MyDriver - DLL_PROCESS_ATTACH
MyDriver - DEM_Init
+OALIntrEnableIrqs(1, 0x8c9902c8)
+BSPIntrEnableIrq(-1)
MyDriver - ~ DEM_Init
---------------------------------------------
下面附上我在powerbutton驱动里init函数中的代码,在这里加载就可以。
HANDLE WINAPI PWR_Init(ULONG Identifier)
{
HMODULE hmCore;
// get pointers to APIs for shutting down the system -- this is only necessary if
// we are concerned that somebody might sysgen a version of the OS that doesn't
// contain the appropriate APIs.
gpfnSetSystemPowerState = NULL;
hmCore = (HMODULE) LoadLibrary(_T("coredll.dll"));
if(hmCore == NULL)
return NULL;
gpfnSetSystemPowerState = (PFN_SetSystemPowerState) GetProcAddress(hmCore, _T("SetSystemPowerState"));
FreeLibrary(hmCore);
if (!PwrBtnSocInit(Identifier))
goto InitFailed;
g_hPwrBtnEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
g_hHTimerEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//added by me///////////////////////////////////////////
g_hWaitAppCloseEvent = CreateEvent(NULL,FALSE,FALSE,PM_POWERBTN_WAIT_APP_CLOSE_EVENT);
if(g_hPwrBtnEvent == NULL || g_hWaitAppCloseEvent == NULL)
goto InitFailed;
if (!(InterruptInitialize(g_oalSysInfo.pwrbtnInfo.dwSysIntr, g_hPwrBtnEvent, NULL, 0)))
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("PwrBUTTON INTR INIT Failed\r\n")));
goto InitFailed;
}
if(g_hPwrBtnThread == NULL)
{
g_hPwrBtnThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PwrButtonIntrThread, NULL, 0, NULL);
if ( g_hPwrBtnThread == NULL)
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("Fatal Error! Failed to create PwrButton threads.\r\n")));
goto InitFailed;
}
}
//////////////////////////////////////....added by me.......................
if (!(InterruptInitialize(SYSINTR_TIMER2, g_hHLTimerEvent, NULL, 0)))
{
RETAILMSG(1, (TEXT("SYSINTR_TIMER2 INTR INIT Failed\r\n")));
}
////////////////////////////////////................end..................
if (g_oalSysInfo.pwrbtnInfo.bCloseWmpOnSleep)
{
if (NULL == g_hCloseWmpEvent)
{
g_hCloseWmpEvent = CreateEvent(NULL,FALSE,FALSE,PM_POWERBTN_CLOSE_WMPLAYER_EVENT);
}
if (NULL == g_hCloseWmpThread)
{
g_hCloseWmpThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) CloseWmpThread, NULL, 0, NULL);
}
if (NULL == g_hCloseWmpEvent || NULL == g_hCloseWmpThread)
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("Fatal Error! Failed to create CloseWmpThread! r\n")));
goto InitFailed;
}
}
//create _T("SHARE_POWER_NOTIFY_EVENT") event, if sleep event come from extern force, will skip this time pwr
ghevNotifyEvent = CreateEvent(NULL, FALSE, FALSE, PM_POWER_NOTIFY_EVENT);
if(ghevNotifyEvent == NULL)
{
RETAILMSG(1,(TEXT("PWR_Init:: create ghevNotifyEvent failure\r\n")));
}
if ( !CeSetThreadPriority(g_hPwrBtnThread, ATLAS_THRDPRI_POWER))
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("Power Button ERROR: CeSetThreadPriority ERROR:%d\n"), GetLastError()));
goto InitFailed;
}
DEBUGMSG(DBG_ATLAS_ZONE_INIT, (TEXT("-PwrButton PWR Init\r\n")));
return g_hPwrBtnThread;
InitFailed:
PWR_Deinit(0);
return NULL;
}
--------------------------------------------
当加上红色的代码时就会出错,当然,我已经将SYSINTR_TIMER2和IRQ_TIMER2在[BSP]\kernel\oal\intr.c文件中的BSPIntrInit里静态连接上了。
这个事情困扰了好几天,还是没找出问题所在。
19 个解决方案
#1
g_hHTimerEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
InterruptInitialize(SYSINTR_TIMER2, g_hH LTimerEvent, NULL, 0)
是不是多打了一個 L??
Paul, Chao @ Techware
InterruptInitialize(SYSINTR_TIMER2, g_hH LTimerEvent, NULL, 0)
是不是多打了一個 L??
Paul, Chao @ Techware
#2
LZ,你的这个g_hHTimerEvent在哪儿使用的呢?该不会是在PwrButtonIntrThread线程里WaitForSingleObject的吧?
如果是的话那InterruptInitialize肯定会失败了~
在InterruptInitialize之前,不能使用即将关联的事件!
如果是的话那InterruptInitialize肯定会失败了~
在InterruptInitialize之前,不能使用即将关联的事件!
#3
把下面调个位置看看
//////////////////////////////////////....added by me.......................
if (!(InterruptInitialize(SYSINTR_TIMER2, g_hHLTimerEvent, NULL, 0)))
{
RETAILMSG(1, (TEXT("SYSINTR_TIMER2 INTR INIT Failed\r\n")));
}
////////////////////////////////////................end..................
if(g_hPwrBtnThread == NULL)
{
g_hPwrBtnThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PwrButtonIntrThread, NULL, 0, NULL);
if ( g_hPwrBtnThread == NULL)
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("Fatal Error! Failed to create PwrButton threads.\r\n")));
goto InitFailed;
}
}
//////////////////////////////////////....added by me.......................
if (!(InterruptInitialize(SYSINTR_TIMER2, g_hHLTimerEvent, NULL, 0)))
{
RETAILMSG(1, (TEXT("SYSINTR_TIMER2 INTR INIT Failed\r\n")));
}
////////////////////////////////////................end..................
if(g_hPwrBtnThread == NULL)
{
g_hPwrBtnThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PwrButtonIntrThread, NULL, 0, NULL);
if ( g_hPwrBtnThread == NULL)
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("Fatal Error! Failed to create PwrButton threads.\r\n")));
goto InitFailed;
}
}
#4
要不然是多了L要不然是g_hHLTimerEvent没定义。。瀑布汗。。
#5
哦,谢谢大家的帮忙,那个L不是多的,是我不小心没改掉,贴上来了。
#6
请放心,这个驱动我编译是通过的,而且我的第2个timer也已经很正常的打开和关闭。
现在的问题是我自己写的一个驱动里,init函数中如果用这个代码,编译也可以通过,就是返回-1。
下面是我的init函数中的代码,虽然我觉得很简单,但是调用就是出错。郁闷之极。
---------------------------------------------------------------------
DWORD DEM_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{
OutputDebugString(L"MyDriver - DEM_Init - Context: ");
OutputDebugString(pContext);
OutputDebugString(L"\n");
g_hHTimerEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//added by me///
if (!(InterruptInitialize(SYSINTR_TIMER2, g_hHTimerEvent, NULL, 0)))
{
OutputDebugString((L"SYSINTR_TIMER2 INIT Failed\r\n"));
}
OutputDebugString(L"MyDriver - ~ DEM_Init\n");
return 0x1234;
}
#7
这个貌似没有什么关系吧。
我理解的是,interruptinitialize的功能是启动一个中断,并且关联一个event。这个我也实验过,如果调用成功,在函数UINT32 BSPIntrEnableIrq(UINT32 irq)那里加上一个case选项,比如我这里是处理 IRQ_TIMER2,就可以加上这个来初始化。
case IRQ_TIMER2:
RETAILMSG(1, (TEXT("@@@@@@@@@@ timer2 enable @@@@@@@@@@@@@@@@@@@@\r\n")));
TIMER_LATCH = 1;
TIMER_MATCH_2 =TIMER_LATCHED_LO +1000*g_oalTimer.countsPerSysTick;//added by hl
TIMER_INT_EN = 0x4;
INT_RISC_MASK |= INT_MASK_OST2;
break;
-----------------------------------------------------------------------------------------------
这个我已经做过验证了,改过之后,编译烧写内核,这个打印信息就可以出来,timer就已经启动起来了。
#8
错误信息是什么啊?
#9
MyDriver - DLL_PROCESS_ATTACH
MyDriver - DEM_Init
+OALIntrEnableIrqs(1, 0x8c9902c8)
+BSPIntrEnableIrq(-1)
MyDriver - ~ DEM_Init
----------------------------------
上面这个就是串口出来的错误信息,interruptinitialize调用过程中产生的,也就是说在调用BSPIntrEnableIrq是传输的数据是错误的。
这个信息对应的驱动程序是6楼给出来的那段代码。
#10
1. 在 %_TARGETPLATROOT%\src\kernel\oal\intr.c BSPIntrInit() 中加入
OALIntrStaticTranslate(SYSINTR_TIMER2, IRQ_TIMER2);
或
2. 用
dwIRQ = IRQ_TIMER2;
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(dwIRQ), &dwSysIntr, sizeof(dwSysIntr), NULL)
去取得 dwSysIntr, 再 InterruptInitialize(dwSysIntr, g_hHLTimerEvent, NULL, 0)
這 2 個方法皆是令 kernel 將 SysIntr 與 Irq 產生對應關係, 可擇一使用.
Paul, Chao @ Techware
OALIntrStaticTranslate(SYSINTR_TIMER2, IRQ_TIMER2);
或
2. 用
dwIRQ = IRQ_TIMER2;
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(dwIRQ), &dwSysIntr, sizeof(dwSysIntr), NULL)
去取得 dwSysIntr, 再 InterruptInitialize(dwSysIntr, g_hHLTimerEvent, NULL, 0)
這 2 個方法皆是令 kernel 將 SysIntr 與 Irq 產生對應關係, 可擇一使用.
Paul, Chao @ Techware
#11
这个我已经加如果了。
并且我在powerbutton里的修改之后的驱动,编译之后也可以实现我的功能。现在出现的问题是,当我用自己写的那个驱动来interruptinitialize这个SYSTEM_TIMER2的时候,出现了问题。
非常感谢!第二种方法我还没有试过。
#12
第2种方法貌似是动态申请,第1种方法是静态申请SYSTEM_XXX号。我现在用的BSP,他们的手册里说如果是自己来添加中断处理的话,最好使用静态申请。
动态申请,我的BSP建议使用的函数是
DWORD irq, sysIntr;
sysIntr = OALIntrRequestSysIntr(1, &irq, OAL_INTR_TRANSLATE);
#13
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwPhoneInterruptIrqID, sizeof(DWORD), &(g_dwSpeakerSwitch), sizeof(DWORD), NULL))
{
// invalid SDIO SYSINTR value!
RETAILMSG(1, (TEXT("Error obtaining MMC CD SYSINTR value!\n")));
g_dwSpeakerSwitch = SYSINTR_UNDEFINED;
return ERROR_INVALID_DATA;
}
if(!InterruptInitialize(g_dwSpeakerSwitch, g_SpeakerSwitchEvent, NULL, 0))
{
RETAILMSG( 1,( TEXT("AMPSwitchInit: InterruptInitialize ERROR!\r\n")));
return FALSE;
}
这是一段动态申请中断和初始化的代码,建议用动态,这样不会牵一发动全身,你参考一下
{
// invalid SDIO SYSINTR value!
RETAILMSG(1, (TEXT("Error obtaining MMC CD SYSINTR value!\n")));
g_dwSpeakerSwitch = SYSINTR_UNDEFINED;
return ERROR_INVALID_DATA;
}
if(!InterruptInitialize(g_dwSpeakerSwitch, g_SpeakerSwitchEvent, NULL, 0))
{
RETAILMSG( 1,( TEXT("AMPSwitchInit: InterruptInitialize ERROR!\r\n")));
return FALSE;
}
这是一段动态申请中断和初始化的代码,建议用动态,这样不会牵一发动全身,你参考一下
#14
这个我已经加如果了。
并且我在powerbutton里的修改之后的驱动,编译之后也可以实现我的功能。现在出现的问题是,当我用自己写的那个驱动来interruptinitialize这个SYSTEM_TIMER2的时候,出现了问题。
非常感谢!第二种方法我还没有试过.
楼主是不是已经在powerbutton中使用了SYSTEM_TIMER2,并且启动时已经加载了该驱动?
如果该驱动已经工作,那你在自己的驱动中再用InterruptInitialize是会出错的。
并且我在powerbutton里的修改之后的驱动,编译之后也可以实现我的功能。现在出现的问题是,当我用自己写的那个驱动来interruptinitialize这个SYSTEM_TIMER2的时候,出现了问题。
非常感谢!第二种方法我还没有试过.
楼主是不是已经在powerbutton中使用了SYSTEM_TIMER2,并且启动时已经加载了该驱动?
如果该驱动已经工作,那你在自己的驱动中再用InterruptInitialize是会出错的。
#15
这个我已经将powerbutton卸载了!之后再加的自己编译的驱动。并且改过的powerbutton的驱动卸载后重新加载也没有问题。
#16
在CSND的搜索中找到一篇帖子,他的问题是中断号太大了,改了之后就好了。
我也将SYSTEM_TIMER2减10,在原来的基础上。然后加载后成功了!郁闷!
现在问题又出来了,为什么在powerbutton里加载没有问题,那里就不存在大于64的限制还是?!
我也将SYSTEM_TIMER2减10,在原来的基础上。然后加载后成功了!郁闷!
现在问题又出来了,为什么在powerbutton里加载没有问题,那里就不存在大于64的限制还是?!
#17
这个问题暂时先告一段落吧,因为我大概找到了解决办法,而出现的这个问题可能和BSP相关。
因为我用platform builder建立一个驱动工程的时候,工程目录是放置在 X:\WINCE500\PBWorkspaces\[PROJECT]\MYDriver,结果编译的时候不是缺少头文件,就是找不到库文件。
后来我将建立的工程目录移动到 X:\WINCE500\PLATFORM\[BSP FOLDER]\DRIVERS\MYDriver;之后再编译就什么问题也没有,而且将之前添加的头文件,库的路径全部删除,也可以编译通过。这样的话,以后我如果想编写驱动程序,就在这个目录下建立工程就可以了。
发现这个问题,是因为后来在驱动程序里我把SYSINTR_TIMER2打印出来了,结果发现数值是远小于期望的值得,后来查到原来编译的时候 _WINCEOSVER这个变量没有申明,如果不申明的话,
#if (_WINCEOSVER >= 500)
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+55)
#else
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+23)
#endif
---------------------------------------------------------------
但是为什么没有用这个环境变量,我也不太清楚。因为调用 Build OS->Open Release Directory进入command终端,这些环境变量都有,但就是编译的时候没有加载,如果在错误的目录下。搞了一大圈,微软的文档也看了不少,还是有很多不太明白的地方。
因为我用platform builder建立一个驱动工程的时候,工程目录是放置在 X:\WINCE500\PBWorkspaces\[PROJECT]\MYDriver,结果编译的时候不是缺少头文件,就是找不到库文件。
后来我将建立的工程目录移动到 X:\WINCE500\PLATFORM\[BSP FOLDER]\DRIVERS\MYDriver;之后再编译就什么问题也没有,而且将之前添加的头文件,库的路径全部删除,也可以编译通过。这样的话,以后我如果想编写驱动程序,就在这个目录下建立工程就可以了。
发现这个问题,是因为后来在驱动程序里我把SYSINTR_TIMER2打印出来了,结果发现数值是远小于期望的值得,后来查到原来编译的时候 _WINCEOSVER这个变量没有申明,如果不申明的话,
#if (_WINCEOSVER >= 500)
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+55)
#else
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+23)
#endif
---------------------------------------------------------------
但是为什么没有用这个环境变量,我也不太清楚。因为调用 Build OS->Open Release Directory进入command终端,这些环境变量都有,但就是编译的时候没有加载,如果在错误的目录下。搞了一大圈,微软的文档也看了不少,还是有很多不太明白的地方。
#18
1111111111111111111111111
#19
这个,真的和路径有关系,经常遇到这种情况,不是楼主的错
#20
#1
g_hHTimerEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
InterruptInitialize(SYSINTR_TIMER2, g_hH LTimerEvent, NULL, 0)
是不是多打了一個 L??
Paul, Chao @ Techware
InterruptInitialize(SYSINTR_TIMER2, g_hH LTimerEvent, NULL, 0)
是不是多打了一個 L??
Paul, Chao @ Techware
#2
LZ,你的这个g_hHTimerEvent在哪儿使用的呢?该不会是在PwrButtonIntrThread线程里WaitForSingleObject的吧?
如果是的话那InterruptInitialize肯定会失败了~
在InterruptInitialize之前,不能使用即将关联的事件!
如果是的话那InterruptInitialize肯定会失败了~
在InterruptInitialize之前,不能使用即将关联的事件!
#3
把下面调个位置看看
//////////////////////////////////////....added by me.......................
if (!(InterruptInitialize(SYSINTR_TIMER2, g_hHLTimerEvent, NULL, 0)))
{
RETAILMSG(1, (TEXT("SYSINTR_TIMER2 INTR INIT Failed\r\n")));
}
////////////////////////////////////................end..................
if(g_hPwrBtnThread == NULL)
{
g_hPwrBtnThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PwrButtonIntrThread, NULL, 0, NULL);
if ( g_hPwrBtnThread == NULL)
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("Fatal Error! Failed to create PwrButton threads.\r\n")));
goto InitFailed;
}
}
//////////////////////////////////////....added by me.......................
if (!(InterruptInitialize(SYSINTR_TIMER2, g_hHLTimerEvent, NULL, 0)))
{
RETAILMSG(1, (TEXT("SYSINTR_TIMER2 INTR INIT Failed\r\n")));
}
////////////////////////////////////................end..................
if(g_hPwrBtnThread == NULL)
{
g_hPwrBtnThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PwrButtonIntrThread, NULL, 0, NULL);
if ( g_hPwrBtnThread == NULL)
{
DEBUGMSG(DBG_ATLAS_ZONE_INIT | DBG_ATLAS_ZONE_ERROR, (TEXT("Fatal Error! Failed to create PwrButton threads.\r\n")));
goto InitFailed;
}
}
#4
要不然是多了L要不然是g_hHLTimerEvent没定义。。瀑布汗。。
#5
哦,谢谢大家的帮忙,那个L不是多的,是我不小心没改掉,贴上来了。
#6
请放心,这个驱动我编译是通过的,而且我的第2个timer也已经很正常的打开和关闭。
现在的问题是我自己写的一个驱动里,init函数中如果用这个代码,编译也可以通过,就是返回-1。
下面是我的init函数中的代码,虽然我觉得很简单,但是调用就是出错。郁闷之极。
---------------------------------------------------------------------
DWORD DEM_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{
OutputDebugString(L"MyDriver - DEM_Init - Context: ");
OutputDebugString(pContext);
OutputDebugString(L"\n");
g_hHTimerEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//added by me///
if (!(InterruptInitialize(SYSINTR_TIMER2, g_hHTimerEvent, NULL, 0)))
{
OutputDebugString((L"SYSINTR_TIMER2 INIT Failed\r\n"));
}
OutputDebugString(L"MyDriver - ~ DEM_Init\n");
return 0x1234;
}
#7
这个貌似没有什么关系吧。
我理解的是,interruptinitialize的功能是启动一个中断,并且关联一个event。这个我也实验过,如果调用成功,在函数UINT32 BSPIntrEnableIrq(UINT32 irq)那里加上一个case选项,比如我这里是处理 IRQ_TIMER2,就可以加上这个来初始化。
case IRQ_TIMER2:
RETAILMSG(1, (TEXT("@@@@@@@@@@ timer2 enable @@@@@@@@@@@@@@@@@@@@\r\n")));
TIMER_LATCH = 1;
TIMER_MATCH_2 =TIMER_LATCHED_LO +1000*g_oalTimer.countsPerSysTick;//added by hl
TIMER_INT_EN = 0x4;
INT_RISC_MASK |= INT_MASK_OST2;
break;
-----------------------------------------------------------------------------------------------
这个我已经做过验证了,改过之后,编译烧写内核,这个打印信息就可以出来,timer就已经启动起来了。
#8
错误信息是什么啊?
#9
MyDriver - DLL_PROCESS_ATTACH
MyDriver - DEM_Init
+OALIntrEnableIrqs(1, 0x8c9902c8)
+BSPIntrEnableIrq(-1)
MyDriver - ~ DEM_Init
----------------------------------
上面这个就是串口出来的错误信息,interruptinitialize调用过程中产生的,也就是说在调用BSPIntrEnableIrq是传输的数据是错误的。
这个信息对应的驱动程序是6楼给出来的那段代码。
#10
1. 在 %_TARGETPLATROOT%\src\kernel\oal\intr.c BSPIntrInit() 中加入
OALIntrStaticTranslate(SYSINTR_TIMER2, IRQ_TIMER2);
或
2. 用
dwIRQ = IRQ_TIMER2;
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(dwIRQ), &dwSysIntr, sizeof(dwSysIntr), NULL)
去取得 dwSysIntr, 再 InterruptInitialize(dwSysIntr, g_hHLTimerEvent, NULL, 0)
這 2 個方法皆是令 kernel 將 SysIntr 與 Irq 產生對應關係, 可擇一使用.
Paul, Chao @ Techware
OALIntrStaticTranslate(SYSINTR_TIMER2, IRQ_TIMER2);
或
2. 用
dwIRQ = IRQ_TIMER2;
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(dwIRQ), &dwSysIntr, sizeof(dwSysIntr), NULL)
去取得 dwSysIntr, 再 InterruptInitialize(dwSysIntr, g_hHLTimerEvent, NULL, 0)
這 2 個方法皆是令 kernel 將 SysIntr 與 Irq 產生對應關係, 可擇一使用.
Paul, Chao @ Techware
#11
这个我已经加如果了。
并且我在powerbutton里的修改之后的驱动,编译之后也可以实现我的功能。现在出现的问题是,当我用自己写的那个驱动来interruptinitialize这个SYSTEM_TIMER2的时候,出现了问题。
非常感谢!第二种方法我还没有试过。
#12
第2种方法貌似是动态申请,第1种方法是静态申请SYSTEM_XXX号。我现在用的BSP,他们的手册里说如果是自己来添加中断处理的话,最好使用静态申请。
动态申请,我的BSP建议使用的函数是
DWORD irq, sysIntr;
sysIntr = OALIntrRequestSysIntr(1, &irq, OAL_INTR_TRANSLATE);
#13
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwPhoneInterruptIrqID, sizeof(DWORD), &(g_dwSpeakerSwitch), sizeof(DWORD), NULL))
{
// invalid SDIO SYSINTR value!
RETAILMSG(1, (TEXT("Error obtaining MMC CD SYSINTR value!\n")));
g_dwSpeakerSwitch = SYSINTR_UNDEFINED;
return ERROR_INVALID_DATA;
}
if(!InterruptInitialize(g_dwSpeakerSwitch, g_SpeakerSwitchEvent, NULL, 0))
{
RETAILMSG( 1,( TEXT("AMPSwitchInit: InterruptInitialize ERROR!\r\n")));
return FALSE;
}
这是一段动态申请中断和初始化的代码,建议用动态,这样不会牵一发动全身,你参考一下
{
// invalid SDIO SYSINTR value!
RETAILMSG(1, (TEXT("Error obtaining MMC CD SYSINTR value!\n")));
g_dwSpeakerSwitch = SYSINTR_UNDEFINED;
return ERROR_INVALID_DATA;
}
if(!InterruptInitialize(g_dwSpeakerSwitch, g_SpeakerSwitchEvent, NULL, 0))
{
RETAILMSG( 1,( TEXT("AMPSwitchInit: InterruptInitialize ERROR!\r\n")));
return FALSE;
}
这是一段动态申请中断和初始化的代码,建议用动态,这样不会牵一发动全身,你参考一下
#14
这个我已经加如果了。
并且我在powerbutton里的修改之后的驱动,编译之后也可以实现我的功能。现在出现的问题是,当我用自己写的那个驱动来interruptinitialize这个SYSTEM_TIMER2的时候,出现了问题。
非常感谢!第二种方法我还没有试过.
楼主是不是已经在powerbutton中使用了SYSTEM_TIMER2,并且启动时已经加载了该驱动?
如果该驱动已经工作,那你在自己的驱动中再用InterruptInitialize是会出错的。
并且我在powerbutton里的修改之后的驱动,编译之后也可以实现我的功能。现在出现的问题是,当我用自己写的那个驱动来interruptinitialize这个SYSTEM_TIMER2的时候,出现了问题。
非常感谢!第二种方法我还没有试过.
楼主是不是已经在powerbutton中使用了SYSTEM_TIMER2,并且启动时已经加载了该驱动?
如果该驱动已经工作,那你在自己的驱动中再用InterruptInitialize是会出错的。
#15
这个我已经将powerbutton卸载了!之后再加的自己编译的驱动。并且改过的powerbutton的驱动卸载后重新加载也没有问题。
#16
在CSND的搜索中找到一篇帖子,他的问题是中断号太大了,改了之后就好了。
我也将SYSTEM_TIMER2减10,在原来的基础上。然后加载后成功了!郁闷!
现在问题又出来了,为什么在powerbutton里加载没有问题,那里就不存在大于64的限制还是?!
我也将SYSTEM_TIMER2减10,在原来的基础上。然后加载后成功了!郁闷!
现在问题又出来了,为什么在powerbutton里加载没有问题,那里就不存在大于64的限制还是?!
#17
这个问题暂时先告一段落吧,因为我大概找到了解决办法,而出现的这个问题可能和BSP相关。
因为我用platform builder建立一个驱动工程的时候,工程目录是放置在 X:\WINCE500\PBWorkspaces\[PROJECT]\MYDriver,结果编译的时候不是缺少头文件,就是找不到库文件。
后来我将建立的工程目录移动到 X:\WINCE500\PLATFORM\[BSP FOLDER]\DRIVERS\MYDriver;之后再编译就什么问题也没有,而且将之前添加的头文件,库的路径全部删除,也可以编译通过。这样的话,以后我如果想编写驱动程序,就在这个目录下建立工程就可以了。
发现这个问题,是因为后来在驱动程序里我把SYSINTR_TIMER2打印出来了,结果发现数值是远小于期望的值得,后来查到原来编译的时候 _WINCEOSVER这个变量没有申明,如果不申明的话,
#if (_WINCEOSVER >= 500)
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+55)
#else
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+23)
#endif
---------------------------------------------------------------
但是为什么没有用这个环境变量,我也不太清楚。因为调用 Build OS->Open Release Directory进入command终端,这些环境变量都有,但就是编译的时候没有加载,如果在错误的目录下。搞了一大圈,微软的文档也看了不少,还是有很多不太明白的地方。
因为我用platform builder建立一个驱动工程的时候,工程目录是放置在 X:\WINCE500\PBWorkspaces\[PROJECT]\MYDriver,结果编译的时候不是缺少头文件,就是找不到库文件。
后来我将建立的工程目录移动到 X:\WINCE500\PLATFORM\[BSP FOLDER]\DRIVERS\MYDriver;之后再编译就什么问题也没有,而且将之前添加的头文件,库的路径全部删除,也可以编译通过。这样的话,以后我如果想编写驱动程序,就在这个目录下建立工程就可以了。
发现这个问题,是因为后来在驱动程序里我把SYSINTR_TIMER2打印出来了,结果发现数值是远小于期望的值得,后来查到原来编译的时候 _WINCEOSVER这个变量没有申明,如果不申明的话,
#if (_WINCEOSVER >= 500)
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+55)
#else
#define SYSINTR_TN2X0A_OEM_0 (SYSINTR_FIRMWARE+23)
#endif
---------------------------------------------------------------
但是为什么没有用这个环境变量,我也不太清楚。因为调用 Build OS->Open Release Directory进入command终端,这些环境变量都有,但就是编译的时候没有加载,如果在错误的目录下。搞了一大圈,微软的文档也看了不少,还是有很多不太明白的地方。
#18
1111111111111111111111111
#19
这个,真的和路径有关系,经常遇到这种情况,不是楼主的错