USB总线驱动程序的作用

1. 识别USB设备

1.1 分配地址

1.2 并告诉USB设备(set address)

1.3 发出命令获取描述符

描述符的信息可以在include\linux\usb\Ch9.h看到  (Ch9是指USB规范的第九章)



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

3. 提供USB读写函数





把USB设备接到开发板上,看输出信息:

usb 1-1: new full speed USB device using s3c2410-ohci and address 2

usb 1-1: configuration #1 chosen from 1 choice

scsi0 : SCSI emulation for USB Mass Storage devices

scsi 0:0:0:0: Direct-Access     HTC      Android Phone    0100 PQ: 0 ANSI: 2

sd 0:0:0:0: [sda] Attached SCSI removable disk

拔掉

usb 1-1: USB disconnect, address 2





再接上:

usb 1-1: new full speed USB device using s3c2410-ohci and address 3

usb 1-1: configuration #1 chosen from 1 choice

scsi1 : SCSI emulation for USB Mass Storage devices

scsi 1:0:0:0: Direct-Access     HTC      Android Phone    0100 PQ: 0 ANSI: 2

sd 1:0:0:0: [sda] Attached SCSI removable disk

在内核目录下搜:

grep "USB device using" * -nR

drivers/usb/core/hub.c:2186:              "%s %s speed %sUSB device using %s and address %d\n",



根据打印信息查看信息所在的函数hub_port_init(),看这个函数的被调用情况

hub_irq  //这个中断是主机控制器驱动程序注册的中断,当接上USB设备后,USB设备硬件上的手脚使主机控制器的D+或D-引脚发生变化。主机控制器硬件上感知有USB控制器接入,就会产生某个中断,调用中断函数hub_irq。

hub_irq

 
kick_khubd

hub_thread

hub_events

hub_port_connect_change



udev
= usb_alloc_dev(hdev, hdev->bus, port1);

dev->dev.bus
= &usb_bus_type;  //总线设备驱动模型



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





hub_port_init
  // usb 1-1: new full speed USB device using s3c2410-ohci and address 3



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

usb_get_device_descriptor(udev, 8); // 获取设备描述符,这里获得8个字节是因为还不知道端点0一次性能传输多少数据,从第8个字节可以知道端点0一次性传输的包大小是多少。

retval
= usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);



usb_new_device(udev)
  

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

usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来。

##################################################

我们插上任意的USB设备,就发现内核打印出一些信息,说明USB总线驱动程序已经做好。USB设备程序已经做好。后面只需要编写USB驱动程序,即上图中的usb_driver 。(因此,以后写USB驱动程序,写的就是USB接口描述符方面的)

##################################################

关于设备描述符的详细介绍,可以参考我的博客:http://blog.csdn.net/qq_26093511/article/details/51125618

1、设备描述符

(1)这里bMaxPacketSize0

最大包大小0是指端点0,每一个设备都有端点0,因为是通过端点0识别USB设备的,把命令和地址发给端点0,从端点0读取到描述符信息

(2)设备描述符有厂家ID、产品ID等

可以打开windows里面的设备管理器

(3)设备描述符里有bNumConfigurations

是指配置的个数,这个设备有多少种配置。因而有配置描述符。

2、配置描述符

配置描述符里有bNumInterfaces; /*配置所支持的接口数*

3、接口描述符

接口描述符是指逻辑上的设备,如一个USB声卡,硬件上只有一个,但是逻辑上可能有两个功能,一个是录音,一个是播放。

写驱动程序的时候是给逻辑上的设备写的,所以一个USB硬件可能安装多个驱动程序。

4、端点描述符
 (端点是USB传输对象)

(1)结构体

struct usb_endpoint_descriptor {

 __u8 bLength; /* 描述符长度 */

 __u8 bDescriptorType; /* 描述符类型 */

 __u8 bEndpointAddress; /* 端点地址: 0~3 位是端点号,第 7 位是方向(0-OUT,1-IN) */

 __u8 bmAttributes; /* 端点属性: bit[0:1] 的值为00 表示控制,为01 表示同步,为02 表示批量,为03
表示中断 */



 __le16 wMaxPacketSize; /* 本端点接收或发送的最大信息包的大小 */

 __u8 bInterval; /* 轮询数据传送端点的时间间隔 */

 /* 对于批量传送的端点以及控制传送的端点,此域忽略 */

 /* 对于同步传送的端点,此域必须为 1 */

 /* 对于中断传送的端点,此域值的范围为 1~255 */



 __u8 bRefresh;

  __u8 bSynchAddress;

} __attribute__ ((packed));

