5637|24

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440 按键驱动问题 [复制链接]

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

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

预先谢谢各位大侠!

最新回复

结贴!  详情 回复 发表于 2009-11-13 21:42
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这种问题,我觉得问友善比较合适。
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
昨天发邮件给友善,至今无回复。

因为这三个中断号在修改后的板子上要用到,故继续在这里等待高手解答。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
自己把它写进去。。。GPIO驱动
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
在ISR 按键中断分支 加打印信息 看进没进中断啊
没进就查查GPIO设置 进了看中断流程里这三个好的和那三个不好的有什么不一样的呗
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
回楼上的,我当然是加入了打印信息才知道有没有响应的啊。

中断线程的代码也仔细看过了,几个中断的处理方式没有什么不一样,就是几个switch case,无非是case的中断号不一样而已。

哪位也有这个板子的,帮我在你自己的板子上试试那几个键,看看有没有这个问题啊。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
我就有啊 以前的bsp包没有按键的驱动,现在有更新的了,下了个新的bsp有按键驱动了,我才把新包中的按键移到老的里面 可以用 ,不过新bsp包在我板子上触摸有问题 正解决呢!!
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 
可能是驱动中没有处理那几个按键吧,如果你需要自己加上去就行了!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
lyx_wq,我用的是今年8月份的BSP啊,应该是最新的了吧,那个按键驱动也是BSP自带的。你的6个按键都试过了吗?
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

10
 
这个还真没有试!因为bsp触摸有问题的缘故。也说不清楚,贴下我的按键驱动吧!这个中断号是动态绑定的,我改过它用 静态绑定的  是可以的 ,应该没问题,你可以对照下!!!
#include
//#include
#include
//#include
#include
#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]);
                }
        }
}


 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

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);

       
        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;
}
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

12
 
1. linux跑着没有问题就是hw没问题了;
2. keyboard driver中先去检测有没有中断event产生;
3. keyevent/mounse_event是不是正确
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 
我用的BSP上的驱动代码应该和lyx_wq差不多,在这一层次上的代码应该没有多大问题,也许问题出在更底层。有人能实际按下那6个按键,检测一下吗?

友善回复了我的邮件,说什么有可能wince5中这三个按键的驱动有点问题,下次更新会解决。等于什么都没说,而且估计也没有仔细检查和验证。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

14
 
我今天晚上帮你按按,不过好像没有按键打印信息啊 ,还得修改debug.c里面的宏吧

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

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


 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
按键不好使,有可能是以下原因:
1.中断申请绑定部分出了问题。2.中断口配置不正确。3.对应的按键虚拟码实现出了问题。

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

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

16
 
给你看了  确实有问题!!!!明天改改试试!!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

17
 
是的,要修改options.h里面的宏才有打印输出。

我接触wince不久,对更深层次的驱动不太了解,如果lyx_wq能帮忙找到问题,那真是太感谢了!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 
上班时间没法搞
只能等晚上了
明天不上班,准备好好弄下
不过我也是菜鸟,相互学习吧!!!!!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

19
 
你可以先把
C:\WINCE500\PLATFORM\mini2440\Src\Kernel\Oal中
init.c里void ConfigureGPIO()函数中的
    s2440IOP->GPGCON    = 0x0480FFBA;
改成s2440IOP->GPGCON    = 0x0480ABBA;
试试
感觉这有问题
要不也太巧合了!!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

20
 
顺便问下,要打印信息  是不是还要把platform.reg中关于串口的部分注释掉
昨天开放了options。h里关于调试的宏,没成功!!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表