大话USB驱动之总线驱动程序

总线驱动是不用改的,内核都帮我们做好了,为了了解整个USB驱动的体系,我们来分析一下总线驱动程序。

一.总线框图

总线的图画的已经非常清楚了,这篇博客我们分析的是左边的程序,在下篇我们想通过USB键盘这一实际例子来讲解。

二.程序实现

1. 由于代码太多且关系复杂这里只列出调用的函数(没有写参数)。从插入USB设备,到调用USB设备驱动程序,这一过程。

hub_irq()                //当我们接上USB的时候,由于硬件上会产生一个高电平,所以主机控制器会产生中断
    kick_khubd()                             //唤醒线程
        hub_thread()                         //线程
            hub_events()                     //事件
                hub_port_connect_change()    //端口连接发生变化
                    udev = usb_alloc_dev(hdev, hdev->bus, port1); // 分配一个udev结构体
                                dev->dev.bus = &usb_bus_type;     //USB总线
                    choose_address(udev); // 给新设备分配编号(地址)
                    hub_port_init()    //端口初始化
                        hub_set_address  // 把编号(地址)告诉USB设备
                        usb_get_device_descriptor(udev, 8); // 获取设备描述符
                        retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);//再次获得一次
                        usb_new_device(udev)                //新建USB设备
                            err = usb_get_configuration(udev); //获得配置,把所有描述符都读出来并解析
                            usb_parse_configuration()         //解析
                            device_add()  // 把device放入usb_bus_type的dev链表,
                                            // 从usb_bus_type的driver链表里取出usb_driver,
                                            // 把usb_interface和usb_driver的id_table比较
                                            // 如果能匹配,调用usb_driver的.probe
                                                                                            

2.总线驱动程序都做了什么

a. 识别USB设备

1. 分配地址

choose_address(udev); // 给新设备分配编号(地址)

2. 并告诉USB设备(set address)

hub_set_address  // 把编号(地址)告诉USB设备

3. 发出命令获取描述符(描述符的信息可以在include\linux\usb\Ch9.h看到)

retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);

b. 查找并安装对应的设备驱动程序


device_add();

c. 提供USB读写函数

尽管USB本身所属设备驱动的结构与不挂在USB总线上时完全相同,但是在访问方式上却发生了很大的变化。例如,对于字符设备驱动而言,尽管仍然是write(), read(), ioctl()这些函数,但是在这些函数中,与USB设备通信时不再是I/O内存和I/O端口的访问,而贯穿始终的是称为URB的USB请求块,这些请求块通过USB总线驱动提供的读写等接口进行操作。

参考:韦东山视频第二期

大话USB驱动之总线驱动程序,布布扣,bubuko.com

时间: 2024-11-05 18:46:24

大话USB驱动之总线驱动程序的相关文章

大话USB驱动之基础概念

写在前面的话:这几天一直在学习USB驱动,中间遇到挫折困难在此不再详诉.....写着几篇文章算是对之前几天来所学知识的一个总结.本人深知你仅仅通过这几篇文章是不可能完全掌握USB驱动的,但只要能给大家带来一点思路,或者能对大家有所帮助,文章的目的也就达到了. 一.整体框架 ------------------------------------------------------------- USB设备驱动程序      // 知道数据含义 内核 -----------------------

大话USB驱动之USB键盘

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25040049 一.总体框图 二.驱动代码 /*************************************************************** *版权所有 (C)2014, *文件名称:linux键盘驱动 *内容摘要:用另一种方式改写linux键盘驱动 *其它说明: *当前版本:V1.2 *作 者: 若云流风 *完成日期:2014.5.6 *修改记

Linux驱动之USB总线驱动程序框架简析

通用串行总线(USB)是主机和外围设备之间的一种连接.USB总线规范有1.1版和2.0版,当然现在已经有了3.0版本.USB1.1支持两种传输速度:低速为1.5Mbps,高速为12Mbps.USB2.0的传输速度可以高达480Mbps.USB2.0向下兼容USB1.1,可以将USB1.1的设备连接到USB2.0控制器上,也可以把USB2.0的设备连接到USB1.1控制器上.S3C2440的USB主机控制器支持USB1.1总线规范. USB总线的拓扑结构如下图所示:USB主机控制器(USB Hos

Linux USB 驱动开发(三)—— 编写USB 驱动程序

前面学习了USB驱动的一些基础概念与重要的数据结构,那么究竟如何编写一个USB 驱动程序呢?编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否安装了硬件.当然,这些制造商和设备标识需要我们编写进USB 驱动程序中. USB 驱动程序依然遵循设备模型 -- 总线.设备.驱动.和I2C 总线设备驱动编写一样,所有的USB驱动程序都必须创建的主要结构体是 struct usb_driver,它们向USB 核心代码描

Linux USB 驱动开发实例 (三)—— 基于USB总线的无线网卡浅析

回顾一下USB的相关知识   USB(Universal Serial Bus)总线又叫通用串行外部总线,它是20世纪90年代发展起来的.USB接口现在得到了广泛的应用和普及,现在的PC机中都带有大量的USB接口.它最大的特点就是方便通用.支持热插拔并且可以在一个接口上插上多个设备.当设备用电量小的时候,它还可以充当电源.它的众多优点使得它得到了广泛的应用. 在PC机器内部有个USB中央控制器,这个中央控制器负责管理插到USB接口上的设备.当主机要向设备发送或接受数据时,都是向USB中央控制器发

Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁.在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作. 设备驱动程序是内核的一部分,主要完成以下功能:对设备的初始化和释放:把数据从内核传送到硬件设备和从硬件设备读取数据:读取应用程序数据传送给设备文件和回送应用程序请求的数据:检测和处理硬件设备出现的错误. 一. Linux USB子系统分析 在Linux系统中,USB主机驱动程序由3部分组成:US

Linux USB驱动程序设计

1. USB发展史 USB(Universal Serial Bus ),通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯. USB是在1994年底由英特尔.康柏.IBM.Microsoft等多家公司联合提出的,自1996年推出后,已成功替代串口和并口,成为当今个人电脑和大量智能设备的必配接口之一. ?USB 1.0出现在1996年的,速度只有1.5Mb/s1998年升级为USB 1.1,速度也提升到12Mb/s,称之为"full speed" ?USB 2.0规范

USB驱动开发大全【转】

本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构体struct usb_driverstruct usb_driver->struct module *owner   (有他可正确对该驱动程序引用计数,应为THIS_MODULE)->const char *name   (驱动名字,运行时可在查看 /sys/bus/usb/drivers/)-

Linux USB驱动框架分析 【转】

转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结当然不可缺,更何况我决定为嵌入式卖命了.好,言归正传,我说一说这段时间的收获,跟大家分享一下Linux的驱动开发.但这次只先针对Linux的USB子系统作分析,因为周五研讨老板催货.当然,还会顺带提一下其他的驱动程序写法. 事实上,Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更