wince5.0 bsp自制驱动中无法使用retailmsg打印调试信息

riyan 2009-05-05 04:37:56
【我的环境】:
友善的mini2440,用厂商提供的5.0 BSP,XP SP3 + PB5 + Wince5,自己做了一个i2c的驱动。
1.release版本下编译通过,确定不是ship版本;
2.oal下debug.c中串口相关的函数厂商也实现了:OEMInitDebugSerial()/ OEMWriteDebugLED()/ OEMWriteDebugString()/ OEMWriteDebugByte()/ OEMReadDebugByte()/ OEMClearDebugCommError(),而且指定的输出端口也是正确的:UART0
3.

想在DllEntry()函数下面case DLL_PROCESS_ATTACH分支里用retailmsg打印一些信息,来测试驱动有没有没成功加载。


【我的代码】:

...
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
//add by sy 初始化就点亮所有LED
IIC_IOControl(0, IO_CTL_LED_ALL_ON, NULL, 0, NULL, 0, NULL);
RETAILMSG(1,(TEXT("========I2C module loaded!========\r\n")));
return TRUE;
...
...

在打印串口信息之前,还点亮了所有的4个LED来验证。后来发现,LED全部亮了,表示这一段分支肯定执行到了。
但是串口没有打印我想要的信息出来(确定没有其他任何模块会做同样的全点亮动作),但是超级终端中就是没有出现我想要的信息来,只有其他模块的一些调试信息。


【实际的串口输出】:

Windows CE Firmware Init
INFO: Initializing system interrupts...
INFO: Initializing system clock(s)...
INFO: Initializing driver globals area...
SDMMC config set rGPGCON: 82a982
OEMInit Done...
Sp=ffffc7cc
NandFlash FMD_Init
NandFlash FMD_Init Done
+++PWR: Process Attach+++
>PWR_Init(602ED68)
HW_Init : GetProcAddress
HW_Init : ERROR_INVALID_PARAMETER
HW_Init : InitializeCriticalSection
HW_Init : VirtualAlloc
HW_Init : pPWR->State
HW_Init : HW_InitRegisters
HW_Init : CreateEvent
HW_Init : InterruptInitialize
HW_Init : CreateThread
HW_Init : CeSetThreadPriority
HW_Init OOCS: 0x00
HW_Init INT1: 0x00
HW_Init INT2: 0x00
HW_Init INT3: 0x00
HW_Init : Donw
<PWR_Init:0x37c80
>PWR_Open(0x37c80, 0x0, 0x3)
<PWR_Open:1
>PWR_IOControl(0x321000, 0x0, 0, 0x60379c8)
<PWR_IOControl:1
>PWR_Open(0x37c80, 0x0, 0x3)
<PWR_Open:2
PWR_Close(0x37c80)

到这里系统就启动成功了。但是没有我驱动里面想打印的东西。

我在代码中找到打印“+++PWR: Process Attach+++”的地方:bsp下的一个pwr.c文件,代码如下:

BOOL
DllEntry(
HINSTANCE hinstDll, /*@parm Instance pointer. */
DWORD dwReason, /*@parm Reason routine is called. */
LPVOID lpReserved /*@parm system parameter. */
)
{
if ( dwReason == DLL_PROCESS_ATTACH ) {
DEBUGREGISTER(hinstDll);
RETAILMSG (1, (TEXT("+++PWR: Process Attach+++\r\n")));
}

if ( dwReason == DLL_PROCESS_DETACH ) {
RETAILMSG (1, (TEXT("PWR: Process Detach\r\n")));
}

return(TRUE);
}

我把加号换成了星号*** ***,重新编译nk.bin并下载执行,然后观察串口输出,发现加号确实被替换了星号。
为什么这里也用的是retailmsg而且可以打印出消息,我的i2c驱动里面就不行呢?跪求各位大侠指点!

...全文
724 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xilangyue 2009-06-29
  • 打赏
  • 举报
