jinhualee
驱动牛犊
驱动牛犊
  • 注册日期2004-09-01
  • 最后登录2007-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1484回复:10

高手看过来(需要你的帮助)!!

楼主#
更多 发布于:2004-11-12 19:41
本人在做基于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]
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-13 08:22
关注中...
Come on, let us drive the world.
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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里的实现.
www.cnemb.com
jinhualee
驱动牛犊
驱动牛犊
  • 注册日期2004-09-01
  • 最后登录2007-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-14 16:14
谢谢joyfly兄,谢谢你的讲解
至于键盘的原理那些我自己也很清楚
就是不知道怎么样在WIN CE 底下实现对我的CPU的通用I/O接口的操作。我以前是做单片机开发的。
现在看了你的讲解有了一些思路,我试试看,不行再请教你


能告诉我你的联系方法吗?
谢谢


[编辑 -  11/14/04 by  jinhualee]

[编辑 -  11/14/04 by  jinhualee]
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-15 13:33
如果你完全没有接触过WINCE,那可能会麻烦一点,因为你的那些GPIO的寄存器地址要做一次地址映射才能在DRIVER里使用.不过我想你只要参考一下现有的CODE(因为你现在的BSP里应该还有别的DRIVER用到了GPIO,看看他们是怎么做的),应该没什么问题的.

因为工作的关系,我恐怕无法给你即时通讯联系方式.
你有问题的话可以在这个论坛,或者在www.cnemb.com的WINCE DRIVER论坛上提问.我会经常来看. 而且别人也可以帮助你.
www.cnemb.com
jinhualee
驱动牛犊
驱动牛犊
  • 注册日期2004-09-01
  • 最后登录2007-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-15 20:49
joyfly兄:
   我正是之前没进行过WIN CE的开发,所以才头痛呢。谢谢你!
祝你工作顺利。
   我按你说的思路先做做看。
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-16 11:40
对于行GPIO,读取GEDR后,确定是否产生中断
但是对于列GPIO,是循环读取GPLR来查看状态,还是全部拉低,然后查看是否有电平未发生变化??
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-16 11:50
对于列的位置不太清楚怎么定位,请指教 :o
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
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]
www.cnemb.com
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-16 18:01
拉低列GPIO时,行GPIO的电平也会变低,为什么?
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-11-17 11:04
因为行GPIO的方向是INPUT的,所以它会被外部电平拉低或拉高
www.cnemb.com
游客

返回顶部