3000|8

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于动态加载中断流驱动 [复制链接]

1:如果加载驱动不成功 首先注意你的XXX_Open() 那3个XXX是否大写
2:对于WINCE4.2以上的版本,动态加载中断流是不成功的啊

但是我的版本是WINCE5.0,而且我大小写都注意了,我就是用CE驱动调试助手激活我的中断驱动就是不成功啊

希望大侠们指点
放出我的程序
[code]



/*******************************************************************
** 函数: DLL程序入口
** 功能: 驱动形式是DLL的
********************************************************************/
BOOL WINAPI DllEntry(HANDLE hinstDLL,
                                         DWORD  dwReason,
                                         LPVOID /* 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 ret=true;
       
        RETAILMSG(1,(TEXT("WZQ_KEY:KEY_Deinit......\r\n")));
       
        //屏蔽系统逻辑按键中断
        InterruptDisable(SYSINTR_USER_KEY);
       
        CloseHandle(g_hEINTIntrThread);

        for(int i=0; i<4; i++)
        {
                CloseHandle(g_ahKeyEvent);
        }
        //释放虚拟内存空间
        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->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 << 0x6)) | (0x2 << 0x6);        // GPG3 == EINT11
        s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x3 << 12);                // Falling-edge triggered.

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

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

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

BOOL InitInterruptThread(void)
{
        DWORD  threadID;
        DWORD  ret;

        g_hKeyEvent=CreateEvent(NULL, FALSE, FALSE, NULL);
       
        if(!g_hKeyEvent)
        {
                RETAILMSG(1,(TEXT("Fail to g_hKeyEvent=CreateEvent(NULL, FALSE, FALSE, NULL);\r\n")));
                return FALSE;
        }
       
        ret=InterruptInitialize(SYSINTR_USER_KEY, g_hKeyEvent, NULL, 0);
       
        if(!ret)
        {
                RETAILMSG(1,(TEXT("Fail to ret=InterruptInitialize(SYSINTR_USER_KEY, g_hKeyEvent, NULL, 0);\r\n")));
                return FALSE;
        }
       
        g_hEINTIntrThread=CreateThread(
                                        NULL,
                                        0,
                                        (LPTHREAD_START_ROUTINE)EintThread,
                                        0,
                                        0,
                                        &threadID
                                        );
        if(NULL == g_hEINTIntrThread)
        {
                RETAILMSG(1,(TEXT("Fail to g_hEINTIntrThread\r\n")));
                return FALSE;
        }

        RETAILMSG(1,(_T("UserKey.DLL::InterruptThread Initialized.\r\n")));
        return TRUE;
}

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

        // 1. Virtual Alloc
        EINT_InitAddress();
       
        KeyGpioInit();
       
        for(int i=0; i<4; i++)
        {
                g_ahKeyEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
        }

        if (!InitInterruptThread())
        {
        RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
        return FALSE;
    }   
       
       
        //mInitialized = TRUE;
        return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_IOControl(DWORD hOpenContext,
                                   DWORD dwCode,
                                   PBYTE pBufIn,
                                   DWORD dwLenIn,
                                   PBYTE pBufOut,
                                   DWORD dwLenOut,
                                   PDWORD pdwActualOut)
{
   
        RETAILMSG(1,(TEXT("KEY:Ioctl code = 0x%x\r\n"), dwCode));
        return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
        RETAILMSG(1,(TEXT("USERKEY: KEY_Open\r\n")));
    RETAILMSG(1,(TEXT("USERKEY: KEY_Open---------\r\n")));
        RETAILMSG(1,(TEXT("USERKEY: KEY_Open----------\r\n")));
        RETAILMSG(1,(TEXT("USERKEY: KEY_Open-----------\r\n")));
       
        return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_Close(DWORD hOpenContext)
{
        RETAILMSG(1,(TEXT("USERKEY: KEY_Close\r\n")));
        return TRUE;
}

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

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

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
        DWORD dwRet;
        uchar *pReadBuf;

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

        if(pBuffer==NULL || Count==0)
        {
                return FALSE;
        }
       
        pReadBuf=(uchar *)MapPtrToProcess(pBuffer,GetCallerProcess());
        *pReadBuf=0;

        //挂起当前线程直到有按键按下为止
        dwRet=WaitForMultipleObjects(4,g_ahKeyEvent,FALSE,INFINITE);

        if(dwRet==WAIT_OBJECT_0)
        {
                ResetEvent(g_ahKeyEvent[KEY1_EVENT]);
                *pReadBuf=KEY1_DOWN;
        }
        else if(dwRet==WAIT_OBJECT_0+1)
        {
                ResetEvent(g_ahKeyEvent[KEY2_EVENT]);
                *pReadBuf=KEY2_DOWN;       
        }
        else if(dwRet==WAIT_OBJECT_0+2)
        {
                ResetEvent(g_ahKeyEvent[KEY3_EVENT]);
                *pReadBuf=KEY3_DOWN;       
        }       
        else if(dwRet==WAIT_OBJECT_0+3)
        {
                ResetEvent(g_ahKeyEvent[KEY4_EVENT]);
                *pReadBuf=KEY4_DOWN;       
        }
        return (TRUE);
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
        RETAILMSG(1,(TEXT("USERKEY: KEY_Seek\r\n")));
        return 0;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
        RETAILMSG(1,(TEXT("USERKEY: KEY_Write\r\n")));
        return 0;
}

最新回复

多谢大家 解决:外部中断被别人占用了  详情 回复 发表于 2009-5-29 15:35
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
请大家看看 不知道哪里出错 我已经编译驱动成功的 ,以上是驱动的主要部分
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
up
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

4
 
加载到哪一步不成功,请看打印信息,你打包这个驱动能用吗?

注意在XXX_DeInit函数必须把系统中断释放,否则卸载驱动再次加载会造成一个物理中断对应多个系统中断,这样是不会响应中断的。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
怎么个不成功法?

基本上,只要注册表没错,加载应该是没问题的。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
[color=#FF0000](1)我使用驱动调试助手来加载中断的
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
驱动加载不成功和你的KEY_init函数有很大关系。
如果跟不了代码,建议在KEY_init()中插入日志打印语句,看到底是哪步有问题,定位了这个再说。


例如:

DWORD KEY_Init(DWORD dwContext)
{

RETAILMSG(1,(TEXT("KEY_Init----\r\n")));

// 1. Virtual Alloc
EINT_InitAddress();
RETAILMSG(1,(TEXT("EINT_InitAddress done...\r\n")));
KeyGpioInit();
RETAILMSG(1,(TEXT("KeyGpioInit done...\r\n")));

for(int i=0; i <4; i++)
{
g_ahKeyEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
}
RETAILMSG(1,(TEXT("Create 4 Events done...\r\n")));

if (!InitInterruptThread())
{
        RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
        return FALSE;
}

//mInitialized = TRUE;
return TRUE;
}

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
好的谢谢 我今晚会宿舍试试
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

9
 
多谢大家

解决:外部中断被别人占用了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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