2440 按键驱动问题

whgoplayer 2009-11-10 11:52:20
Mini2440的板子,WINCE 5.0,板子上有6个测试按键,并且BSP里自带了驱动。现在的问题是,板子上的6个按键只有三个是有效的,而另外三个按键没有任何反应。这几个无效按键所对应的IRQ分别为IRQ_EINT13,IRQ_EINT14,IRQ_EINT15。我搜了一下,似乎板子上其它的驱动里没有使用这几个中断号,到底是怎么回事呢?

另外,板子的硬件部分应该没有什么问题,因为我换装linux后,测试出这几个按键都是可用的。

预先谢谢各位大侠!
...全文
538 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyx_wq 2009-11-13
  • 打赏
  • 举报
回复
上班时间没法搞
只能等晚上了
明天不上班,准备好好弄下
不过我也是菜鸟,相互学习吧!!!!!
whgoplayer 2009-11-13
  • 打赏
  • 举报
回复
是的,要修改options.h里面的宏才有打印输出。

我接触wince不久,对更深层次的驱动不太了解,如果lyx_wq能帮忙找到问题,那真是太感谢了!
whgoplayer 2009-11-13
  • 打赏
  • 举报
回复
结贴!
lyx_wq 2009-11-13
  • 打赏
  • 举报
回复
呵呵 可以结贴了 别忘记给分哦!!!^_^
whgoplayer 2009-11-13
  • 打赏
  • 举报
回复
严重感谢lyx_wq大侠!!!

试过了,确实把那两行去掉就可以了。看来还是其它的驱动程序用到同样的端口造成了干扰。当初就有这个担心,但是只用IRQ_EINT13,IRQ_EINT14,IRQ_EINT15作为关键字来搜索,而没有用GPG5, GPG6, GPG7来搜索,造成了遗漏。关于那个打印输出的问题,可能我在注册表哪个地方也修改过,不记得了。

再次对lyx_wq表示感谢,同时也感谢其他各位给我提出建议的同学!
lyx_wq 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 whgoplayer 的回复:]
要打印信息,我这里是把#define KITL_SERIAL_UART0开放,其它几个KITL_XXX全部注释起来,可以使用。
[/Quote]
那个我试了 不可以用 进不去系统 死到那里了
不过好像把注册表里的串口内容 注释掉 可以
lyx_wq 2009-11-13
  • 打赏
  • 举报
回复
搞定了
在C:\WINCE500\PLATFORM\mini2440\Src\Drivers\Keybd\Kbdcommon的
s3c2440kbd.cpp中把BOOL Ps2Keybd::KeybdPowerOn()函数中的
v_pIOPregs->GPGCON &= ~((0x3 << 10) | (0x3 << 12) | (0x3 << 14));// Clear GPG5,6,7
v_pIOPregs->GPGCON |= ((0x3 << 10) | (0x3 << 12) | (0x3 << 14));
注释掉就可以了
原因应该是
内核启动过程中 先进入 KEY_Init()函数 又进入 这个函数 结果IO脚配置被改掉了
你可以在这两个函数分别加打印信息看看 是不是这个顺序验证下

我的现在按键是可以用了 要把打印信息调出来!
GOOD LUCK!!
whgoplayer 2009-11-13
  • 打赏
  • 举报
回复
要打印信息,我这里是把#define KITL_SERIAL_UART0开放,其它几个KITL_XXX全部注释起来,可以使用。
lyx_wq 2009-11-13
  • 打赏
  • 举报
回复
顺便问下,要打印信息 是不是还要把platform.reg中关于串口的部分注释掉
昨天开放了options。h里关于调试的宏,没成功!!
lyx_wq 2009-11-13
  • 打赏
  • 举报
回复
你可以先把
C:\WINCE500\PLATFORM\mini2440\Src\Kernel\Oal中
init.c里void ConfigureGPIO()函数中的
s2440IOP->GPGCON = 0x0480FFBA;
改成s2440IOP->GPGCON = 0x0480ABBA;
试试
感觉这有问题
要不也太巧合了!!
lyx_wq 2009-11-12
  • 打赏
  • 举报
回复
给你看了 确实有问题!!!!明天改改试试!!
larryk 2009-11-12
  • 打赏
  • 举报
