wince下usb驱动攻坚战(转贴)
来源:互联网 发布:淘宝网童装大全 编辑:程序博客网 时间:2024/04/29 11:51
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://bluefish.blog.51cto.com/214870/72920
首先给出一个ED和TD的链表结构图,相信有了这个图对代码的理解就容易多了!
HeadPtr-->ED-->ED-->ED-->ED
ED-->TD-->TD-->TD...
HeadPtr-->ED-->ED-->ED-->ED
ED-->TD-->TD-->TD...
根据OHCI spec:每个ED(Endpoint Descriptor)描述USB设备的一个端点的所有数据传输,所有的ED被连接在一起;而TD(Transfer Descriptor)描述的才是最终要在USB总线上传输的数据包,属于同一个USB设备端点的TD被连接在一起,并挂在相应的ED上。
1)ohcd.c
该文件在platform下,可替代wince自带的system.c文件(在public/common/oak/drivers/usb/hcd/ohc/下)。该文件中的函数被hcddrv.c文件中的HCD_流形式接口函数调用。
该文件在platform下,可替代wince自带的system.c文件(在public/common/oak/drivers/usb/hcd/ohc/下)。该文件中的函数被hcddrv.c文件中的HCD_流形式接口函数调用。
2)hcddrv.cpp
该文件在public/common/oak/drivers/usb/hcd/common下面,文件中的具体设置函数:
HcdMdd_CreateMemoryObject
HcdMdd_CreateHcdObject
HcdMdd_DestroyMemoryObject
HcdMdd_DestroyHcdObject
HcdMdd_PowerOn
HcdMdd_PowerDown
HcdMdd_SetCapability
又被ohcd.c中的函数调用
CUHcd-->CHW-->CHcd(继承关系,CUHcd的实例被创建)
该文件在public/common/oak/drivers/usb/hcd/common下面,文件中的具体设置函数:
HcdMdd_CreateMemoryObject
HcdMdd_CreateHcdObject
HcdMdd_DestroyMemoryObject
HcdMdd_DestroyHcdObject
HcdMdd_PowerOn
HcdMdd_PowerDown
HcdMdd_SetCapability
又被ohcd.c中的函数调用
CUHcd-->CHW-->CHcd(继承关系,CUHcd的实例被创建)
初始化函数调用流程
1)HCD_Init()[hcddrv.cpp]
1)HCD_Init()[hcddrv.cpp]
2)HcdPdd_Init()[ohcd.c]
3)InitializeOHCI()[ohcd.c]
配置IOBASE,IRQ。可读取注册表,也可以通过程序自配
配置IOBASE,IRQ。可读取注册表,也可以通过程序自配
4)HcdMdd_CreateMemoryObject();HcdMdd_CreateHcdObject()[hcddrv.cpp]
HcdMdd_CreateMemoryObject()==>CPhysMem->InittedOK()[usb/hcd/common/cphysmem.hpp]
HcdMdd_CreateHcdObject()==>CHcd->DeviceInitialize()[usb/hcd/ohcd2/cuhcd.cpp]
HcdMdd_CreateMemoryObject()==>CPhysMem->InittedOK()[usb/hcd/common/cphysmem.hpp]
HcdMdd_CreateHcdObject()==>CHcd->DeviceInitialize()[usb/hcd/ohcd2/cuhcd.cpp]
CHcd::DeviceInitialize()过程
1)CDeviceGlobal::Initialize()[usb/hcd/common/cdevice.cpp]
加载usbd.dll,并调用其中的HcdAttach()[usb/usbd/usbddrv.cpp]用hcddrv.cpp中的gc_HcdFuncs来设置usbd层的功能函数[pHcd->pHcdFuncs]
2)CHW::Initialize()[usb/hcd/ohcd2/chw.cpp]
初始化硬件,控制器寄存器,并创建线程用于处理HC的IST,并调用SignalCheckForDoneTransfer()来侦听传输的完成
3)CHCCArea::Initialize()[usb/hcd/ohcd2/cpipe.cpp]
初始化CPipe的静态变量,建立一个祯链表的空调度,同时建立中断Queue Head树,创建线程用于处理传输完成。
1)CDeviceGlobal::Initialize()[usb/hcd/common/cdevice.cpp]
加载usbd.dll,并调用其中的HcdAttach()[usb/usbd/usbddrv.cpp]用hcddrv.cpp中的gc_HcdFuncs来设置usbd层的功能函数[pHcd->pHcdFuncs]
2)CHW::Initialize()[usb/hcd/ohcd2/chw.cpp]
初始化硬件,控制器寄存器,并创建线程用于处理HC的IST,并调用SignalCheckForDoneTransfer()来侦听传输的完成
3)CHCCArea::Initialize()[usb/hcd/ohcd2/cpipe.cpp]
初始化CPipe的静态变量,建立一个祯链表的空调度,同时建立中断Queue Head树,创建线程用于处理传输完成。
IoPortBase = USB_BASE 以及Sys_Irq的初始化流程
1)HcdPdd_Init()[ohcd.c]
2)InitializeOHCI()[ohcd.c]
3)ConfigureOHCICard()[ohcd.c]:在此配置;HcdMdd_CreateHcdObject()[hcddrv.cpp]
4)CreateHCDObject()[cuhcd.cpp]:在此new CUhcd并初始化其父类CHW,在CHW初始化时初始化其成员变量m_portBase[chw.cpp]
1)HcdPdd_Init()[ohcd.c]
2)InitializeOHCI()[ohcd.c]
3)ConfigureOHCICard()[ohcd.c]:在此配置;HcdMdd_CreateHcdObject()[hcddrv.cpp]
4)CreateHCDObject()[cuhcd.cpp]:在此new CUhcd并初始化其父类CHW,在CHW初始化时初始化其成员变量m_portBase[chw.cpp]
Transfer流程
所有的IssueTransfer最终都要调用CPipe::IssueTransfer()[cpipe.cpp]
1)new STransfer并配置
2)拷贝client buffer到out transfer
3)AddTransfer:设置TDs链表并加到相应的ED下
4)ScheduleTransfer
5)CHW::ListControl()
所有的IssueTransfer最终都要调用CPipe::IssueTransfer()[cpipe.cpp]
1)new STransfer并配置
2)拷贝client buffer到out transfer
3)AddTransfer:设置TDs链表并加到相应的ED下
4)ScheduleTransfer
5)CHW::ListControl()
[以下以bulk为例]
1)在CHW::Initialize()中有
CHW::m_pBulkHead = &m_portBase->HcBulkHeadED;
2)在各pipe类的::OpenPipe()中有
*(CHW::m_pBulkHead) = (pa)m_pED;
1)在CHW::Initialize()中有
CHW::m_pBulkHead = &m_portBase->HcBulkHeadED;
2)在各pipe类的::OpenPipe()中有
*(CHW::m_pBulkHead) = (pa)m_pED;
故此:传输过程由HC根据各ED值来读写指定内存,具体数据在各ED下的TDS链表中的各TD中,过程由HcControl和HcCommandStatus寄存器的各相应位来控制。
本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/72920
- wince下usb驱动攻坚战(转贴)
- wince下usb驱动攻坚战
- wince下usb驱动攻坚战
- wince下USB 驱动
- Wince下USB驱动结构
- WINCE下的USB驱动开发
- 详解WinCE下USB Host驱动开发
- Wince下usb驱动的思路
- 详解WinCE下USB Host驱动开发
- wince下USB总线驱动分析
- WINCE下的USB驱动开发
- 详解WinCE下USB Host驱动开发
- wince下的USB驱动要点总结
- Wince下usb驱动详细总结
- 详解WinCE下USB Host驱动开发
- wince下USB总线驱动分析
- wince下USB总线驱动分析
- WINCE下的USB驱动开发
- UNIX系统操作入门
- 防范非法用户入侵Win 2000/XP系统
- 如何提高Linux系统安全性
- 解决双击硬盘打开搜索问题
- 学习中LINUX中常见问题
- wince下usb驱动攻坚战(转贴)
- 对图像进行模板匹配
- myclipse6.6注册码
- IE 6 png背景透明bug的处理
- 收拾行囊,重新上路
- 破解加密光盘的方法
- Ubuntu9.04中,Firefox3.0.10无法播放flash的解决方法
- 写给刚毕业参加工作的朋友
- 挽救硬盘的几个方法