WINCE 串口驱动初始化后,会自动执行打开吗?

riccdw421 2010-04-14 06:12:48
OS:WINCE 6.0
HW:PXA310
问题描述:
COM1:用作调试信息输出口
COM2:用作蓝牙通信口

串口程序:PUBLIC\COMMON\OAK\DRIVERS\SERIAL\COM_MDD2

通过打印信息如下:

+COM_Init...

+COM_Open handle 0xD28173C0, access 0x0, share 0x3 //BTUART Driver 未执行CreateFile(L"COM2:"...)

+COM_Open handle 0xD28173C0, access 0xC0000000, share 0x0 //BTUART Driver 执行过CreateFile(L"COM2:"...)

通过以上分析,个人发现COM2,初始化后,有打开操作,而COM1初始化后,没有执行打开操作,不知道,这个打开的操作是不是系统查询COM口的一些属性[因为access = 0x0 即非Read跟Write状态],或Marvell,定制了COM1为特殊口。

请各位指教~谢谢
...全文
229 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
aduhupu 2011-01-06
  • 打赏
  • 举报
回复
9楼的说的是正确的。凡是具有电源管理的驱动。设备管理器在加载驱动后,都会查询驱动所支持的电源状态。而要查询则需要首先打开驱动。
如果不支持电源管理,“IClass”的值不需要添加"{A32942B7-920C-486b-B0E6-92A702A99B35}"(Generic power-manageable)
riccdw421 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 paul85 的回复:]
"Order"=dword:15 ; make sure it is loaded afer IPM
这个order太早了,可能会加载不了,建议将order改大点。我遇到过order过小造成流驱动加载不了的情况。
[/Quote]
谢谢提醒,不过我现在的问题是驱动成功加载之后,有Open的操作:
+COM_Open handle 0xD28173C0, access 0x0, share 0x3 //还未加载BTUART Driver即未执行CreateFile(L"COM2:"...),所以我想确定一下,是不是系统调用的,因为Access=0x0,自己认为是系统的一个查询询问。可以看下,本人#9楼的分析。
riccdw421 2010-04-16
  • 打赏
  • 举报
回复
问题暂时解决,在platform.reg中屏蔽:
"IClass"=multi_sz:"{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}",
"{A32942B7-920C-486b-B0E6-92A702A99B35}"
就OK,没有时间深研究其根源,有清楚的朋友,可以再次回贴。
分析可以查看#9楼回复,多谢各位捧场,散分啦~
riccdw421 2010-04-15
  • 打赏
  • 举报
回复
IF BSP_BTUART
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial2]
"Irq"=dword:15 ; 21 IRQ_BTUART
"MemBase"=dword:40200000 ; BTUART Register

"MemLen"=dword:40
"DeviceArrayIndex"=dword:81 ; BTUART object
"Prefix"="COM"
"IClass"=multi_sz:"{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}",
"{A32942B7-920C-486b-B0E6-92A702A99B35}"
"Dll"="$(_TGTPLAT_PFX)_serial.dll"
"Order"=dword:15 ; make sure it is loaded afer IPM
"Flags"=dword:0
"Index"=dword:2 "32BitBus"=dword:1
"EnableDMA"=dword:1
"AutoFlowControl"=dword:2 ; 0=no auto flow, 1=half auto flow, 2=full auto flow
"RxBufferSize"=dword:2048
"DebugMask"=dword:3

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial2\Unimodem]
"Tsp"="Unimodem.dll"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on BT port:"
; "FriendlyName"="Not Serial port:"
"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_BTUART


IF BSP_FFUART
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
"Irq"=dword:16 ; 22 IRQ_FFUART
"MemBase"=dword:40100000 ; FFUART Register

"MemLen"=dword:40
"DeviceArrayIndex"=dword:80 ; FFUART object
"Prefix"="COM"
"IClass"=multi_sz:"{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}",
"{A32942B7-920C-486b-B0E6-92A702A99B35}"
"Dll"="$(_TGTPLAT_PFX)_serial.dll"
"Order"=dword:15 ; make sure it is loaded afer IPM
"Flags"=dword:0
"Index"=dword:1
"32BitBus"=dword:1
"EnableDMA"=dword:1
"AutoFlowControl"=dword:2 ; 0=no auto flow, 1=half auto flow, 2=full auto flow
"RxBufferSize"=dword:2048
"DebugMask"=dword:3

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial\Unimodem]
"Tsp"="Unimodem.dll"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on COM1:"
"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_FFUART