回复
按键不好使,有可能是以下原因:
1.中断申请绑定部分出了问题。2.中断口配置不正确。3.对应的按键虚拟码实现出了问题。

这个你可以通过打印信息看中断口的UDP,CON等寄存器的配置是否正确,测一下中断口的电平是否正常。
另外,确认一下每个中断来了,是否都进入了中断ISR。如果都进入ISR了,那识别按键的部分出没出问题??最后,如果上面的都没有问题,那就要搞清楚虚拟码实现的部分的代码了。

lyx_wq 2009-11-12
  • 打赏
  • 举报
回复
我今天晚上帮你按按,不过好像没有按键打印信息啊 ,还得修改debug.c里面的宏吧

RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to create event.\r\n")));不能用的吧

你怎么整的。只是把 options.h里#define KITL_SERIAL_UART0 去掉注释就可以了吧?


whgoplayer 2009-11-12
  • 打赏
  • 举报
回复
我用的BSP上的驱动代码应该和lyx_wq差不多,在这一层次上的代码应该没有多大问题,也许问题出在更底层。有人能实际按下那6个按键,检测一下吗?

友善回复了我的邮件,说什么有可能wince5中这三个按键的驱动有点问题,下次更新会解决。等于什么都没说,而且估计也没有仔细检查和验证。
gooogleman 2009-11-11
  • 打赏
  • 举报
回复
这种问题,我觉得问友善比较合适。
guopeixin 2009-11-11
  • 打赏
  • 举报
回复
1. linux跑着没有问题就是hw没问题了;
2. keyboard driver中先去检测有没有中断event产生;
3. keyevent/mounse_event是不是正确
lyx_wq 2009-11-11
  • 打赏
  • 举报
回复

void Virtual_Alloc()
{

// GPIO Virtual alloc
s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440IOP == NULL) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy failed!\r\n")));
}
}


// Interrupt Virtual alloc
s2440INT = (volatile INTreg *) VirtualAlloc(0,sizeof(INTreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440INT == NULL) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440INT,(PVOID)(INT_BASE),sizeof(INTreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualCopy failed!\r\n")));
}
}

}


