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来进行初始化:
具体的引脚及其功能见如下代码及注释:

相关文章推荐

s3c2410开发板上LINUX内核移植文档

  • 2011年05月04日 22:34
  • 1.02MB
  • 下载

boa服务器在S3C2410开发板上移植

一、配置编译boa 1. #tar zxvf boa-0.94.13.tar.gz 2. #mv boa-0.94.13 boa_arm 3. #cd boa_arm/src ...

u-boot在s3c2410开发板上移植(NAND Flash Boot)过程 2007-08-21 11:56:25

这篇文章对于我的U-Boot移植起了重要作用,阐述了U-Boot从NAND Flash启动需要做的修改,但是其做法并不是完全正确(只是个人意见)。在这里谢谢Bekars涡轮增压!! 这篇文章转载自...

将Android移植到FS2410开发板上(转

  • 2011年09月14日 00:16
  • 84KB
  • 下载

WinCE6.0 DEVICEEMULATOR BSP的BatteryDriver驱动简析

WinCE6.0 DEVICEEMULATOR BSP的Battery驱动,位于/SRC/DRIVERS/BATTDRVR下,只有一个battif.c,内容比较简单.实际上是电池驱动的PDD层,实现P...

WinCE6.0 DEVICEEMULATOR BSP的BackLight驱动简析

这里就WinCE6.0 DEVICEEMULATOR BSP的BackLight驱动做下分析, 更多关于电源管理的内容可以参考其他资料. 这是一个名称为BKL的流接口驱动,实际上流接口函数,如BKL...

u-boot-1.1.6在FS2410开发板上的移植

网上找的一个帖子,没有找到原帖,想移植uboot,但是对代码从nand搬到ram的过程不熟悉,按这个文章的说明实践成功了,后续再研究重定位原理。 根据u-boot-1.1.6目录下的README文件...
  • gb1230
  • gb1230
  • 2016年02月16日 22:35
  • 425

u-boot-1.1.6在FS2410开发板上的移植

根据u-boot-1.1.6目录下的README文件2375行的提示,可以知道要使uboot支持一款新的开发板,要经过以下步骤: l  在顶层Makefile文件中新增一个配置选项。 l  在bo...

linux-2.6.32在mini2440开发板上移植(10)之触摸屏工作原理以及驱动程序详细分析

编者:这部分还是比较长的,因此没有放在上个移植里面。这里主要说触摸屏的工作原理,以及对上述驱动程序代码的简单分析。分析中参考了网上的很多资料。感谢原作者的无私奉献,因为涉及多篇,在此就没有注出原作的链...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinCE6.0 DEVICEEMULATOR BSP在GEC2410开发板上的移植(3)-PwrButton驱动移植及分析
举报原因:
原因补充:

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