(2)

5、把描述符统统读出来后,根据这些信息来找到驱动程序

转自:http://blog.csdn.net/qingkongyeyue/article/details/53363298

USB驱动程序之USB总线驱动程序学习笔记的更多相关文章

  1. USB驱动程序之USB设备驱动程序2鼠标用作键盘学习笔记

    1.usbmouse.c (1)probe函数 在这个probe函数后判断是不是一个鼠标,先得到usb_host_interface结构体,除了端点0外,端点个数如果不是1,返回错误,表示不是自己能支 ...

  2. CAN总线协议 学习笔记

    1.CAN总线网络 CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻,但是 ...

  3. I2C总线协议学习笔记 (转载)

    1.I2C协议   2条双向串行线,一条数据线SDA,一条时钟线SCL.   SDA传输数据是大端传输,每次传输8bit,即一字节.   支持多主控(multimastering),任何时间点只能有一 ...

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

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

  5. USB驱动程序之概念介绍学习笔记

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

  6. USB2.0学习笔记连载(三):通用USB驱动程序解析

    对于USB驱动的开发,读者可以使用Windows DDK.DriverStudio等多种开发工具来实现USB的驱动,但是驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄露而死机.那么对于笔 ...

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

    通用串行总线(USB)是主机和外围设备之间的一种连接.USB总线规范有1.1版和2.0版,当然现在已经有了3.0版本.USB1.1支持两种传输速度:低速为1.5Mbps,高速为12Mbps.USB2. ...

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

    转载注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25040009 总线驱动是不用改的.内核都帮我们做好了.为了了解整个USB驱动的体 ...

  9. USB总线驱动程序

    USB主机控制器:UHCI OHCI EHCI UHCI:intel 低速(1.5Mbps)(USB1.1)/全速(12Mbps)(USB2.0,USB2.0又分为全速和高速)OHCI:microso ...

随机推荐

  1. 如何查看PHP的配置信息

    1.问题描述 如何利用PHP函数查看PHP的配置信息 2.问题函数 <?php echo phpinfo(); ?> 3.输出结果 phpinfo() PHP Version => ...

  2. java.lang.IllegalArgumentException: Invalid character found in method name

    1.错误描述 信息: Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors ...

  3. Vim技能修炼教程(1) - 使用vundle管理插件

    世界上有两个伟大的编辑器:一个是emacs,一个是vi.它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持. 尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它 ...

  4. postfix邮件服务器搭建03-webmail安装篇

    本文接着上文的安装进行,介绍另一个WebMail功能更加人性化的roundcube.当然也可以对已有的postfix邮件系统进行功能完善 1.下载安装roundcube cd /server/tool ...

  5. 用xapian来做索引

    最近一个项目需要正则搜索MongoDB,400多万的数据一次查询要20s以上,需要建立一个前端索引服务.本着部署简单.开发容易的原则,找到了xapian这个索引库. 我使用的是Python的接口,xa ...

  6. 线性回归 Linear regression(4) 局部加权回归

    这篇文章将介绍过拟合和欠拟合的概念,并且介绍局部加权回归算法. 过拟合和欠拟合 之前在线性回归中,我们总是将单独的x作为我们的特征,但其实我们可以考虑将,甚至x的更高次作为我们的特征,那么我们通过线性 ...

  7. 页面提交 string数组和list对象集合举例

    ajax表单提交   $.ajax({                 cache: true,                 type: "POST",             ...

  8. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  9. BZOJ3730 震波 【动态点分治】*

    BZOJ3730 震波 Description 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土 ...

  10. BZOJ3144 Hnoi2013 切糕 【网络流】*

    BZOJ3144 Hnoi2013 切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的 ...