4915|6

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Ce6.0下利用COMPOSITEFN驱动实现串口和U盘成为复合设备的问题 [复制链接]

我们在用三星ideal6410开发板,想利用C:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\USBFN\CLASS\COMPOSITEFN驱动来实现串口和优盘的复合设备。我们的具体做法如下:
1.        将上面目录compositefn文件夹移植到bsp\src\driver下面,接着将compositefn编译成流驱动compositefn.dll,然后通过设置注册表如下:
……………………………………………………………………………………………
IF BSP_USBFNCLASS == COMPOSITEFN                    
        [HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
           "DefaultClientDriver"=- ; erase previous default
        "DefaultClientDriver"="CompositeFN"
        [HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\CompositeFN]
          "ClientDriverList"=multi_sz:"Mass_Storage_Class","Serial_Class"
          "bcdDevice"=dword:0
          "Prefix"="UFC"
          "Dll"="compositefn.dll"
          "Index"=dword:0
          "Order"=dword:53
          "ManufacturerString"="COMPOSITE DEVICE"
          "MaxPacketSize"=dword:40
          "VendorID"=dword:045E
          "ProductID"=dword:00CE
          "Attributes"=multi_sz:"80","81"
          "xFriendlyName"="COMPOSITE"
ENDIF BSP_USBFNCLASS
;------------ USB Function Serial Driver --------------------------------------
IF BSP_USBFNCLASS == SERIAL
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
        "DefaultClientDriver"="Serial_Class"
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Serial_Class]
        "UFC_DefaultClient"=dword:1
        "UFC_FriendlyName"=LOC_USBFN_SERIAL_NAME
        "UFC_idVendor"=dword:0547
        "UFC_Manufacturer"=LOC_USBFN_SERIAL_MANUFACTURER
        "UFC_idProduct"=dword:2720
        "UFC_Product"=LOC_USBFN_SERIAL_PRODUCT
        "UFC_Index"=dword:5
"UFC_Configurations"=multi_sz:81
        "UFC_FunctionClass"=dword:0E
        "UFC_FunctionProtocol"=dword:00
        "UFC_FunctionSubClass"=dword:03
        "UFC_bcdDevice"=dword:0

ENDIF BSP_USBFNCLASS
;-------------------------------------------------------------------------

;------------ USB Function Mass Stroge Driver ---------------------------------
IF BSP_USBFNCLASS == MASS_STORAGE
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
        "DefaultClientDriver"="Mass_Storage_Class"
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Mass_Storage_Class]
"UFC_DefaultClient"=dword:0
        "Dll"="usbmsfn.dll"
        "UFC_InterfaceSubClass"=dword:06
        "UFC_InterfaceProtocol"=dword:50
"UFC_Configurations"=multi_sz:80
        "UFC_FunctionClass"=dword:0E
        "UFC_FunctionProtocol"=dword:00
        "UFC_FunctionSubClass"=dword:03
        "UFC_bcdDevice"=dword:0
        "UFC_DeviceName"="DSK3:"
        "UFC_FriendlyName"="Mass Storage"
        "UFC_idVendor"=dword:045E
        "UFC_Manufacturer"="Generic Manufacturer (PROTOTYPE--Remember to change idVendor)"
        "UFC_idProduct"=dword:FFFF
        "UFC_Product"="Generic Mass Storage (PROTOTYPE--Remember to change idVendor)"
……………………………………………………………………………………………………
在最后加入:
;CPF
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CompositeFN]
         "ClientDriverList"=multi_sz:"Mass_Storage_Class","Serial_Class"
          "Prefix"="UFC"
          "Dll"="compositefn.dll"
   "Index"=dword:1
          "Order"=dword:53
          "ManufacturerString"="COMPOSITE DEVICE"
          "MaxPacketSize"=dword:40
          "VendorID"=dword:045E
          "ProductID"=dword:00CE
          "Attributes"=multi_sz:"80","81"
          "xFriendlyName"="Serial on USB" ; experimenting

并改写相应的platform.BIB,SMDK6410.bat文件,并在CMD窗口下设置环境变量如下:set   SYSGEN_USBFN_COMPOSITE=1。这样compositefn.dll就可以在系统启动的时候被自动加载。
通过实验,经编译通过的NK.EXE下载到我们的在ideal6410开发板上面,我们可以看到:在ideal6410上打开注册表,在driver\active\下面的23项,看到COMPOSITEFN.DLL已经被成功加载。
2通过DWN.EXE查看串口调试信息关键部分如下:
-OALIntrRequestSysIntr(irq = 96, sysIntr = 30)
compositefn1 dllentry success
UPC attach success
compositefn load success
2   success
2   success
Drivers\Active\23 1 is ActiveKey
4   success
Drivers\Active\23 2 is ActiveKey
composite init success
m_globalRegistryInfo.Init success
Drivers\Active\23  is IS UfnInitializeInterface.ActiveKey
4   success

