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

wince500下ZLG7290键盘驱动的开发心得

楼主#
更多 发布于:2007-07-14 11:03
前段时间发了一个贴请教键盘驱动的开发工作,得到了各位的大力帮助。现在已经修改成功,唯恐以后遗忘写了一点心得放上来,请大伙帮助斧正。

wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-14 11:04
ZLG7290键盘驱动开发心得
Wikee 20070714

1、    了解键盘驱动结构,清楚准备要修改的地方和目的
Wince50的键盘驱动主要分几个层,

  

描述:键盘驱动分层结构

图片:key.JPG

键盘驱动分层结构


其中GWES和layout manager一般不用修改,但是可以看看里面的源码帮助理解驱动的接口,主要看初始化PDD的函数KeybdDriverInitializeEx()和回调函数KeybdEventCallback()就可以了。
Input language一般是0409,美国101键盘输入即可,不用修改。
PS/2和Matrix都是PDD,一般PS/2是默认的,如果没有PS/2键盘的话可以使用PS2_NOP_Entry即可。主要修改工作就是Matrix的driver和layout。

2、修改驱动、虚拟键值对照表和中断
我原来BSP中就已经具有KEYBD的源码,修改工作就在这个基础上的。目录在PLATFORM\SMDK2410\DRIVERS\KEYBD\。查看kbds3c2410us项目下的SOURCES文件如下:

================================================
SYNCHRONIZE_DRAIN=1

RELEASETYPE=PLATFORM

TARGETNAME=KbdS3C2410Us  (生成的DLL的名称,会在bib文件中调用该文件,同时改名为kbdmouse.dll来加载)
DEFFILE=KbdUS.def
TARGETTYPE=DYNLINK
DLLENTRY=DllMain
TARGETLIBS= \
    $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib

(这些是用到的库文件,TARGETPLATROOT目录下的几个就是我们要修改的,COMMONOAKROOT下的是标准的库文件一般不去修改。S3C2410KBD.lib对应KBDCOMMON目录,S3C2410_Layout.lib对应MATRIX_0409目录,PddList.lib对应PDDLIST目录,只需修改这三个目录。其中PDDLIST我没有修改,因为里面只是声明了两个PDD结构,正是我所需要的,如果不是则需要修改)
SOURCELIBS=\
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\S3C2410KBD.lib \
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\S3C2410_Layout.lib \
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\PddList.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\Nop_KbdCommon.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\PS2_AT_00000409.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\LayoutManager.lib    \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\KeybdIst.lib    \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\NumPadRmp.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\InputLang_0409.lib \

WINCETARGETFILE=dummy

SOURCES=

==============================================

下面是platform.bib中有关键盘的内容:其中一大堆IF是根据你的OS的选择来COPY不同的键盘驱动DLL文件,只要保证OS中选择了S32410 Matrix Keyboard/Mouse English特性即可。
; @CESYSGEN IF CE_MODULES_KEYBD || CE_MODULES_POINTER
#if ! (defined BSP_NOKEYBD && defined BSP_NOMOUSE)
IF LOCALE=0411 !
IF LOCALE=0412 !
IF BSP_KEYBD_NOP
; @CESYSGEN IF CE_MODULES_NOPKEYBOARD
    kbdmouse.dll        $(_FLATRELEASEDIR)\KbdNopUs.dll            NK  SH
; @CESYSGEN ENDIF CE_MODULES_NOPKEYBOARD
ENDIF    ; BSP_KEYBD_NOP
IF BSP_KEYBD_NOP !
(起效的是这句把KbdS3C2410Us.dll装进NK中,这样修改的驱动才会被使用到。)
    kbdmouse.dll        $(_FLATRELEASEDIR)\KbdS3C2410Us.dll        NK  SH
ENDIF    ; BSP_KEYBD_NOP
(后面省略)。。。。
; @CESYSGEN ENDIF CE_MODULES_KEYBD || CE_MODULES_POINTER
==================================================

注册表一般不用修改,我只是增加了IIC的基地址进去,替换原来的SPI基地址。
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\KEYBD]
    "DriverName"="kbdmouse.dll"
    "SysIntr"=dword:10    ; SYSINTR_FIRMWARE + 0
    "IOBase"=dword:B1600000
;    "SSPBase"=dword:B1900000
    "IICBase"=dword:B1400000

===============================================

