百度空间 | 百度首页 
               
 
查看文章
 
Linux环境下USB的原理、驱动和配置1
2008-08-05 13:39
        随着生活水平的提高,人们对USB设备的使用也越来越多,鉴于Linux在硬件配置上尚不能全部即插即用,因此关于Linux如何配置和使用,成为困扰我们的一大问题。

什么是USB

USB是英文Universal Serial Bus的缩写,意为通用串行总线。USB最初是为了替代许多不同的低速总线(包括并行、串行和键盘连接)而设计的,它以单一类型的总线连接各种不同的类型的设备。USB的发展已经超越了这些低速的连接方式,它现在可以支持几乎所有可以连接到PC上的设备。最新的USB规范修订了理论上高达480Mbps的高速连接。Linux内核支持两种主要类型的USB驱动程序:宿主系统上的驱动程序和设备上的驱动程序,从宿主的观点来看(一个普通的宿主也就是一个PC机),宿主系统的USB设备驱动程序控制插入其中的USB设备,而USB设备的驱动程序控制该设备如何作为一个USB设备和主机通信。

USB的具体构成

在动手写USB驱动程序这前,让我们先看看写的USB驱动程序在内核中的结构,如下图:

USB驱动程序存在于不同的内核子系统和USB硬件控制器之间,USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。USB是一个非常复杂的设备,linux内核为我们提供了一个称为USB的核心的子系统来处理大部分的复杂性,USB设备包括配置(configuration)、接口(interface)和端点(endpoint)USB设备绑定到接口上,而不是整个USB设备。如下图所示:

USB通信最基本的形式是通过端点(USB端点分中断、批量、等时、控制四种,每种用途不同),USB端点只能往一个方向传送数据,从主机到设备或者从设备到主机,端点可以看作是单向的管道(pipe)。所以我们可以这样认为:设备通常具有一个或者更多的配置,配置经常具有一个或者更多的接口,接口通常具有一个或者更多的设置,接口没有或具有一个以上的端点。驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否已经安装了硬件。USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序,热插拨脚本使用它来确定当一个特定的设备插入到系统时该自动装载哪一个驱动程序。

上面我们简要说明了驱动程序的基本理论,在写一个设备驱动程序之前,我们还要了解以下两个概念:模块和设备文件。

模块:是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序。Linux下对于一个硬件的驱动,可以有两种方式:直接加载到内核代码中,启动内核时就会驱动此硬件设备。另一种就是以模块方式,编译生成一个.ko文件(2.4以下内核中是用.o作模块文件,我们以2.6的内核为准,以下同)。当应用程序需要时再加载到内核空间运行。所以我们所说的一个硬件的驱动程序,通常指的就是一个驱动模块。

设备文件:对于一个设备,它可以在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点。这个节点是通过mknod命令建立的,其中指定了主设备号和次设备号。主设备号表明了某一类设备,一般对应着确定的驱动程序;次设备号一般是区分不同属性,例如不同的使用方法,不同的位置,不同的操作。这个设备号是从/proc/devices文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。这个设备号(特指主设备号)的主要作用,就是声明设备所使用的驱动程序。驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统就已经知道这个设备所对应的驱动程序。对于一个硬件,Linux是这样来进行驱动的:首先,我们必须提供一个.ko的驱动模块文件。我们要使用这个驱动程序,首先要加载它,我们可以用insmod xxx.ko,这样驱动就会根据自己的类型(字符设备类型或块设备类型,例如鼠标就是字符设备而硬盘就是块设备)向系统注册,注册成功系统会反馈一个主设备号,这个主设备号就是系统对它的唯一标识。驱动就是根据此主设备号来创建一个一般放置在/dev目录下的设备文件。在我们要访问此硬件时,就可以对设备文件通过openreadwriteclose等命令进行。而驱动就会接收到相应的readwrite操作而根据自己的模块中的相应函数进行操作了。

USB驱动程序如何应用

了解了上述理论后,我们就可以动手写驱动程序,如果你基本功好,而且写过linux下的硬件驱动,USB的硬件驱动和pci_driver很类似,那么写USB的驱动就比较简单了,如果你只是大体了解了linux的硬件驱动,那也不要紧,因为在linux的内核源码中有一个框架程序可以拿来借用一下,这个框架程序在/usr/src/~(你的内核版本,以下同)/drivers/usb下,文件名为usb-skeleton.c。写一个USB的驱动程序最基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urbUSB请求块)(当然也可以不用urb来传输数据,下文我们会说到)。

