社区导航

 

搜索
查看: 8393|回复: 22
打印 上一主题 下一主题

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

[复制链接]

108

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

跳转到指定楼层
楼主
发表于 2009-5-5 16:37 | 只看该作者 |倒序浏览 |阅读模式
【我的环境】:
友善的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_Open(0x37c80, 0x0, 0x3)
>PWR_IOControl(0x321000, 0x0, 0, 0x60379c8)
>PWR_Open(0x37c80, 0x0, 0x3)
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驱动里面就不行呢?跪求各位大侠指点!

此帖出自WindowsCE论坛
0

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

沙发
发表于 2009-5-5 17:11 | 只看该作者
会不会是你的sources文件缺少了一些库

102

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

板凳
发表于 2009-5-5 17:23 | 只看该作者
我跟可以打印串口的pwrbtn_pcf模块比较过,库都是一样的。而且缺少库的话链接的时候就过不了

100

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

4
发表于 2009-5-5 18:28 | 只看该作者
你的驱动被加载了吗??

或者调试一把就知道了

87

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

5
发表于 2009-5-5 18:37 | 只看该作者
莫非sources放了 SHIP_BUILD=1 ?

103

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

6
发表于 2009-5-5 18:43 | 只看该作者
我之前做驱动的时候,也碰到过打不出log的情况,一直困扰我很久,后来解决了,总得说来就是一些细节问题,到最后你会发现这些细节很愚蠢。我总结了一些可能的原因,希望对你有帮助:

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

从你的描述来看,我建议你再检查下1、3、4点

91

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

7
发表于 2009-5-6 09:21 | 只看该作者
进了WINCE在注册表里看看有没有加载驱动

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

8
发表于 2009-5-6 09:28 | 只看该作者
引用 5 楼 lbiori241 的回复:
我之前做驱动的时候,也碰到过打不出log的情况,一直困扰我很久,后来解决了,总得说来就是一些细节问题,到最后你会发现这些细节很愚蠢。我总结了一些可能的原因,希望对你有帮助:

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


有理,问问板子的技术支持。这个都不回答。不要买他们的了。

103

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

9
发表于 2009-5-6 09:36 | 只看该作者
非常感谢大家的指点,我马上试试 lbiori241的建议。
现在发现友善的技术支持很不到位啊,我上qq群里问了两天都没人理

107

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

10
发表于 2009-5-6 10:26 | 只看该作者

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

platform.bib中加了dll相关内容
;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")));

...
...

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



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。

103

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

11
发表于 2009-5-6 10:30 | 只看该作者
To heroin_z和Veabol:
我用网络传了驱动调试助手到板子上,用驱动调试助手看,我的I2C的驱动的状态是“启动”的,应该是加载成功了的。

108

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

12
发表于 2009-5-18 15:13 | 只看该作者
引用 7 楼 gooogleman 的回复:
引用 5 楼 lbiori241 的回复:
我之前做驱动的时候,也碰到过打不出log的情况,一直困扰我很久,后来解决了,总得说来就是一些细节问题,到最后你会发现这些细节很愚蠢。我总结了一些可能的原因,希望对你有帮助:

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

严重支持

67

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

13
发表于 2009-5-18 20:21 | 只看该作者
你把注册表里面的所有关于串口的选项都关闭了 或者关闭串口1的选项那样才能打印出完全的信息。因为mini2440做了debug串口和应用串口复用所以打印的信息会不全

114

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

14
发表于 2009-5-19 10:48 | 只看该作者
如果直接调用NKDbgPrintfW呢

118

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

15
发表于 2009-5-19 11:03 | 只看该作者
Driver 有沒有成功加載, 應該看的是 IIC_Init 有沒有被叫用, 其傳回值是否非零.

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

Paul, Chao @ Techware

100

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

16
发表于 2009-5-19 11:47 | 只看该作者
引用 14 楼 paul_chao 的回复:
Driver 有沒有成功加載, 應該看的是 IIC_Init 有沒有被叫用, 其傳回值是否非零.

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

Paul, Chao @ Techware


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


105

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

17
发表于 2009-5-19 17:09 | 只看该作者
to ZTG328: 能说的更详细点么?是把platform.reg中所有关于COM的项都注释掉么?

117

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

18
发表于 2009-5-19 17:20 | 只看该作者
to guopeixin: 我试了直接调用NKDbgPrintfW,还是不行。
to paul_chao: 编译dll工程的时候,配置里面有一个“dll入口函数”项,缺省指向的就是dllentry,当然也可以指向另外的函数。如果是入口指向的是dllentry,那它就是dll被加载后第一个执行的函数。打印调试信息应该跟驱动dll有没有加载成功没有直接关系吧?即使dll加载不成功,调试信息也应可用。我不明白的是怎么确认这个RETAILMSG是否在当前Dll可用呢?

110

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

19
发表于 2009-5-21 20:33 | 只看该作者
引用 17 楼 riyan 的回复:
to guopeixin: 我试了直接调用NKDbgPrintfW,还是不行。
to paul_chao: 编译dll工程的时候,配置里面有一个“dll入口函数”项,缺省指向的就是dllentry,当然也可以指向另外的函数。如果是入口指向的是dllentry,那它就是dll被加载后第一个执行的函数。打印调试信息应该跟驱动dll有没有加载成功没有直接关系吧?即使dll加载不成功,调试信息也应可用。我不明白的是怎么确认这个RETAILMSG是否在当前Dll可用呢?

最后一个怀疑的地方:
在加载你的驱动的之前,会不会刚好有另外一个驱动将你Debug用的Uart口给重新初始化或者做其它用途了,简单说就是会不会另外的一个驱动也在使用你Debug用的uart口?
如果在你现在的驱动后面仍然有debug信息输出的话,那就不可能是这种原因了。

110

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

20
发表于 2009-5-21 20:38 | 只看该作者
在串口一的地方注释掉了  我这样设的
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串口

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

关闭

站长推荐上一条 1/3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( )

GMT+8, 2020-4-7 23:58 , Processed in 0.549530 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表
足球投注注册送彩金 三亚赌博送彩金 彩票大赢家开奖 爱彩送彩金 鼎盛赛车机器人 充值送彩金活动 澳客彩票 彩票大赢家 棋牌娱乐app送彩金 棋牌游戏送彩金38