wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
阅读:2786回复:10

请教使用IIC接口的ZLG7290芯片扩展键盘如何修改驱动。

楼主#
更多 发布于:2007-06-28 08:28
我的平台使用IIC接口的ZLG7290芯片扩展的键盘,需要改WINCE的键盘驱动。
查了一下网络上的资料,我认为有两者实现方法:
1、改动原KEYBOARD的代码中有关SCAN_CODE的部分和中断部分。
2、写一个流驱动接到键盘中断,在IST中处理SCAN_CODE和虚键值的转换。资料如下:

WINCE的键盘驱动程序开发的注意事项 -
转自:http://winceblog.blogspot.com/2007/02/wince.html

WINCE中标准的键盘驱动程序接口可以参考PS2键盘的驱动程序,但那个接口比较复杂,对于了解流接口的人来说,实现一个流接口的驱动程序应该是一个更好的选择.我们只需要实现一个流接口驱动程序,发生中断以后读到键盘的扫描码,将其用MapVirtualKey转化成虚键,再调用keybd_event函数将些虚键发送出去即可。只是我们需要注意记录CTRL,ALT等特殊键的状态。
注意:
1,某些键的扫描码有两个值,以0XE0或0XE1开始,注意正确处理。
2,一个PS2键盘不需要初始化就可以工作,但我们可以发送RESET命令再读其返回值来判断键盘是否已经连接。
3,必须加上kbdmous.dll,这个模块,我们的键盘驱动才能正常工作,通常只需要加上NOP Keyboard/Mouse English,再加上相应的注册表设置就行。
4,系统中只能有一个标准接口的键盘驱动,即kbdmouse.dll,所以如果我们有更多的键盘硬件需要驱动,就需要把其它的做成流接口的,最多将一个写成标准的键盘驱动,当然也可以把所有的都写成流接口驱动,再加上NOP Keyboard/Mouse English

我想第一种方法,应该是最好的方法,但是就是复杂了一点。第二种方法有点旁门左道的意思,但是应该也是可行的。

目前,我还在看资料,碰到的第一个问题就是:我的OS中已经有了一种键盘驱动了,叫做S32410 Matrix Keyboard/Mouse English,查了一下没有源码,或者不知道在哪个文件夹下。我又添加了S32410 Matrix Keyboard/Mouse Common,这个是有源码的,可以修改。两个特性一起是否有冲突呢?
诚心请教达人。麻烦给我讲一下思路,万分感谢。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
沙发#
发布于:2007-06-28 13:27
不用添加S32410 Matrix Keyboard/Mouse Common,注意DRIVERS/KEYBD/KBDCOMMON/目录下sources,它是生成S3C2410KBD.lib库,而DRIVERS/KEYBD/KBDS3C2410US/sources文件才是生成最终的键盘驱动动态库,会连接S3C2410KBD.lib,所以你就放心大胆地去改KBDCOMMON/下的源文件,实际上你也只需改这个目录下的文件就能实现你需要的了。
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-28 18:12
感谢楼上的解答。我看了一天的help,得到的答案也是这样的。
通过认真看help,获益不少,知道PB中DIRS,SOUCERS文件的重要性。呵呵。
过几天搞出来了,再来总结总结。
dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-28 21:09
太乐观,太乐观了,呵呵,真的只修改KEYBD\KBDCOMMON下面的文件,只搞定如何获取scan code并返回给MDD,是KeyDown还是KeyUp就能搞定一切吗?兄弟,那你运气好的话,也许就能碰巧搞定,否则你只是开始了1/3的工作。

跟你提个醒,你后面还有1/3的工作是要搞清楚你从键盘控制器那里得到的键盘码应该怎么样转换成VKey,所以如果你不提供你的键盘的ScanCodeToVKeyTable这样的表格,那么CE按照你上次的默认的ScanCodeToVKeyTable(也就是你拿别人的那份代码)可能就得不到正确的Vkey,CE可不知道0x03,0xE0这样的数据到底是哪个VK_MENU或者VK_TAB。(PS,拒我看到的目前比较普遍的远蜂的那个键盘驱动的ScanCodeToVKeyTable好象是笔记本那样的键盘用的,不过没验证过,反正比队了下,不是标准PS2的)

另外,1/3是你要记得你的这个******_PDD这个宏,不要定义的和别人冲突了,否则MDD load不起来你的PDD层,那样你会发现你每个按键蚂都捕获到了,可界面上怎么没反映呢?

另外,对于你自己说的那几个注意,好象第一,二点还能说得过去,3,4我就不明白了,kbdmouse.dll这个DLL本来就是你写的,叫其他名字也可以啊,NOP Keyboard的代码你看了吗?是不是加上就行呢?呵呵

最后,如果有多个键盘的话(指的是两个PS2接口的吗?)这样的产品应该是很少吧,但是如果是有,也可以写到一个键盘驱动里的,你可以将两个物理中断隐射到同一个系统中断中来,不过最好加上一些全局变量(放在固定RAM区域的),可以区分出是哪个键盘中断到来,毕竟一个流接口,一个标准键盘驱动接口会让GWES觉得怪怪的,呵呵,搞不好还容易死机(都按快了的话)

说的有点多,但相信是对你有帮助的,goodluck

PS,希望这个坛子里的人能像linuxforum里的嵌入式版块那样畅所欲言,不要保留什么,上次要个DM9000的驱动,要的可真是辛苦啊,不过最后还是感谢一个好心的老兄,连BSP都发给我了,再次向他表示 谢意!
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-29 08:53
非常感谢dillonhua大牛的指点。你说的都有道理,但是我不能畏难而停滞不前的,我深刻的意识到开发不可能完全靠别人的,一定要自己看明白程序才能修改到自己的意图。但是前人的帮组是非常有益的,所以感谢你的无私指点。

ScanCodeToVKeyTable是可以改的,看help中说有个工具KEYGEN.exe可以生成。我还没有测试,但是这个应该不成问题,因为我看过源码就在D:\WINCE500\PLATFORM\SMDK2410\DRIVERS\KEYBD\MATRIX_0409中,至少可以修改。

另外******_PDD这个宏,我还没完全了解。但是我的想法完全使用原来的函数名称和结构,只是修改SCAN_CODE的地方,我想是不会LOAD不起来的。这个还要实践才知道。

那几个注意,是我搜查资料的时候人家的帖子来的,上面说了转自。。。,那个网站现在已经打不开了。这个转贴只是给出了方法,而且我也认为可行。在硬件上不会支持两个键盘的,而且这个流驱动的键盘只是提供了键盘消息,其他程序不会问这个消息是从哪来的。而且我认为流驱动应该是被DEVICE.EXE加载的,而不是GWES了。GWES加载的是标准驱动,而硬件上没有PS2键盘,所以GWES认为是键盘一直没有键按下而已,应该不会有冲突。这只是我的一点点想法。

但我不会使用流驱动的实现方式,毕竟要按MS的方式来玩才是兼容性最好的,实现是麻烦了一点,但是不会走不通吧?

再次感谢你的回复,我会注意你提出的地方的。谢谢。
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-06-29 08:59
今天准备先在ADS中实现硬件的调试,在BIOS中实现键盘功能,确认我的平台中的键盘部分硬件是OK的才进行PB的修改。这样碰到问题才不会怀疑硬件出了问题。

GOOGLUCK TO MYSELF!
rilyyu
驱动小牛
驱动小牛
  • 注册日期2006-11-17
  • 最后登录2010-08-17
  • 粉丝0
  • 关注0
  • 积分512分
  • 威望130点
  • 贡献值0点
  • 好评度127点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-29 09:29
我路过 发布个信息
DM9000的驱动 官方网站上有下的
 
dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-06-29 10:45
引用第6楼rilyyu于2007-06-29 09:29发表的  :
我路过 发布个信息
DM9000的驱动 官方网站上有下的
 


楼上的,看来你也搞过DM9000,能不能帮忙看下我的另外一篇求助的帖子,现在用DM9000遇到了断线的问题
http://bbs.driverdevelop.com/htm_data/48/0706/103144.html


另外,楼主,我所说的冲突是指无论你流驱动里的keybd_event(),还是标准Keyboard drivers里的keybd_event()都是通知GWES去处理,并在界面上反映出来的。所以,当你挂两个键盘,当他们的layout有一样的地方,(两个PS2键盘的layout有重合的地方应该还比较多吧),那么就有出问题的可能。除非你的流驱动里面不是用keybd_event(),来产生按键事件,而是通过其他的方式通知应用的。不过,我现在也没搞清楚你两个键盘的需求到底是什么样子的,呵呵。
(另外,我不是大牛,只是有些东西做过而已,不会的东西还是很多的,大家互相讨论,一起提高)
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-06-29 11:26
楼上,我没使用两个键盘。我的目的是采用IIC的7290做小键盘,上面只有几个键而已。

大家讨论才能进步嘛,谢谢指教!

搞了几个小时,现在在ADS下BIOS中能读取键值了,说明键盘硬件没问题。接下来是重点了,PB的键盘驱动!!!
jasonshi
驱动小牛
驱动小牛
  • 注册日期2004-10-11
  • 最后登录2011-07-01
  • 粉丝2
  • 关注0
  • 积分23分
  • 威望446点
  • 贡献值3点
  • 好评度256点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-06-29 12:08
如果只是实现几个键的功能不用费这么大劲吧,修改一下SMDK2410下的一个文件就可以了吧,我就这么干的。呵呵
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-06-29 17:31
楼上请问哪一个文件?
游客

返回顶部