未能安装设备驱动程序序通常要完成哪些工作

Linux USB驱动工作流程 - wxie的Linux人生
- 博客频道 - CSDN.NET
3427人阅读
1. USB主机
在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。
因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB设备如何与主机通信。Linux内核USB核心负责USB驱动管理和协议处理的主要工作。主机控制器驱动和设备驱动之间的USB核心非常重要,其功能包括:通过定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息;完成设备热插拔控制、总线数据传输控制等。
2. USB设备
Linux内核中USB设备侧驱动程序分为3个层次:UDC驱动程序、Gadget API和Gadget驱动程序。UDC驱动程序直接访问硬件,控制USB设备和主机间的底层通信,向上层提供与硬件相关操作的回调函数。当前Gadget API是UDC驱动程序回调函数的简单包装。Gadget驱动程序具体控制USB设备功能的实现,使设备表现出“网络连接”、“打印机”或“USB Mass Storage”等特性,它使用Gadget API控制UDC实现上述功能。Gadget
API把下层的UDC驱动程序和上层的Gadget驱动程序隔离开,使得在Linux系统中编写USB设备侧驱动程序时能够把功能的实现和底层通信分离。
&3. 在USB设备组织结构中,从上到下分为设备(device)、配置(config)、接口(interface)和端点(endpoint)四个层次。USB设备程序绑定到接口上。
&& 对于这四个层次的简单描述如下:
&&&&& 设备通常具有一个或多个的配置
&&&&& 配置经常具有一个或多个的接口
&&&&& 接口没有或具有一个以上的端点
4. USB通信最基本的形式是通过端点(USB端点分中断(Interrupt)、批量(Bulk)、等时(ISO)、控制(Control)四种,每种用途不同),USB端点只能往一个方向传送数据,从主机到设备或者从设备到主机,端点可以看作是单向的管道(pipe)。驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否已经安装了硬件。USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序,热插拨脚本使用它来确定当一个特定的设备插入到系统时该自动执行哪一个驱动程序的Probe。
5. 数据结构
1) USB设备:对应数据结构struct usb_device
2) 配置:struct usb_host_config&(任一时刻,只能有一个配置生效)
3)USB接口:struct usb_interface (USB 核心将其传递给USB设备驱动,并由USB设备驱动负责后续的控制。一个USB接口代表一个基本功能,每个USB驱动控制一个接口。所以一个物理上的硬件设备可能需要 一个以上的驱动程序。)
4)端点:&struct usb_host_endpoint ,它所包含的真实端点信息在另一个结构中:struct usb_endpoint_descriptor(端点描述符,包含所有的USB特定数据)。
6. USB端点分类
USB 通讯的最基本形式是通过一个称为端点的东西。一个USB端点只能向一个方向传输数据(从主机到设备(称为输出端点)或者从设备到主机(称为输入端点))。端点可被看作一个单向的管道。
USB 端点有 4 种不同类型, 分别具有不同的数据传送方式:
1) 控制CONTROL
控制端点被用来控制对USB设备的不同部分访问. 通常用作配置设备、获取设备信息、发送命令到设备或获取设备状态报告。这些端点通常较小。每个 USB 设备都有一个控制端点称为&端点 0&, 被 USB 核心用来在插入时配置设备。USB协议保证总有足够的带宽留给控制端点传送数据到设备.
2)中断INTERRUPT
每当 USB 主机向设备请求数据时,中断端点以固定的速率传送小量的数据。此为USB 键盘和鼠标的主要的数据传送方法。它还用以传送数据到USB设备来控制设备。通常不用来传送大量数据。USB协议保证总有足够的带宽留给中断端点传送数据到设备.
3) 批量BULK
批量端点用以传送大量数据。这些端点通常比中断端点大得多. 它们普遍用于不能有任何数据丢失的情况。USB 协议不保证传输在特定时间范围内完成。如果总线上没有足够的空间来发送整个BULK包,它被分为多个包进行传输。这些端点普遍用于打印机、USB Mass Storage和USB网络设备上。
4) 等时ISOCHRONOUS
等时端点也批量传送大量数据, 但是这个数据不被保证能送达。这些端点用在可以处理数据丢失的设备中,并且更多依赖于保持持续的数据流。如音频和视频设备等等。
控制和批量端点用于异步数据传送,而中断和等时端点是周期性的。这意味着这些端点被设置来在固定的时间连续传送数据,USB 核心为它们保留了相应的带宽。
7. endpoint
struct usb_host_endpoint{
&&&&struct usb_endpoint_descriptor desc;//端点描述符
&&&&struct list_head urb_list;//此端点的URB对列,由USB核心维护
&&&&void *hcpriv;
&&&&struct ep_device
*ep_dev; /* For sysfs info */
&&&&unsigned char*extra;/* Extra descriptors */
&&&&int extralen;
&&&&int enabled;
当调用USB设备驱动调用usb_submit_urb提交urb请求时,将调用int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)把此urb增加到urb_list的尾巴上。(hcd: Host Controller Driver,对应数据结构struct usb_hcd )
&&&&& 所有USB通讯均为请求--&响应模式,USB设备不会主动向Host发送数据。写数据:USB设备驱动发送urb请求给USB设备,USB设备不需要回数据。读数据:USB设备驱动发送urb请求给USB设备,USB设备需要回数据。
&&&&& USB 设备驱动通过urb和所有的 USB 设备通讯。urb用 struct urb 结构描述(include/linux/usb.h )。
&urb 以一种异步的方式同一个特定USB设备的特定端点发送或接受数据。一个 USB 设备驱动可根据驱动的需要,分配多个 urb 给一个端点或重用单个 urb 给多个不同的端点。设备中的每个端点都处理一个 urb 队列, 所以多个 urb 可在队列清空之前被发送到相同的端点。
&& &一个 urb 的典型生命循环如下:
&(1)被创建;
&(2)被分配给一个特定 USB 设备的特定端点;
&(3)被提交给 USB 核心;
&(4)被 USB 核心提交给特定设备的特定 USB 主机控制器驱动;
&(5)被 USB 主机控制器驱动处理, 并传送到设备;
&(6)以上操作完成后,USB主机控制器驱动通知 USB 设备驱动。
&&& urb 也可被提交它的驱动在任何时间取消;如果设备被移除,urb 可以被USB核心取消。urb 被动态创建并包含一个内部引用计数,使它们可以在最后一个用户释放它们时被自动释放。
8.1 提交 urb
一旦 urb 被正确地创建并初始化, 它就可以提交给 USB 核心以发送出到 USB 设备. 这通过调用函数sb_submit_urb 实现.
int usb_submit_urb(struct urb *urb, gfp_t mem_flags);
struct urb *urb :指向被提交的 urb 的指针
gfp_t mem_flags :使用传递给 kmalloc 调用同样的参数, 用来告诉 USB 核心如何及时分配内存缓冲
因为函数 usb_submit_urb 可被在任何时候被调用(包括从一个中断上下文), mem_flags 变量必须正确设置. 根据 usb_submit_urb 被调用的时间,只有 3 个有效值可用:
GFP_ATOMIC
只要满足以下条件,就应当使用此值:
1) 调用者处于一个 urb 结束处理例程,中断处理例程,底半部,tasklet或者一个定时器回调函数.
2) 调用者持有自旋锁或者读写锁. 注意如果正持有一个信号量, 这个值不必要.
3) current-&state 不是 TASK_RUNNING. 除非驱动已自己改变 current 状态,否则状态应该一直是TASK_RUNNING .
驱动处于块 I/O 处理过程中. 它还应当用在所有的存储类型的错误处理过程中.
GFP_KERNEL
所有不属于之前提到的其他情况
在 urb 被成功提交给 USB 核心之后, 直到结束处理例程函数被调用前,都不能访问 urb 结构的任何成员
8.2 urb结束处理例程
如果 usb_submit_urb 被成功调用, 并把对 urb 的控制权传递给 USB 核心, 函数返回 0; 否则返回一个负的错误代码. 如果函数调用成功, 当 urb 被结束的时候结束处理例程会被调用一次.当这个函数被调用时, USB 核心就完成了这个urb, 并将它的控制权返回给设备驱动.
只有3 种结束urb并调用结束处理例程的情况:
(1)urb 被成功发送给设备, 且设备返回正确的确认.如果这样, urb 中的status变量被设置为 0.
(2)发生错误, 错误值记录在 urb 结构中的 status 变量.
(3)urb 从 USB 核心unlink. 这发生在要么当驱动通过调用 usb_unlink_urb 或者 usb_kill_urb告知 USB 核心取消一个已提交的 urb,或者在一个 urb 已经被提交给它时设备从系统中去除.
9. 探测和断开
在 struct usb_driver 结构中, 有 2 个 USB 核心在适当的时候调用的函数:
(1)当设备插入时, 如果 USB 核心认为这个驱动可以处理(USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序),则调用探测(probe)函数,探测函数检查传递给它的设备信息,
并判断驱动是否真正合适这个设备.
(2)由于某些原因,设备被移除或驱动不再控制设备时,调用断开(disconnect)函数,做适当清理.
探测和断开回调函数都在USB集线器内核线程上下文中被调用, 因此它们休眠是合法的. 为了缩短 USB 探测时间,大部分工作尽可能在设备打开时完成.这是因为 USB 核心是在一个线程中处理 USB 设备的添加和移除, 因此任何慢设备驱动都可能使 USB 设备探测时间变长。
9.1探测函数分析
在探测回调函数中, USB设备驱动应当初始化它可能用来管理 USB 设备的所有本地结构并保存所有需要的设备信息到本地结构, 因为在此时做这些通常更容易.为了和设备通讯,USB 驱动通常要探测设备的端点地址和缓冲大小.
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:592928次
积分:8396
积分:8396
排名:第916名
原创:206篇
转载:257篇
评论:91条
(2)(1)(4)(9)(3)(6)(11)(7)(1)(1)(5)(2)(7)(22)(27)(14)(6)(25)(7)(6)(19)(23)(15)(21)(4)(9)(6)(3)(15)(1)(13)(46)(20)(55)(19)(28)由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常. (代码 31)_百度知道
由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常. (代码 31)
WAN微信端口,IP,IPv6,网络监视器全是黄色叹号
我有更好的答案
您好,对于您这样的情况建议您下载最新版本的驱动软件,更新到最新版本的驱动。
您好,类似于这样的驱动程序建议您在官网更新到最新版本试一下,一般是比较有效果的。
其他类似问题
驱动程序的相关知识
等待您来回答
为您推荐:
下载知道APP
随时随地咨询
出门在外也不愁做linux设备驱动的工作和前景如何?
- 全力为用户发展你我他
做linux设备驱动的工作和前景如何?
公司里做产品,不注重linux系统底层和驱动开发;我刚来公司,便让我写了两个驱动,一个i2c的,一个spi的。全是自学的,顶着压力郁闷了三个月搞定。抛开这个产品不再用是领导决策的失误,但勾起了我对设备驱动的兴趣。公司注重硬件和软件,很少甚至几乎没有人在做驱动,因此我准备跳槽,想找一份设备驱动的工作。设备驱动工程师的前景如何?驱动和底层BSP要求很高,应该选择什么样规模和领域的企业呢?小公司也招驱动工程师,但是有这样高的技术实力么?请各抒己见,谢谢。
做驱动,环境跟公司大小并没有什么太大的关联。比如有些公司主做vxworks, 招linux驱动工程师,则有可能你进去就是一个人做这块。楼主在面试过程可向考官了解下公司的概况,再决定是否加入。
其他回答 (16)
感觉你算牛的,linux驱动应该算是嵌入式中最难的,做好了驱动,就非常牛了,楼主加油!
楼主起的好早啊,早期的鸟儿有虫吃~~
只要做精通了就很值钱。驱动负责的是硬件、软件的这层。一个产品的稳定性就在此,技术难度很高。
做深了,做哪块都可以。驱动的话学电子的更容易理解一些。
这个我建议必须跳,驱动是最重要的我认为,搞驱动的难度也最大。不知要懂软件,也要懂硬件。。我就是 做驱动的。底层上至写调试应用程序,对于不规则的驱动,或者说没有几个明确架构的驱动,你都要考虑软件的问题,下至底层,有时你都得亲自上阵调板子,这就要求很多仪器你也得会用了,当然,画电路,这个肯定轮不到你做了,这是硬件的事情。。。
不要总想着是否有前途,沉下心去,总会有不错的回报
我也是做驱动的 的确招这种人的公司比较的少,现在很多公司都给不起钱啊。加油吧
公司里做产品,不注重linux系统底层和驱动开发;我刚来公司,便让我写了两个驱动,一个i2c的,一个spi的。全是自学的,顶着压力郁闷了三个月搞定。抛开这个产品不再用是领导决策的失误,但勾起了我对设备驱动的兴趣。======================================================================================月经贴,看过呵呵,lz过3年再回来看看这贴不知道是什么感想。只说一句,“写了两个驱动,一个i2c的,一个spi的”你认为你这两个“驱动”(姑且算作驱动吧),是整个产品的重点吗,能给整个产品带来什么亮点(无非就是通讯接口罢了),随便拿起个山寨机那个上面少了这些接口,你认为这是做山寨机的难点吗,在看看价格,只能呵呵了吧。
我就是做驱动,有难度不假,对于整个系统来说最重要也不假,但是这类人的需求量少,而且基本上所有的驱动都是移植,当然移植也是很有难度的。就现在的发展来说,驱动的受众太少,除非是绝顶高手否则工资比较低,活也不会太多。加上各种平台的集成度越来越高,没有多少驱动要自己去搞,除非你能进平台生产商。怎么说呢,虽然是个难度高的活,但是也许因为难度太高所以正在被集成,正在被现成的代码代替。而且硬件的更新速度是有限的,这也决定了驱动的贡献空间不会太大。而应用则不一样,应用是多样化的,用户的需求是永远在变化的。有干不完的活。如果应用做得好还是建议不要来搞驱动了。C++,java架构师啥的,非常值钱。
还是有一定的前途的。但是要扩展相关知识面。
我毕业快三年了。刚来公司因为有驱动的需求,才得以有这个是实践的机会;后来又做了一年多硬件。由于设备驱动涉及的内容很多,技术还不够强,也在学习,才没有过早跳槽。驱动需要实践,需要多方面的学习。都要加油啊,路还很长;这可是工作兴趣和动力的来源啊、
人处在啥环境就能做啥事, 楼主加油.
做个中庸的评价:做驱动的条件: 1. 学过模拟电路,数字电路。能看懂电路原理图。 2. C语言过硬,理解透彻。 3. 逻辑严谨,思维缜密,DEBUG能力强,运行稳定性强。 4. 能流畅阅读英文资料。做驱动还是有前途的,关键是看LZ想往哪个方向发展了。如果LZ喜欢与硬件打交道,对性能比较感兴趣,那做驱动是很合适的。
原厂和外企首选。
做驱动,环境跟公司大小并没有什么太大的关联。比如有些公司主做vxworks, 招linux驱动工程师,则有可能你进去就是一个人做这块。楼主在面试过程可向考官了解下公司的概况,再决定是否加入。
说实话,很佩服你!我跟你有一样的想法,我学过驱动,也很喜欢那种思考的感觉,当然跟你一样也想做驱动方面的工作,但是刚刚毕业没有那么 好的技术,我现在还只是搞应用层的软件,但是也是一直在自学底层的开发。我是做嵌入式的,主要是在不同的ARM板上跑应用层,希望有一天可以跟你一样去做驱动方面的工作…… 至于 你的问题我还没有你了解,就不多说了。
相关知识等待您来回答
该问题来自:致力于网站建设的技术交流,经验分享,资源分享,为网站建设者提供资源交流等站长交流论坛-易采网操作系统领域专家一章 操作系统引论 一.填空题 1.操作系统是最基本的( )软件。 2&..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
第一章 操作系统引论
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口操作系统作业二答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
&&¥2.00
喜欢此文档的还喜欢
操作系统作业二答案
华​南​理​工​大​学​操​作​系​统​作​业​答​案
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢}

我要回帖

更多关于 找不到设备驱动程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信