BOOL WINAPI
DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID Reserved/* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}

return TRUE;
}


BOOL KEY_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;

RETAILMSG(1,(TEXT("USERKEY: KEY_Deinit\r\n")));

// s2440INT->rINTMSK |= BIT_EINT8_23;
for (int i=0; i<6; i++)
InterruptDisable(g_KeySysIntr[i]);


CloseHandle(KeyThread);
CloseHandle(KeyEvent);
VirtualFree((void*)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
VirtualFree((void*)s2440INT, sizeof(INTreg), MEM_RELEASE);

return TRUE;
}






BOOL KeyGpioInit()
{
RETAILMSG(1,(TEXT("Key_Gpio_Setting----\r\n")));
s2440IOP->rGPGUP = 0xffff;
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPG0 == EINT8
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 0)) | (0x3 << 0); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 6)) | (0x2 << 6); // GPG3 == EINT11
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x3 << 12); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10); // GPG5 == EINT13
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 20)) | (0x3 << 20); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 12)) | (0x2 << 12); // GPG6 == EINT14
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 24)) | (0x3 << 24); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 14)) | (0x2 << 14); // GPG7 == EINT15
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 28)) | (0x3 << 28); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 22)) | (0x2 << 22); // GPG11 == EINT19
s2440IOP->rEXTINT2 = (s2440IOP->rEXTINT2 & ~(0x7<< 12)) | (0x3 << 12); // Falling-edge triggered.
return TRUE;
}




DWORD KEY_Init(DWORD dwContext)
{
DWORD threadID; // thread ID
RETAILMSG(1,(TEXT("KEY_Init----\r\n")));

// 1. Virtual Alloc
Virtual_Alloc();

KeyGpioInit();

KeyThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)UserKeyProcessThread,
0,
0,
&threadID);

if (NULL == KeyThread ) {
RETAILMSG(1,(TEXT("ERROR: failed to Create Key Thread!\r\n")));
return FALSE;
}

return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{

return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_Close(DWORD hOpenContext)
{
return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerDown(DWORD hDeviceContext)
{

}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerUp(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_PowerUp\r\n")));
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_Read\r\n")));
return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
return 0;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
return 0;
}
lyx_wq 2009-11-11
  • 打赏
  • 举报
回复
这个还真没有试!因为bsp触摸有问题的缘故。也说不清楚,贴下我的按键驱动吧!这个中断号是动态绑定的,我改过它用 静态绑定的 是可以的 ,应该没问题,你可以对照下!!!
#include <windows.h>
//#include <ceddk.h>
#include <nkintr.h>
//#include <oalintr.h>
#include <pm.h>
#include "pmplatform.h"
#include "Pkfuncs.h"
#include "s2440.h"


volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
volatile INTreg *s2440INT = (INTreg *)INT_BASE;
UINT32 g_KeySysIntr[6];
HANDLE KeyThread;
HANDLE KeyEvent;

void Virtual_Alloc(); // Virtual allocation
DWORD UserKeyProcessThread(void);
DWORD UserKeyProcessThread(void)
{
UINT32 IRQ;

KeyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!KeyEvent) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to create event.\r\n")));
return FALSE;
}

IRQ = 36; //IRQ_EINT8;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[0], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 39; //IRQ_EINT11;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[1], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 41; //IRQ_EINT13;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[2], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 42; //IRQ_EINT14;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[3], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 43; //IRQ_EINT15;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[4], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 47; //IRQ_EINT19;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[5], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}





if (!InterruptInitialize(g_KeySysIntr[0], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}

if (!InterruptInitialize(g_KeySysIntr[1], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[2], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[3], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[4], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[5], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}





while(1)
{
WaitForSingleObject(KeyEvent, INFINITE);
RETAILMSG(0,(L"EINTMASK=%X, rGPGCON=%X\r\n", s2440IOP->rEINTMASK, s2440IOP->rGPGCON));

//EINT8 - K1 - VK_TAB - 0x09
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
RETAILMSG(1,(TEXT("[Key1 - TAB]\r\n")));
keybd_event(VK_TAB ,0x09, 0, 0);
Sleep(30);
keybd_event(VK_TAB ,0x09, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[0]);
}

//EINT11 - K2 - VK_UP - 0x26
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<11))
{
RETAILMSG(1,(TEXT("[Key2 - UP]\r\n")));
keybd_event(VK_UP ,0x26, 0, 0);
Sleep(30);
keybd_event(VK_UP ,0x26, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[1]);

}

//EINT13 - K3 - VK_RETURN - 0x0D
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<13))
{
RETAILMSG(1,(TEXT("[K3 - RETURN]\r\n")));
keybd_event(VK_RETURN ,0x0D, 0, 0);
Sleep(30);
keybd_event(VK_RETURN ,0x0D, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[2]);

}

//EINT14 - K4 - VK_DOWN - 0x28
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<14))
{
RETAILMSG(1,(TEXT("[K4 - DONW]\r\n")));
keybd_event(VK_DOWN ,0x28, 0, 0);
Sleep(30);
keybd_event(VK_DOWN ,0x28, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[3]);

}

//EINT15 - K5 - VK_LEFT - 0x25
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<15))
{
RETAILMSG(1,(TEXT("[K5 - LEFT]\r\n")));
keybd_event(VK_LEFT ,0x25, 0, 0);
Sleep(30);
keybd_event(VK_LEFT ,0x25, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[4]);

}

//EINT19 - K6 - VK_RIGHT - 0x27
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<19))
{
RETAILMSG(1,(TEXT("[K6 - RIGHT]\r\n")));
keybd_event(VK_RIGHT ,0x27, 0, 0);
Sleep(30);
keybd_event(VK_RIGHT ,0x27, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[5]);
}
}
}


whgoplayer 2009-11-11
  • 打赏
  • 举报
回复
lyx_wq,我用的是今年8月份的BSP啊,应该是最新的了吧,那个按键驱动也是BSP自带的。你的6个按键都试过了吗?
博说医械研发 2009-11-11
  • 打赏
  • 举报
回复
可能是驱动中没有处理那几个按键吧,如果你需要自己加上去就行了!
加载更多回复(5)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