Linux下的硬件驱动——USB设备(上)(驱动配置部分)

  USB设备越来越多而Linux在硬件配置上仍然没有做到完全即插即用对于Linux怎样配置和使用他们也越来越成为困扰我们的一大问题本文分两部分着力从Linux系统下设备驱动的架构去阐述怎样去使用和配置以及怎样编制USB设备驱动对于一般用户可以使我们明晰Linux设备驱动方式为更好地配置和使用USB设备提供了方便而对于希望开发Linux系统下USB设备驱动的程序员提供了初步学习USB驱动架构的机会     前言

  USB是英文Universal Serial Bus的缩写意为通用串行总线是由Compaq(康柏)DECIBMIntelNEC微软以及Northern Telecom(北方电讯)等公司于年月共同提出的主要目的就是为了解决接口标准太多的弊端USB使用一个针插头作为标准插头并通过这个标准接头采用菊花瓣形式把所有外设连接起来它采用串行方式传输数据目前最大数据传输率为Mbps 支持多数据流和多个设备并行操作允许外设热插拔

  目前USB接口虽然只发展了代(USB/USB)但是USB综合了一个多平台标准的所有优点 包括降低成本增加兼容性可连接大量的外部设备融合先进的功能和品质使其逐步成为PC接口标准进入了高速发展期

  那么对于使用Linux系统正确支持和配置常见的USB设备就是其使用必不可少的关键一步

  模块(驱动程序)

  模块(module)是在内核空间运行的程序实际上是一种目标对象文件没有链接不能独立运行但是可以装载到系统中作为内核的一部分运行从而可以动态扩充内核的功能模块最主要的用处就是用来实现设备驱动程序

  Linux下对于一个硬件的驱动可以有两种方式直接加载到内核代码中启动内核时就会驱动此硬件设备另一种就是以模块方式编译生成一个o文件当应用程序需要时再加载进内核空间运行所以我们所说的一个硬件的驱动程序通常指的就是一个驱动模块

  设备文件

  对于一个设备它可以在/dev下面存在一个对应的逻辑设备节点这个节点以文件的形式存在但它不是普通意义上的文件它是设备文件更确切的说它是设备节点这个节点是通过mknod命令建立的其中指定了主设备号和次设备号主设备号表明了某一类设备一般对应着确定的驱动程序次设备号一般是区分不同属性例如不同的使用方法不同的位置不同的操作这个设备号是从/proc/devices文件中获得的所以一般是先有驱动程序在内核中才有设备节点在目录中这个设备号(特指主设备号)的主要作用就是声明设备所使用的驱动程序驱动程序和设备号是一一对应的当你打开一个设备文件时操作系统就已经知道这个设备所对应的驱动程序

  SCSI 设备

  SCSI是有别于IDE的一个计算机标准接口现在大部分平板式扫描仪CDR刻录机MO光磁盘机等渐渐趋向使用SCSI接口加之SCSI又能提供一个高速传送通道所以接触到SCSI设备的用户会越来越多Linux支持很多种的SCSI设备例如SCSI硬盘SCSI光驱SCSI磁带机更重要的是Linux提供了IDE设备对SCSI的模拟(idescsio模块)我们通常会就把IDE光驱模拟为SCSI光驱进行访问因为在Linux中很多软件都只能操作SCSI光驱例如大多数刻录软件一些媒体播放软件通常我们的USB存储设备也模拟为SCSI硬盘而进行访问

  Linux硬件驱动架构

  对于一个硬件Linux是这样来进行驱动的首先我们必须提供一个o的驱动模块文件(这里我们只说明模块方式其实内核方式是类似的)我们要使用这个驱动程序首先要加载运行它(insmod *o)这样驱动就会根据自己的类型(字符设备类型或块设备类型例如鼠标就是字符设备而硬盘就是块设备)向系统注册注册成功系统会反馈一个主设备号这个主设备号就是系统对它的唯一标识(例如硬盘块设备在/proc/devices中显示的主设备号为 我们用ls l /dev/had看到的主设备就肯定是)驱动就是根据此主设备号来创建一个一般放置在/dev目录下的设备文件(mknod命令用来创建它它必须用主设备号这个参数)在我们要访问此硬件时就可以对设备文件通过openreadwrite等命令进行而驱动就会接收到相应的readwrite操作而根据自己的模块中的相应函数进行了

  其中还有几个比较有关系的东西一个是/lib/modules/XX目录它下面就是针对当前内核版本的模块只要你的模块依赖关系正确(可以通过depmod设置)你就可以通过modprobe 命令加载而不需要知道具体模块文件位置 另一个是/etc/modulesconf文件它定义了一些常用设备的别名系统就可以在需要此设备支持时正确寻找驱动模块例如alias eth e就代表第一块网卡的驱动模块为eo他们的关系图如下

  配置USB设备

  内核中配置

  要启用 Linux USB 支持首先进入USB support节并启用Support for USB选项(对应模块为usbcoreo)尽管这个步骤相当直观明了但接下来的 Linux USB 设置步骤则会让人感到糊涂特别地现在需要选择用于系统的正确 USB 主控制器驱动程序选项是EHCI (对应模块为ehcihcdo)UHCI (对应模块为usbuhcio)UHCI (alternate driver)和OHCI (对应模块为usbohcio)这是许多人对 Linux 的 USB 开始感到困惑的地方

  要理解EHCI及其同类是什么首先要知道每块支持插入 USB 设备的主板或 PCI 卡都需要有 USB 主控制器芯片组这个特别的芯片组与插入系统的 USB 设备进行相互操作并负责处理允许 USB 设备与系统其它部分通信所必需的所有低层次细节

  Linux USB 驱动程序有三种不同的 USB 主控制器选项是因为在主板和 PCI 卡上有三种不同类型的 USB 芯片EHCI驱动程序设计成为实现新的高速 USB 协议的芯片提供支持OHCI驱动程序用来为非 PC 系统上的(以及带有 SiS 和 ALi 芯片组的 PC 主板上的)USB 芯片提供支持UHCI驱动程序用来为大多数其它 PC 主板(包括 Intel 和 Via)上的 USB 实现提供支持只需选择与希望启用的 USB 支持的类型对应的?HCI驱动程序即可如有疑惑为保险起见可以启用EHCIUHCI (两者中任选一种它们之间没有明显的区别)和OHCI(赵明注根据文档EHCI已经包含了UHCI和OHCI但目前就我个人的测试单独加EHCI是不行的通常我的做法是根据主板类型加载UHCI或OHCI后再加载EHCI这样才可以支持USB设备)

  启用了USB support和适当的?HCIUSB 主控制器驱动程序后使 USB 启动并运行只需再进行几个步骤应该启用Preliminary USB device filesystem然后确保启用所有特定于将与 Linux 一起使用的实际 USB 外围设备的驱动程序例如为了启用对 USB 游戏控制器的支持我启用了USB Human Interface Device (full HID) support我还启用了主Input core support 节下的Input core support和Joystick support

  一旦用新的已启用 USB 的内核重新引导后若/proc/bus/usb下没有相应USB设备信息应输入以下命令将 USB 设备文件系统手动挂装到 /proc/bus/usb

  # mount t usbdevfs none /proc/bus/usb

  为了在系统引导时自动挂装 USB 设备文件系统请将下面一行添加到 /etc/fstab 中的 /proc 挂装行之后

  none /proc/bus/usb usbdevfs defaults

  模块的配置方法

  在很多时候我们的USB设备驱动并不包含在内核中其实我们只要根据它所需要使用的模块逐一加载就可以使它启作用

  首先要确保在内核编译时以模块方式选择了相应支持这样我们就应该可以在/lib/modules/XX目录看到相应o文件在加载模块时我们只需要运行modprobe xxxo就可以了(modprobe主要加载系统已经通过depmod登记过的模块insmod一般是针对具体o文件进行加载)

  对应USB设备下面一些模块是关键的

  usbcoreo 要支持usb所需要的最基础模块   usbuhcio (已经提过)   usbohcio (已经提过)   uhcio 另一个uhci驱动程序我也不知道有什么用一般不要加载会死机的   ehcihcdo (已经提过 usb)   hido USB人机界面设备像鼠标呀键盘呀都需要   usbstorageo USB存储设备U盘等用到相关模块

  idedisko IDE硬盘   idescsio 把IDE设备模拟SCSI接口   scsi_modo SCSI支持

  注意kernel config其中一项

  Probe all LUNs on each SCSI device

  最好选上要不某些同时支持多个口的读卡器只能显示一个若模块方式就要带参数安装或提前在/etc/modulesconf中加入以下项来支持多个LUN

  add options scsi_mod max_scsi_luns=

  sd_modo SCSI硬盘   sr_modo SCSI光盘    sgo SCSI通用支持(在某些探测U盘SCSI探测中会用到)

  常见USB设备及其配置

  在Linux 的内核中已经支持不下种设备它支持几乎所有的通用设备如键盘鼠标modem打印机等并不断地添加厂商新的设备象数码相机MP网卡等下面就是几个最常见设备的介绍和使用方法

  USB鼠标

  键盘和鼠标属于低速的输入设备对于已经为用户认可的PS/接口USB键盘和USB鼠标似乎并没有太多更优越的地方现在的大部分鼠标采用了PS/接口不过USB接口的鼠标也越来越多两者相比各有优势一般来< 不会因为别人显赫的成功而促使自己有卓越的进步。

Linux下的硬件驱动——USB设备(上)(驱动配置部分)

相关文章:

你感兴趣的文章:

标签云: