WinCE6.0 USB Fubction驱动加载流程

简介:
   今天来看看WinCE6.0平台下USB Function驱动部分加载流程,USB Function是指WinCE设备相对于PC机而讲的,一般可以支持Mass StorageRNDISPrinter或者Serial Class。在实际中用的最多的莫过于串口功能,作为一个串口设备连接PC机,实现activesync的功能。
       在目录WINCE600\PUBLIC\COMMON\OAK\DRIVERS\USBFN下面有微软提供的关于USB Function的驱动程序,此目录下的层次结构为:
    在之前的博文中已经对该目录的整体功能进行了说明,这里就不重复了。
    CONTROLLER控制器文件夹是整个Function驱动的入口处,在该目录下的MDD文件夹内实现并导出了总线接口,并利用该接口加载USB Function Client驱动。下面具体分析。
    注意在CONTROLLER目录下面有一个NET2280的文件夹,它实现的NET2280控制器的PDD部分。但是在common.reg下面并没有找到相关的注册表信息,说明实际的设备平台中并没有使用微软默认的控制器型号。
       本人使用的平台是Android6410的开发板,在PLATFORM目录下发现了USB Funtion ContrllerPDD部分,在 WINCE600\PLATFORM\SMDK6410\SRC\DRIVERS\OTG\Device的目录下,这里使用了OTG作为了Function功能。该目录下面的内容为:
    同时在platform.reg文件中发现了关于控制器的注册表信息,如下:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SC6410USBFN]
  "Dll"="s3c6410_usbfn.dll"
  "Prefix"="UFN"
  "Order"=dword:20
  "Priority256"=dword:64
  "Irq"=dword:60        ; USB OTG Virtual IRQ = 96 (0x60), Physical IRQ = 58
  "BusIoctl"=dword:2a0048
  "IClass"=multi_sz:"{E2BDC372-598F-4619-BC50-54B3F7848D35}=%b","{6F40791D-300E-44E4-BC38-E0E63CA8375C}=%b"
    所以系统加载的USB Function Controller驱动是s 3c 6410_usbfn.dll,由设备管理Device.exe从注册表HKEY_LOCAL_MACHINE\Drivers\BuiltIn下面加载该驱动。
       看看s 3c 6410_usbfn.def文件导出了哪些接口函数:
LIBRARY                S3C6410_USBFN

EXPORTS
        UFN_Init
        UFN_Deinit
        UFN_Open
        UFN_Close
        UFN_PowerDown
        UFN_PowerUp
        UFN_IOControl
    在目录WINCE600\PUBLIC\COMMON\OAK\DRIVERS\USBFN\CONTROLLER\MDD下面的ufnmdd.cpp文件里,实现了流接口的入口函数DllEntry()函数,不过该函数并没有具体的操作内容。
    接着来看看UFN_Init()函数。在初始化函数中首先创建PUFN_MDD_CONTEXT结构体,用来记录驱动MDD层的一些信息,包括一些MDD层的接口函数。该信息将会在驱动接口之间通过参数进行传递。之后创建了CUfnBus类的一个实例,通过该类可以加载Client层驱动,并且处理USB function controller驱动的IOCTLS。创建之后便调用CUfnBus::Init()函数完成总线的相关初始化。最后调用PDD层的初始化函数UfnPdd_Init(),完成硬件控制器的一些初始化设置,将PDD层的硬件操作函数封装成函数列表结构体传递给MDD层。
    从上述的过程中,始终没有发现如何调用Client驱动的,从参考资料中发现,在创建CUfnBus类之后,会调用该类的成员函数PostInit(),而CUfnBus类是从DefaultBusDriver类继承过来的,在这个里面找到了启动Client驱动的方式。
    PostInit()函数主要调用了四个函数:
函数CUfnBus::GetDefaultClientName用来获取默认的Client名称; CUfnBus::CreateChildDefaultBusDriver::InsertChild用来创建一个usb buschild,并添加到相应的list列表中;CUfnBus::ActivateChild则是用来启动一个Client驱动的。
       在注册表platform.reg中有一个默认的Client名称选项,如下:
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
  "DefaultClientDriver"=-      ; erase previous default

IF BSP_USBFNCLASS == SERIAL
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
  "DefaultClientDriver"="Serial_Class"
ENDIF BSP_USBFNCLASS

IF BSP_USBFNCLASS == MASS_STORAGE
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
  "DefaultClientDriver"="Mass_Storage_Class"
ENDIF BSP_USBFNCLASS
    本文的硬件平台是Android6410开发板,从注册表中可以看出,在该平台下支持WinCE设备为串口或者大容量存储器两种状态,而微软提供的可以支持四种状态。另外上面有一个环境变量BSP_USBFNCLASS决定了默认的Client驱动是哪个?而平台的环境变量定义在文件WINCE600\PLATFORM\SMDK6410\ SMDK6410.bat中,
CUfnBus::ActivateChild函数当中调用了父类的函数DefaultBusDriver::ActivateChild。在文件WINCE600\PUBLIC\COMMON\OAK\DRIVERS\BUSENUM\BUSDEF\defbus.cpp中有类DefaultBusDriver的实现。在父类的ActivateChild()函数中,又调用了类DeviceFolder的成员函数LoadDevice()。类DeviceFolder和类DefaultBusDriver在同一个文件中实现。在DeviceFolder::LoadDevice函数中根据驱动DLL的不同类型,调用::LoadLibrary(DevDll)或者::LoadDriver(DevDll),其中DevDll为驱动的名称。之后通过GetProcAddress()函数获取到相应驱动的入口函数地址,并调用驱动的入口初始化函数。
今天就先分析一下加载流程,以后再进一步分析数据传输的流程。


本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/752186,如需转载请自行联系原作者
相关文章
|
Android开发
Android Mediatek bootloader oem锁定和解锁流程
Android Mediatek bootloader oem锁定和解锁流程
584 0
|
存储 Java Android开发
Android系统升级的机制概要
Android系统升级的机制概要
529 0
|
Android开发
autojs下拉刷新
牙叔教程 简单易懂
1172 0
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
407 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
Linux
Rockchip系列之LED状态灯 以太网收发数据包流程以及控制状态显示(2)
Rockchip系列之LED状态灯 以太网收发数据包流程以及控制状态显示(2)
350 1
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
1146 1
|
机器学习/深度学习 算法 数据可视化
机器学习-特征选择:如何使用相关性分析精确选择最佳特征?
本文致力于利用相关性分析来辅助特征选择过程。相关性分析作为一种用于量化特征之间关系的方法,可以帮助我们理解数据中的潜在模式和相互作用。通过分析特征之间的相关性,我们可以更加准确地选择具有高预测能力和独立性的特征,从而提高特征选择的效果和结果。
3223 0
|
存储 关系型数据库 MySQL
面试官:MySQL一次到底插入多少条数据合适啊?
本文探讨了数据库插入操作的基础知识、批量插入的优势与挑战,以及如何确定合适的插入数据量。通过面试对话的形式,详细解析了单条插入与批量插入的区别,磁盘I/O、内存使用、事务大小和锁策略等关键因素。最后,结合MyBatis框架,提供了实际应用中的批量插入策略和优化建议。希望读者不仅能掌握技术细节,还能理解背后的原理,从而更好地优化数据库性能。
|
负载均衡 NoSQL Java
Spring Boot + Redis 处理 Session 共享
Spring Boot + Redis 处理 Session 共享
229 1
|
Java 数据处理 索引
JAVA中的插入操作:深入解析与实现
JAVA中的插入操作:深入解析与实现
342 1