Linux设备驱动程序学习(18)-USB 驱动程序(三)

合集下载

LINUX操作系统USB驱动程序

LINUX操作系统USB驱动程序

一、引言USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不同速度的、可扩充的并且使用方便的外围设备接口,同时也是为了解决计算机接口的太多的弊端而设计的。

一个USB系统主要有三部分组成:USB互连、USB主机、USB设备三部分组成的,其结构如图1所示。

在编写USB设备驱动程序设计时,可以分为三部分编写:主机端设备驱动程序、主机控制器驱动程序设计和设备端驱动程序三部分,在本文中重点介绍主机端驱动程序的设计。

二、USB设备驱动程序的设计USB设备驱动程序的设计包括主机端设备驱动程序设计、主机控制器驱动程序设计和设备端驱动程序设计三部分组成。

主机端设备驱动程序就是通常说的设备驱动程序,它是主机环境中为用户应用程序提供一个访问USB外设的接口。

Linux为这部分驱动程序提供编程接口,驱动程序设计者只要按照需求编写驱动程序框架,通过调用操作系统提供的API接口函数可以完成对USB外设的特定访问。

主机控制驱动主要是对USB主机控制器的驱动,在大多数PC环境下,主机控制器都是由操作系统提供。

嵌入式设备一般都没有USB主机控制器,只是工作在Slave模式下。

如果要使USB具有主机功能,那么设备中需要选用一个带主机控制器的USB接口控制芯片,同时自己还要有实现该主机控制器的驱动程序。

目前Linux内核中只提供USB主机控制器的开放主机控制器和通用主机控制器接口两种规格,而这两种规格主要用在PC架构中。

USB主机端驱动程序与主机控制器的结构如图2所示。

其中USB核是Linux的一个子模块,集中定义了一组USB相关的数据结构、宏以及API函数。

USB设备驱动程序是常说的设备固件程序的一部分,提供设备信息与主机的通信接口。

设备端USB驱动程序设计由以下几部分处理程序组成。

初始化例程:完成描述符指针、端点、配置改变等操作。

数据传输例程:完成控制传输、批量传输、中断传输及同步传输等传输方式下的数据收发工作。

嵌入式LinuxUSB驱动程序

嵌入式LinuxUSB驱动程序
放 主 机 控 制 器 和 通 用 主 机 控 制 器 接 口两 种 规 格 ,而这 两种 规 格
备 三部 分 组 成 的 ,其 结 构 如 图 1 示 。 在 编 写 U B设 备 驱 动 所 S 程 序 设 计 时 ,可 以分 为三 部 分 编 写 :主 机 端 设 备 驱 动 程 序 、主 机 控 制 器 驱 动程 序 设 计 和设 备 端 驱 动程 序 三 部 分 ,在 本 文 中重 点 介 绍 主 机 端 驱 动 程序 的设 计 。
编 写 驱 动 程 序 框 架 ,通 过 调 用 操 作 系统 提 供 的 A I 口函数 可 P接
以完 成 对 U B外 设 的 特 定 访 问 。 S 主 机 控 制 驱 动 主 要 是 对 U B主 机 控 制 器 的 驱 动 。在 大 多 S
双 向 同步 传 输 的支 持 热 插 拔 的数 据 传 输 总 线 ,其 目的是 为 了提 供 一种 兼 容 不 同速 度 的 、 可扩 充 的并 且 使 用 方 便 的外 围设 备接 口 , 同时 也 是 为 了解 决 计 算 机 接 口 的太 多 的弊 端 而设 计 的 。一
U B设备 驱 动 程 序 S
上层 A I函 数 P U B核 S 下 层 ^ I函 P
U B主机 控制器驱动 程序 S
U B主机控 制器驱动程序 S
图 2 U B主 机 端 驱 动 程 序 结 构 S
U B设 备 驱 动程 序 是 常说 的设 备 固 件 程 序 的 一 部 分 ,提 供 S 设 备 信 息 与 主 机 的 通 信 接 口 。设 备 端 U B驱 动 程 序 设 计 由 以 S 下 几 部 分 处 理 程 序 组 成 。 初 始 化 例 程 :完 成 描 述 符 指 针 、端 点 、配 置 改 变等 操 作 。数 据 传输 例 程 :完 成 控 制 传 输 、批 量 传 输 、中 断传 输 及 同 步 传输 等 传输 方 式 下 的 数 据 收 发 工 作 。标 准

