3952|7

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

4.2键盘驱动 [复制链接]

有做过矩阵键盘的指导下:
在oalintr.h 添加了中断的定义,CFW.C和ARMINTI.C添加了相应的实现。
s3c2440kbd.cpp文件修改如下:
BOOL Ps2Keybd::IsrThreadProc()
{
....
extern UINT v_uiPddId;
        extern PFN_KEYBD_EVENT v_pfnKeybdEvent;

        KEYBD_IST keybdIst;
        keybdIst.hevInterrupt = m_hevInterrupt;
        keybdIst.dwSysIntr_Keybd = dwSysIntr_Keybd;
        keybdIst.uiPddId = v_uiPddId;
        keybdIst.pfnGetKeybdEvent = KeybdPdd_GetEventEx2;
        keybdIst.pfnKeybdEvent = v_pfnKeybdEvent;

        RETAILMSG(DEBUGMODE, (TEXT("IsrThreadProc Call KeybdIstLoop()\r\n")));               
        KeybdIstLoop(&keybdIst);
....
}

static UINT KeybdPdd_GetEventEx2(UINT uiPddId, UINT32 rguiScanCode[16], BOOL rgfKeyUp[16])
{
....
ui8ScanCode = (UINT8)GetKeySCode(); //add 这个是我的键盘扫描函数
    RETAILMSG(DEBUGMODE, (TEXT("[KeybdPdd_GetEventEx2] ui8ScanCode : %x\r\n"),ui8ScanCode));
    DEBUGMSG(ZONE_SCANCODES,
        (_T("%s: scan code 0x%08x, code in progress 0x%08x, previous 0x%08x\r\n"),
        pszFname, ui8ScanCode, scInProgress, scPrevious));
   
        
     scInProgress = ui8ScanCode;
....
}

BOOL Ps2Keybd::KeybdPowerOn()
这个函数进行了中断和IO的初始话,

其他的几个文件改动不打。

编译下载后出现了:
-----Call Matrix_Entry-----
Initialize Matrix ID
Ps2Keybd::Initialize
IsrThreadStart:
++KeybdDriverInitializeAddresses
Touch Init
call Ps2KeybdIsrThread:
call IsrThreadProc:
HARDWARE\DEVICEMAP\KEYBD\Priority256: 0
KEYBDCreateEventm_hevInterrupt: 2fbe4c6a
Call InterruptInitialize()
IsrThreadProc Call KeybdIstLoop()
Data Abort: Thread=8fbf6c9c Proc=8d426a08 'gwes.exe'
AKY=00000009 PC=034a5d40 RA=034a5d30 BVA=080000d4 FSR=00000007

按键没有任何反应,大家看下那里错了,谢谢了

最新回复

uping     学习  详情 回复 发表于 2009-11-5 22:51
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没人回答啊
!!!
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
产生异常自己退出DLL了

4.2和5.0 没有什么不同,只有中断申请不同而已。
我就是让4.2的键盘驱动放在5.0下运行的。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
中断初始化的问题吧,InterruptInitialize()初始化硬件管脚、中断等。
之后就进入IsrThreadStart->KeybdIstLoop等待键盘中断。

看你的信息,是KeybdIstLoop函数中,直接发生数据异常了Data Abort

  1. IsrThreadProc Call KeybdIstLoop()
  2. Data Abort: Thread=8fbf6c9c Proc=8d426a08 'gwes.exe'
  3. AKY=00000009 PC=034a5d40 RA=034a5d30 BVA=080000d4 FSR=00000007
复制代码


