《精通linux设备驱动程序开发》——USB

一、USB体系架构

 一)、简介

  1、USB通信协议采用主从结构,实现了主机控制器和外围设备的通信。USB主机控制器属于南桥芯片的一部分,通过PCI总线和处理器通信。

 

  2、PC机上的USB系统(P217  图11-1)和嵌入式设备上的USB系统(P217  图11-2)。


  3、嵌入式设备上的USB系统中的SOC内嵌了USB控制器,该控制器支持4条总线和3种操作模式。

   1)、总线1工作在主机模式下,通过(P217  图11-1)收发器和A型接口有限连接。该A型接口可用来连接笔驱动或者键盘。

   2)、总线2工作在主机模式下,其USB收发器连接的是内嵌USB设备。

   3)、总线3工作在设备模式下,通过USB收发器和B型接口有线连接,B型接口通过一条B-A线和主机连接。在该模式下,该嵌入式设备可以当USB笔驱动设备使用,同时也可

            为主机提供另一个存储分区。

   4)、总线4接的是OTG控制器。使用这种接口,既可以把笔驱动器连接到系统上,也可以把系统连接到另一台主机上。



 二)、总线速度

  1、USB传输的速度有三种:

   1)、USB1.0标准支持的速度是1.5MB/s,称为低速USB。

   2)、USB1.1标准支持的速度是12MB/s,称为全速USB。

   3)、USB2.0标准支持的速度是480MB/s,称为高速速USB。



 三)、主机控制器

  1、USB主机控制器分为以下几种:

   1)、UHCI(通用主机控制器接口)。

   2)、OHCI(开放主机控制器接口)。

   3)、FHCI(增强主机控制器接口)。

   4)、USB OTG控制器。



 四)、传输模式

  1、USB传输数据的模式有四种:

   1)、控制传输模式,用来传输外设和主机之间的控制、状态、配置等信息。

   2)、批量传输模式,传输大量时延要求不高的数据。

   3)、中断传输模式,传输数据量小,但是对传输时延敏感,要求马上相应。

   4)、等时传输模式,传输实时数据,传输速率要预先可知。



 五)、寻址

  1、USB设备里的每个可寻址单元称作端点。为每个端点分配的地址称为端点地址。

   1)、每个端点地址都有与之相关的传输模式。地址为0的端点专门用来配置设备。控制管道和它相连,完成设备枚举过程。

   2)、每个端点可以沿上行方向发送数据,也可以沿下行方向接收数据。沿上行方向从设备接收数据叫IN传输。 沿下行方向到达设备叫OUT传输。




二、Linux-USB子系统

  1、Linux-USB子系统架构。(P220  图11-3)


  2、Linux-USB子系统组成:

   1)、USB核心。

   2)、驱动不同主机控制器的HCD。

   3)、用于根集线器的hub驱动和一个内核辅助线程khubd。

   4)、用于USB客户设备的设备驱动程序。

   5)、USB文件系统usbfs,它能够让你从用户空间驱动USB设备。



