阅读:1960回复:8
求助,键盘驱动硬件操作怎么改
打算在2410上用几个IO口并行接受外部编码器编好的按键代码
一个EINT0作中断通知 已经在armint.c cfw.c power.c中把EINT0指向了键盘的SYSINTR 但是在WINCE420\PLATFORM\SMDK2410\DRIVERS\KEYBD\KBDCOMMON\s3c2410kbd.cpp里找到的是一堆函数定义,对SPI操作啊一类的 但是我是学硬件的,C基本上是大致能看懂的程度,巴不得的就是一句一句挨个写寄存器 看不出来到底是哪句响应了中断,然后哪句从SPI口取了数据存在什么地方了 大家能不能帮我指出一下啊 我想的是这个文件改了,编码相同放在同样的地方,其他的文件应该就不用再改了,不知道对不对 |
|
沙发#
发布于:2007-06-12 18:59
BOOL Ps2Keybd::KeybdPowerOn()根据你自己硬件的设计做相应的修改。
BOOL Ps2Keybd::IsrThreadProc()根据你自己硬件的设计做相应修改。 ReadRegDWORD( TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("SysIntr"), &dwSysIntr_Keybd );SysIntr值根据你的EINT0做相应的注册表设置,或者你直接设定, static UINT KeybdPdd_GetEventEx2(UINT uiPddId, UINT32 rguiScanCode[16], BOOL rgfKeyUp[16])键盘中断处理的回调函数也做相应的修改,检测按键键值你自己的处理就可以添加在这里。 KeybdIstLoop()这个函数里会响应中断,会调用到KeybdPdd_GetEventEx2(). 你的想法是对的。SPI的处理替换成你自己的接收键码处理。 |
|
板凳#
发布于:2007-06-13 09:15
谢谢楼上的大哥……
我搞搞去 |
|
地板#
发布于:2007-06-13 09:36
KeybdPdd_GetEventEx2里有这么一句:
getsFromKBCTL(&ui8ScanCode, 1); 是不是就是这句实现了从SPI获取SCANCODE 然后保存在ui8ScanCode里? |
|
地下室#
发布于:2007-06-14 10:00
自己写个独立驱动会简单很多。
|
|
5楼#
发布于:2007-06-14 14:42
写我可以用汇编写出来……
就是不晓得杂嵌到CE里头去 |
|
6楼#
发布于:2007-06-18 16:33
请教下各位高人
以下是我改的函数: void getsFromKBCTL(UINT8 *m) { int j; volatile tmp = 1; m = ((v_pIOPregs->rGPGDAT >> 3)|(v_pIOPregs->rGPGDAT >> 10))&(0x3<<0); //取IO口值处理为8位2进制编码 for(j = 0; j < 3; j++) tmp += tmp; for(j = 0; j < 250 * 30; j++) tmp += tmp; if (m != ((v_pIOPregs->rGPGDAT >> 3)|(v_pIOPregs->rGPGDAT >> 10))&(0x3<<0)) m=0xFF; //延时后与自身比较作为防抖 } } 编译错误信息为:error C2440: '=' : cannot convert from 'unsigned int' to 'unsigned char *' error C2446: '!=' : no conversion from 'unsigned int' to 'unsigned char *' KeybdPdd_GetEventEx2函数里描述为: getsFromKBCTL(&ui8ScanCode); 请问类型错误在哪里呢? |
|
7楼#
发布于:2007-06-18 22:38
UINT8 *m
这是一个指针,要用*m来比较和赋值 另外,v_pIOPregs->rGPGDAT是多少位的? |
|
8楼#
发布于:2007-06-25 11:23
v_pIOPregs->rGPGDAT是16位
也考虑位宽的问题 但也不该是UCHAR转换类型…… 试了if (v_pIOPregs->rGPGDAT&0x1) m|=0X1;也不行 现在用if (v_pIOPregs->rGPGDAT&0x1) m=m+1; 这句没问题了 提示文件/S2410XKBD.OBJ错误 找里对应目录 没这个文件啊 |
|