Cstyle的UEFI导读之USB Driver Stack

    

===================================================================== 

固件C字营·版权所有·欢迎转载
敬请关注微信公众号:“固件C字营”
敬请关注QQ群:1052307
敬请关注CSDN博客:Cstyle_0x007

图片

===================================================================== 

        说完了PCI driver再来看下USB,跟PCI一样USB driver也分为三个层次:USB host controller driver,USB bus driver,USB device driver。
USB host controller driver:Consumes PCI I/O Protocol on the USB host controller handle and produces the USB2  Host Controller Protocol.
USB bus driver:Consumes the USB2 Host Controller Protocol and produces a child handle for each USB controller  on the USB bus. Installs the Device Path Protocol and USB I/O Protocol onto each child handle.
USB device driver:Consumes the USB I/O Protocol and produces an I/O abstraction that provides services for the console devices and boot devices required to boot an EFI-conformant operating system.
下图是一个示例,一个pci总线下挂了一个USB host controller,usb host controller下挂了三个设备,键盘鼠标,和usb存储设备(ext . U盘),三种不同的driver消费和生产protocol的情况。
各种USB相关的protocol 数据类型定义:
 
USB Host Controller Driver:
根据控制器的实现标准不同,USB控制器大概分为4类,他们遵循UEFI driver modle消费EFI_PCI_IO_PROTOCOL并生产EFI_USB2_HC_PROTOCOL,在udk/MdeModulePkg/Bus/Pci/...中有他们的实现实例:
• Open Host Controller Interface (OHCI) (USB 1.0 and USB 1.1)
• Universal Host Controller Interface (UHCI) (USB 1.0 and USB 1.1)
• Enhanced Host Controller Interface (EHCI) (USB 2.0)
• Extended Host Controller Interface (XHCI) (USB 3.0)
USB Host Controller Driver Binding Protocol: Supported()
和其他的driver一样它会先locate由pci bus driver 产生的pci io protocol然后使用其提供的服务去access设备的pci配置空间,读取vid/did/class code看driver是否能够认识到该设备。
USB Host Controller Driver Binding Protocol: Start()
使用EFI_OPEN_PROTOCOL_BY_DRIVER参数去locate pci io protocol最终会install EFI_USB2_HC_PROTOCOL。
USB Host Controller Driver Binding Protocol: Stop()
EFI_USB2_HC_PROTOCOL实现:
上图可知,该protocol提供的服务大体分为4类:
• Host controller general information
• GetCapability()
• Root hub–related services(硬件相关):
• GetRootHubPortStatus()
• SetRootHubPortFeature()
• ClearRootHubPortFeature()
• Host controller state–related services(硬件相关):
• GetState()
• SetState()
• Reset()
• USB transfer–related services:
• ControlTransfer() --同步传输
• BulkTransfer() --同步传输
• AsyncInterruptTransfer()-异步传输
• SyncInterruptTransfer() --同步传输
• IsochronousTransfer() --同步传输
• AsyncIsochronousTransfer()-异步传输
Synchronous transfer:
    以BulkTransfer为例通常会有以下几个步骤:
1.Preparation:做一些传输前的准备工作,比如清状态寄存器。
2.Setting up the DMA direction:根据地址信息,设置DMI传输的方向,map  PCI DMA 操作,设定PCI bus master的读或写操作。
3.Building the transfer context:根据usb规范建立数据传输帧结构。
4.Executing the TD and getting the result:对准备好的数据进行传输,等待传输结束,返回传输结果,状态
5.Cleaning up:清除帧缓冲,unmap  PCI DMA 操作.
Asynchronous transfer:
    异步传输通常会用到 periodic timer event,USB Host Controller Driver通常会为所有的异步传输任务维护一个队列。每当timer event 被signaled的时候,evernt的callback服务会去检索任务队列看异步传输任务是否完成。如果状态显示还没完成,哪么他就什么都不做;如果状态显示完成了,USB host controller driver就会把接收到的数据拷贝到一个预先定义的缓冲区当中,并删除帧缓冲。在此之后还会调用transfer callback服务,USB host controller driver根据transfer complete status来决定下一步的动作(update the transfer data status accordingly/leave the error recovery work to the related USB device driver);