驱动程序支持的设备:有一个结构体struct usb_device_id,这个结构体提供了一列不同类型的该驱动程序支持的USB设备,对于一个只控制一个特定的USB设备的驱动程序来说,struct usb_device_id表被定义为:

/* 驱动程序支持的设备列表 */

static struct usb_device_id skel_table [] = {

       { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },

       { }                               /* 终止入口 */

};

MODULE_DEVICE_TABLE (usb, skel_table);

对于PC驱动程序,MODULE_DEVICE_TABLE是必需的,而且usb必需为该宏的第一个值,而USB_SKEL_VENDOR_IDUSB_SKEL_PRODUCT_ID就是这个特殊设备的制造商和产品的ID了,我们在程序中把定义的值改为我们这款USB的,如:

/* 定义制造商和产品的ID */

#define USB_SKEL_VENDOR_ID       0x1234

#define USB_SKEL_PRODUCT_ID     0x2345

这两个值可以通过命令lsusb,当然你得先把USB设备先插到主机上了。或者查看厂商的USB设备的手册也能得到,在我机器上运行lsusb是这样的结果:

Bus 004 Device 001: ID 0000:0000

Bus 003 Device 002: ID 1234:2345 Abc Corp.

Bus 002 Device 001: ID 0000:0000

Bus 001 Device 001: ID 0000:0000

得到这两个值后把它定义到程序里就可以了。

博客文章汇总:

如何科学饮水   供应WIFI(提供 wince linux下驱动)  

合肥市政府原副秘书长受贿240万被判13   百度C2C支付平台定名百付宝 域名地址昨曝光

LHC 的加速过程   什么是百度蜘蛛?百度爬虫是什么?    百度确定推C2C支付平台 电子商务大战一触即发   

无线音箱(出售)  

LINUX下无线网卡驱动程式安装的一般步骤  

云时代来临之云计算的四个显著特点 云计算时代来临 云计算到底指什么 随着安全云计算的热潮 您准备好了吗  

云计算的基本原理和概念  

发现一个靠点击广告就能赚美元的网站

Writing Linux LCD drivers

WinCELCD驱动程序编写指南

关于MODULE_PARM()  

Linux环境下USB的原理、驱动和配置2

Linux环境下USB的原理、驱动和配置1

腾讯发布QQ for Linux 1.0 Preview  

搜索引擎正在逐步抹杀人类的记忆和思考

[转载] Linux内核2.4.x的网络接口源码的结构  

Zigbee入门开发  

中国会面临金融战争的灭顶之灾吗?    不断增长的外汇储备,是中国政府的心病  

两粒电子的爱情  

zigbee简介  

银监会令深上报断供真相MTK是什么?  

[出售]WIFI模块,WIFI方案VT6656+RFUSB接口,MINIPCI接口   

鸟巢山寨机,玩的就是心跳   

ARM Bootloader的共性  

Jennic-zigbee开发套件

供应jennic无线模块 > jn5139高功率模块

吴宇森首度回应质疑萌萌是可爱的错误   

《赤壁》中的精彩与搞笑  

日本第一钻石王老五”--青山光司 日本第一钻王老五”--青山光司  

谁来拯救中国3760亿美元财富  

什么是无线网卡?

电磁辐射会失忆

中国产山寨手机热销巴基斯坦 难定位恐怖分子  

Zigbee标准可能成为自动化的未来动力

无线网络知识收集 无线增益天线认识和选购  

功率放大器"增益放大器"的区别   

无线问题面面观

噪声与信噪比  

zigbee软件设计  

什么是ZigBee无线网络?  

PLC 电力载波通信  

Introduction to IT800D  

超外差和超再生模块有何区别?  

飞弹发射失败怎么办?用 Photoshop 补一枚上去!   

Linux Driver Model()  

Power   Management in the Linux Driver Model(2.6.14)()  

WDM(Windows Driver Model)学习()  

Google问:手机还能拿来做什么?   

USB Dongle VT6656   

IEEE1394  

接收灵敏度   

JN5139 Wireless   Microcontroller  

JN5139-xxx-M02 高功率模块   

ZigBee架构WG议长:ZigBee与蓝牙可以共存  

基于ZigBee的无线网络技术及其应用  

Zigbee可能成为自动化的未来动力  

zigbee简介  

JN51xx开发套件  

ZigBee网络层


类别:杂项 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu