标签:div 实现 框架 link class strong pre monitor 分享
本文从数据结构的角度看一下EHCI的初始化:
下图是EHCI驱动中涉及的主要数据结构的关系图:
1.Struct USB2_HC_DEV是Host controller的核心数据结构,在初始化过程中创建;QTD、QH的数据结构的定义位于 EHCI spec 3.5/3.6;
2.管理controller和bulk传输:插入Asynchronous Schedule list
//把组装好的Qh插入EHCI主控制器的Asynchronous Schedule List,以便硬件执行传输命令 EhcLinkQhToAsync (Ehc, Urb->Qh); //阻塞式的执行此次controller传输 Status = EhcExecTransfer (Ehc, Urb, TimeOut); //从Asynchronous Schedule List中将其移除 EhcUnlinkQhFromAsync (Ehc, Urb->Qh);
3.管理isochronous和interrupt传输:插入Periodic schedule frame list
//把组装好的Qh插入EHCI主控制器的Periodic schedule frame list,以便硬件执行传输命令 EhcLinkQhToPeriod (Ehc, Urb->Qh); //并把URB插入异步中断传输链表 &Ehc->AsyncIntTransfers InsertHeadList (&Ehc->AsyncIntTransfers, &Urb->UrbList);
4.插入硬件链表的URB,硬件会自动执行发送;
5.链表&Ehc->AsyncIntTransfers是由驱动程序创建并管理的,由EhcMonitorAsyncRequests()管理;
(1)他会循环&Ehc->AsyncIntTransfers上的每个urb;
(2)通过判断QTD.status来判断执行结果(一个urb中包含一个QH和一串QTD);
(3)更新QH,为下一轮异步传输准备;
(4)如果有回调函数,执行回调函数。
6.总结:EHCI驱动初始化完成后,硬件负责维护两个链表(自动发送上面的数据),软件负责维护一个链表(用来周期查询Periodic list中的URB的执行结果,并调用回调函数)。
标签:div 实现 框架 link class strong pre monitor 分享
原文地址:http://www.cnblogs.com/nju347/p/7819956.html