linux安装usb驱动命令

linux安装usb驱动命令

linux安装usb驱动命令有时我们会用到usb设备,这时我们就要学会如何在linux系统下安装usb驱动了。

下面由店铺为大家整理了linux安装usb驱动命令的相关知识,希望大家喜欢!linux安装usb驱动命令安装方法及步骤:一、准备工作2、到/projects/ndiswrapper下载最新的ndiswrapper包,我的版本是ndiswrapper-1.52.tar.gz3、准备好网卡在Winxp下的驱动程序。

驱动程序最好是最新的,指定给XP用的。

二、安装及配置1、安装(1)解压:tar -zxvf ndiswrapper-1.52.tar.gz(2)进入ndiswrapper-1.52:cd ndiswrapper-1.52(3)编译:make//在此操作之前必需先把编译环境搭建好,即:安装好开发环境。

(4)安装:make install //如果不采取默认的安装路径,则可以用。

configure ——prefix="/etc/local"来指定安装目录。

//此目录是自建。

(5)查看安装后的版本ndiswrapper -v | grep //此处似乎不对。

如安装成功则显示version:1.51(6)获取该无线网卡的WindowsXP驱动,(7)进入该驱动所在目录:cd /home/tsm/dwl_g520(8)安装无线网卡驱动:ndiswrapper -i net5211.inf(9)查看驱动是否安装:ndiswrapper -l//如:显示net5211(驱动名称):driver installed(10)写入配置文件:ndiswrapper -m ndiswrapper -ma ndiswrapper -mi(11)启动后模块自动加载:modprobe ndiswrapper补充:linux安装usb驱动命令出现的小问题及解决方法我是用ndiswrapper安装windows下的inf驱动的sony本本384M内存,4M集成显存,usb1.0接口,跑windows 速度比较慢,就像装个轻量级的操作系统。

嵌入式Linux下的USB设备驱动技术

嵌入式Linux下的USB设备驱动技术

嵌入式Linux下的USB设备驱动技术Linux以其稳定、高效、易定制、硬件支持广泛、源代码开放等特点,已在嵌入式领域迅速崛起,被国际上许多大型的跨国企业用作嵌入式产品的系统平台。

USB是Universal Serial Bus (通用串行总线)的缩写,是1995年由Microsoft、Compaq、IBM等公司联合制定的一种新的PC串行通信协议。

它是一种快速、灵活的总线接口。

与其它通信接口相比较,USB接口的最大特点是易于使用,这也是USB的主要设计目标。

USB的成功得益于在USB标准中除定义了通信的物理层和电器层标准外。

还定义了一套相对完整的软件协议堆栈。

这使得多数USB设备都很容易在各种平台上工作。

作为一种高速总线接口,USB适用于多种设备(如数码相机、MP3播放器、高速数据采集设备等)。

另外,USB接口还支持热插拔,而且所有的配置过程都由系统自动完成,无须用户干预。

1 Linux下的USB设备驱动在Linux内核的不断升级过程中,驱动程序的结构相对稳定。

由于USB设备也是外围设备的一种,因此,它的驱动程序结构与普通设备的驱动程序相同。

Linux系统的设备分为字符设备(CharDevice)和块设备(BlockDevice)。

字符设备支持面向块字符的I/O操作,它不通过系统的快速缓存,而只支持顺序存取。

块设备则支持面向块的I/O操作,所有块设备的I/O操作都通过在内核地址空间的I/O缓冲区进行,可以支持几乎任意长度和任意位置上的I/O请求。

块设备与字符设备还有一点不同,就是块设备必须能够随机存取(RandomAccess),字符设备则没有这个要求。

典型的字符设备包括鼠标、键盘、串行口等,而块设备主要包括硬盘软盘设备、CD-Rom等。

由于USB设备主要都是通过快速串行通讯来读写数据,因此一般都可作为字符设备来进行处理。

2 Linux下的USB core2.1 Linux中USB core与USB的结构关系Linux操作系统中有一个叫做“USB core”的子系统,可提供支持USB设备驱动程序的API和USB主机控制器的驱动程序。

Linux下的硬件驱动——USB设备

Linux下的硬件驱动——USB设备

