1、 内 容 简 介 本书基于 2.6.22 内核,对 USB 子系统的大部分源代码逐行进行分析,系统地阐释了 Linux 内核中 USB 子系统是如何运转的,子系统内部的各个模块之间是如何互相协作互相配合的。本书使用幽默诙谐的笔调对 Linux 内核中的 USB 子系统源代码进行了分析,形象且详尽地介绍了 USB 在Linux 中的实现。本书从 U 盘、Hub、USB Core 直到主机控制器覆盖了 USB 实现的方方面面,被一些网友誉为USB 开发的“圣经”。对于 Linux 初学者,可以通过本书掌握学习内核、浏览内核代码的方法;对于 Linux 驱动开发者,可以通过本书对设备模型有形象深刻的
2、理解;对于 USB 开发者,可以通过本书全面的理解 USB 在一个操作系统中的实现;对于 Linux 内核开发者,也可以通过本书学习到很多 Linux 高手开发维护一个完整子系统时的编程思想。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。版权所有,侵权必究。图书在版编目(CIP)数据 Linux 那些事儿之我是 USB/肖林甫,肖季东,任桥伟著.-北京:电子工业出版社,2010.7 ISBN 978-7-121-11178-5 .L.肖 肖 任.Linux 操作系统程序设计电子计算机接口程序设计.TP316.89TP334 中国版本图书馆 CIP 数据核字(2010)第 117276
3、 号 责任编辑:孙学瑛 文字编辑:王 静 印 刷:北京天宇星印刷厂 装 订:三河市皇庄路通装订厂 出版发行:电子工业出版社 北京市海淀区万寿路 173 信箱 邮编 100036 开 本:8601092 1/16 印张:36 字数:843 千字 印 次:2010 年 7 月第 1 次印刷 印 数:4000 册 定价:79.00 元 凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888。质量投诉请发邮件至 ,盗版侵权举报请发邮件至 。服务热线:(010)88258888。III 导 读 Linux 那些事儿之我是那些事儿
4、之我是 USB Core 2-6,对 USB 协议规范的简单描述。7,USB 设备在 sysfs 文件系统中的表示。8-9,通过对 README、Kconfig、Makefile 文件的分析,定位要分析的目标代码范围。10-11,USB 子系统的初始化函数 usb_init()。12-13,2.6 内核的设备模型,以及设备模型在 USB 子系统中的映射。14-19,USB 子系统实现中的几个重要数据结构。?14,struct usb_interface,接口。?15,struct usb_host_interface,设置。?16,struct usb_host_endpoint,端点。?17
5、,struct usb_device,设备。?18,struct usb_host_config,配置。?19,struct usb_driver,USB 接口驱动,struct usb_device_driver,USB 设备驱动,以及USB 设备与 USB 驱动的匹配函数 usb_device_match()。20-30,USB 设备连接到 Hub 上之后,内核中 USB 子系统的处理过程。?20,设备生命线(一),usb_alloc_dev(),USB 设备的构造函数。?21,设备生命线(二),usb_control_ msg(),创建一个控制 urb,并把它发送给 USB 设备,然后等
6、待它完成。?22-23,设备生命线(三)、设备生命线(四),struct urb,描述 USB 数据传输的结构。?24,设备生命线(五),usb_alloc_urb(),创建一个 urb,usb_fill_control_urb(),初始化控制 urb,usb_start_wait_urb(),将 urb 提交给 USB Core,以便分配给特定的主机控制器驱动进行处理,然后默默地等待处理结果。?25,设备生命线(六),usb_submit_urb,启动和停止 USB 数据传输,对 urb 做些前期处理后扔给 HCD。?26-27,设备生命线(七)、设备生命线(八),struct usb_hc
7、d,USB 主机控制器驱动,struct usb_bus,USB 总线。IV?28,设备生命线(九),usb_hcd_submit_urb(),将提交过来的 urb 指派给合适的主机控制器驱动程序。?29,设 备 生 命 线(十),usb_get_device_descriptor(),获 得 设 备 描 述 符,usb_get_configuration(),获得配置描述符。?30,设备生命线(十一),usb_parse_configuration(),解析配置描述符。31-34,USB 驱动从注册到卸载的处理过程。?31,驱动生命线(一),usb_register_device_drive
8、r(),注册 USB 世界里唯一的那个 USB 设备驱动(不是 USB 接口驱动)struct device_driver 结构体对象 usb_generic_driver。?32-34,驱动生命线(二)、驱动生命线(三)、驱动生命线(四),usb_set_configuration(),配置设备。35,字符串描述符。36,usb_register(),注册接口的驱动。37,usb_device_match(),匹配 USB 设备与 USB 驱动。Linux 那些事儿之我是那些事儿之我是 HUB 3,Root Hub,与 USB 主机控制器集成在一起的根 Hub。usb_hub_init(),
9、Hub 的初始化程序。4,struct usb_driver hub_driver,Hub 的接口驱动程序。5,hub_thread(),Hub 驱动中最精华的代码。struct usb_hub,Hub 数据结构。hub_event_list,Hub 事件链表。6,hub_events(),处理线程 khubd 的工作链表 hub_event_list。7,hub_probe(),Hub 驱动的 probe 函数。8,工作队列。9-13,配置 Hub 的过程。?9,hub_configure(),配置 Hub 设备的函数。?10,get_hub_descriptor(),获得 Hub 描述符。
10、?11,struct usb_tt,transaction translator 的数据结构,负责 Hub 在高速和低速/全速的数据转换。hub_hub_status(),返回 Hub 状态的函数。?12-13,kick_khubd(),唤醒等待队 khubd_wait 上的等待线程 hub_thread()。14,locktree(),锁住 USB 设备树。15-16,hub_port_status(),返回 Hub 各个端口的状态。hub_port_connect_change(),当 Hub端口上有连接变化时调用这个函数。V 18-22,Hub 端口上有连接变化时的处理过程。?18,us
11、b_set_device_state(),设置设备状态的函数。?19,choose_address(),为设备选择地址的函数。?20,hub_port_init(),Hub 所含端口的初始化函数。?22,usb_new_device(),寻找驱动程序,调用驱动程序的 probe,跟踪这个函数就能一直跟踪到设备驱动程序的 probe()函数的调用。23,hub_power_on(),Hub 上电。24,hub_irq(),Hub 的中断处理函数,负责调用 kick_khubd()。Linux 那些事儿之我是那些事儿之我是 UHCI 1-2,UHCI 驱动的初始化和退出。?uhci_hcd_ini
12、t(),UHCI 驱动的初始化函数。?uhci_hcd_cleanup(),UHCI 驱动的退出函数。?struct pci_driver uhci_pci_driver,从 PCI 层面上描述,UHCI 的驱动(注意 UHCI 是一个 PCI设备)。3,usb_hcd_pci_probe(),UHCI 驱动的 probe 函数。usb_create_hcd(),创建 struct usb_hcd。struct hc_driver uhci_driver,UHCI 驱动结构。4,I/O 内存与 I/O 端口。5,usb_add_hcd(),初始化并注册 struct usb_hcd。6,usb
13、_register_bus(),注册 USB 总线函数。7,uhci_init(),UHCI 初始化。8,UHCI 的中断资源。9-13,uhci_start(),初始化 UHCI 的帧列表。uhci_alloc_td(),创建 Transfer Descriptors。uhci_alloc_qh(),创建 Queue Heads。14,usb_hcd_poll_rh_status(),轮询 Root Hub 的状态变化情况。15-16,Root Hub 的控制传输过程。?usb_submit_urb,启动和停止 USB 数据传输,对 urb 做些前期处理后扔给 HCD。?usb_hcd_su
14、bmit_urb(),主机控制器向设备提交 urb。?rh_urb_enqueue(),对 Root Hub 的 urb 进行排队。?rh_call_control(),向 Root Hub 发送控制命令。17,uhci_submit_bulk(),非 Root Hub 的批量传输。VI 18,uhci_irq(),UHCI 的中断服务程序。19,rh_queue_status(),Root Hub 的中断传输。20,uhci_submit_interrupt(),非 Root Hub 的中断传输。21,uhci_submit_isochronous(),非 Root Hub 的等时传输。Li
15、nux 那些事儿之我是那些事儿之我是 U 盘盘 1,通过对 Kconfig、Makefile 文件的分析,定位要分析的目标代码范围。2-4,usb_stor_init(),USB storage 模块的初始化函数。usb_stor_exit(),USB storage 模块的退出函数。5-9,2.6 内核的设备模型,以及设备模型在 USB 子系统中的映射。struct usb_driver usb_storage_driver,U 盘驱动结构。10,struct usb_device_id,USB 设备的 ID。14,storage_probe(),USB storage 模块的 probe
16、函数。struct us_data,会为每一个 USB storage设备申请一个 us_data。16,associate_dev(),为 us_data 的各个成员赋值。17 19,get_device_info(),获得设备信息。20,get_transport(),决定用的是哪种传输模式。21,get_protocol(),决定用的是哪种通信协议。22,usb_stor_acquire_resources(),初始化所有需要的动态资源。23-40,struct urb,传说中的 urb。?24 25,usb_stor_control_thread(),USB storage 模块的内核守护进程,负责监听命令。?26,usb_stor_scan_thread(),Usb storage 模块的内核守护进程,负责扫描设备。?27,queuecommand(),排队 SCSI 命令。?28,struct scsi_device,SCSI 设备。?33,usb_stor_show_command(),打印 SCSI 命令信息。?34 40,usb_stor_Bulk_transport