三、驱动程序的数据结构

 一)、usb_device结构体

      struct  usb_device  {

          /*  ......  */

          enum  usb_device_state  state;

          enum  usb_device_speed  speed;

          /*  ......  */

          struct  usb_device  *parent;

          /*  ......  */

          struct  usb_device_descriptor  descriptor;

          struct  usb_host_config  *config;

          struct  usb_host_config  *actconfig;

          /*  ......  */

          int  maxchild;

          struct  usb_device  *children[USB_MAXCHILDREN];

          /*  ......  */

       };



 二)、URB

  1、URB是USB数据传输机制使用的核心数据结构。URB供USB协议栈使用。


  2、URB结构

     struct  urb   {

         struct  kref  kref;

         /* ......  */

         struct  usb_device  *dev;

         unsigned  int  pipe;

         int  status;

         unsigned  int  transfer_flags;

         void  *transfer_dma;

         dma_addr_t  trsanfer_dma;

         int  tranfer_buffer_length;

         /* ......  */

         unsigned  char  *setup_packet;

         /* ......  */

         int  interval;

         /* ......  */

         void  *context;

         usb_complete  complete;

         /* ......  */

       };


  3、URB的使用分3步:分配内存,初始化,提交。

   1)、URB的内存是调用usb_alloc_urb()方法来分配的,该函数分配内存并将其置零,之后初始化URB相关的kobject和用于保护URB的自旋锁。

   2)、为了提交URB以便进行数据传输,需调用usb_submit_urb()函数。该函数异步提交URB。回调函数的地址作为参数传递给usb_fill_[control | int | bluk]_urb()函数。回

             调函数在URB提交过后被调用,负责完成检查提交状态、释放传输数据缓冲区等事情。

   3)、USB核心也提供了同步提交URB的接口函数:int  usb_[control | interrupt | bilk]_msg()。

   4)、URB的任务完成后,usb_free_urb()函数释放该实例。usb_unlink_urb()取消一个待处理的URB。



 四)、管道

  1、管道包括以下几个部分:

   1)、端点地址。

   2)、数据传输方向。

   3)、数据传输模式。


  2、管道的创建

   1)、USB核心提供现成的宏来创建管道。

      usb_[rcv | snd] [ctrl | int | bulk | isoc]pipe(struct  usb_device  *usb_dev,  __u8  endpointAddress);



 五)、描述符接口

  1、USB标准定义了一系列的描述符数据结构来保护设备的信息。Linux-USB核心定义的描述符有四种类型。

   1)、设备描述符存放设备的普通信息。usb_device_descriptor结构体表示设备描述符。

   2)、配置描述符用来描述设备配置模式。usb_config_descriptor结构体用于表示配置描述符。

   3)、接口描述符使得USB能支持多种功能。usb_interface_descriptor结构体表示接口描述符。

   4)、端点描述符存放设备最终的端点信息。usb_endpoint_descriptor结构体用于表示端点描述符。



四、枚举

  1、枚举过程是热插拔USB设备的其实步骤,该过程中,主机控制器获得设备的相关信息并配置好设备。在linux-USB子系统中,集线器驱动程序负责该枚举过程。



五、设备实例:遥测卡

 一)、简介

  1、遥控卡的寄存器


  2、USB遥测卡端点说明:

   1)、控制端点附在一个卡上配置寄存器中。

   2)、批量IN端点负责把卡收集到的遥测数据传递个给处理器。

   3)、批量OUT端点负责接收处理器传递过来的数据。



 二)、初始化和探测过程 

  1、USB驱动程序用probe()/disconnect()方法支持热插拔,用设备ID表识别驱动程序所支持的设备。

     struct  usb_device_id  {

        /*  ....  */

        __u16  idVendor;

        __u16  idProduct;

        /*  ....  */

        __u8  bDeviceClass;

        __u8  bDeviceSubClass;

        __u8  bDeviceProtocol;

        /*  ....  */

     };

   1)、idVendor和idProduct分别表示厂商ID和产品ID。

   2)、bDeviceClass、bDeviceSubClass、bDeviceProtocol则基于设备的功能对其进行归类。


  2、遥测卡驱动程序初始化及代码解析(代码清单11-2)


  3、遥测卡探测和断开连接及代码解析(代码清单11-3)



 三)、寄存器访问

  1、当应用程序打开/dev/tele设备文件的时候,open()方法立刻初始化遥测卡的配置寄存器。


  2、usb_ctrlrequest结构体

    struct  usb_ctrlrequest  {

        __u8  bRequestType;

        __u8  bRequest;

        __le16  wValue;

        __le16  wIndex;

        __le16  wLength;

      }__attribute__((packed));

   1)、bRequest域用来标识该控制请求。

   2)、bRequestType表示数据传输方向、请求类别以及数据接收方是何种类型。

   3)、wValue存放即将写到寄存器里的数据。

   4)、wIndex是寄存器的偏移地址。

   5)、wLength是传输数据的字节数。


  3、初始化遥测卡配置寄存器及代码解析(代码清单11-4)



 四)、数据传输

  1、遥测卡的数据交换(代码清单11-5)