回复
这个也遇到过,谢谢有这么多热心人。
riyan 2009-05-22
  • 打赏
  • 举报
回复
多谢所有参与讨论的朋友,lbiori241、guopeixin给予了很有价值的指导,惭愧的是我没能找出问题所在。
新人分数条件有限,以上两位朋友择日再谢。
riyan 2009-05-22
  • 打赏
  • 举报
回复
【结贴】按照ZTG328兄弟的建议,问题终于解决了。
厂商在platform.reg中串口段定义了3个串口,具体内容如下:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; UART0 (physical COM1 connector P1) (Serial)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF BSP_NOSERIAL !

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\COM1]
"DeviceArrayIndex"=dword:0
"Irq"=dword:03
"IoBase"=dword:50000000
"IoLen"=dword:2C
"Prefix"="COM"
"Dll"="SER2440.Dll"
"Order"=dword:0
"Priority"=dword:0
"Port"="COM1:"
"DeviceType"=dword:0 ; null modem
"FriendlyName"="S2440 COM1"
"Index"=dword:1
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\COM2] ;;add by lyc 2007/1/12
"DeviceArrayIndex"=dword:1 ;;can't use COM2
"Irq"=dword:16
"IoBase"=dword:50004000
"IoLen"=dword:2C
"Prefix"="COM"
"Dll"="SER2440.Dll"
"Order"=dword:0
"Priority"=dword:0
"Port"="COM2:" ;;use COM4 instead of COM2
"DeviceType"=dword:0 ; null modem
"FriendlyName"="S2440 COM2"
"Index"=dword:2
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\COM3] ;;add by lyc 2007/1/12
"DeviceArrayIndex"=dword:2
"Irq"=dword:17
"IoBase"=dword:50008000
"IoLen"=dword:2C
"Prefix"="COM"
"Dll"="SER2440.Dll"
"Order"=dword:0
"Priority"=dword:0
"Port"="COM3:"
"DeviceType"=dword:0 ; null modem
"FriendlyName"="S2440 COM3"
"Index"=dword:3
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
ENDIF BSP_NOSERIAL !


把上面3个串口相关的项全部注释掉之后,重新生成bin,终于看到大片调试信息了。


最后有个问题想问ZTG328兄弟,注释掉这段内容为什么就可以出调试信息了啊?虽然问题解决了,但是没弄懂是什么道理。
ZTG328 2009-05-21
  • 打赏
  • 举报
回复
在串口一的地方注释掉了 我这样设的
IF BSP_NOSERIAL !
IF 0
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\COM1]
"DeviceArrayIndex"=dword:0
"Irq"=dword:03
"IoBase"=dword:50000000
"IoLen"=dword:2C
"Prefix"="COM"
"Dll"="SER2440.Dll"
"Order"=dword:0
"Priority"=dword:0
"Port"="COM1:"
"DeviceType"=dword:0 ; null modem
"FriendlyName"="S2440 COM1"
"Index"=dword:1
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"
ENDIF
串口打印的信息就很丰富了 。你的那个bsp包要是他们最新的
因为在老的bsp中他们没有设置debug串口
guopeixin 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 riyan 的回复:]
to guopeixin: 我试了直接调用NKDbgPrintfW,还是不行。
to paul_chao: 编译dll工程的时候,配置里面有一个“dll入口函数”项,缺省指向的就是dllentry,当然也可以指向另外的函数。如果是入口指向的是dllentry,那它就是dll被加载后第一个执行的函数。打印调试信息应该跟驱动dll有没有加载成功没有直接关系吧?即使dll加载不成功,调试信息也应可用。我不明白的是怎么确认这个RETAILMSG是否在当前Dll可用呢?
[/Quote]
最后一个怀疑的地方:
在加载你的驱动的之前,会不会刚好有另外一个驱动将你Debug用的Uart口给重新初始化或者做其它用途了,简单说就是会不会另外的一个驱动也在使用你Debug用的uart口?
如果在你现在的驱动后面仍然有debug信息输出的话,那就不可能是这种原因了。
CBEMA 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 paul_chao 的回复:]
Driver 有沒有成功加載, 應該看的是 IIC_Init 有沒有被叫用, 其傳回值是否非零.

