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;
EDK II之USB设备驱动程序的加载与运行的更多相关文章
- USB设备驱动程序学习笔记(一)
现象:把USB设备接到PC1. 右下角弹出"发现android phone"2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能知道 ...
- USB设备驱动程序(一)
USB驱动编程原理: 当我们把USB设备插入USB口时会提示需要安装相对应的驱动,如USB鼠标.USB键盘等,这些电脑自己自身已经自带有相对于的驱动程序, 当电脑检查到该USB设备类型相同就去帮你安装 ...
- 12、USB设备驱动程序
linux-3.4.2\driver\hid\usbhid\usbmouse.c 内核只带USB驱动程序 (hub和usb是两个不同的设备,hub在内核上电的过程中在usb_hub_init函数中调用 ...
- USB设备驱动程序1
目的:USB鼠标用作按键,左键相当于字母L,右键相当于字母S,中键相当于Enter.如何来实现?用到输入子系统:1)分配input_dev2)设置3)注册4)硬件相关操作对于USB鼠标来说,硬件操作应 ...
- linux设备和驱动加载的先后顺序
点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...
- 事件ID:7026(“下列引导或系统启动驱动程序无法加载: cdrom”)的解决方法
电脑没有安装光驱,而是使用USB光驱/虚拟光驱软件,每次开机后"事件查看器"都显示错误:"下列引导或系统启动驱动程序无法加载: cdrom"(事件ID:7 ...
- AutoCAD配置的Heidi驱动程序未加载
电脑安装的软件越来越多,有的软件也就偶尔使用一下下,于是就找了一个绿化版的AutoCAD,挺好的,可启动时弹出"配置的Heidi驱动程序未加载.切换到默认软件驱动程序". 对于上述 ...
- C#如何加载程序运行目录外的程序集
我们的应用程序部署的时候,目录结构一般不会只有运行程序的目录这一个,我们可能在运行目录下建子目录,也可能使用System32目录,也可能使用其它第三方的程序集..Net程序集 首先会在GAC中搜索相应 ...
- 未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。
今天使用VS2012创建项目的时候,考虑到项目中代码的重用性以及清晰简洁性,搭建了一个三层架构,但是在项目运行的时候,总是报错: “未能加载文件或程序集“BLL”或它的某一个依赖项.生成此程序集的运行 ...
随机推荐
- sap 查看自己代码的结构
1:进入系统X3C:然后输入T-CODE bsp_wd_cmpwb
- GRU门控制循环单元【转载】
转自:https://www.infoq.cn/article/sliced-recurrent-neural-networks 1.门控循环单元 GRU GRU 由 reset gate r 和 u ...
- NgDL:第四周深层神经网络
4.3核对矩阵维数 根据前向的矩阵,可以计算出右上的规律,对于第L层的w来说,其维数为(n[L],n[L-1]),n[L]表示第L层的单元数. 4.4为什么深层神经网络会好用? 如果要做一个人脸识别的 ...
- xcodebuild 打包
我的xcode版本比较高,查找的一些低版本的构建都不可用,所以在此记录我的打包过程. 1.app代码仓需要发布的ipa的打包:采用achieve的方式 (1)前期工作 mkdir arch archi ...
- 产品设计教程:wireframe,prototype,mockup到底有何不同?
wireframe,prototype,mockup 三者经常被混用,很多人把三者都叫原型,真的是这样吗? 我们来看看三者到底有何不同.先来做一道选择题: 从这张图可以看出,prototype 和其他 ...
- Appium基础(三)对象抓取
一.启动Android模拟器 二.打开App应用,这里以计算器为例子 三.打开uiautomatorviewer.bat 这个文件在Android SDK-->Tool目录下 双击uiautom ...
- 文档设计也需要坚持DRY原则--支付中心应用部署结构图完善
今天上午,我拿着支付中心的设计文档,给入职不久的同事讲解目前支付中心系统的应用部署情况.当时同事嗯嗯地点头反应. 下午呢,发现自己设计的有问题,赶紧给予完善. 代码重构方面讲究DRY编程原则.我们在设 ...
- 在屏幕拖拽3D物体移动
3D物体的拖拽不同于2D的.因为3D物体有x,y,z当然.实际拖拽还是在XZ平面.只是多了几个转换 using UnityEngine; using System.Collections; publi ...
- 39.css3----button按钮点击时出现蓝色边框
css控制Button 按钮的点击时候出现蓝色边框http://www.inbeijing.org/archives/1139 Button 按钮的点击时候出现蓝色边框的问题 添加css属性,这样在点 ...
- 29.html5 移动端开发总结
手机与浏览器 浏览器: 移动端开发主要针对手机,ipad等移动设备,随着地铁里的低头族越来越多,移动端开发在前端的开发任务中站的比重也越来越大.各种品牌及尺寸的手机也不尽相同.尺寸不同就算了分辨率,视 ...