六、类驱动程序

 一)、简介

  1、USB规范引入了设备类的概念,根据每一类驱动程序的功能吧USB设备分为几大类标准的几大类包括:

   1)、大容量存储类。

   2)、网络类。

   3)、集线器类。

   4)、串行转换器类。

   5)、音频类。

   6)、视频类。

   7)、图像类。

   8)、调制解调器。

   9)、打印机。

   10)、HID(人机接口设备)。

   每一大类的驱动程序对属于这类的所有设备通用,不需要另外开发和安装驱动程序就可以使用。


  2、每个USB设备都有类代码和子类代码。设备驱动程序的usb_device_id结构体就包含类代码成员和子类代码成员。也可以从/proc/bus/usb/device的输出结果“I:”行看到设

        备 的类代码和子类代码信息。



 二)、大容量存储设备

  1、通常来讲,USB大容量存储设备主要指USB硬盘、笔驱动器、CD-ROM、软驱以及类似的存储设备。USB大容量存储设备利用了SCSI(小型计算机系统接口)协议和主机

        系统通信。(P237  图11-4)


  2、SCSI子系统的结构分为3层:

   1)、位于顶层的设备驱动程序。

   2)、扫描总线,配置设备和将底层驱动程序相关联的中层驱动程序。

   3)、底层SCSI适配器驱动程序。


  3、大容量存储驱动程序把自己注册成一个虚拟的SCSI适配器。该虚拟适配器在上行方向上通过SCSI命令和上层通信,在下行方向上通过URB与块存储器交换数据。


  4、让usbfs中也能显示设备结点。(代码清单11-6)



 三)、USB-串行端口转换器

  1、USB-串行端口转换器能把USB接口转换成串行端口。(P241  图11-5)


  2、USB-串行端口转换器驱动程序与其他USB设备驱动程序相似,其除了利用了USN核心外,还利用了USB-Serial核心。

   1)、USB-Serial核心提供的功能如下:

    I、tty驱动程序把底层USB-串行端口转换器驱动程序和高层的串行端口层分开。

    II、通用的probe()和disconnect()函数能被所有的USB-串行端口转换器驱动程序共用。

    III、有了设备结点,从用户空间就能访问USB-串行端口转换器。应用程序通过/dev/tty/USBX设备结点就能操作USB-串行端口转换器。

   2)、底层USB-串行端口驱动程序功能如下:

    I、调用usb_serial_register()函数向USB-Seral核心注册usb_serial_driver结构体。usb_serial_driver结构体的入口点是驱动程序的核心。

    II、初始化一个usb_driver结构体并调用usb_register()函数向USB核心注册。除了USB-串行端口转换器能利用USB-Seral核心提供的probe()和disconnect()函数外,其他的

          过程和遥测卡的驱动程序很相似。


  3、FTDI驱动程序代码片段。(代码清单11-7)


 四)、人机接口设备


 五)、蓝牙



七、gadget驱动程序

  1、USB gadget驱动程序使嵌入式linux系统设备可以工作在USB设备模式。


  2、USB gadget支持属于内核的一部分,包括以下几项内容:

   1)、用于集成SoC的USB设备控制器的驱动程序。

   2)、针对存储设备、网络设备和串行端口转换器使用的驱动程序。

   3)、框架性驱动可以用来测试设备控制器驱动程序。