经过上面的分析,已经清楚需要修改的地方了
KBDCOMMON下的:kbd.cpp和s3c2410kbd.cpp
MATRIX_0409下的:s3c2410.cpp

我在KBDCOMMON文件夹下添加了从网上下载的iic.h和zlg7290.h,主要是定义的一些宏。s3c2410kbd.cpp中去掉原来PS/2的获取键值的子函数,增加ZLG7290的获取键值的子函数,还有根据硬件修改POWERON函数等。7290的子函数,周工网站有下,网上还有针对2410的IIC程序也找一个来自己分析后添加。KBD.CPP一般也不改,我在Matrix_Entry()函数中加上串口调试输出,来确定这个PDD被加载了。

关键在函数KeybdPdd_GetEventEx2(),这个函数在每次中断被键盘IST调用,可以看成是对中断的一个响应即可。IST我们使用默认的,可以在PUBLIC\COMMON\OAK\DRIVERS\KEYBD\下找到,这里同时还有layout maneger的代码。在这个函数中加上获取ZLG7290 IIC端口内容的函数ZLG7290_GetKey(key);其中key是一个4字节的数组,存放ZLG7290的前4个字节内容,第一个字节的第0位表示是否有键按下,第二字节是键值,没有键按下则为0,第3个为repeat count,第4个为功能键。具体看ZLG7290datasheet。

MATRIX_0409中的s3c2410.cpp就是修改ScanCodeToVKeyTable。Layout manager是根据偏移量来查找虚拟键值的。也就是以scancode为下标,对应的vkey为内容的一维数组而已。如果不支持的键,则填0即可,但是数组长度不要变,最好把原来的注释掉,复制后修改。
UINT8 ScanCodeToVKeyTable[] =
{
    0,  // Scan Code 0x0
    VK_F1, // Scan Code 0x1
    VK_F2, // Scan Code 0x2
    VK_F3, // Scan Code 0x3
    VK_F4, // Scan Code 0x4
    0, // Scan Code 0x5
    0, // Scan Code 0x6
    0, // Scan Code 0x7
    0, // Scan Code 0x8
    VK_ESCAPE, // Scan Code 0x9,esc
    VK_RETURN, // Scan Code 0xA,enter
    VK_UP, // Scan Code 0xB
    VK_RIGHT, // Scan Code 0xC
    0, // Scan Code 0xD
    0, // Scan Code 0xE
    0, // Scan Code 0xF
    0, // Scan Code 0x10
    VK_LEFT, // Scan Code 0x11
    VK_DOWN, // Scan Code 0x12
    'B', // Scan Code 0x13,back light
……
}

至此驱动修改完成,但是却不能正确运行。因为中断等没有修改正确,不能保证拿来的BSP就可以使中断正确了。如果使用与原来BSP同样的开发板就不需要修改。
中断的修改一般涉及到中断处理的几个函数,在KENEL\HAL\下的cfw.c和子目录下的armint.c。把对应的中断处理case分支,返回SYSINTR_KEYBOARD,或者处理SYSINTR_KEYBOARD对应case分支内容。

3、修改驱动注意的地方
    修改工作主要是对键盘驱动的结构流程的熟悉过程。我从键盘驱动不懂到修改成功经过了两周多,主要的修改代码工作才用了两天多一点。原因主要是对PB的不熟练和结构流程不熟悉造成的,多操作,多看书和help,多问人,多查看相关代码才是最快的方法。
    首先,确保你的硬件没有问题,是正常的。我之前使用ADS调试已经确认硬件正常,这个很重要,否则在软件上瞎搞,你也不会看到正确的结果出现的。
    第二,掌握一种调试手段。我的开发板没有网卡,不能使用PB进行代码调试,非常的痛苦,只能使用串口调试。我的BSP DEBUG下不能编译通过,现在在查问题,只能使用RELASE版。这样只能使用RETAILMSG宏来调试,但是注意不能选SHIP_BUILD一项。
   第三,灵活地调试。驱动的流程都是一层一层的,层之间使用接口函数,这样就提供了分层测试的方法。我在测试layout maneger时不使用获取的键值,而是定义一个键值当是硬件返回的扫描码来测试,结果成功,能在wince上看到该键值的效果了,表示上层从layout maneger和GWES都没问题了。当时我只是模拟了一下向下键,看到开始栏上光标不断移动,心里别提多开心了。这时候ZLG7290还没有做通呢。