Linux下的硬件驱动——USB设备什么是USB设备?USB即Universal Serial Bus,翻译过来就是通用串行总线。

它是一种规范化的、快速的、热插拔的串行输入/输出接口。

USB接口常被用于连接鼠标、键盘、打印机、扫描仪、音频设备、存储设备等外围设备。

Linux下的USB驱动在Linux系统中,每个USB设备都需要一个相应的驱动程序来驱动。

从Linux 2.4开始,内核提供了完整的USB设备支持。

对于每个USB设备,内核都会自动加载对应的驱动程序。

Linux下的USB设备驱动程序主要分为以下几个部分:USB核心驱动程序USB核心驱动程序是操作系统内核中处理USB设备的核心模块,负责与各种类型的USB设备进行通信,包括主机控制器、USB总线、USB设备等。

它与驱动程序和应用程序之间起到了桥梁的作用,为驱动程序提供了USB设备的基础支持。

USB设备驱动程序USB设备驱动程序是与特定USB设备相对应的驱动程序,为USB设备提供具体的读写功能和其他控制功能。

USB核心驱动程序和USB设备驱动程序之间的接口USB核心驱动程序和USB设备驱动程序之间的接口是指USB层和应用程序层之间的接口,负责传递各种USB操作的命令和数据。

如何编译一个USB设备驱动编译一个USB设备驱动程序需要按照以下步骤进行:步骤一:安装必要的软件包首先需要安装编译和调试USB设备驱动所需的软件包,包括编译工具链、内核源代码、内核头文件等。

sudo apt-get install build-essential linux-source linux-headers-`una me -r`步骤二:编写代码现在可以编写USB设备驱动程序的代码,此处不做详细介绍。

步骤三:编译代码在终端窗口中进入USB设备驱动程序所在的目录下,输入以下命令进行编译:make此命令将会编译USB设备驱动程序,并生成一个将驱动程序与内核进行连接的模块文件。

Linux内核USB驱动程序框架

Linux内核USB驱动程序框架

25.2 USB驱动程序框架Linux内核提供了完整的USB驱动程序框架。

USB总线采用树形结构,在一条总线上只能有唯一的主机设备。

Linux内核从主机和设备两个角度观察USB总线结构。

本节介绍Linux内核USB驱动程序框架。

25.2.1 Linux内核USB驱动框架图25-2是Linux内核从主机和设备两个角度观察USB总线结构的示意图。

从图25-2中可以看出,Linux内核USB驱动是按照主机驱动和设备驱动两套体系实现的,下面介绍两套体系的结构和特点。

1.基本结构图25-2的左侧是主机驱动结构。

主机驱动的最底层是USB主机控制器,提供了OHCI/EHCI/UHCI这3种类型的总线控制功能。

在USB控制器的上一层是主机控制器的驱动,分别对应OHCI/EHCI/UHCI这3种类型的总线接口。

USB核心部分连接了USB控制器驱动和设备驱动,是两者之间的转换接口。

USB设备驱动层提供了各种设备的驱动程序。

USB主机部分的设计结构完全是从USB总线特点出发的。

在USB总线上可以连接各种不同类型的设备,包括字符设备、块设备和网络设备。

所有类型的USB设备都是用相同的电气接口,使用的传输协议也基本相同。

向用户提供某种特定类型的USB设备时,需要处理USB总线协议。

内核完成所有的USB总线协议处理,并且向用户提供编程接口。

图25-2 Linux内核USB总线结构图25-2右侧是设备驱动结构。

与USB主机类似,USB设备提供了相同的层次结构与之对应。

但是在USB设备一侧使用名为Gadget API的结构作为核心。

Gadget API是Linux内核实现的对应USB设备的核心结构。

Gadget API屏蔽了USB设备控制器的细节,控制具体的USB设备实现。

2.设备每个USB设备提供了不同级别的配置信息。

一个USB设备可以包含一个或多个配置,不同的配置使设备表现出不同的特点。

其中,设备的配置是通过接口组成的。