八、调试(略)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本信息 原书名: Essential Linux Device Drivers 原出版社: Prentice Hall 作者: (印)Sreekrishnan Venkateswaran 译者: 宋宝华 何昭然 史海滨 吴国成 丛书名: 图灵程序设计丛书 操作系统 出版社:人民邮电出版社 ISBN:9787115221674 出版日期:2010 年6月 页码:468 内容简介   本书是linux设备驱动程序开发领域的权威著作。全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深入探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如pcmcia、i2c和usb等外部总线以及视频、音频、无线连网和闪存等驱动程序开发,并讲解了相关的内核源码文件,给出了完整的开发实例。   本书适合中高级linux开发人员阅读。 目录 第1章 引言1 1.1 演进1 1.2 gnu copyleft2 1.3 kernel.org2 1.4 邮件列表和论坛3 1.5 linux发行版3 1.6 查看源代码4 1.7 编译内核7 1.8 可加载的模块8 1.9 整装待发9 第2章 内核11 2.1 启动过程11 2.1.1 bios-provided physical ram map12 2.1.2 758mb lowmem available14 2.1.3 kernel command line: ro root=/dev/hda114 2.1.4 calibrating delay...1197.46 .bogomips (lpj=2394935)15 2.1.5 checking hlt instruction16 2.1.6 net: registered protocol family 217 2.1.7 freeing initrd memory: 387k freed17 2.1.8 io scheduler anticipatory registered (default)18 2.1.9 setting up standard pci resources18 2.1.10 ext3-fs: mounted filesystem19 2.1.11 init: version 2.85 booting19 2.2 内核模式和用户模式20 2.3 进程上下文和中断上下文20 2.4 内核定时器21 2.4.1 hz和jiffies21 2.4.2 长延时22 2.4.3 短延时24 2.4.4 pentium时间戳计数器24 2.4.5 实时钟25 2.5 内核中的并发26 2.5.1 自旋锁和互斥体26 2.5.2 原子操作30 2.5.3 读—写锁31 2.5.4 调试32 2.6 proc文件系统32 2.7 内存分配33 2.8 查看源代码34 第3章 内核组件37 3.1 内核线程37 3.1.1 创建内核线程37 3.1.2 进程状态和等待队列41 3.1.3 用户模式辅助程序42 3.2 辅助接口43 3.2.1 链表44 3.2.2 散列链表49 3.2.3 工作队列49 3.2.4 通知链51 3.2.5 完成接口54 3.2.6 kthread辅助接口56 3.2.7 错误处理助手57 3.3 查看源代码58 第4章 基本概念61 4.1 设备驱动程序介绍61 4.2 中断处理63 4.2.1 中断上下文63 4.2.2 分配irq号64 4.2.3 设备实例:导航杆65 4.2.4 softirq和tasklet68 4.3 linux设备模型71 4.3.1 udev71 4.3.2 sysfs、kobject和设备类73 4.3.3 热插拔和冷插拔76 4.3.4 微码下载76 4.3.5 模块自动加载77 4.4 内存屏障78 4.5 电源管理79 4.6 查看源代码79 第5章 字符设备驱动程序81 5.1 字符设备驱动程序基础81 5.2 设备实例:系统cmos82 5.2.1 驱动程序初始化83 5.2.2 打开与释放86 5.2.3 数据交换88 5.2.4 查找92 5.2.5 控制94 5.3 检测数据可用性95 5.3.1 轮询95 5.3.2 fasync98 5.4 和并行端口交互99 5.5 rtc子系统108 5.6 伪字符驱动程序109 5.7 混杂驱动程序110 5.8 字符设备驱动程序注意事项115 5.9 查看源代码115 第6章 串行设备驱动程序118 6.1 层次架构119 6.2 uart驱动程序121 6.2.1 设备实例:手机122 6.2.2 rs-485132 6.3 tty驱动程序132 6.4 线路规程134 6.5 查看源代码141 第7章 输入设备驱动程序143 7.1 输入事件驱动程序144 7.2 输入设备驱动程序150 7.2.1 serio150 7.2.2 键盘150 7.2.3 鼠标152 7.2.4 触摸控制器157 7.2.5 加速度传感器158 7.2.6 输出事件158 7.3 调试159 7.4 查看源代码160 第8章 i2c协议161 8.1 i2c/smbus是什么161 8.2 i2c核心162 8.3 总线事务164 8.4 设备实例:eeprom164 8.4.1 初始化165 8.4.2 探测设备167 8.4.3 检查适配器的功能169 8.4.4 访问设备169 8.4.5 其他函数170 8.5 设备实例:实时时钟171 8.6 i2c-dev174 8.7 使用lm-sensors监控硬件174 8.8 spi总线174 8.9 1-wire总线176 8.10 调试176 8.11 查看源代码176 第9章 pcmcia和cf179 9.1 pcmcia/cf是什么179 9.2 linux-pcmcia子系统181 9.3 主机控制器驱动程序183 9.4 pcmcia核心183 9.5 驱动程序服务183 9.6 客户驱动程序183 9.6.1 数据结构184 9.6.2 设备实例:pcmcia卡185 9.7 将零件组装在一起188 9.8 pcmcia存储189 9.9 串行pcmcia189 9.10 调试191 9.11 查看源代码191 第10章 pci193 10.1 pci系列193 10.2 寻址和识别195 10.3 访问pci198 10.3.1 配置区198 10.3.2 i/o和内存199 10.4 dma200 10.5 设备实例:以太网—调制解调器卡203 10.5.1 初始化和探测203 10.5.2 数据传输209 10.6 调试214 10.7 查看源代码214 第11章 usb216 11.1 usb体系架构216 11.1.1 总线速度218 11.1.2 主机控制器218 11.1.3 传输模式219 11.1.4 寻址219 11.2 linux-usb子系统220 11.3 驱动程序的数据结构221 11.3.1 usb_device结构体221 11.3.2 urb222 11.3.3 管道223 11.3.4 描述符结构223 11.4 枚举225 11.5 设备实例:遥测卡225 11.5.1 初始化和探测过程226 11.5.2 卡寄存器的访问230 11.5.3 数据传输233 11.6 类驱动程序236 11.6.1 大容量存储设备236 11.6.2 usb-串行端口转换器241 11.6.3 人机接口设备243 11.6.4 蓝牙243 11.7 gadget驱动程序243 11.8 调试244 11.9 查看源代码245 第12章 视频驱动程序247 12.1 显示架构247 12.2 linux视频子系统249 12.3 显示参数251 12.4 帧缓冲api252 12.5 帧缓冲驱动程序254 12.6 控制台驱动程序265 12.6.1 设备实例:手机266 12.6.2 启动logo270 12.7 调试270 12.8 查看源代码271 第13章 音频驱动程序273 13.1 音频架构273 13.2 linux声音子系统275 13.3 设备实例:mp3播放器277 13.3.1 驱动程序函数和结构体278 13.3.2 alsa编程287 13.4 调试288 13.5 查看源代码289 第14章 块设备驱动程序291 14.1 存储技术291 14.2 linux块i/o层295 14.3 i/o调度器295 14.4 块驱动程序数据结构和方法296 14.5 设备实例:简单存储控制器298 14.5.1 初始化299 14.5.2 块设备操作301 14.5.3 磁盘访问302 14.6 高级主题304 14.7 调试306 14.8 查看源代码306 第15章 网络接口卡308 15.1 驱动程序数据结构308 15.1.1 套接字缓冲区309 15.1.2 网络设备接口310 15.1.3 激活311 15.1.4 数据传输311 15.1.5 看门狗311 15.1.6 统计312 15.1.7 配置313 15.1.8 总线相关内容314 15.2 与协议层会话314 15.2.1 接收路径314 15.2.2 发送路径315 15.2.3 流量控制315 15.3 缓冲区管理和并发控制315 15.4 设备实例:以太网nic316 15.5 isa网络驱动程序321 15.6 atm321 15.7 网络吞吐量322 15.7.1 驱动程序性能322 15.7.2 协议性能323 15.8 查看源代码324 第16章 linux无线设备驱动326 16.1 蓝牙327 16.1.1 bluez328 16.1.2 设备实例:cf卡329 16.1.3 设备实例:usb适配器330 16.1.4 rfcomm331 16.1.5 网络332 16.1.6 hid334 16.1.7 音频334 16.1.8 调试334 16.1.9 关于源代码334 16.2 红外335 16.2.1 linux-irda335 16.2.2 设备实例:超级i/o芯片337 16.2.3 设备实例:ir dongle338 16.2.4 ircomm340 16.2.5 联网340 16.2.6 irda套接字341 16.2.7 lirc341 16.2.8 查看源代码342 16.3 wifi343 16.3.1 配置343 16.3.2 设备驱动程序346 16.3.3 查看源代码347 16.4 蜂窝网络347 16.4.1 gprs347 16.4.2 cdma349 16.5 当前趋势350 第17章 存储技术设备352 17.1 什么是闪存352 17.2 linux-mtd子系统353 17.3 映射驱动程序353 17.4 nor芯片驱动程序358 17.5 nand芯片驱动程序359 17.6 用户模块361 17.6.1 块设备模拟361 17.6.2 字符设备模拟361 17.6.3 jffs2362 17.6.4 yaffs2363 17.7 mtd工具363 17.8 配置mtd363 17.9 xip364 17.10 fwh364 17.11 调试367 17.12 查看源代码367 第18章 嵌入式linux369 18.1 挑战369 18.2 元器件选择370 18.3 工具链371 18.4 bootloader372 18.5 内存布局374 18.6 内核移植375 18.7 嵌入式驱动程序376 18.7.1 闪存377 18.7.2 uart377 18.7.3 按钮和滚轮378 18.7.4 pcmcia/cf378 18.7.5 sd/mmc378 18.7.6 usb378 18.7.7 rtc378 18.7.8 音频378 18.7.9 触摸屏379 18.7.10 视频379 18.7.11 cpld/fpga379 18.7.12 连接性379 18.7.13 专用领域电子器件380 18.7.14 更多驱动程序380 18.8 根文件系统380 18.8.1 nfs挂载的根文件系统381 18.8.2 紧凑型中间件382 18.9 测试基础设施383 18.10 调试383 18.10.1 电路板返工384 18.10.2 调试器385 第19章 用户空间的驱动程序386 19.1 进程调度和响应时间387 19.1.1 原先的调度器387 19.1.2 o(1)调度器387 19.1.3 cfs388 19.1.4 响应时间388 19.2 访问i/o区域390 19.3 访问内存区域393 19.4 用户模式scsi395 19.5 用户模式usb397 19.6 用户模式i2c400 19.7 uio401 19.8 查看源代码402 第20章 其他设备驱动程序403 20.1 ecc报告403 20.2 频率调整407 20.3 嵌入式控制器408 20.4 acpi408 20.5 isa与mca410 20.6 火线410 20.7 智能输入/输出411 20.8 业余无线电411 20.9 voip411 20.10 高速互联412 20.10.1 infiniband413 20.10.2 rapidio413 20.10.3 光纤通道413 20.10.4 iscsi413 第21章 调试设备驱动程序414 21.1 kdb414 21.1.1 进入调试器415 21.1.2 kdb415 21.1.3 kgdb417 21.1.4 gdb420 21.1.5 jtag调试器421 21.1.6 下载423 21.2 内核探测器423 21.2.1 kprobe423 21.2.2 jprobe427 21.2.3 返回探针429 21.2.4 局限性431 21.2.5 查看源代码431 21.3 kexec与kdump431 21.3.1 kexec432 21.3.2 kdump与kexec协同工作432 21.3.3 kdump433 21.3.4 查看源代码437 21.4 性能剖析437 21.4.1 利用oprofile剖析内核性能438 21.4.2 利用gprof剖析应用程序性能440 21.5 跟踪441 21.6 ltp444 21.7 uml444 21.8 诊断工具444 21.9 内核修改配置选项444 21.10 测试设备445 第22章 维护与发布446 22.1 代码风格446 22.2 修改标记446 22.3 版本控制447 22.4 一致性检查447 22.5 构建脚本448 22.6 可移植代码450 第23章 结束语451 23.1 流程一览表451 23.2 下一步该做什么452 附录a linux汇编453 附录b linux与bios457 附录c seq文件461

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值