以上摘录platform.reg:BSP_BTUART[COM2] BSP_FFUART[COM1]
对比分析发现只有我标明红色的地方不同,为什么我上面回复“gooogleman”时,说肯定不是应用调用的,因为我既便修改了"Index"=dword:1=>4或5,初始化后,都有COM_OPEN操作,如果是应用调用的,那么应用应该还是调用L"COM2:"才对,除非应用直接读注册表项。再就是我也看了驱动的代码发现关键就是“DeviceArrayIndex”项的值。
riccdw421 2010-04-15
  • 打赏
  • 举报
回复
+COM_Init...

+COM_Open handle 0xD28173C0, access 0x0, share 0x3 //BTUART Driver 未执行CreateFile(L"COM2:"...)这里再次说明一下:程序运行到这句时,蓝牙驱动还未加载,因为系统定制为,开机就打开蓝牙。

+COM_Open handle 0xD28173C0, access 0xC0000000, share 0x0 //BTUART Driver 执行过CreateFile(L"COM2:"...)这里再次说明一下:程序运行到这句时,蓝牙驱动加载,并在驱动中有执行CreateFile(L"COM2:"...)操作。


TO gooogleman: " com open 是应用调用的 ,不是加载调用的。"
因为目前在调试系统驱动阶段,所以我可以肯定是没有应用[自已写的]所调用,所以我想除了系统本身的调用之外,再就是驱动之间的调用了。而且我在整个代码中,搜索没有看到CreateFile(L"COM2:"...)的操作,所以再次请教,有没有什么方法可以定位到谁调用了打开操作。或者是有另有玄机,COM_OPEN 可以不通过CreateFile这种方式也可以调用?
domworldjohn 2010-04-15
  • 打赏
  • 举报
回复
当然不会自动打开了,否则到时如何关闭?不过加载的时候会执行xxx_Init()函数
paul85 2010-04-15
  • 打赏
  • 举报
回复
"Order"=dword:15 ; make sure it is loaded afer IPM
这个order太早了,可能会加载不了,建议将order改大点。我遇到过order过小造成流驱动加载不了的情况。
riccdw421 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangou42 的回复:]
检查一下是否 COM2 的驱动加载得比 COM1 早。
要实现你的功能 COM2 的驱动必须在 COM1 之前加载。
[/Quote]

嗯,我可以试试,不过你能解释一下为什么要这么做吗?
riccdw421 2010-04-15
  • 打赏
  • 举报
回复
COM_Open handle 0xD28173C0, access 0x0, share 0x3
分析1:个人通过对SDIO驱动[支持电源管理]、与普通的流驱动[不支持电源管理]发现,支持电源管理的驱动会有两次OPEN,一次CLOSE,这与COM2我跟踪到的情况是一致,而普通的流驱动则没有。所以我得到的结果是Access=0x0的,是系统调用用于查询相关属性,如设备支持几种电源状态。不知道我这种理解是否正确,因为COM的ICLASS并没有配置成支持电源管理。
分析2:串口源代码都是MS的,没有修改过,因为我发现在COM_Open时,有代码调用HWOpen,并增加记数:
if ( !pHWObj->pFuncTbl->HWOpen(pSerialHead->pHWHead) ) {
RETAILMSG (1, (TEXT("HW Open failed.\r\n")));
goto OpenFail;
}

....
++(pSerialHead->OpenCnt);
而关闭时,HWClose未被调用,代码如下:
// If we are closing the last open handle, then close PDD also
if ( !pSerialHead->OpenCnt ) {// 跟踪到OpenCnt = 2 即我前面提到的Open两次,才执行一次关闭
RETAILMSG (myset, (TEXT("About to call HWClose\r\n")));
if ( pHWObj )
pHWObj->pFuncTbl->HWClose(pSerialHead->pHWHead);
RETAILMSG (myset, (TEXT("Returned from HWClose\r\n")));
因此,在我未通过应用程序打开COM2口时,这时一旦有数据向COM2[DMA_Enable]发送时,过段时间整个系统很慢。我想是COM2的RX_Buffer满了的原因。

所以再次请教同行,指点一二。
wangou42 2010-04-15
  • 打赏
  • 举报
回复
检查一下是否 COM2 的驱动加载得比 COM1 早。
要实现你的功能 COM2 的驱动必须在 COM1 之前加载。
xqhrs232 2010-04-14
  • 打赏
  • 举报
回复
蓝牙是不自动打开?
gooogleman 2010-04-14
  • 打赏
  • 举报
回复
com open 是应用调用的 ,不是加载调用的。
E等于MC平方 2010-04-14
  • 打赏
  • 举报
回复
没弄明白什么意思,但是,有一点,串口初始化后,是不会自动打开的.

19,518

社区成员

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

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