Linux内核定义了USB设备描述结构如下:struct usb_device_descriptor {__u8 bLength; // 设备描述符长度__u8 bDescriptorType; // 设备类型__le16 bcdUSB; // USB版本号(使用BCD编码)__u8 bDeviceClass; // USB设备类型__u8 bDeviceSubClass; // USB设备子类型__u8 bDeviceProtocol; // USB设备协议号__u8 bMaxPacketSize0; // 传输数据的最大包长__le16 idVendor; // 厂商编号__le16 idProduct; // 产品编号__le16 bcdDevice; // 设备出厂号__u8 iManufacturer; // 厂商字符串索引__u8 iProduct; // 产品字符串索引__u8 iSerialNumber; // 产品序列号索引__u8 bNumConfigurations; // 最大的配置数量} __attribute__ ((packed));从usb_device_descriptor结构定义看出,一个设备描述符定义了与USB设备有关的所有信息。

Linux下的USB总线驱动

Linux下的USB总线驱动

Linux下的USB总线驱动一.USB理论1. USB概念概述USB1.0版本速度1.5Mbps(低速USB)USB1.1版本速度12Mbps(全速USB)USB2.0版本速度480Mbps(高速USB)USB驱动由USB主机控制器驱动和USB设备驱动组成。

USB主机控制器是用来控制USB 设备和CPU之间通信的,USB主机控制器驱动主要用来驱动芯片上的主机控制器硬件。

US B设备驱动主要是指具体的例如USB鼠标,USB键盘灯设备的驱动。

一般的通用的Linux设备,如U盘、USB鼠标、USB键盘,都不需要工程师再编写驱动,需要编写的是特定厂商、特定芯片的驱动,而且往往也可以参考内核中已经提供的驱动模板。

USB只是一个总线,真正的USB设备驱动的主体工作仍然是USB设备本身所属类型的驱动,如字符设备、tty设备、块设备、输入设备等。

2. USB主机控制器USB主机控制器属于南桥芯片的一部分,通过PCI总线和处理器通信。

USB主机控制器分为UHCI(英特尔提出)、OHCI(康柏和微软提出)、EHCI。

其中OHCI驱动程序用来为非PC系统上以及带有SiS和ALi芯片组的PC主办上的USB芯片提供支持。

UHCI驱动程序多用来为大多数其他PC主板(包括Intel和Via)上的USB芯片提供支持。

ENCI兼容OHC I和UHCI。

UHCI的硬件线路比OHCI简单,所以成本较低,但需要较复杂的驱动程序,CP U负荷稍重。

主机控制器驱动程序完成的功能主要包括:解析和维护URB,根据不同的端点进行分类缓存URB;负责不同USB传输类型的调度工作;负责USB数据的实际传输工作;实现虚拟跟HUB的功能。

3. USB设备与USB驱动的匹配USB设备与USB驱动怎么匹配的呢?实际上USB设备中有一个模块叫固件,是固件信息和USB驱动进行的匹配。

固件是固化在集成电路内部的程序代码,USB固件中包含了USB设备的出厂信息,标识该设备的厂商ID、产品ID、主版本号和次版本号等。

详细介绍Linux USB驱动工作流程

详细介绍Linux USB驱动工作流程

详细介绍Linux USB驱动工作流程1. USB主机在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB 主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。

因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB 设备驱动,前者控制插入其中的USB设备,后者控制USB设备如何与主机通信。

Linux 内核USB核心负责USB驱动管理和协议处理的主要工作。

主机控制器驱动和设备驱动之间的USB核心非常重要,其功能包括:通过定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息;完成设备热插拔控制、总线数据传输控制等。

2. USB设备Linux内核中USB设备侧驱动程序分为3个层次:UDC驱动程序、Gadget API和Gadget 驱动程序。

UDC驱动程序直接访问硬件,控制USB设备和主机间的底层通信,向上层提供与硬件相关操作的回调函数。

当前Gadget API是UDC驱动程序回调函数的简单包装。

Gadget驱动程序具体控制USB设备功能的实现,使设备表现出“网络连接”、“打印机”或“USB Mass Storage”等特性,它使用Gadget API控制UDC实现上述功能。

Gadget API 把下层的UDC驱动程序和上层的Gadget驱动程序隔离开,使得在Linux系统中编写USB 设备侧驱动程序时能够把功能的实现和底层通信分离。

3. 在USB设备组织结构中,从上到下分为设备(device)、配置(config)、接口(interface)和端点(endpoint)四个层次。

USB设备程序绑定到接口上。

对于这四个层次的简单描述如下:设备通常具有一个或多个的配置配置经常具有一个或多个的接口接口没有或具有一个以上的端点。

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

Linux设备驱动程序学习(18)-USB 驱动程序(三) (2009-07-14 11:45) 分类:Linux设备驱动程序USB urb (USB request block)内核使用2.6.29.4USB 设备驱动代码通过urb和所有的 USB 设备通讯。

urb用 struct urb 结构描述(include/linux/usb.h )。

urb以一种异步的方式同一个特定USB设备的特定端点发送或接受数据。

一个USB 设备驱动可根据驱动的需要,分配多个 urb 给一个端点或重用单个 urb 给多个不同的端点。

设备中的每个端点都处理一个 urb 队列, 所以多个 urb 可在队列清空之前被发送到相同的端点。

一个 urb 的典型生命循环如下:(1)被创建;(2)被分配给一个特定 USB 设备的特定端点;(3)被提交给 USB 核心;(4)被 USB 核心提交给特定设备的特定 USB 主机控制器驱动;(5)被 USB 主机控制器驱动处理, 并传送到设备;(6)以上操作完成后,USB主机控制器驱动通知 USB 设备驱动。

urb 也可被提交它的驱动在任何时间取消;如果设备被移除,urb 可以被USB 核心取消。

urb 被动态创建并包含一个内部引用计数,使它们可以在最后一个用户释放它们时被自动释放。

struct urbstruct list_head urb_list;/* list head for use by the urb's* current owner */struct list_head anchor_list;/* the URB may be anchored */struct usb_anchor *anchor;struct usb_device *dev;/* 指向这个 urb 要发送的目标 structusb_device 的指针,这个变量必须在这个 urb 被发送到 USB 核心之前被USB 驱动初始化.*/struct usb_host_endpoint *ep;/* (internal) pointer to endpoint */ unsigned int pipe;/* 这个 urb 所要发送到的特定struct usb_device 的端点消息,这个变量必须在这个 urb 被发送到 USB 核心之前被 USB 驱动初始化.必须由下面的函数生成*/int status;/*当 urb开始由 USB 核心处理或处理结束, 这个变量被设置为 urb 的当前状态. USB 驱动可安全访问这个变量的唯一时间是在 urb 结束处理例程函数中. 这个限制是为防止竞态. 对于等时 urb, 在这个变量中成功值(0)只表示这个 urb 是否已被去链. 为获得等时 urb 的详细状态, 应当检查 iso_frame_desc 变量. */unsigned int transfer_flags;/* 传输设置*/void*transfer_buffer;/* 指向用于发送数据到设备(OUT urb)或者从设备接收数据(IN urb)的缓冲区指针。

为了主机控制器驱动正确访问这个缓冲, 它必须使用 kmalloc 调用来创建, 不是在堆栈或者静态内存中。

对控制端点, 这个缓冲区用于数据中转*/dma_addr_t transfer_dma;/* 用于以 DMA 方式传送数据到 USB 设备的缓冲区*/int transfer_buffer_length;/* transfer_buffer 或者 transfer_dma 变量指向的缓冲区大小。

如果这是 0, 传送缓冲没有被 USB 核心所使用。

对于一个 OUT 端点, 如果这个端点大小比这个变量指定的值小, 对这个USB 设备的传输将被分成更小的块,以正确地传送数据。

这种大的传送以连续的 USB 帧进行。

在一个 urb 中提交一个大块数据, 并且使 USB 主机控制器去划分为更小的块, 比以连续地顺序发送小缓冲的速度快得多*/int actual_length;/* 当这个 urb 完成后, 该变量被设置为这个 urb (对于 OUT urb)发送或(对于 IN urb)接受数据的真实长度.对于 IN urb, 必须是用此变量而非 transfer_buffer_length , 因为接收的数据可能比整个缓冲小*/unsigned char*setup_packet;/* 指向控制urb的设置数据包指针.它在传送缓冲中的数据之前被传送(用于控制 urb)*/dma_addr_t setup_dma;/* 控制 urb 用于设置数据包的 DMA 缓冲区地址,它在传送普通缓冲区中的数据之前被传送(用于控制 urb)*/int start_frame;/* 设置或返回初始的帧数量(用于等时urb) */int number_of_packets;/* 指定urb所处理的等时传输缓冲区的数量(用于等时urb,在urb被发送到USB核心前,必须设置) */int interval;/*urb 被轮询的时间间隔. 仅对中断或等时 urb 有效. 这个值的单位依据设备速度而不同. 对于低速和高速的设备, 单位是帧, 它等同于毫秒. 对于其他设备, 单位是微帧, 等同于 1/8 毫秒. 在 urb被发送到 USB 核心之前,此值必须设置.*/int error_count;/* 等时urb的错误计数,由USB核心设置 */void*context;/* 指向一个可以被USB驱动模块设置的数据块. 当 urb 被返回到驱动时,可在结束处理例程中使用. */usb_complete_t complete;/* 结束处理例程函数指针, 当 urb 被完全传送或发生错误,它将被 USB 核心调用. 此函数检查这个 urb, 并决定释放它或重新提交给另一个传输中*/struct usb_iso_packet_descriptor iso_frame_desc[0];/* (仅用于等时urb)usb_iso_packet_descriptor结构体允许单个urb 一次定义许多等时传输,它用于收集每个单独的传输状态*/};struct usb_iso_packet_descriptor {unsigned int offset;/* 该数据包的数据在传输缓冲区中的偏移量(第一个字节为0) */上述结构体中unsigned int pipe;的生成函数(define):上述结构体中unsigned int transfer_flags;的值域:/** urb->transfer_flags:** Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb().*/#define URB_SHORT_NOT_OK 0x0001 /* 置位时,任何在IN 端点上发生的简短读取, 被USB 核心当作错误. 仅对从USB 设备读取的urb 有用*/#define URB_ISO_ASAP 0x0002 /* 若为等时urb , 驱动想调度这个urb 时,可置位该位, 只要带宽允许且想在此时设置urb 中的start_frame 变量. 若没有置位,则驱动必须指定start_frame 值,且传输如果不能在当时启动的话,必须能够正确恢复*/#define URB_NO_TRANSFER_DMA_MAP 0x0004 /* 当urb 包含要被发送的DMA 缓冲时,应被置位.USB 核心使用就会使用transfer_dma 变量指向的缓冲, 而不是被transfer_buffer 变量指向的缓冲. */#define URB_NO_SETUP_DMA_MAP 0x0008 /* 和URB_NO_TRANSFER_DMA_MAP 类似, 这个位用来控制DMA 缓冲已经建立的urb. 如果它被置位, USB 核心使用setup_dma 变量而不是setup_packet 变量指向的缓冲. */#define URB_NO_FSBR 0x0020 /* 仅UHCI USB 主机控制器驱动使用,上述结构体中int status;的常用值(in include/asm-generic/errno.h and errno_base.h) :创建和注销 urbstruct urb 结构不能静态创建,必须使用 usb_alloc_urb 函数创建. 函数原型:如果驱动已经对 urb 使用完毕, 必须调用 usb_free_urb 函数,释放urb。

函数原型:根据内核源码,可以通过自己kmalloc一个空间来创建urb,然后必须使用进行初始化后才可以继续使用。

其实usb_alloc_urb函数就是这样实现的,所以我当然不推荐这种自找麻烦的做法。

初始化 urbstatic inline void usb_fill_control_urb(struct urb *urb,struct usb_device *dev,unsigned int pipe,unsigned char*setup_packet,void*transfer_buffer,int buffer_length,usb_complete_t complete_fn,void*context);//struct urb *urb :指向要被初始化的 urb 的指针//struct usb_device *dev :指向 urb 要发送到的 USB 设备.//unsigned int pipe : urb 要被发送到的 USB 设备的特定端点. 必须使用前面提过的 usb_******pipe 函数创建//void *transfer_buffer :指向外发数据或接收数据的缓冲区的指针.注意:不能是静态缓冲,必须使用 kmalloc 来创建.//int buffer_length :transfer_buffer 指针指向的缓冲区的大小//usb_complete_t complete :指向 urb 结束处理例程函数指针//void *context :指向一个小数据块的指针, 被添加到 urb 结构中,以便被结束处理例程函数获取使用.//int interval :中断 urb 被调度的间隔.//函数不设置 urb 中的 transfer_flags 变量, 因此对这个成员的修改必须由驱动手动完成/*等时 urb 没有初始化函数,必须手动初始化,以下为一个例子*/urb->dev = dev;urb->context = uvd;urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp-1);其实那三个初始化函数只是简单的包装,是inline函数。

相关文档
最新文档