sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
阅读:1893回复:8

求助,键盘驱动硬件操作怎么改

楼主#
更多 发布于:2007-06-12 15:38
打算在2410上用几个IO口并行接受外部编码器编好的按键代码
一个EINT0作中断通知
已经在armint.c  cfw.c  power.c中把EINT0指向了键盘的SYSINTR
但是在WINCE420\PLATFORM\SMDK2410\DRIVERS\KEYBD\KBDCOMMON\s3c2410kbd.cpp里找到的是一堆函数定义,对SPI操作啊一类的
但是我是学硬件的,C基本上是大致能看懂的程度,巴不得的就是一句一句挨个写寄存器
看不出来到底是哪句响应了中断,然后哪句从SPI口取了数据存在什么地方了
大家能不能帮我指出一下啊
我想的是这个文件改了,编码相同放在同样的地方,其他的文件应该就不用再改了,不知道对不对
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
沙发#
发布于: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的处理替换成你自己的接收键码处理。
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-13 09:15
谢谢楼上的大哥……
我搞搞去
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-13 09:36
KeybdPdd_GetEventEx2里有这么一句:
getsFromKBCTL(&ui8ScanCode, 1);
是不是就是这句实现了从SPI获取SCANCODE
然后保存在ui8ScanCode里?
longyong
驱动牛犊
驱动牛犊
  • 注册日期2002-10-27
  • 最后登录2008-04-01
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-14 10:00
自己写个独立驱动会简单很多。
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-06-14 14:42
写我可以用汇编写出来……
就是不晓得杂嵌到CE里头去
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
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);

请问类型错误在哪里呢?
dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-06-18 22:38
UINT8 *m

这是一个指针,要用*m来比较和赋值

另外,v_pIOPregs->rGPGDAT是多少位的?
sunignol
驱动牛犊
驱动牛犊
  • 注册日期2007-06-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
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错误
找里对应目录
没这个文件啊
游客

返回顶部