阅读:1562回复:10
高手看过来(需要你的帮助)!!
本人在做基于EP9301(ARM920T内核)(Cirrus logic公司的产品)的嵌入式系统开发。由于EP9301上不带键盘控制、触摸屏控制、鼠标接口、显示控制等接口。所以我用通用的I/O接口做了一个矩阵键盘,并且自己定义一个中断来控制键盘;通过I/O口接了一个液晶显示模块。
我现在得到的Cirrus logic的BSP上没有中断管理和I/O管理的源代码。 我现在的困惑是我如何实现对I/O的操作和自己定义的中断的操作。请大家给个清晰的思路。我现在的理解是用驱动去做,但是具体怎么去实现呢??请有经验的高手帮忙! 谢谢!! 我是用WIN CE NET 4.2进行开发的! [编辑 - 11/12/04 by jinhualee] |
|
沙发#
发布于:2004-11-13 08:22
关注中...
|
|
|
板凳#
发布于:2004-11-14 14:42
矩阵键盘的原理还是比较简单的,就是把行GPIO设为输入,初始化为低电平,并ENABLE它们的上升/下降边沿触发中断; 把列GPIO作为输出,初始化为高电平. 一旦某个键被按下,此键所在的行GPIO电平会被拉高,触发上升沿中断.通过中断处理程序就可以知道是哪一行. 然后,再逐列拉低列GPIO,如果某一列的GPIO电平变低时,此行GPIO的电平也跟着变低,这个列就是按下的按键所在的列. 如此行列都得到,就可以确定是哪一个键了.再把这个SCAN_CODE映射成VIRTUAL KEY返回给GWES.
所谓IO管理就是通过相应寄存器去设置GPIO的高/低电平;输入/输出状态,开/关中断,上升/下降边沿触发等等.具体怎么设要参考EP9301的开发文档了. 所谓中断管理管理,一方面是要在KERNEL\HAL下的OEMInterruptHandler(),OEMInterruptEnalbe(),OEMInterruptDisable(),OEMInterruptDone()这些ISR相关的函数里添加相关的开/关和清除GPIO中断的代码.; 另一方面要在你的DRIVER的IST里去判断是哪一根GPIO的中断. 你可以参考CE的KEYBD DRIVER和一些BSP里的实现. |
|
|
地板#
发布于:2004-11-14 16:14
谢谢joyfly兄,谢谢你的讲解
至于键盘的原理那些我自己也很清楚 就是不知道怎么样在WIN CE 底下实现对我的CPU的通用I/O接口的操作。我以前是做单片机开发的。 现在看了你的讲解有了一些思路,我试试看,不行再请教你 能告诉我你的联系方法吗? 谢谢 [编辑 - 11/14/04 by jinhualee] [编辑 - 11/14/04 by jinhualee] |
|
地下室#
发布于:2004-11-15 13:33
如果你完全没有接触过WINCE,那可能会麻烦一点,因为你的那些GPIO的寄存器地址要做一次地址映射才能在DRIVER里使用.不过我想你只要参考一下现有的CODE(因为你现在的BSP里应该还有别的DRIVER用到了GPIO,看看他们是怎么做的),应该没什么问题的.
因为工作的关系,我恐怕无法给你即时通讯联系方式. 你有问题的话可以在这个论坛,或者在www.cnemb.com的WINCE DRIVER论坛上提问.我会经常来看. 而且别人也可以帮助你. |
|
|
5楼#
发布于:2004-11-15 20:49
joyfly兄:
我正是之前没进行过WIN CE的开发,所以才头痛呢。谢谢你! 祝你工作顺利。 我按你说的思路先做做看。 |
|
6楼#
发布于:2004-11-16 11:40
对于行GPIO,读取GEDR后,确定是否产生中断
但是对于列GPIO,是循环读取GPLR来查看状态,还是全部拉低,然后查看是否有电平未发生变化?? |
|
7楼#
发布于:2004-11-16 11:50
对于列的位置不太清楚怎么定位,请指教 :o
|
|
8楼#
发布于:2004-11-16 13:35
我不清楚你的GEDR,GELR是指什么
我说的"逐列拉低列GPIO",是指每次把一个列GPIO电平拉低,其余列GPIO的电平为高. 比如: 列0低, 列1,2,3,4高,读确定的那个行GPIO的电平,如果为低,就是列0 列1低, 列0,2,3,4高,读确定的那个行GPIO的电平,如果为低,就是列1 列2低, 列0,1,3,4高,读确定的那个行GPIO的电平,如果为低,就是列2 . . . [编辑 - 11/16/04 by joyfly] |
|
|
9楼#
发布于:2004-11-16 18:01
拉低列GPIO时,行GPIO的电平也会变低,为什么?
|
|
10楼#
发布于:2004-11-17 11:04
因为行GPIO的方向是INPUT的,所以它会被外部电平拉低或拉高
|
|
|