DllEntry 是做什麼用的, 我到現在還沒搞清楚, 尚請各位先進不吝指教.

Paul, Chao @ Techware
[/Quote]

应该是注册表加载驱动时候依据路径所寻找的程序入口吧。

paul_chao 2009-05-19
  • 打赏
  • 举报
回复
Driver 有沒有成功加載, 應該看的是 IIC_Init 有沒有被叫用, 其傳回值是否非零.

DllEntry 是做什麼用的, 我到現在還沒搞清楚, 尚請各位先進不吝指教.

Paul, Chao @ Techware
guopeixin 2009-05-19
  • 打赏
  • 举报
回复
如果直接调用NKDbgPrintfW呢
riyan 2009-05-19
  • 打赏
  • 举报
回复
to guopeixin: 我试了直接调用NKDbgPrintfW,还是不行。
to paul_chao: 编译dll工程的时候,配置里面有一个“dll入口函数”项,缺省指向的就是dllentry,当然也可以指向另外的函数。如果是入口指向的是dllentry,那它就是dll被加载后第一个执行的函数。打印调试信息应该跟驱动dll有没有加载成功没有直接关系吧?即使dll加载不成功,调试信息也应可用。我不明白的是怎么确认这个RETAILMSG是否在当前Dll可用呢?
riyan 2009-05-19
  • 打赏
  • 举报
回复
to ZTG328: 能说的更详细点么?是把platform.reg中所有关于COM的项都注释掉么?
ZTG328 2009-05-18
  • 打赏
  • 举报
回复
你把注册表里面的所有关于串口的选项都关闭了 或者关闭串口1的选项那样才能打印出完全的信息。因为mini2440做了debug串口和应用串口复用所以打印的信息会不全
emily_zheng 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gooogleman 的回复:]
引用 5 楼 lbiori241 的回复:
我之前做驱动的时候,也碰到过打不出log的情况,一直困扰我很久,后来解决了,总得说来就是一些细节问题,到最后你会发现这些细节很愚蠢。我总结了一些可能的原因,希望对你有帮助:

1 驱动没有被正确加载
请仔细检查相关注册表配置,如果要编进内核,还要检查BIB设置;
在DllEntry的入口处加上RETAILMSG,而不是在分支中
2 Ship Build没有关闭
3 确认RETAILMSG在当前Dll可用

[/Quote]
严重支持
riyan 2009-05-06
  • 打赏
  • 举报
回复
To heroin_z和Veabol:
我用网络传了驱动调试助手到板子上,用驱动调试助手看,我的I2C的驱动的状态是“启动”的,应该是加载成功了的。
riyan 2009-05-06
  • 打赏
  • 举报
回复

1 驱动没有被正确加载
请仔细检查相关注册表配置,如果要编进内核,还要检查BIB设置;
在DllEntry的入口处加上RETAILMSG,而不是在分支中

