7474|12

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WINCE 串口驱动初始化后,会自动执行打开吗? [复制链接]

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为特殊口。

请各位指教~谢谢

最新回复

"Order"=dword:15 ; make sure it is loaded afer IPM 这个order太早了,可能会加载不了,建议将order改大点。我遇到过order过小造成流驱动加载不了的情况。  详情 回复 发表于 2010-4-15 20:48
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没弄明白什么意思,但是,有一点,串口初始化后,是不会自动打开的.
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
com open 是应用调用的 ,不是加载调用的。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
蓝牙是不自动打开?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
当然不会自动打开了,否则到时如何关闭?不过加载的时候会执行xxx_Init()函数
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
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”项的值。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 13 楼 paul85 的回复:
"Order"=dword:15 ; make sure it is loaded afer IPM
这个order太早了,可能会加载不了,建议将order改大点。我遇到过order过小造成流驱动加载不了的情况。

   谢谢提醒,不过我现在的问题是驱动成功加载之后,有Open的操作:
+COM_Open handle 0xD28173C0, access 0x0, share 0x3 //还未加载BTUART Driver即未执行CreateFile(L"COM2:"...),所以我想确定一下,是不是系统调用的,因为Access=0x0,自己认为是系统的一个查询询问。可以看下,本人#9楼的分析。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
+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这种方式也可以调用?
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

9
 
问题暂时解决,在platform.reg中屏蔽:
"IClass"=multi_sz:"{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}",
  "{A32942B7-920C-486b-B0E6-92A702A99B35}"
就OK,没有时间深研究其根源,有清楚的朋友,可以再次回贴。
分析可以查看#9楼回复,多谢各位捧场,散分啦~
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
检查一下是否 COM2 的驱动加载得比 COM1 早。
要实现你的功能 COM2 的驱动必须在 COM1 之前加载。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
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满了的原因。

所以再次请教同行,指点一二。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 7 楼 wangou42 的回复:
检查一下是否 COM2 的驱动加载得比 COM1 早。
要实现你的功能 COM2 的驱动必须在 COM1 之前加载。


嗯,我可以试试,不过你能解释一下为什么要这么做吗?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
"Order"=dword:15 ; make sure it is loaded afer IPM
这个order太早了,可能会加载不了,建议将order改大点。我遇到过order过小造成流驱动加载不了的情况。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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