WinCE6.0 DEVICEEMULATOR BSP在GEC2410开发板上的移植(3)-PwrButton驱动移植及分析

原创 2011年01月19日 11:56:00

PwrButton驱动实现了按键关机(PowerOff)和重启(Reset)的功能.我们这里定义开发板上的K1为PowerOff,K3为Reset,对应与CPU的EINT0和EINT2中断.
DEVICEEMULATOR BSP中已经基本实现了该驱动,在GEC2410.bat中使能PwrButton,即设置BSP_NOPWRBTN不为1:
set BSP_NOPWRBTN=
编译后通过KITL可以看到pwrbtn2410.dll已经被加载了,但是按任何按钮都没有反应.这是由于PwrButton驱动中的IO设置与我们实际板子上还不完全匹配.
在GEC2410开发板上,按键的原理图是:

在PwrButton驱动中,使用EINT0和EINT2来检测按键的输入,没有按键输入时,EINT0,EINT2被上拉为1,当K1按下时要使EINT0产生下降沿中断,KSCAN0必须为输出0,为了使K2,K9,K10按下时不产生中断,KSCAN1-3需要输出1.这样只有当K1按下时才产生EINT0的下降沿中断.
同理对K3.
我们需要的工作就是配置相应的GPIO,使KSCAN0输出0,KSCAN1-3输出1,EINT0和EINT2设置为外部中断,下降沿触发.然后在驱动中设置该中断,当中断发生时读取EINT0或EINT2对应引脚的值就可以判断K1或者K3是否按下了.
如果要读取所有键盘的值,只需要通过KSCAN0-KSCAN3分别置0扫描并读取相应的EINT管脚就能确定是哪个按键按下了.
接下来我们来看看该驱动详细的代码以及需要添加或修改的地方.
1.流驱动接口
PwrButton驱动也是个标准的流接口驱动,但是只实现了PBT_Init一个函数,其他的如PBT_Open,PBT_Read,PBT_Write都没有实现,仅仅返回0.
PBT_Init 主要工作是:
(1)从coredll.dll获得系统函数SetSystemPowerState,
(2)调用InitializeAddresses获取寄存器地址
(3)调用SetScanOutput()来设置KSCAN0-3的输出值.
(4)创建检测PowerButton(K1)和ResetButton(K3)的线程:PowerButtonIntrThread和ResetButtonIntrThread.
其中SetScanOutput()是我添加的函数,用来初始化KSCAN0-3的输出(KSCAN0为0,其余为1)
代码如下:

InitializeAddresses:
InitializeAddresses通过调用VirtualAlloc和VirtualCopy获得了GPIO寄存器和中断寄存器的虚拟地址,并转换为S3C2410X_IOPORT_REG和S3C2410X_INTR_REG结构的指针。
 
SetScanOutput:
设置KSCAN0为0,KSCAN1-3为1

2.PowerButtonIntrThread和ResetButtonIntrThread
PowerButtonIntrThread:
(1).调用EnablePowerButtonInterrupt()来初始化IO和使能中断EINT0.
(2).创建中断事件PwrButtonIntrEvent,调用KernelIoControl向系统申请IRQ_EINT0对应的逻辑中断号PwrButtonSysIntr.
(3).调用InterruptInitialize将PwrButtonSysIntr关联PwrButtonIntrEvent事件并初始化中断.
(4).等待中断事件发生
(5).中断发生后,调用PowerButtonIsPushed来检测按钮是否按下,延时200ms并再次判断是否按键释放,如果释放了确定按键有效.
(6).pfnSetSystemPowerState存在时,调用其来设置系统状态为POWER_STATE_SUSPEND
pfnSetSystemPowerState(NULL, POWER_STATE_SUSPEND, POWER_FORCE);
否则调用PowerOffSystem()关闭系统.
(7).最后InterruptDone(PwrButtonSysIntr);来通知系统中断完成.
以下是PowerButtonIntrThread代码:

ResetButtonIntrThread:
(1).调用EnableResetButtonInterrupt()来初始化IO和使能中断EINT2.
(2).创建中断事件ResetButtonIntrEvent,调用KernelIoControl向系统申请IRQ_EINT2对应的逻辑中断号ResetButtonSysIntr.
(3).调用InterruptInitialize将ResetButtonSysIntr关联ResetButtonIntrEvent事件并初始化中断.
(4).等待中断事件发生
(5).中断发生后,首先屏蔽EINT11中断(原来的EINT11是连接存储设备的,而我们的板子连接的是键盘,这句代码可以不用)
(6)调用PowerButtonIsPushed来检测按钮是否按下,延时200ms并再次判断是否按键释放,如果释放了确定按键有效.
(7).pfnSetSystemPowerState存在时,调用其来设置系统状态为POWER_STATE_RESET
pfnSetSystemPowerState(NULL, POWER_STATE_RESET, POWER_FORCE);
否则调用KernelIoControl(IOCTL_HAL_REBOOT,NULL,0,NULL,0,NULL)来重启系统.
(8).最后InterruptDone(ResetButtonSysIntr);来通知系统中断完成.
以下是ResetButtonIntrThread代码:

3.EnablePowerButtonInterrupt,EnableResetButtonInterrupt,PowerButtonIsPushed,ResetButtonIsPushed
EnablePowerButtonInterrupt和EnableResetButtonInterrupt初始化EINT0和EINT2的功能管脚和中断设置(下降沿触发)

PowerButtonIsPushed和ResetButtonIsPushed读取GPF0和GPF2的状态来确定按钮是否按下.

4.增加OAL中的GPIO初始化
KSCAN0-3的GPIO寄存器配置在OAL中的OEMInit()函数中完成,调用以下的InitGPIO来进行初始化:
具体的引脚及其功能见如下代码及注释:

VxWorks的移植和BSP定制过程

BSP(Board Support Package,板级支持包)的作用是针对特殊的硬件平台,为操作系统内核提供操作接口,使操作系统能够独立于底层硬件。对上层应用屏蔽具体硬件,VxWorks的高可移植性...
  • kulala082
  • kulala082
  • 2016年11月30日 14:32
  • 2490

wifi RT3070驱动移植 网络转载

本文转载自:RT3070wifi模块的移植  关于无线网络加密的一些概念   本人糅合了两篇文章的内容。 平台:TI dm6441, ,linux2.6.18, wifi:RT3070 我看...
  • mianhuantang848989
  • mianhuantang848989
  • 2015年04月23日 18:00
  • 666

【分享】iTOP4412开发板-Bluetooth移植文档

标签: 4412开发板 2015-07-20 13:30 674人阅读 评论(0) 收藏 举报  分类: 4412开发板(79)  版权声明:本文为博主原创文章,未...
  • mirkerson
  • mirkerson
  • 2016年11月26日 12:25
  • 1133

移植Qt到开发板的过程

做linux大半年了,接触QT也有一段时间了,从来没有成功的把QT移植到开发板上去,过完年闲得无聊,试了哈。今天能够成功的把QT的一个界面软件运行在开发板上了,写下此文,以防止如果有一天忘记了,能够通...
  • guoguoshizhuo
  • guoguoshizhuo
  • 2014年02月14日 01:21
  • 2929

移植 ssh 到开发板

参考:http://blog.sina.com.cn/s/blog_86d540e401019yie.html 1》下载需要的源码 下载zlib: zlib-1.2.3.tar.gz       ...
  • lizuobin2
  • lizuobin2
  • 2016年09月25日 21:17
  • 1504

移植QT5.6到嵌入式开发板(史上最详细的QT移植教程)

版权声明:欢迎转载,转载请注明出处 http://blog.csdn.net/lizuobin2/   目前网上的大多数 QT 移植教程还都停留在 qt4.8 版本,或者还有更老的 Qtop...
  • qq_26093511
  • qq_26093511
  • 2016年09月28日 09:28
  • 3208

android BSP与硬件相关子系统读书笔记(1)android BSP移植综述

对于一些简单的设备驱动,可以不用写HAL的代码,实际上很多时候也不用去写,一种常见的情况是由JNI的部分代码直接调用驱动程序的设备节点或者使用sys文件系统。也可以直接把/sys/的属性文件(可以通过...
  • seek_0380
  • seek_0380
  • 2015年12月09日 22:33
  • 2106

巧借WinCE BSP移植,嵌入式系统开发有捷径

 http://tech.it168.com/a2009/0617/591/000000591093.shtml 近期,公司让我负责一个嵌入式消费产品的开发项目。此产品原来的操作系统是WinC...
  • ljsant
  • ljsant
  • 2016年07月19日 09:48
  • 752

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植

前段时间就开始学习I.MX6Q了,但是最近工作实在是忙,间断了一些时间了。为了提高移植效率,还是考虑移植Freescale维护的3.10版本的内核。 源码获取 Freescale维护的3.10的内核是...
  • girlkoo
  • girlkoo
  • 2015年05月01日 23:38
  • 17308

vxworks6.6移植日记

转载地址:http://www.cedn.cn/?uid-45-action-viewspace-itemid-3114 下载VxWorks6.6的评估版有很长一段时间了。但是一直都没有时间来见...
  • qingfengtsing
  • qingfengtsing
  • 2014年03月06日 18:28
  • 1731
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinCE6.0 DEVICEEMULATOR BSP在GEC2410开发板上的移植(3)-PwrButton驱动移植及分析
举报原因:
原因补充:

(最多只允许输入30个字)