EDK II之USB设备驱动程序的加载与运行

本文简单介绍一下USB设备的驱动程序是如何匹配设备以及被加载的:

 

上文(UDK中USB总线驱动的实现框架)提到USB总线枚举设备的最后一步是调用gBS->ConnectController()去查找device的驱动并加载。

1.查找驱动:

首先UEFI中所有符合UEFI Driver Model的驱动在模块的入口点,都会去安装EFI_DRIVER_BINDING_PROTOCOL;gBS->ConnectController()会去遍历系统中所有的EFI_DRIVER_BINDING_PROTOCOL,并调用其中的Support函数,来做判断,如果匹配成功,就接着调用Start函数来初始化硬件。

 

2.举例说明support()是如何匹配driver和device的:

Support()会通过USBDI获取设备的接口描述符InterfaceDescriptor,通过判断接口描述符来判断device的类型,如下:

(1)USB键盘驱动程序:USBKeyboardDriverBindingSupported()

  if (InterfaceDescriptor.InterfaceClass == CLASS_HID &&          //CLASS_HID          3
      InterfaceDescriptor.InterfaceSubClass == SUBCLASS_BOOT &&   //SUBCLASS_BOOT      1
      InterfaceDescriptor.InterfaceProtocol == PROTOCOL_KEYBOARD  //PROTOCOL_KEYBOARD  1
      ) {
    return TRUE;
  }

(2)USB鼠标驱动:

  if ((InterfaceDescriptor.InterfaceClass == CLASS_HID) &&        // CLASS_HID        3
      (InterfaceDescriptor.InterfaceSubClass == SUBCLASS_BOOT) && // SUBCLASS_BOOT    1
      (InterfaceDescriptor.InterfaceProtocol == PROTOCOL_MOUSE)   // PROTOCOL_MOUSE   2
      ) {
    return TRUE;
  }

(3)USB Mass Storage驱动程序:

  if (Interface.InterfaceClass != USB_MASS_STORE_CLASS) {  // USB_MASS_STORE_CLASS 0x08
    goto ON_EXIT;
  }

 

下图是USB Class Codes的分类:

 

 至此,差不多了解了UEFI中USB整个驱动的框架,下面来做个总结,顺便总结一下UEFI的 UEFI Driver Model:

1.符合UEFI Driver Model的模块都会在模块入口点安装EFI_DRIVER_BINDING_PROTOCOL(类似于Linux中的USB设备驱动都会注册usb_driver);

2.只有当内核去调用gBS->ConnectController()的时候,才会去访问EFI_DRIVER_BINDING_PROTOCOL->support(),来为device加载合适的驱动;(这一点与Linux中不同,Linux中每当注册一个usb_driver就会紧接着执行probe函数去查找系统中有没有合适的device);

3.UEFI中的整个USB驱动框架的层次很清晰,必须先加载HCD,然后加载USBD,最后加载USB DEVICE Driver;

 

转载于:https://www.cnblogs.com/nju347/p/7840577.html

EDK2是一个开源的UEFI固件开发框架,它提供了许多常用的驱动程序和工具,可以帮助开发者快速构建高质量的UEFI固件。如果你要在EDK2中安装HDMI驱动程序,可以按照以下步骤进行操作: 1. 下载最新版本的EDK2,并解压缩到本地目录中。 2. 打开EDK2的Shell环境,并设置相关环境变量。例如,如果你的EDK2目录位于"C:\EDK2",则可以使用以下命令设置环境变量: ``` set EDK_TOOLS_PATH=C:\EDK2\BaseTools set WORKSPACE=C:\EDK2\MyWorkspace set PACKAGES_PATH=C:\EDK2\MyWorkspace\MyPackages ``` 3. 在EDK2的Shell环境中,使用以下命令创建一个新的驱动程序: ``` edksetup.bat cd MyWorkspace mkdir MyDriver cd MyDriver ``` 4. 在MyDriver目录中,创建一个名为 MyDriver.inf 的文件,并输入以下内容: ``` [Defines] INF_VERSION = 0x00010005 BASE_NAME = MyDriver FILE_GUID = 12345678-1234-1234-1234-1234567890AB VERSION_STRING = 1.0 MODULE_TYPE = UEFI_DRIVER [Sources] MyDriver.c [Packages] MdePkg/MdePkg.dec [LibraryClasses] UefiDriverEntryPoint [Protocols] GraphicsOutput [BuildOptions] -DUSE_HDMI=1 ``` 在上面的示例中,我们指定了驱动程序的版本号、GUID、模块类型、源文件和依赖项等信息,并将USE_HDMI设置为1以启用HDMI支持。 5. 在MyDriver目录中,创建一个名为 MyDriver.c 的文件,并输入以下内容: ``` #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <Protocol/GraphicsOutput.h> EFI_STATUS EFIAPI MyDriverEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&GraphicsOutput); if (EFI_ERROR (Status)) { Print(L"Failed to locate GraphicsOutput protocol: %r\n", Status); return Status; } // TODO: Add HDMI support here return EFI_SUCCESS; } ``` 在上面的示例中,我们定义了一个名为MyDriverEntryPoint的入口函数,并使用LocateProtocol函数查找GraphicsOutput协议。在此之后,你可以添加HDMI支持代码。 6. 在MyDriver目录中,运行以下命令来编译和构建驱动程序: ``` build -p MyDriver.inf -a X64 -b RELEASE ``` 在上面的示例中,我们使用build命令来编译和构建驱动程序,并指定了平台类型和版本等参数。 7. 编译和构建成功后,你可以在BUILD目录中找到编译后的驱动程序文件。在EDK2中安装和加载驱动程序的方法因平台而异,请参考EDK2文档和平台规格书以获取更多帮助。 需要注意的是,EDK2开发需要一定的编程和驱动开发经验,如果你没有相关的经验或者知识,可能需要花费一些时间学习和掌握相关技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值