怎样写linux下的USB设备驱动程序

合集下载

基于嵌入式Linux下的USB3.0驱动程序开发方法研究

基于嵌入式Linux下的USB3.0驱动程序开发方法研究

求 。U B . 信标 准 和协 议 的推 出必 将带 动 基 于 S3 0通 U B . 口设 备 的大量 生产 。 S 30接 对于 每一 种 U B . 品 S3 0产 在嵌入式应用中都必须开发其相应的设备驱动程序才 可使该产 品正常工作。因此 , 嵌入式系统工程师们对于
或者加载设备驱动时调用 ,其主要负责检测所需驱动 的硬件设备是否存在或是否能正常工作 。如果该设备 正常 ,则对这个设备及其相关的驱动程序需要 的软件 状态进行初始化。驱动程序所提供 的与设备的打开、 释
12Ln x驱动 . iu
驱动 程序 是 Ln x内核 的重要 组成 部分 , 以看 作 i u 可
是应用程序和物理设备之间的一个软件层 , 由设备驱动 程序来完成操作系统与硬件设备之间的交互。 对于嵌入 式开发而言 由于没有通用的驱动程序 , 因而驱动程序开 发便成为嵌入式系统设计过程的一个重要环节。 驱动程序包括配置初始化子程序 和 I / O请求子程 序 。配置初始化子程序在初始化时被调用一次 ,0请 I / 求子 程序 的调用通 过系统调用 或硬件 中断信号来触
统 和 用 户 应 用 程 序 三 部 分 。嵌 入 式 Lnx内 核 包 含 iu
个设备驱动程序后 ,用户可 以动态地将该设备驱动
口函数 为 ii m dl( 和 cenp m dl( 。除此之外 nt oue ) l u oue ) _ a
程 序 加载 到 内核 中或 从 内核 中卸 载 。加 载和 卸 载 的入
执 行程序 。
对于设备的每一种操作设备驱动程序 中都包含其相应
的人 口函数 。字 符 型和 块设 备 驱 动程 序 中包 括 打开设
备 函数 oe ( 、 pn )关闭设备 函数 c s( 、 l e )读数据函数 r d o e a (、 )写数据函数 wi (和 I re ) / t 0控制函数 i t ) o l 等。 c(

基于Linux系统的USB HOST驱动程序设计与实现

基于Linux系统的USB HOST驱动程序设计与实现

1 引言
随着 嵌入式 系 统应用 的 日益广 泛 ,iu Lnx系统 凭
模块 , 它为 U B驱动 ( ei 和 H 提供了一个用 S dv e c C)
于访 问和 控制 U B硬 件 的统一 接 口。如 图 1 S 所示 :
应用程序发出的 U B请求块 ( r ) S ub 经过 U B设备 S
维普资讯
基于 L x系统的 i n u US B HOS T驱动程序设计与实现
张卓 亮
摘要 : 本文 介 绍 了基 于 Ln x系统 的 U B 制 器驱 动设 计 的一般 方 法 。首先 介 绍 UB控 制 器驱 动 的 总 iu S控 S

UB S



CO

L we AP 0 l r l

f l 状沿 H C Di  ̄ r e v l J f l

U BH S C Di r re v I J
给出了 U B控制器驱动程序 的总体结构 , S 并通过作 者编写 的 I 16 的实 际程序说 明各模块的设计要 S 1 P1
驱 动 和 U Ber 后 到 达 U B主机控 制 器 ( C) 主 S oe S H ,
借其强大 、 稳定 、 免费以及对设备的广泛支持等特 使其在嵌入式系统领域迅速得到了应用。 i x Ln 系统 u
对 设备 的友 好支 持 由来 已久 , 随着 U B接 口的广泛 S 使 用 ,iu 统 的 U B子系 统也 得 到不 断 的发 展 。 Lnx系 S 尽 管 Lnx系 统 为 U B设 备 ( ei ) 主 机 ( , iu S dv e 和 c HC Hot ot l) sC n o 提供 统 一 的 编 程 接 口 , r1 但相 对 于 U B S 设备 , 主机 结构 更复 杂 , 发难 度更 大 。本 文 通过 分 开 析 Lnx系 统 的 U B主机 控 制 器 ( C) 程 框 架 , iu S H 编

Linux下有中断端点的USB设备驱动的实现

Linux下有中断端点的USB设备驱动的实现
An ed i e i u r B e i ewi tru t n p i t i d s n d Boh a p iai n p o r m n o a a l x e i n sd — d t rv ri L n xf h n o US d v c t i er p d p n s s e i e . hn e g t p l t r g a a dc mp b ee p r c o r me t e m o s ae ef a i i t ft ed i e. Co a e t h o n t t d t e s l y o r r r h b i h v mp d wi t e c mmo eh d f n u u s se wi g r i g t t r p n p i t, r h n m t o so p t b y tm t r a d n i er te d on s i s h e o n u
17 2 1, 7 56 00 1( 3 )
计 算机 工程 与 设 计 C m u r ni en d ei o p t g e i a s n eE n rg n D g
・开 发 与 应 用 ・
Lnx i 下有中断端点的 US u B设备驱动的实现
金 鑫 , 孙 松 林 , 景 晓 军
1 r d 函数 l 、e 等 a


硬 件

图 3 应 用程 序 与硬 件设 备 的通 信 过程
3 L n x下 的 U B设 备 驱 动 机 制 的研 究 iu S
在 Ln x环 境 下 设 计 驱 动 程 序 , 想 简 洁 、 作 简 单 、 iu 思 操 功
能 强 大 , 是 它 只 能 调 用 Ln x内核 提 供 的 函数 , 且 要 和 硬 但 i u 而

嵌入式Linux下USB摄像头驱动程序开发

嵌入式Linux下USB摄像头驱动程序开发
参考文献 :
[ 1 ] 李松福. 象棋 史话[ M] . 北京 : 人 民体育 出版社 , 1 9 8 1 .
[ 2 ] 郭志菊 , 李树新. 象 棋 文 化 熟 语语 义 解 构 [ J ] . 汉 字 文化 , 2 0 0 2 ( 2 ) . [ 3 ] 丁桂兴. 象棋 运 动 好 处 多[ J ] . 教育与管理, 2 0 0 9 ( 1 2 ) . [ 4 ] 刘 殿 中. 象棋 实战 指 南 / 象棋新编教程[ M] . 北京 : 北京体 育大 学出
版 社 , 2 0 0 3 .
本走法 、 经典棋局 、 大 师风 采 等 方 面 , 能 够 丰 富 人们 的 精 神
生活 , 普及传统文化 , 发 扬 中华 文 明 。 象棋多媒体学 习软件界 面美 观 , 多种 媒体 效果 丰富 , 交互性强 , 内容 易 扩 充 。适 用 于 不 同 年 龄 段 、 不 同就 学 阶 段、 不 同工 作 岗位 的 人 群 , 适用 范围广 。既可用 于象 棋 自
第1 2 卷 第1 期 2 0 l 3 年 1 月
软 件 导 刊
sO f t wa r e Gu i d e
VOI . 1 2N o. 1
嵌入 式 L i n u x下 US B摄 像 头 驱 动 程 序 开 发
郭 旭 , 冉 全
( 武汉 工程 大 学 计 算机科 学与工程 学院 , 湖北 武 汉 4 3 0 2 0 5 )
驱动程序 的实现。
可 以像 操 作 普 通 文 件 一 样 。设 备 驱 动 程 序 被 看 作 是 内 核 的构 成 部 分 , 其 完 成 的功 能 有 : 设 备 的初 始 化 和 释 放 、 数 据
从 内核 到硬 件 、 从硬 件读取数 据 、 接 收 应 用 程 序 传 送 给 设

《开发板——Linux配置USBRNDIS》

《开发板——Linux配置USBRNDIS》

《开发板——Linux配置USBRNDIS》 ⼀台Linux即可充当USB的device端,也可以由另⼀台Linux来充当USB的Host端。

在与以太⽹不同,在USB⽹络⾥各终端不是对等的,即USB Host端和USB Device端的所需要软件和硬件接⼝不⼀样。

Linux充当USB Host Linux开发板当USB Host时,需要安装安装 rndis_host.ko 这个驱动。

│ Prompt: Host for RNDIS and ActiveSync devices (EXPERIMENTAL) ││ Defined at drivers/net/usb/Kconfig:234││ Depends on: NETDEVICES && USB && NET && USB_USBNET && EXPERIMENTAL ││ Location: ││ -> Device Drivers ││ -> Network device support (NETDEVICES [=y]) ││ -> USB Network Adapters ││ -> Multi-purpose USB Networking Framework (USB_USBNET [=m]) │Linux充当USB Device Linux开发板需要安装USB Gadget驱动g_ether.ko 来进⾏通讯。

Symbol: USB_ETH_RNDIS [=n] ││ Prompt: RNDIS support ││ Defined at drivers/usb/gadget/Kconfig:609││ Depends on: && USB_ETH ││ Location: ││ -> Device Drivers ││ -> USB support (USB_SUPPORT [=y]) ││ -> USB Gadget Support (USB_GADGET [=y]) ││ -> USB Gadget Drivers ( [=m]) ││ -> Ethernet Gadget (with CDC Ethernet support) (USB_ETH [=n │ 最终配置选项就是:CONFIG_USB_ETH=y和CONFIG_USB_ETH_RNDIS=y。

基于Linux的USB设备驱动程序实现

基于Linux的USB设备驱动程序实现

!+ 123 设备驱动程序设计
123 设备开发包括硬件电路设计和 软件设计两部分 内容, 其中软件设计部分又包括 123 芯片驱动 程序设计 和应 用程 序设 计; 123 设 备在 硬件 上 通过 123 芯 片实 现。 123 芯片负责管理和实现 123 物理层 差分信 号, 通 过配置和管理寄存器来初始化设 备, 提供连接的端点, 管 理电源和通过寄存器管理端点。 123 芯片提供多个 标准的端 点, 每个端 点都 支持单 一的总线传输方式。 端点 " 支 持控制 传输, 其它 端点支 持同步传输、 批量传输 或者中断 传输中 的一种。 管理和 使用这些端点, 实际上是通过操作相应的控制寄存器、 状 态寄存器、 中断寄存器和数据寄存器来实现的。其中, 控 制寄存器用 于设 置端 点的 工作 模式 和启 用端 点的 功能 等; 状态寄存器用于查询端点的当前状态; 中 断寄存器用 于设置 端点的中 断触发和响 应功能; 数据寄 存器则是设 备与主机交换 用的缓冲区。
收稿日期: !""#$"%$&# 作者简介: 刘 永祥 (&’() * + ) , 男, 湖北钟祥人, 昆明理工大学信自学院 硕士研究生。
!4
Байду номын сангаас
第 \ 卷$
! " # $ 电路设计原理
无 锡 职 业 技 术 学 院 学 报 引脚连接 +,-//20> 外部中断引脚 %>?3@0 , 对应的中断 向量为 0 。初始化 1+2 中 断的步 骤如 下: 初 始化 中断控 制器的 ?3@-93 及 中 断 方式 寄 存器 ?3@79:, 使 %?3@0 中断使能; 安装 1+2 中断程 序入 口到 中断 向量 中; 初始 化 ? A 9 端口 Q 组控制器 <-93Q, <1<Q 指 明 %>?@0 是作 为中断输入引脚 使用; 设置外 部中断 寄存器 %>@?3@, 指 明触发中断方式。 初始化 1+2 需要 使用 1+2 读 A 写 函 数对 1+2 控制 器内部的控制寄存器进行设置, 步骤如下: 设置主控制寄 存器 7-3@RS 的软 件复 位位 ( +R+@) , 以复 位 1+2 控制 器; 设置主控制器 7-3@RS 的 ; 电 压调 整位 ( .Q% ) 及中 断输出 ( ?3@9- ) 位, 以 禁 止 中 断 输 出; 写时钟寄存器 --93T , 设置 1+2 控制 器的 工作 频率; 初 始化 功能 地址 寄存器 ( T;R) , 及 %<-0 寄存器。端点号 0 为双向 端点, 用作控制使用; 设置中断屏蔽寄存器, 包括 主屏蔽寄存器 7;7+=、 无应答事件 寄存器 3;=7+=、 发送时 间寄 存器 @>7+=、 接收事 件寄 存器 R>7+= 和 ;O*(FIM*( 事 件寄存 器 ;S@7+=; 允许 1+2 控制 器中 信 号输 出, 使 控制 器附 加到 1+2 总线上。 1+2 中断服务例程: 中断服务例程 处理 1+2 控制器 产生的中断, 它将数据从 1+2 内部 T?T9 读出, 并建立正 确的事件标志, 以通知主循环程序进行处理, 其基本步骤 如下: 从 主事件 寄存 器 7;%. 中 读出 产生中 断的 事件; 根据 主事件寄存 器某位的状 态判别事 件, 接 着读取相应 的事件寄存器, 接收事件寄存器 R>%., 或发 送事件寄存 器 @>%., 或无 应答 事件 寄存 器 3;=%., 或 ;O*(FIM*( 事 件寄存器 ;S@%.; 进一 步判 别事 件寄 存器 某位 的状 态, 根据具体事件分别作出相应的 操作。 中断初始化, 安装 1+2 中断服务函数: NBCD ?)FG?IC* ( NBCD) { $ F?3@-93 U P 0V# ; $ A A 中断控制寄存器设置 $ F?3@79:W P X 0V# ; A A ?RY 模式 $ ( " ( NBOM*CO( $ ( " ( NBOM*CO( HI)CJI(D HI)CJI(D KLMF KLMF ") ") 引脚 $ F<1<Q P F<1<QW0V[(; $ A A Q<Q9 上拉电阻有 效 $ F%>@?3@ P 0V00 ; $ A A 低电平触发 $ F?3@7+= P F?3@7+= U 2?@G%?3@0 ;A A 关外部中断 } 通道 0 用 于控 制传 输, 在驱 动程 序中 调 用 FV(N(I*0 () 和 *V(N(I*0 () 处理端点 0 的事件, 通道 # 中 由 *V(N(I*# () 处理端点 # ( 单向 发送) 的 事件, 由 FV(N(I*# () 处理端 点! ( 单向接收) 的事件, 通道 ! 中由 *V(N(I*! () 处理端点 $ F(*HFI ( "( NBOM*CO( HI)CJI(D KLMF " ) ( 单向发送) , 的事 件, 由 FV(N(I*! () 处理 端点 / ( 单 向接 收) 的事件。通道 , 中由 *V(N(I*, () 处理 端点 \ 的 事件, 由 FV(N(I*, () 处理端点 5 的事件。 $ Z?+RG%?3@0 P ( CI* ) GG%CI*0?)F; $ F<-93Q P F<-93Q U 0V000, ; $ A A Q<Q0 设 为 中断

ARM-Linux下USB主机驱动程序研究与实现

ARM-Linux下USB主机驱动程序研究与实现

1 Lnx下 U B驱动程序体 系 iu S
U B驱动 程序 体 系结 构 ,如 图 1 示 。 S 所
应 用 层 软 件
持热插拔 的总线接 口。U B是典型的被动的总线标 S 准 ,即只有 U B主机才能与 U B设备传输数据 , S S
两个 主 机端 口或设 备 端 口是 不 能通信 的。U B接 口 S

( 电子科技大学
震 。阎 波
6 13 ) 17 1
通信与信息工程学院 ,成都摘要 :Ln x 作 系统 由于其 源码 开放 、具有 可裁剪等特 点在 嵌入 式 系统 中得到越 来越广 泛的应 用,而 U B接 口在 嵌入 式 iu 操 S 系统 中 的应 用 也 十 分 广 泛 ,现 在 的嵌 入 式 系统 的硬 件 平 台大 多 数是 基 于 A M 处理 器 的 。 文 中介 绍基 于 A M 平 台 的 Lnx. R R iu2
6 内核 下 ,嵌 入 式 U B 主 机 设 备 驱 动 开 发 实现 。具 体 的从 U B 设 备 驱 动 的 开发 流 程 出发 ,介 绍 了 U B 接 口的 一般 原 理 和 S S S
U B通信的一般过程 ,然后对 U B驱动 骨架进行 了分析 ,最后 给 出了驱动具体 实现的关键代码。 S S 关 键 词 :A M 处 理 器 ;Lnx操 作 系统 ;设 备 驱 动 程 序 R iu 中图 分 类 号 :T 3 3 N 2 P 9 ;T 9 文 献 标 志 码 :A d i 0 3 6/.sn 17 4 5 .02 O .2 o:1 .9 9 ji . 62— 5 0 2 1 . 103 s
第l O卷
第1 期
实验科学与技术
Ex e me tS inc n c oo y pr i n c e e a d Te hn lg

USB驱动移植教程

USB驱动移植教程

USB驱动移植教程一.USB驱动框架在Linux系统中,提供了主机侧和设备侧视角的USB驱动框架,这里,仅仅讲解主机侧角度看到的USB驱动框架。

从主机侧的角度而言,需要编写的USB驱动程序包括主机控制器驱动和设备驱动两类。

USB主机控制器驱动程序控制插入其中的USB设备,而USB设备驱动程序控制该设备如何作为设备与主机通信。

在USB主机控制器驱动和USB设备驱动之间还有一层叫USB核心层。

USB核心负责USB驱动管理和协议处理工作,它通过定义一些数据结构、宏和功能函数,向上为USB设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息,完成设备热插拔控制、总线数据传输控制等。

说了那么多,无图无真相啊~~Linux USB主机侧驱动总体框架二.USB驱动移植步骤1.S5PV210主机控制驱动的移植USB主机控制器有3种规范,UHCI(Universal Host Controller Interface),这种规范主要是Intel、Via芯片公司提供支持PC主板的;OHCI(Open Host Controller Interface),这种规范是微软提出来的,主要应用在非PC系统上的嵌入式领域上的USB芯片;EHCI(Enhanced Host Controller Interface),这种后来为提高USB速度而提出的规范,它支持最高速度为480Mbps。

在《S5PV210_UM_REV1.1》手册上搜索OHCI关键词,会发现下面一段话这表明S5PV210这款CPU支持一个USB主机接口,同时支持EHCI和OHCI这两种规范,支持USB1.1和USB2.0规范,支持最高的外设传输速率为480Mbps。

注意了,它并不支持USB3.0规范的USB设备,所以做测试的时候,千万不要拿USB3.0规范的USB设备去测试。

2.1移植ohci-s5p驱动打开内核目录:driversusbhost,发现Linux系统提供了大量的主机控制器驱动,找遍所有平台,都没有找到ohci-s5p.c源码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

怎样写linux下的USB设备驱动程序 发布时间:2007年11月19日 引言 随着人们生活水平的提高,我们用到的USB设备也越来越多,但是Linux在硬件配置上仍然没有做到完全即插即用,对于Linux怎样配置和使用他们,也越来越成为困扰我们的一大问题;本文的目地是使大家了解怎样编制USB设备驱动,为更好地配置和使用USB设备提供方便;对于希望开发Linux系统下USB设备驱动的人员,也可作为进一步学习USB驱动的大体架构进而编写出特殊USB设备的驱动程序。

USB基础知识 USB是英文Universal Serial Bus的缩写,意为通用串行总线。USB最初是为了替代许多不同的低速总线(包括并行、串行和键盘连接)而设计的,它以单一类型的总线连接各种不同的类型的设备。USB的发展已经超越了这些低速的连接方式,它现在可以支持几乎所有可以连接到PC上的设备。最新的USB规范修订了理论上高达480Mbps的高速连接。Linux内核支持两种主要类型的USB驱动程序:宿主系统上的驱动程序和设备上的驱动程序,从宿主的观点来看(一个普通的宿主也就是一个PC机),宿主系统的USB设备驱动程序控制插入其中的USB设备,而USB设备的驱动程序控制该设备如何作为一个USB设备和主机通信。本文将详细介绍运行于PC机上的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目录下的设备文件。在我们要访问此硬件时,就可以对设备文件通过open、read、write、close等命令进行。而驱动就会接收到相应的read、write操作而根据自己的模块中的相应函数进行操作了。

USB驱动程序实践 了解了上述理论后,我们就可以动手写驱动程序,如果你基本功好,而且写过linux下的硬件驱动,USB的硬件驱动和pci_driver很类似,那么写USB的驱动就比较简单了,如果你只是大体了解了linux的硬件驱动,那也不要紧,因为在linux的内核源码中有一个框架程序可以拿来借用一下,这个框架程序在/usr/src/~(你的内核版本,以下同)/drivers/usb下,文件名为usb-skeleton.c。写一个USB的驱动程序最基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块)(当然也可以不用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_ID和USB_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 得到这两个值后把它定义到程序里就可以了。 注册USB驱动程序:所有的USB驱动程序都必须创建的结构体是struct usb_driver。这个结构体必须由USB驱动程序来填写,包括许多回调函数和变量,它们向USB核心代码描述USB驱动程序。创建一个有效的struct usb_driver结构体,只须要初始化五个字段就可以了,在框架程序中是这样的: static struct usb_driver skel_driver = { .owner = THIS_MODULE, .name = "skeleton", .probe = skel_probe, .disconnect = skel_disconnect, .id_table = skel_table, }; struct module *owner :指向该驱动程序的模块所有者的指针。USB核心使用它来正确地对该USB驱动程序进行引用计数,使它不会在不合适的时刻被卸载掉,这个变量应该被设置为THIS_MODULE宏。 const char *name:指向驱动程序名字的指针,在内核的所有USB驱动程序中它必须是唯一的,通常被设置为和驱动程序模块名相同的名字。 int (*probe) (struct usb_interface *intf,const struct usb_device_id *id):这个是指向USB驱动程序中的探测函数的指针。当USB核心认为它有一个接口(usb_interface)可以由该驱动程序处理时,这个函数被调用。 void (disconnect)(struct usb_interface *intf):指向USB驱动程序中的断开函数的指针,当一个USB接口(usb_interface)被从系统中移除或者驱动程序正在从USB核心中卸载时,USB核心将调用这个函数。 const struct usb_device_id *id_table:指向ID设备表的指针,这个表包含了一列该驱动程序可以支持的USB设备,如果没有设置这个变量,USB驱动程序中的探测回调函数就不会被调用。 在这个结构体中还有其它的几个回调函数不是很常用,这里就不一一说明了。以struct usb_driver 指针为参数的usb_register_driver函数调用把struct usb_driver注册到USB核心。一般是在USB驱动程序的模块初始化代码中完成这个工作的: static int __init usb_skel_init(void) { int result;

/* 驱动程序注册到USB子系统中*/ result = usb_register(&skel_driver); if (result) err("usb_register failed. Error number %d", result);

return result; } 当USB驱动程序将要被卸开时,需要把struct usb_driver从内核中注销。通过调用usb_deregister_driver来完成这个工作,当调用发生时,当前绑定到该驱动程序上的任何USB接口都被断开,断开函数将被调用: static void __exit usb_skel_exit(void) { /* 从子系统注销驱动程序 */ usb_deregister(&skel_driver); } 探测和断开:当一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。当驱动程序因为某种原因不应该控制设备时,断开函数被调用,它可以做一些清理工作。探测回调函数中,USB驱动程序初始化任何可能用于控制USB设备的局部结构体,它还把所需的任何设备相关信息保存到一个局部结构体中,下面是探测函数的部分源

相关文档
最新文档