之后是调试中断,因为我使用的不是原来的中断号了,我使用EINT10,但是有一段时间不能响应,后来才查到原因。因为EINT10的引脚GPG2其他驱动使用到了,这些后来才加载的驱动把端口修改了!我在PB中查找GPGCON的所有内容,把相关的驱动修改后,中断才正常。同样IIC的两个端口引脚也是一样。现在我明白了WINCE的所有驱动、OAL都是一个相关的整体,一发动全身。
最后调试7290要注意IIC的通讯频率,7290最高25K不能过高,在ADS中可以的程序放到WINCE下不一定可以,因为两者频率不一定相同。IIC的超时也要注意,改到WINCE下不能太短,否则根本没有IIC波形生成。因为太快了,上一个数据都没有移出去,下一个数据就把移位寄存器中的数据冲掉了,是得不到正确数据回应的。需要有一定硬件知识。
Layout maneger具有auto-repaet功能,还需要分keyup和keydown,7290没有这个标志,我采取双边沿中断的方式,按一次键产生两次中断,第一次是keydow你,第二次是keyup,使用7290的第一个字节的0位来判断。
第四,就是多看多查PB的help,当中什么都有了。
These all!
zzjlovece
驱动牛犊
驱动牛犊
  • 注册日期2006-06-01
  • 最后登录2012-01-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望117点
  • 贡献值0点
  • 好评度84点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-14 14:00
支持一个。
dreamzqw
驱动牛犊
驱动牛犊
  • 注册日期2004-11-25
  • 最后登录2019-04-08
  • 粉丝1
  • 关注0
  • 积分19分
  • 威望182点
  • 贡献值0点
  • 好评度55点
  • 原创分1分
  • 专家分2分
地板#
发布于:2007-07-15 09:30
好,是不是在MagicARM2410上搞的呀.
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-16 08:26
不是,是自己做的板子。
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-07-16 09:44
用户被禁言,该主题自动屏蔽!
saint_bxg
驱动小牛
驱动小牛
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望284点
  • 贡献值0点
  • 好评度257点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-16 14:11
好同志,顶一个!
努力! 成功就在不远处....
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-07-17 16:40
恩……
这个帖子很清晰
我目前还没改的是SOURCE文件和IO口基地址(难道和SPI不同吗?哪里看是多少呢?基+偏在哪算的)
试试去
wikee
驱动小牛
驱动小牛
  • 注册日期2003-02-25
  • 最后登录2009-02-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望108点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-07-17 17:30
楼上应该清楚自己的硬件端口,基地址和偏移一般在S2410.H中。具体用法就要看2410DATASHEET了。
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-07-17 17:50
我清楚……
而且貌似同一文件里有对GPIO的访问
格式直接粘贴……
OK
WIKEE,邮件已经发给你了
麻烦你看下
zhang_blue
驱动牛犊
驱动牛犊
  • 注册日期2003-01-08
  • 最后登录2007-07-21
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-07-17 23:18
正在找这方面的资料,这个芯片用的不少可以做一下了.共同提高,多谢
westfloor
驱动牛犊
驱动牛犊
  • 注册日期2005-03-31
  • 最后登录2007-09-02
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-08-18 21:19
是不是如果使用标准的ps2键盘就不用更改了呢? 按照楼主的的设置是不是这个驱动必然进   的是    Matrix_Entry,而不是PS2_NOP_Entry呢?
"PS/2和Matrix都是PDD,一般PS/2是默认的",???
不知道"如果没有PS/2键盘的话可以使用PS2_NOP_Entry即可"是否是说用系统没有ps/2键盘外设的时候, 就使用PS2_NOP_Entry.
可以取,可以无取,取伤廉;可以与,可以无与,与伤惠;可以死,可以无死,死伤勇
richyshu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2007-10-22
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望9点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-08-21 09:50
wikee,我想问你点SL811HS的问题,不知道怎么联系啊,急!我的邮箱:richyshu@126.com
peterkayla
驱动牛犊
驱动牛犊
  • 注册日期2007-11-27
  • 最后登录2009-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-11-28 12:21
正在搞,要做64个按键,学习中
xinjie1023
驱动牛犊
驱动牛犊
  • 注册日期2008-06-29
  • 最后登录2010-05-26
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望201点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2010-04-16 16:51
支持下
游客

返回顶部