Linux下的USB程序分析_第1页
Linux下的USB程序分析_第2页
Linux下的USB程序分析_第3页
Linux下的USB程序分析_第4页
Linux下的USB程序分析_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux 下的下的 USB 程序分析程序分析 关键字关键字 USB LINUX 设备驱动 总线 参考文献参考文献 LINUX 设备驱动程序 ALESSANDRO RUBINI 进程管理 进程管理功能负责创建和撤销进程以及处理它们和外部世界的连接 输入和输 出 不同进程之间的通信 通过信号 管道或进程见通信原语 是整个模块的基 本功能 除此之外 控制进程如何共享 CPU 的调度程序也是进程管理的一部分 概括地说 内核的进程管理活动就是在单个或多个 CPU 上实现多个进程的抽象 内存管理 内存是计算机的主要资源之一 用来管理内存的策略是决定系统性能的一个关 键因素 内核在有限的可用资源上为每一个进程都创建了一个虚拟寻址空间 内核 的不同部分和在内存管理子系统交互时使用一套相同的系统调用 包括从简单的 malloc free 到对其它一些不常用的系统调用 文件系统 Linux 中的每个对象几乎都可以被看作文件 内核在没有结构的硬件上构造 结构化的文件系统 所构造的文件系统抽象在整个系统中广泛使用 另外 Linux 支持多种文件系统类型 即在物理介质上组织数据的不同方式 设备控制 除了处理器 内存以及其他很有限的几个实体外 所有设备控制操作都由与被 控制设备相关的代码来完成 这段代码就是设备驱动程序 内核必须为系统中的每 件外设嵌入相应的驱动程序 包括硬盘驱动器 键盘 鼠标等 3 设备和模块分类设备和模块分类 Linux 系统将设备分成三种类型 字符设备 块设备和网络接口 每个模块 通常实现其中一种类型 相应地 模块可分为字符模块 char modual 块模 块 block modual 和网络模块 network modual 三种 字符设备 character device 字符设备是能够象字节流 比如文件 一样被访问地设备 由字符设备驱动程 序来实现这种特性 字符设备驱动程序通常至少需要实现 open close read 和 write 系统调用 字符终端 dev console 和串口 dev ttySO 以及类 似设备 就是字符设备的两个例子 他们能够用流很好地表示 字符设备可以通过 文件系统节点 如 dev tty1 和 dev lp0 来访问 它和普通文件之间的唯一 差别在于 对普通文件的访问可以前后移动访问指针 而大多数字符设备是只能顺 序访问的数据通道 然而 也存在和数据区特性类似的字符设备 访问它们时可前 后移动访问指针 块设备 block device 和字符设备一样 块设备也是通过 dev 目录下的文件系统节点被访问的 块 设备 例如硬盘 上能够容纳文件系统 Linux 允许应用程序象字符设备那样读 写块设备 可以一次传递任意多字节的数据 因此 块设备和字符设备的区别仅仅 在于内核内部管理数据的方式 也就是内核和驱动程序的接口不同 象字符设备一 样 块设备也是通过文件系统节点被访问的 他们之间的差异对用户来说是透明的 块驱动程序除了给内核提供和字符驱动程序一样的接口以外 还提供了专门面向块 设备的接口 不过这些接口对于那些从 dev 目录下某个目录打开块设备的用户和 应用程序都是不可见的 另外 块设备的接口必须支持挂装 mount 文件系统 网络接口 network interface 任何网络事务都要经过一个网络接口 即一个能够和其它主机交换数据的设备 通常接口是个硬件设备 但也可能是个纯软件设备 比如回环 loopback 接口 网络接口由内核中的网络子系统驱动 负责发送和接收数据包 它无须了解每项事 务是如何映射到实际传送的数据包的 尽管 Telnet 和 FTP 连接都是面向流的 它们都使用了同一个设备 但这个设备看到的只是数据包 而不是独立的流 三 三 Linux 下下 USB 程序分析程序分析 USB 总线的初始化和总线的初始化和 USB 设备的枚举设备的枚举 首先 我们先看一下 USB 总线本身的初始化 USB 控制器 连同根集中器 连接在 PCI 总线上 是一个 PCI 设备 在 PCI 总线的初始化过程中会受到枚举 PCI 设备的初始化完成后 在 PCI 总线树中就游乐代表着具体 USB 总线控制器的 PCI DEV 数据结构 并已为控制器的 I O 区间和 RAM 区间分配和设置了总线地址 在 USB 总线控制器的设备驱动程序方面 则要为其准备下一个 PCI DRIVER 数据结构 其类型定义在 include linux pci h 中 struct pci driver struct list head node char name const struct pci device id id table int probe struct pci dev dev const struct pci device id id void remove struct pci dev dev void suspend struct pci dev dev void resume struct pci dev dev 这个数据结构为通用的 PCI 设备管理机制提供了几个函数指针 特别是为一 个通用的 一般化的 PCI 设备初始化过程提供了函数指针 PROBE 供这个 PCI 设 备的初始化过程叫 回叫 以完成具体设备的初始化 对于遵循 UHCI 界面的 USB 控制器 其 PCI DRIVER 数据结构为 uhci pci driver 定义于 drivers usb uhci c static struct pci driver uhci pci driver name usb uhci id table 结构中的指针 id table 应该指向一个 pci device id 结构数组 表明由 这个数据结构所确定的设备驱动程序适用于哪一些 PCI 设备 对此 drivers usb uhci c 中相应地定义了数组 uhci pci ids static const struct pci device id devinitdata uhci pci ids handle any USBUHCI controller class PCI CLASS SERIAL USB status status td info info td buffer buffer 与目标设备建立连接的过程就是对目标设备的 枚举 枚举过程的步骤如下 1 为设备制订地址 2 从设备读入其 usb device descriptor 数据结构 3 从设备读入其所有的 配置 描述结构 4 枚举或改变设备的配置 USB 设备的初始化设备的初始化 每个 USB 设备都有 usb driver 数据结构 定义再 include linux usb h 中 struct usb driver const char name void probe struct usb device dev unsigned intf const struct usb device id id void disconnect struct usb device void struct list head driver list struct file operations fops int minor struct semaphore serialize int ioctl struct usb device dev unsigned int code void buf const struct usb device id id table 通过 usb scan devices 扫描所有 USB 总线上的所有设备 让每个 USB 设备驱动模块都试着来 认领 与其对口的设备 所谓 认领 就是使一个 usb interface descriptor 数据结构与相应 的设备的 usb driver 结构挂钩 这样 从具体设备的数据结构出发 就可以找 到其设备驱动程序了 就这样 当 usb scan devices 完成了对所有的 USB 设备的扫描时 对扫描器设备的登记和初始化就完成了 最后 以次设备号中的低 4 位为下标的指针数组 p scn table 记录着指向每个具体 scn usb data 结 构的地址 USB 设备的驱动设备的驱动 所有的 USB 设备都有相同的主设备号 USB MAJOR 而根据次设备号划分具体 的设备及其类型 所以 根据设备文件节点提供的主设备号 CPU 首先找到 USB 总线的 file operations 数据结构 usb fops 从中得到用于 open 操作的函 数指针 这个指针指向 usb open Static int usb open struct inode inode struct file file int minor MINOR inode i rdev struct usb driver c usb minors minor 16 int err ENODEV struct file operations old fops new fops NULL if c new fops fops get c fops return err old fops file f op file f op new fops if file f op open err file f op open inode file if err fops put file f op file f op fops get old fops put old fops return err 然后 进一步根据次设备号从指针数组 usb minors 中找到扫描器的 usb driver 结构 对于 USB 总线上的每个传输 需要为之创建一个 USB 传输请求块 即 usb 数据结构 发送控制报文的过程是 根据参数建立一个 usb 数据结构 把这 个 usb 结构交给低层 让低层据以调度相应的控制传输 然后睡眠等待传输的完 成 对于采用 UHCI 界面的 USB 总线控制器 其 usb bus 结构中的指针 hcpriv 指向一个 uhci 数据结构 而 uhci 结构

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论