platform.bib中加了dll相关内容
[color=#FF0000];i2c
i2c_2440.dll $(_FLATRELEASEDIR)\i2c_2440.dll NK SH


修改了代码,在DllEntry入口处加RETAILMSG和代码,代码如下:

...
BOOL WINAPI
DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID lpvReserved)
{

//flash all led 3 times
IIC_IOControl(0, IO_CTL_LED_ALL_ON, NULL, 0, NULL, 0, NULL);
IIC_IOControl(0, IO_CTL_LED_ALL_OFF, NULL, 0, NULL, 0, NULL);

IIC_IOControl(0, IO_CTL_LED_ALL_ON, NULL, 0, NULL, 0, NULL);
IIC_IOControl(0, IO_CTL_LED_ALL_OFF, NULL, 0, NULL, 0, NULL);

IIC_IOControl(0, IO_CTL_LED_ALL_ON, NULL, 0, NULL, 0, NULL);
IIC_IOControl(0, IO_CTL_LED_ALL_OFF, NULL, 0, NULL, 0, NULL);

//print
RETAILMSG(1,(TEXT("========I2C_2440 DllEntry entered!========\r\n")));

...
...

灯是闪了若干回,一回亮暗三次,但是还是不见调试信息。[/color]


2 Ship Build没有关闭
检查了pb工程参数 "ship build" = no,source文件中没有出现ship字符串,再次确认没有打开ship模式。

3 确认RETAILMSG在当前Dll可用
这个该如何确认啊?会不会跟我“i2c_2440.dll $(_FLATRELEASEDIR)\i2c_2440.dll NK SH”在bib文件中放置的位置有关系?
我放在MODULES区域的最尾部。

另外,platform.reg中也添加了相关的配置,放在串口、网卡、LED设备配置之后,当初就是以为要等他们加载成功才行,所以把i2c的填在后面。
;;;;;;;;;;;;;;;;;;;;;;
;; add by sy
;;;;;;;;;;;;;;;;;;;;;;
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IIC]
"prefix"="IIC"
"Dll"="i2c_2440.dll"
"Index"=dword:0
"Order"=dword:1



4 确认LOG输出的地方
如果KITL关闭,则所有log信息在串口终端显示;
如果KITL打开,则有些信息在串口终端显示,有些则在VS output中显示

我的platform setting中编译选项没有把Enable KITL打勾,应该就是关闭的吧。
只打开了Enable Eboot in Memory和Enable Full Kernel。
riyan 2009-05-06
  • 打赏
  • 举报
回复
非常感谢大家的指点,我马上试试 lbiori241的建议。
现在发现友善的技术支持很不到位啊,我上qq群里问了两天都没人理
gooogleman 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lbiori241 的回复:]
我之前做驱动的时候,也碰到过打不出log的情况,一直困扰我很久,后来解决了,总得说来就是一些细节问题,到最后你会发现这些细节很愚蠢。我总结了一些可能的原因,希望对你有帮助:

1 驱动没有被正确加载
请仔细检查相关注册表配置,如果要编进内核,还要检查BIB设置;
在DllEntry的入口处加上RETAILMSG,而不是在分支中
2 Ship Build没有关闭
3 确认RETAILMSG在当前Dll可用
4 确认LOG输出的地方
如…
[/Quote]

有理,问问板子的技术支持。这个都不回答。不要买他们的了。
博说医械研发 2009-05-06
  • 打赏
  • 举报
回复
进了WINCE在注册表里看看有没有加载驱动
lbiori241 2009-05-05
  • 打赏
  • 举报
回复
我之前做驱动的时候,也碰到过打不出log的情况,一直困扰我很久,后来解决了,总得说来就是一些细节问题,到最后你会发现这些细节很愚蠢。我总结了一些可能的原因,希望对你有帮助:

1 驱动没有被正确加载
请仔细检查相关注册表配置,如果要编进内核,还要检查BIB设置;
在DllEntry的入口处加上RETAILMSG,而不是在分支中
2 Ship Build没有关闭
3 确认RETAILMSG在当前Dll可用
4 确认LOG输出的地方
如果KITL关闭,则所有log信息在串口终端显示;
如果KITL打开,则有些信息在串口终端显示,有些则在VS output中显示

从你的描述来看,我建议你再检查下1、3、4点
gooogleman 2009-05-05
  • 打赏
  • 举报
回复
莫非sources放了 SHIP_BUILD=1 ?
heroin_z 2009-05-05
  • 打赏
  • 举报
回复
你的驱动被加载了吗??

或者调试一把就知道了
加载更多回复(2)

19,502

社区成员

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

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