UEFI中EHCI驱动的实现框架

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UEFI中EHCI驱动的实现框架相关的知识,希望对你有一定的参考价值。

本文从数据结构的角度看一下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的执行结果,并调用回调函数)。

 

以上是关于UEFI中EHCI驱动的实现框架的主要内容,如果未能解决你的问题,请参考以下文章

UEFI中USB协议栈的实现简介

UEFI中USB总线驱动的实现框架

uefi规范示例提到EfiCoreImageHandle。怎么弄?

linux系统中没有USB驱动怎么办?

UEFI实战DXE驱动相关

UEFI实战Redfish的BIOS实现1