给你这个网址参考一下
[url=http://space.itpub.net/13771794/viewspace-520884][/url]
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢,楼上的,我参考了那文章,那问题解决了!!出现新问题了!!
static DWORD g_dwSysIntr_Keybd[MAX_HDKEY] = {SYSINTR_EINT13,SYSINTR_EINT14,SYSINTR_EINT17,SYSINTR_EINT19,SYSINTR_EINT20,SYSINTR_EINT21};
我定义的中断号

BOOL Ps2Keybd::IsrThreadProc(DWORD index)
{
        DWORD dwPriority;
        //add wy
        DWORD dwIrq_Keybd = dwIrq_Keybdbuf[index];
//        HANDLE m_hevInterrupt;
    RETAILMSG(DEBUGMODE, (TEXT("call IsrThreadProc:\r\n")));

        // look for our priority in the registry -- this routine sets it to zero if
        // it can't find it.
        ReadRegDWORD( TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("Priority256"), &dwPriority );
    RETAILMSG(DEBUGMODE, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\Priority256: %x\r\n"), dwPriority));       

        if(dwPriority == 0) {
//                dwPriority = 145;        // default value is 145
                dwPriority = 240;        // default value is 145
        }
//    RETAILMSG(DEBUGMODE, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\Priority256: %x\r\n"), dwPriority));       

    DEBUGMSG(1, (TEXT("IsrThreadProc:\r\n")));
    m_hevInterrupt = CreateEvent(NULL,FALSE,FALSE,NULL);
    if (m_hevInterrupt == NULL) {
        DEBUGMSG(1, (TEXT("IsrThreadProc: InterruptInitialize\r\n")));
                goto leave;
        }
    RETAILMSG(DEBUGMODE, (TEXT("KEYBD\CreateEvent\m_hevInterrupt: %x\r\n"), m_hevInterrupt ));

        //ReadRegDWORD( TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("SysIntr"), &dwSysIntr_Keybd );
//    RETAILMSG(DEBUGMODE, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\SysIntr: %x\r\n"),  dwSysIntr_Keybd));


/*#if        0
while (1)
{
        if ( WaitForSingleObject(m_hevInterrupt, INFINITE) == WAIT_TIMEOUT )
                DEBUGMSG(1, (TEXT("timeout\r\n")));               
        else
                DEBUGMSG(1, (TEXT("I got one\r\n")));
        InterruptDone(dwSysIntr_Keybd);
}
#endif*/
        if (!InterruptInitialize(g_dwSysIntr_Keybd[index],m_hevInterrupt,NULL,0)) {
                RETAILMSG(1, (TEXT("IsrThreadProc: KeybdInterruptEnable\r\n")));
                goto leave;
        }
        RETAILMSG(1,(TEXT("[KBD]m_hevInterrupt[%d]=0x%08x,irq=%d,sysIntr=%        d\r\n"),index,m_hevInterrupt,dwIrq_Keybd,g_dwSysIntr_Keybd[index]));

        // update the IST priority
        CeSetThreadPriority(GetCurrentThread(), (int)dwPriority);

        extern UINT v_uiPddId;
        extern PFN_KEYBD_EVENT v_pfnKeybdEvent;

        KEYBD_IST keybdIst;
        keybdIst.hevInterrupt = m_hevInterrupt;
        keybdIst.dwSysIntr_Keybd = g_dwSysIntr_Keybd[index]; //dwSysIntr_Keybd;
        keybdIst.uiPddId = v_uiPddId;
        keybdIst.pfnGetKeybdEvent = KeybdPdd_GetEventEx2;
        keybdIst.pfnKeybdEvent = v_pfnKeybdEvent;

        RETAILMSG(DEBUGMODE, (TEXT("IsrThreadProc Call KeybdIstLoop()\r\n")));               
        KeybdIstLoop(&keybdIst);

leave:
    return 0;
}

DWORD Ps2KeybdIsrThread(Ps2Keybd *pp2k)
{
        DEBUGMSG(1,(TEXT("Ps2KeybdIsrThread:\r\n")));
        RETAILMSG(DEBUGMODE,(TEXT("call Ps2KeybdIsrThread:\r\n")));

        pp2k->IsrThreadProc(pp2k->key_index);
        return 0;
}

BOOL Ps2Keybd::IsrThreadStart()
{
        HANDLE        hthrd;

        DEBUGMSG(1,(TEXT("IsrThreadStart:\r\n")));
        while((key_index<(MAX_HDKEY))&&(key_index>=0))
        {
               
        hthrd = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Ps2KeybdIsrThread,this,0,NULL);
        //        Since we don't need the handle, close it now.
        CloseHandle(hthrd);
        Sleep(1);
        key_index ++;
        }
        return TRUE;
}

只有SYSINTR_EINT13 调用InterruptInitialize()成功,其他的全失败了,和SYSINTR_EINT13在数组中的位置无关,在CFW.C和arminit.c中它们的相应实现时一样的啊,为什么啊,有其他好的方法实现矩阵键盘的吗?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
怎么没人给个消息啊
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

7
 
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋為悧鐘汇€侀弴銏犖ч柛鈩冦仦缁剝淇婇悙顏勨偓鏍礉瑜忕划濠氬箣閻樺樊妫滈梺绉嗗嫷娈曢柣鎾存礋閺岀喖鏌囬敃鈧悘閬嶆煕閵堝拋鍎旈柡灞诲€濆鍫曞箰鎼粹€叉樊闂備礁鎼張顒傜矙閹达箑鐓″璺号堥弸搴ㄦ煙闁箑鏋ら柍璇茬箻濮婅櫣鎷犻幓鎺濆妷闂佺厧缍婄粻鏍婵炴潙鍚嬪ḿ娆愵攰闂備礁鎲″ú锕傚垂閹殿喚涓嶉柟鎯板Г閻撴洟鏌嶉埡浣告殧濞寸媴绠戦…璺ㄦ喆閸曨剛顦紓浣介哺閹瑰洤鐣烽幒鎴旀瀻闁瑰瓨绻傞‖澶嬩繆閻愵亜鈧垿宕濈仦杞挎稑鈹戠€n亝鐎梺鍛婂姦閸犳牠锝為崨瀛樼厽婵☆垵娅f禒娑欑箾閸喎鍔ら柍瑙勫灦楠炲﹪鏌涙繝鍐╃妤犵偛锕ラ幆鏃堝閻樻彃顫婇梻鍌氬€搁崐椋庣矆娓氣偓閹潡宕惰濞存牠鏌曟繛褍鎳愰悞鍏肩箾鏉堝墽绉い顐㈩樀瀹曪綀绠涘☉娆戝帾闂佸壊鍋呯换宥呂hぐ鎺撶厽闁规崘娉涢弸娑㈡煛瀹€瀣埌妞ゎ偅绮撻崺鈧い鎺嶈兌椤╂煡鎮规潪鎷岊劅闁诲骸鐖奸弻锝夊箣閿濆憛鎾绘煟閹惧瓨绀嬮柡宀嬬節瀹曟帒鈹戦崶鈹库偓濠勭磽娴e搫啸缂侇噮鍨舵俊鐢稿礋椤栨凹娼婇梺鎸庣☉鐎氼參宕抽弶璇炬棃鎮╅棃娑楃捕濡炪倖鍨甸ˇ闈涱嚕椤愶箑纾奸柣鎰綑濞堢喖姊洪棃娑辨濠碘€虫穿閵囨劙濡搁埡鍌楁嫼闁荤姴娲﹂悡锟狀敁濡ゅ懏鐓曟俊顖濆吹閻帞鈧娲橀崹鍧楃嵁濡偐纾兼俊顖滃帶楠炲牓姊绘担鍝ョШ闁稿锕畷銏$附缁嬭法顦梺闈涚墕濡稓绮绘ィ鍐╃厱妞ゆ劦鍋勬晶顖炴倵濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞妞ゆ帊绀侀崜顓烆渻閵堝棗濮х紒鐘冲灴閻涱噣濮€閵堝棛鍘撻柡澶屽仦婢瑰棝宕濆鍡愪簻闁哄倸鐏濋顐ょ磼鏉堛劍宕岀€规洘甯掗~婵嬵敄閽樺澹曢梺鍛婄缚閸庢娊鎯屽▎鎾寸厱闁哄洢鍔岄悘鐘电磼閻欌偓閸ㄥ爼寮婚妸鈺傚亞闁稿本绋戦锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸ゅ嫰鏌涢锝嗙缂佺姷濞€閺岀喖宕滆鐢盯鏌涚€c劌鈧繈寮婚弴鐔虹闁绘劦鍓氶悵鏇㈡⒑缁嬫鍎忔い鎴濐樀瀵鏁愭径濠勭杸濡炪倖甯婇悞锕傚磿閹剧粯鈷戠紓浣姑粭鎺楁煟韫囨柨鍝哄┑锛勬暬瀹曠喖顢涘槌栧敽闂備浇顫夐幆宀勫垂闁秴鏋佸Δ锝呭暞閻撶喖骞栧ǎ顒€鐏柛鐔哥叀閺岀喖宕欓妶鍡楊伓濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌熼梻瀵割槮缁惧墽绮换娑㈠箣閺冣偓閸ゅ秹鏌涢妷顔煎⒒闁轰礁娲弻鏇$疀閺囩倫銉︺亜閿旇娅嶉柟顔筋殜瀹曟寰勬繝浣割棜闂傚倷绀侀幉鈥趁洪敃鍌氱;濠㈣埖鍔曢弰銉╂煟閹邦喖鍔嬮柍閿嬪灴閹綊骞侀幒鎴濐瀳濠电偛鎳忛崝娆撳蓟閻旂厧绀勯柕鍫濇椤忥拷
 
 
 

回复

62

帖子

0

TA的资源

禁止发言

8
 
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋為悧鐘汇€侀弴銏犖ч柛鈩冦仦缁剝淇婇悙顏勨偓鏍礉瑜忕划濠氬箣閻樺樊妫滈梺绉嗗嫷娈曢柣鎾存礋閺岀喖鏌囬敃鈧悘閬嶆煕閵堝拋鍎旈柡灞诲€濆鍫曞箰鎼粹€叉樊闂備礁鎼張顒傜矙閹达箑鐓″璺号堥弸搴ㄦ煙闁箑鏋ら柍璇茬箻濮婅櫣鎷犻幓鎺濆妷闂佺厧缍婄粻鏍婵炴潙鍚嬪ḿ娆愵攰闂備礁鎲″ú锕傚垂閹殿喚涓嶉柟鎯板Г閻撴洟鏌嶉埡浣告殧濞寸媴绠戦…璺ㄦ喆閸曨剛顦紓浣介哺閹瑰洤鐣烽幒鎴旀瀻闁瑰瓨绻傞‖澶嬩繆閻愵亜鈧垿宕濈仦杞挎稑鈹戠€n亝鐎梺鍛婂姦閸犳牠锝為崨瀛樼厽婵☆垵娅f禒娑欑箾閸喎鍔ら柍瑙勫灦楠炲﹪鏌涙繝鍐╃妤犵偛锕ラ幆鏃堝閻樻彃顫婇梻鍌氬€搁崐椋庣矆娓氣偓閹潡宕惰濞存牠鏌曟繛褍鎳愰悞鍏肩箾鏉堝墽绉い顐㈩樀瀹曪綀绠涘☉娆戝帾闂佸壊鍋呯换宥呂hぐ鎺撶厽闁规崘娉涢弸娑㈡煛瀹€瀣埌妞ゎ偅绮撻崺鈧い鎺嶈兌椤╂煡鎮规潪鎷岊劅闁诲骸鐖奸弻锝夊箣閿濆憛鎾绘煟閹惧瓨绀嬮柡宀嬬節瀹曟帒鈹戦崶鈹库偓濠勭磽娴e搫啸缂侇噮鍨舵俊鐢稿礋椤栨凹娼婇梺鎸庣☉鐎氼參宕抽弶璇炬棃鎮╅棃娑楃捕濡炪倖鍨甸ˇ闈涱嚕椤愶箑纾奸柣鎰綑濞堢喖姊洪棃娑辨濠碘€虫穿閵囨劙濡搁埡鍌楁嫼闁荤姴娲﹂悡锟狀敁濡ゅ懏鐓曟俊顖濆吹閻帞鈧娲橀崹鍧楃嵁濡偐纾兼俊顖滃帶楠炲牓姊绘担鍝ョШ闁稿锕畷銏$附缁嬭法顦梺闈涚墕濡稓绮绘ィ鍐╃厱妞ゆ劦鍋勬晶顖炴倵濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞妞ゆ帊绀侀崜顓烆渻閵堝棗濮х紒鐘冲灴閻涱噣濮€閵堝棛鍘撻柡澶屽仦婢瑰棝宕濆鍡愪簻闁哄倸鐏濋顐ょ磼鏉堛劍宕岀€规洘甯掗~婵嬵敄閽樺澹曢梺鍛婄缚閸庢娊鎯屽▎鎾寸厱闁哄洢鍔岄悘鐘电磼閻欌偓閸ㄥ爼寮婚妸鈺傚亞闁稿本绋戦锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸ゅ嫰鏌涢锝嗙缂佺姷濞€閺岀喖宕滆鐢盯鏌涚€c劌鈧繈寮婚弴鐔虹闁绘劦鍓氶悵鏇㈡⒑缁嬫鍎忔い鎴濐樀瀵鏁愭径濠勭杸濡炪倖甯婇悞锕傚磿閹剧粯鈷戠紓浣姑粭鎺楁煟韫囨柨鍝哄┑锛勬暬瀹曠喖顢涘槌栧敽闂備浇顫夐幆宀勫垂闁秴鏋佸Δ锝呭暞閻撶喖骞栧ǎ顒€鐏柛鐔哥叀閺岀喖宕欓妶鍡楊伓濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌熼梻瀵割槮缁惧墽绮换娑㈠箣閺冣偓閸ゅ秹鏌涢妷顔煎⒒闁轰礁娲弻鏇$疀閺囩倫銉︺亜閿旇娅嶉柟顔筋殜瀹曟寰勬繝浣割棜闂傚倷绀侀幉鈥趁洪敃鍌氱;濠㈣埖鍔曢弰銉╂煟閹邦喖鍔嬮柍閿嬪灴閹綊骞侀幒鎴濐瀳濠电偛鎳忛崝娆撳蓟閻旂厧绀勯柕鍫濇椤忥拷
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后2天:ADI 最新低功耗 MCU 及其解决方案详解
直播时间:3月20日(本周四) 上午10:00
活动奖励:双肩包、充电宝、小夜灯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表