本文简单介绍一下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;

EDK II之USB设备驱动程序的加载与运行的更多相关文章

  1. USB设备驱动程序学习笔记(一)

    现象:把USB设备接到PC1. 右下角弹出"发现android phone"2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能知道 ...

  2. USB设备驱动程序(一)

    USB驱动编程原理: 当我们把USB设备插入USB口时会提示需要安装相对应的驱动,如USB鼠标.USB键盘等,这些电脑自己自身已经自带有相对于的驱动程序, 当电脑检查到该USB设备类型相同就去帮你安装 ...

  3. 12、USB设备驱动程序

    linux-3.4.2\driver\hid\usbhid\usbmouse.c 内核只带USB驱动程序 (hub和usb是两个不同的设备,hub在内核上电的过程中在usb_hub_init函数中调用 ...

  4. USB设备驱动程序1

    目的:USB鼠标用作按键,左键相当于字母L,右键相当于字母S,中键相当于Enter.如何来实现?用到输入子系统:1)分配input_dev2)设置3)注册4)硬件相关操作对于USB鼠标来说,硬件操作应 ...

  5. linux设备和驱动加载的先后顺序

    点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  6. 事件ID:7026(“下列引导或系统启动驱动程序无法加载: cdrom”)的解决方法

     电脑没有安装光驱,而是使用USB光驱/虚拟光驱软件,每次开机后"事件查看器"都显示错误:"下列引导或系统启动驱动程序无法加载: cdrom"(事件ID:7 ...

  7. AutoCAD配置的Heidi驱动程序未加载

    电脑安装的软件越来越多,有的软件也就偶尔使用一下下,于是就找了一个绿化版的AutoCAD,挺好的,可启动时弹出"配置的Heidi驱动程序未加载.切换到默认软件驱动程序". 对于上述 ...

  8. C#如何加载程序运行目录外的程序集

    我们的应用程序部署的时候,目录结构一般不会只有运行程序的目录这一个,我们可能在运行目录下建子目录,也可能使用System32目录,也可能使用其它第三方的程序集..Net程序集 首先会在GAC中搜索相应 ...

  9. 未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。

    今天使用VS2012创建项目的时候,考虑到项目中代码的重用性以及清晰简洁性,搭建了一个三层架构,但是在项目运行的时候,总是报错: “未能加载文件或程序集“BLL”或它的某一个依赖项.生成此程序集的运行 ...

随机推荐

  1. 向数据库中添加数据,通过se16 不能添加,通过 代码可以添加的原因

    1:  在向数据库中添加数据时,通过客户端se16 准备对 数据表进行添加数据,提示如下: 找了以下原因,如下: https://www.baidu.com/link?url=3yRtAfY1_9XG ...

  2. Python几种数据结构内置方法的时间复杂度

    参考:https://blog.csdn.net/baoli1008/article/details/48059623 注:下文中,’n’代表容器中元素的数量,’k’代表参数的值,或者参数的数量. 1 ...

  3. [LeetCode] 704. Binary Search_Easy tag: Binary Search

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...

  4. 从零开始一起学习SLAM | 为啥需要李群与李代数?

    很多刚刚接触SLAM的小伙伴在看到李群和李代数这部分的时候,都有点蒙蒙哒,感觉突然到了另外一个世界,很多都不自觉的跳过了,但是这里必须强调一点,这部分在后续SLAM的学习中其实是非常重要的基础,不信你 ...

  5. php实现记住密码下次自动登陆

    这篇博客里面还写到 实现“记住我的登录状态”的功能方法,简言之,就是对首先对session进行用户信息赋值,检测session,失效后,利用cookie对其赋值: 在实现过程中,根据网上一些代码贴,整 ...

  6. js判断当前页面是否有父页面,页面部分跳转解决办法,子页面跳转父页面不跳转解决 (原)

    //如果当前页面存在父页面,则当前页面的父页面重新加载(即子页面父页面连带跳转) if(top.location!=self.location){         window.parent.loca ...

  7. !! MACD战法总结

    我现在只发技术,不预测大盘.其实说实话,大盘不用预测,只要按照guoweijohn战法,有买入信号就入,有卖出信号就出..你也会成为股神..不是吹牛,且听慢慢分解 股市有三种市场: 一.牛市 二.震荡 ...

  8. HTML5中的audio在手机端和 微信端的自动播放

    再做H5页面的时候,发现audio在手机端和微信端添加了autoplay以后还是不可以自动播放,这是因为手机端为了节约流浪所设置的 通常解决方法是给一个交互事件,一定要是交互事件 标签:<aud ...

  9. MyBatis基础入门《五》核心配置文件

    MyBatis基础入门<五>核心配置文件 描述: 在前面的章节中,简单的学习使用了一下mybatis,对于配置文件没有过多详细说明. 这里先描述项目中的一个核心配置文件:mybatis-c ...

  10. 001-http协议-请求报文以及服务器响应状态

    Http协议的几个概念: 1.连接(Connection):浏览器和服务器之间传输数据的通道. 一般请求完毕就关闭,http不保持连接.不保持连接会降低处理速度(因为建立连接速度很慢),保持连接的话就 ...