USB Bus Driver:
    USB bus deriver 是一个通用的总线驱动,他管理着所有的USB hub devices包括root hub,USB hub devices是不需要usb device driver的.它消费EFI_USB2_HC_PROTOCOL并生产EFI_DEVICE_PATH_PROTOCOL和EFI_USB_IO_PROTOCOL一般我们不建议修改它。如果要移植到新平台的话,一般我们只需要修改USB host controller driver,如果有新的设备接入到usb hub上的时候,我们可能还需要修改USB Device Drivers。
USB Device Driver:
    它是一个遵循UEFI driver modle的driver,消费EFI_USB_IO_PROTOCOL生产一个活多个对设备I/O抽象的protocol,但是他不控制usb hub。参考实现:
• USB Keyboard: MdeModulePkg/Bus/Usb/UsbKbDxe
• USB Mouse: MdeModulePkg/Bus/Usb/UsbMouseDxe
• USB Mouse: MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe
• USB Mass Storage: MdeModulePkg/Bus/Usb/UsbMassStorageDxe
USB Device Driver Driver Binding Protocol Supported():
    driver遵循UEFI driver modle,和所有的其他的driver一样,driver binding protocol是不能少的,在supported()服务里面会检测该driver是否能够管理传递进来的controller handle,当然首先还是要去locateEFI_USB_IO_PROTOCOL,然后使用它提供的各种服务来访问设备。跟pci设备驱动类似一般分为两步如下:
1.先看看传递进来的controller handle是否有install EFI_USB_IO_PROTOCOL ,如果没有的话就表示这个不是一个usb设备。
2.使用locate的efi usb io protocol去获取usb的接口描述符(interface descriptor),然后确认设备的InterfaceClass, InterfaceSubClass以及InterfaceProtocol,类似于检查pci设备的vid,did一样。同时由于supported服务会被调用很多次,为了优化性能避免每次都要去获取设备的接口描述符,在usb bus driver里面可以先记录下设备的信息,避免重复读取操作。 
下面以一个存储设备为例来说明start和stop服务,设备的基本配置如下:它配有4个端点 1 xcontrol endpoint/ 1xinterrupt endpoint(同步)/ 2 xbulk endpoints(一个输入一个输出)如下图是该设备的私有建模或者说是私有数据结构(之前有博文有讲过):
USB Device Driver Driver Binding Protocol Start():
实现这个服务一般有以下几个步骤:
1.在传入的 ControllerHandle上使用 EFI_OPEN_PROTOCOL_BY_DRIVER locate并打开 USB I/O Protocol。
2.和supported服务一样使用EFI_USB_IO_PROTOCOL.UsbGetInterfaceDescriptor()获取端点接口描述符
3.准备设备的私有数据结构的初始化,如上图中分配内存,初始化Signature,usbio,InterfaceDescriptor。
4.使用第二步中我们获取的段的接口描述符来检测和初始化InterfaceDescriptor字段。
5.最后我们要Install Block I/O protocol.
USB Device Driver Driver Binding Protocol Stop():
完成和start()相反的动作,uninstall Block I/O Protocol,close USB I/O Protocol,并释放私有数据的内存空间。
USB就暂时先说到这里,具体细节需要结合code去仔细研究,以后有时间再补上。
转载请注明出处Cstyle.z.zhou@gmail.com//http://blog.csdn.net/CStyle_0x007

===================================================================== 

固件C字营·版权所有·欢迎转载
敬请关注微信公众号:“固件C字营”
敬请关注QQ群:1052307
敬请关注CSDN博客:Cstyle_0x007

图片

===================================================================== 

@微信公众号《固件C字营》不定期更新状态,关注&订阅公众号不迷路。