[SDBUS] SD Card Spec Version : 2.00
[SDBUS] SD/SDHC doesn't support the high-speed mode.
[HSMMC0] Setting for 4 bit mode , Clock Rate = 25000000 Hz
[HSMMC0] Turn OFF the F/B delay control.
[HSMMC1] Setting for 4 bit mode , Clock Rate = 25000000 Hz
[HSMMC1] Turn OFF the F/B delay control.
DEBUG: CreateSerialObject 3
-OALIntrRequestSysIntr(irq = 64, sysIntr = 31)
DEBUG: CreateSerialObject 2
-OALIntrRequestSysIntr(irq = 63, sysIntr = 32)
DEBUG: CreateSerialObject 1
-OALIntrRequestSysIntr(irq = 62, sysIntr = 33)
[USBH] HcdPdd_Init(
[USBH] ++InitializeOHCI()
[USBH] --InitializeOHCI() : Success
-OALIntrRequestSysIntr(irq = 13, sysIntr = 34)
-OALIntrRequestSysIntr(irq = 14, sysIntr = 36)
[MFC POWER] Power is up.
[MFC POWER] Power is down-OALIntrRequestSysIntr(irq = 26, sysIntr = 37)
MFC Interrupt has been initialized.
[MFC IOCTL_POWER_CAPABILITIES]
[MFC IOCTL_POWER_CAPABILITIES] leaving...

[MFC POWER] Power is up.
[MFC POWER] Power is down::: SPL_Init.
-OALIntrRequestSysIntr(irq = 18, sysIntr = 38)
compositefn load success
2   success
2   success
Drivers\Active\59 1 is ActiveKey
4   success
Drivers\Active\59 2 is ActiveKey
composite init success
m_globalRegistryInfo.Init success
Drivers\Active\59  is IS UfnInitializeInterface.ActiveKey
fSuccess chu
ERROR: C:\WINCE600\PLATFORM\SMDK6410\SRC\DRIVERS\COMPOSITEFN\.\manager.cpp line 58: Composite!CCompositeManager::Init: UfnInitializeInterface failed. Error: 31


说明ActiveKey =“Drivers\Active\23”时候,能够成功加载,而ActiveKey =“Drivers\Active\59”时候,出现了错误。具体错误通过加入调试信息也可以找到最根处:
是在C:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\USBFN\UFNCLIENTLIB\中的UfnClient.cpp这段程序:
xtern "C"
DWORD
UfnInitializeInterface(
    LPCTSTR             pszActiveKey,
    UFN_HANDLE         *phDevice,
    PUFN_FUNCTIONS      pFunctions,
    PVOID              *ppvInterfaceInfo
    )
{
    SETFNAME();
    DWORD dwRet;
    PUFN_CLIENT_INTERFACE pInterface = NULL;
    HANDLE hBusAccess = NULL;
    UFN_CLIENT_DATA ucd;
    BOOL fSuccess;
    if ( !pszActiveKey || !phDevice || !pFunctions || !ppvInterfaceInfo ) {
        dwRet = ERROR_INVALID_PARAMETER;
        DEBUGMSG(1, (_T("%s Invalid parameter.\r\n"),
            pszFname));
        goto EXIT;
    }
    pInterface = (PUFN_CLIENT_INTERFACE) LocalAlloc(LPTR, sizeof(UFN_CLIENT_INTERFACE));
    if (pInterface == NULL) {
                RETAILMSG(1, (_T("pInterface == NULL\r\n")));
        dwRet = GetLastError();
        DEBUGMSG(1, (_T("%s Could not allocate memory. Error %u\r\n"),
            pszFname, dwRet));
        goto EXIT;
    }

                RETAILMSG(1, (_T("%s  is IS UfnInitializeInterface.ActiveKey \n"), pszActiveKey));
    hBusAccess = CreateBusAccessHandle(pszActiveKey);
    if (hBusAccess == NULL) {
                RETAILMSG(1, (_T("pInterface == NULL\r\n")));
        dwRet = GetLastError();
        DEBUGMSG(1, (_T("%s Could not CreateBusAccessHandle. Error %u\r\n"),
            pszFname, dwRet));
        goto EXIT;
    }

    memset(&ucd, 0, sizeof(ucd));
    ucd.dwVersion = UFN_CLIENT_INTERFACE_VERSION;
    fSuccess = BusChildIoControl(hBusAccess, IOCTL_UFN_GET_CLIENT_DATA_EX, &ucd, sizeof(ucd));
    if (!fSuccess) {
                RETAILMSG(1, (_T("fSuccess chu\r\n")));///通过上面串口调试信息我们可以看到是在此处///////////////////////////////////////////////////////////////////////出错!!!
        dwRet = GetLastError();
        goto EXIT;
    }
compositefn驱动会被加载两次呢?是不是因为复合了两个设备啊?还有串口是不是不能作为一个设备同另外一个设备符合啊?
请搞过复合设备的高手指点迷津!!!小弟不胜感激!!!![/color]

最新回复

楼主,问题解决了吗?我最近也在搞这个  详情 回复 发表于 2013-3-1 17:54
点赞 关注

回复
举报

50

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
哎,没人回帖,友情帮顶一下吧。。。
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
怎么搞的,没人教我一下啊!!!郁闷了!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
复合驱动,没搞过啊,比较复杂
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
我最近也在看这个,很多不明白的,一起学习一下。
问一下,你SMDK6410.bat文件怎么修改的,貌似修改SMDK6410.bat的UFNCLASS就直接可以加载你的驱动了。还有set SYSGEN_USBFN_COMPOSITE=1你是怎么样处理的?是sysgen还是就make一下就可以了。
我像你之前那么做的,能加载上compositefn驱动,但是想要复合的驱动加不上,在准备搞一搞
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

6
 
注册表配置增加一项:
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\CompositeFN]  
  "DefaultPrefix"="UFC"
并删除类似"UFC_FunctionClass"的值
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

7
 
楼主,问题解决了吗?我最近也在搞这个
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表