完整PDF版整理中,可以在CSDN下载频道搜索”UEFI内核导读“下载样张......

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ACPI(高级配置和电源接口)是现代计算机系统中负责管理硬件和电源的重要组件。编写ACPI编程代码是深入了解和掌握系统的关键。 ACPI编程的入门首先需要了解ACPI的原理和基本概念。ACPI主要包括了ACPI表、ACPI命名空间、ACPI方法、ACPI设备和ACPI事件等组件。其中最重要的是ACPI表,它是存储ACPI配置和信息的数据结构,在操作系统启动时由固件(如BIOS或UEFI)提供。 接下来,我们需要学习如何使用UEFI提供的接口来访问ACPI表。UEFI是用于取代传统BIOS的新一代固件接口标准,它提供了许多用于操作硬件的接口函数。在UEFI内核导读中,我们可以学习到如何使用UEFI提供的接口函数,如GetSystemTable和LocateProtocol来获取ACPI表。 一旦获取了ACPI表,就可以使用ACPI编程来操作和管理系统的硬件。我们可以通过解析ACPI表的结构和字段来获取硬件信息,如处理器、硬盘和显卡等。同时,ACPI编程还可以用于配置和控制硬件,如设置电源管理策略、启用和禁用设备等。 在ACPI编程入门中,我们也需要学习如何处理ACPI事件。ACPI事件是指硬件状态或系统事件的通知,如按键事件、电源事件和温度事件等。通过注册和处理ACPI事件,我们可以编写更加智能和灵活的系统管理代码。 最后,了解ACPI编程的最佳实践和调试技巧也是非常重要的。ACPI编程常常需要谨慎处理硬件和系统的复杂逻辑,同时需要进行灵活的错误处理。熟悉ACPI规范和文档,以及使用调试工具来分析和解决问题,都是提高ACPI编程效率和质量的关键。 总之,ACPI编程是一项重要而复杂的任务,通过学习UEFI内核导读中的ACPI编程入门知识,我们可以更好地了解和掌握ACPI的原理和操作方法,为开发和管理现代计算机系统提供强大的工具和技术支持。 ### 回答2: 《UEFI内核导读》中的ACPI编程入门章节主要介绍了在UEFI环境下进行ACPI编程的基础知识和技巧。ACPI (Advanced Configuration and Power Interface) 是一种用于操作系统和硬件之间通信的标准接口,它定义了电源管理、设备配置和配置信息传递等功能。 ACPI编程的入门主要包括以下内容: 1. ACPI的概述:介绍了ACPI的基本概念、作用和结构,说明了在UEFI中如何使用ACPI来进行设备配置和管理。 2. ACPI表:解释了ACPI表的类型和作用,如DSDT(Differentiated System Description Table)、SSDT(Secondary System Description Table)等,以及如何在UEFI中获取和使用这些表。 3. AML语言:AML(ACPI Machine Language)是一种用于编写ACPI表的高级语言,介绍了AML的基本语法和常用指令,以及如何在UEFI中加载和执行AML代码。 4. 设备电源管理:讲解了如何使用ACPI进行设备电源管理,包括睡眠、唤醒和电源状态转换等操作。 5. 事件和中断处理:说明了如何使用ACPI来处理系统事件和中断,以及如何编写ACPI方法来响应这些事件和中断。 通过学习这些内容,读者可以掌握在UEFI环境下进行ACPI编程的基础知识和技巧。ACPI编程在UEFI开发中起着重要的作用,对于实现系统设备管理和电源管理等功能非常重要,对于理解和使用UEFI内核也具有重要意义。 ### 回答3: acpi(高级配置和电源接口)是一种被广泛使用在现代计算机系统中的标准,用于管理硬件设备的电源管理和配置信息。在UEFI(统一可扩展固件接口)内核导读中,acpi编程入门是其中一个重要的主题。 acpi编程入门的目的是让开发者了解如何使用acpi来控制硬件设备的电源管理和配置操作。acpi提供了一组标准的接口和语言,使开发者可以编写具体的acpi代码来实现特定的功能。通过acpi编程,开发者可以实现诸如电源管理、设备状态监控和系统配置等功能。 在acpi编程入门中,首先需要了解acpi的基本概念和架构。acpi的核心是acpi表,它包含系统的配置信息和控制信息。开发者需要了解如何解析和读取acpi表,以获取系统的配置信息。同时,了解acpi命名空间和对象模型,可以帮助开发者理解acpi中的各个组件和其关系。 在实际的acpi编程中,开发者需要学习acpi语言(ASL)和acpi命令(AML)。ASL是一种类似于C语言的高级语言,用于编写acpi代码。AML是一种二进制格式的编码,用于实际执行acpi代码。了解如何编写和编译ASL代码,并将其转换为AML代码是开发者的关键任务。 此外,理解acpi的工作原理和常见的acpi编程技巧也是入门的重要内容。开发者需要知道如何注册和操作acpi设备,如何监听和处理acpi事件,以及如何控制电源状态和硬件配置。 总之,在UEFI内核导读中,acpi编程入门是为开发者提供的一项重要教学内容。通过学习acpi编程,开发者可以更好地理解和掌握UEFI系统中的电源管理和硬件配置操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值