USB设备驱动开发深度解析

合集下载

Linux 下wifi 驱动开发—— USB接口WiFi驱动浅析

Linux 下wifi 驱动开发—— USB接口WiFi驱动浅析

Linux 下wifi 驱动开发(四)——USB接口WiFi驱动浅析前面学习了SDIO接口的WiFi驱动,现在我们来学习一下USB接口的WiFi驱动,二者的区别在于接口不同。

而USB接口的设备驱动,我们前面也有学习,比如USB摄像头驱动、USB鼠标驱动,同样都符合LinuxUSB驱动结构:USB设备驱动(字符设备、块设备、网络设备)|USB 核心|USB主机控制器驱动不同之处只是在于USB摄像头驱动是字符设备,而我们今天要学习的WiFi驱动是网络设备;当然由我们编写的部分还是USB设备驱动部分,下面进入USB接口WiFi驱动的分析,如何分析呢?我们下面从这几个方面入手:从硬件层面上看,WIFI设备与CPU通信是通过USB接口的,与其他WIFI设备之间的通信是通过无线射频(RF)。

从软件层面上看,Linux操作系统要管理WIFI设备,那么就要将WIFI设备挂载到USB总线上,通过USB子系统实现管理。

而同时为了对接网络,又将WIFI设备封装成一个网络设备。

我们以USB接口的WIFI模块进行分析:a -- 从USB总线的角度去看,它是USB设备;b -- 从Linux设备的分类上看,它又是网络设备;c -- 从WIFI本身的角度去看,它又有自己独特的功能及属性,因此它又是一个私有的设备;通过上述的分析,我们只要抓住这三条线索深入去分析它的驱动源码,整个WIFI驱动框架就会浮现在你眼前。

一、框架整理1、USB设备驱动现在我们先从USB设备开始,要写一个USB设备驱动,那么大致步骤如下:a -- 需要针对该设备定义一个USB驱动,对应到代码中即定义一个usb_driver结构体变量代码如下:[cpp]view plain copyb -- 填充该设备的usb_driver结构体成员变量代码如下:[cpp]view plain copyc -- 将该驱动注册到USB子系统代码如下:[cpp]view plain copy以上步骤只是一个大致的USB驱动框架流程,而最大和最复杂的工作是填充usb_driver结构体成员变量。

USBgadget设备驱动解析

USBgadget设备驱动解析
inet addr:192.168.1.120 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:253 errors:0 dropped:0 overruns:0 frame:0
};
static struct platform_device *smdk2410_devices[] __initdata = {
…,
&s3c_device_usbgadget, /*USB gadget device设备登记*/
};
static void __init sdmk2410_init(void)
};
printk("smdk2410_udc: %s\\n",s3c2410_pullup_info[cmd]);
s3c2410_gpio_cfgpin(S3C2410_GPG9, S3C2410_GPG9_OUTP);
switch (cmd)
{
case S3C2410_UDC_P_ENABLE :
#make zImage
#make modules
在名目drivers/usb/gadget下生成g_ether.ko
3、加载驱动,测试功能
利用前面的生成的内核,启动系统后,加载g_ether.ko
#insmod g_ether.ko
#ifconfig usb0 192.168.1.120
……
usb0 Link encap:Ethernet HWaddr 5E:C5:F6:D4:2B:91
USB(Host)唯独通过描述符了解设备的有关信息,按照这些信息,建立起通信,在这些描述符中,规定了设备所使用的协议、端点情形等。因此,正确地提供描述符,是USB设备正常工作的先决条件。

USB设备开发过程解析_前台VB+驱动VC+固件GCC_

USB设备开发过程解析_前台VB+驱动VC+固件GCC_

边干边写之——USB设备开发过程解析(前台VB+驱动VC+固件GCC)[声明:]1、本文为开发工作过程中的心得体会,认识粗浅表述不周之处请见谅;2、本文内容供广大爱好者学习交流之用,如需转载请注明出处并告知本人。

KKND 08年11月21日清晨发表于VBGood论坛Dreamon-II Labs.******************************************************************************[正文]其实弄清楚USB的工作流程后开发USB设备是很简单的事情。

简单来说无非是这样的过程:开发设备硬件-> 编写设备固件程序-> 编写驱动程序-> 开发应用程序其中后3项主要是软件编程工作,也是本文讨论的重点。

应用程序与USB硬件设备通信自底向上需要完成三部分程序的开发:固件程序 <-USB总线驱动程序-> 设备驱动程序 <-系统I/O管理器-> 用户应用程序以下分别将这三部分程序中用于实现通信的核心代码加以介绍。

固件程序:固件程序也就是所谓的“下位机”程序,它运行于设备上,由设备上的单片机执行,用于控制USB接口芯片与主机进行通信。

开发环境:GCC + AVR Studio……/******************************************************************* USB中断处理,该中断由USB接口芯片产生,由下位机CPU处理******************************************************************/void usb_isr(void){……if ( D12_int_flags & D12_INT_ENDP0OUT ) control_out_handler(); // 产生USB控制端点接收中断时调用该函数……}/******************************************************************* 处理USB控制端点接收事件******************************************************************/ void control_out_handler( void ){……control_dispatcher(); // 调用分发处理函数}/******************************************************************* 分发处理,根据URB 的请求类型和请求号选择相应的处理函数******************************************************************/ void control_dispatcher( void ){uchar type, req;type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;req = ControlData.DeviceRequest.bRequest;……if ( type == USB_VENDOR_REQUEST ) // 处理用户自定义请求{// 根据请求号选择请求处理函数表入口if ( req < NUMBER_VENDOR_REQ ) (*VendorDeviceRequest[req])();}……}/******************************************************************* 用于处理用户请求的函数入口表******************************************************************/ const pfnvoid VendorDeviceRequest[] ={fun0,fun1,fun2,……};/******************************************************************* 用户请求处理函数实现******************************************************************/void fun0(void){uint8_t txdata[LEN];……single_transmit(txdata, LEN);}驱动程序:目前Windows系统下的驱动程序通常采用WDM模型(Win32 Driver Model,Win32驱动模型),采用Microsoft提供的DDK开发,借助第三方驱动程序开发工具比如DriverStudio 可以大大简化开发过程。

USB 驱动开发技术彻底解密

USB 驱动开发技术彻底解密
-4-
PDIUSBD12 USB 器件原理 固件编程及其驱动开发
广州周立功单片机发展有限公司 地址 广州市天河区天河北路 689 号光大银行大厦 16 楼 D2 邮编 510630 电话 (020) 38730916 38730917 38730976 38730977 传真 (020) 38730925 电子邮箱 info@ 网址
十分抱歉 这本书在还没有出版之前是不单独对外销售的 仅仅作为我们销售 Keil C51 高级语言的 DP 51 下载仿真实验仪 和 D12 SMART USB 开发套件 的辅助资料 作为一个技术驱动型的企业 我 们投入了大量的人力 物力 资金 服务及其心血做出一个产品 设计一个软件或者写作一本好书确实不 是一件容易的事情 总有一小撮人不顾他人的心血和利益――将资料扫描 源码通过网络散发 更可恶的 是有些人经常为了一点绳头小利 仿造 以至于很多人还是到我们这里来寻求服务 但面对那么多热心的 客户我们也不能不服务 此时此刻看来服务并非 产品 无论怎样我们希望大家能够尊重我们的劳动成果 和知识产权 这也是我们可持续发展的动力
技术支持 电话 020) 85520995 85539796 85547386
85541621 85541773 85571663 电子邮箱 mcutools@ pmcu@
各地分公司 北京周立功 地址 北京市海淀区黄庄知春路 132 号中发电子大厦 701 室 电话 (010)82628073 82614433(Fax) 成都周立功 地址 成都市一环路南一段 57 号金城大厦 618 室 电话 (028)85499320 85439505(Fax) 深圳周立功 地址 深圳市深南中路 2070 号电子科技大厦 C 座 18 楼 D2 电话 (0755)83287588 83274266(Fax) 杭州周立功 地址 浙江省杭州市教工路 2 号杭州电子市场仪器仪表城二楼 555 室 电话 (0571)88271834 88271326 (Fax) 上海周立功 地址 上海市延安西路 1882 号东华大学上海喜天游大酒店 4 楼 C31 室 电话 (021)62199015 62199016(Fax) 南京周立功 地址 南京市珠江路 280 号珠江大厦 2006 室 电话 (025)3613221 3641103(Fax) 广州周立功 地址 广州市天河区新赛格电子城 203--204 室 邮编 510630 电话 (020)87578634 87578842(Fax)

嵌入式USB设备驱动的研究与设计开发

嵌入式USB设备驱动的研究与设计开发

嵌入式USB设备驱动的研究与设计开发随着科技的飞速发展,嵌入式系统已经成为现代生活中不可或缺的一部分。

而作为嵌入式系统中最常见的外设之一,USB设备的驱动程序对于系统的正常运行起着至关重要的作用。

因此,对嵌入式USB设备驱动的研究与设计开发具有极高的实用价值和深远的意义。

嵌入式USB设备驱动的研究主要涉及到硬件和软件两个方面。

在硬件方面,需要对USB接口的工作原理进行深入研究,了解USB设备的接口规范以及各种USB设备的特性和使用场景。

同时,还需要研究与开发USB设备的驱动电路,确保其能够与嵌入式系统正常通信,并能实现数据的传输和交互。

在软件方面,嵌入式USB设备驱动的设计开发主要包括驱动程序的编写和优化。

首先,需要针对不同的USB设备类型和功能,编写相应的驱动程序。

例如,对于USB存储设备,需要编写文件系统的驱动程序,实现对存储设备的读写操作;对于USB打印机,需要编写打印机控制命令的驱动程序,实现打印功能等。

其次,还需要优化驱动程序的性能,提高系统的响应速度和稳定性。

这需要通过对驱动程序进行调试和测试,发现并修复可能存在的问题,确保驱动程序能够在不同的嵌入式平台上正常运行。

嵌入式USB设备驱动的研究与设计开发还涉及到与操作系统的兼容性和互通性。

不同的嵌入式系统可能采用不同的操作系统,如Linux、Windows等。

因此,在进行驱动程序的设计和开发时,需要考虑到不同操作系统的特点和要求,确保驱动程序能够在不同的操作系统环境下正常运行和兼容。

总之,嵌入式USB设备驱动的研究与设计开发是一个涉及到硬件和软件的综合性工作。

通过对USB接口的研究和了解,编写和优化驱动程序,考虑与操作系统的兼容性和互通性,可以实现嵌入式系统与USB设备之间的良好交互和数据传输,为现代生活中的各种嵌入式系统提供稳定可靠的外设支持。

这将进一步推动嵌入式系统的发展和应用,为人们的生活带来更多便利和创新。

USB驱动开发

USB驱动开发

• 初始化请求
• 为了创建一个URB,你首先应该为URB分配内存,然后调用初始化例程把URB 结构中的各个域填入请求要求的内容,例如,当你为响应IRP_START_DEVICE 请求而配置设备时,首要的任务就是读取该设备的设备描述符。
• • • • • • • • • • •
USB_DEVICE_DESCRIPTOR dd; URB urb; UsbBuildGetDescriptorRequest(&urb, sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, &dd, NULL, sizeof(dd), NULL);



设备的端点模式器的结构决定了它的查询频率,从1到255ms之间。这种传 输方式典型的应用在少量的分散的、不可预测数据的传输。键盘、操纵杆 和鼠标就属于这一类型。 ·大量(bulk)传送:主要应用在数据大量传送传送和接受数据上,同时又没有带宽
和间隔时间要求的情况下,要求保证传输。打印机和扫描仪属于这种类型。这种类 型的设备适合于传输非常慢和大量被延迟的传输,可以等到所有其它类型的数据的 传送完成之后再传送和接收数据。
• 应用软件设计
• 应用软件设计由两部分组成:链接库程序和应用程序。 链接库负责与USB功能驱动程序通信并接受应用程序的 各种操作请求,而应用程序负责对所采集的数据进行 分析处理。
• 我们在这里就可以总结一下:
• 一套完整的嵌入式系统,由硬件和软件组合而成。应用程序要控 制硬件系统的具体工作,但是现在可以看到,它并不是直接参与 硬件的控制,在中间层,还有一套具体的驱动程序来执行应用层 传递过来的I/O请求,同样,硬件系统要返回给应用程序的数据也 要经过驱动程序的处理。

USB设备驱动程序的研究与开发

USB设备驱动程序的研究与开发
负 责初 始 化操 作 ,如设 置 驱动 程序 对 象 中指 向各
种 例 程 的指 针 等 。其 相关 代码 如下 :
H ̄插 即用例 程人 口 l l J D i r be t > r eE tni > d D v e : r eO jc - D i r xe s n- A d ei v v o c
口。而要 实 现U B 件 设备 与 主机 间 稳定 的数 据 S硬
传 输 ,则 不 可避 免 的要 编 写适 合U B 件要 求 的 S硬
驱 动 程序 。为此 ,本 文结 合 实 例 ,论 述 了U B S 设
备 驱动 程序 的具 体实 现机 制和 开发 方法 。
示 是其 体 系结构 图。
/ R 发送 给下 层 的U B / 将U B S 总线 驱动 程序
D i r bet > aoF n t n【R _ _ R — r eO jc 一 M jru c o I P MJC E v i
A E =D v rae T] rC et;
nSa s sC l S D fo ub tt u =U b a U B I( , r); t l d
4 U B 备 驱 动 程 序 的 实现 S设
驱 动程 序 是一 些例 程 的集 合 ,它 一般 被 动地 存 在 ,以等 待 主 机 系统 软 件 (n 管 理 器 、I PP / O管 理 器 、 电源管 理器 1来 调用 。典 型 的U B 备 驱 S设 动 程序 主要 包 括若 干 例程 ,其 中有 驱 动程 序入 口
31 I P 求包 . R 请
个U B S 系统 的分 层 结 构 。 图 中 ,功 能层 负 责 实 现
U B 备 的特 定 功能 。该 层 不 需 要 理 解U B 体 S设 S具

USB驱动开发

USB驱动开发

第17章USB设备驱动USB设备驱动和PCI设备驱动是PC中最主要的两种设备驱动程序。

与PCI协议相比,USB协议更复杂,涉及面较多。

本章将介绍USB设备驱动开发。

首先介绍USB协议,使读者对USB协议有个整体认识。

然后介绍USB设备在WDM中的开发框架。

由于操作系统的USB总线驱动程序提供了丰富的功能调用,因此开发USB驱动开发变得相对简单,只需要调用USB总线驱动接口。

17.1 USB总线协议USB总线协议比PCI协议复杂的多,涉及USB物理层协议,又涉及USB传输层协议等。

对于USB驱动程序开发者来说,不需要对USB协议的每个细节都很清楚。

本节概要地介绍USB总线协议,并对驱动开发者需要了解的地方进行详细介绍。

17.1.1 USB设备简介USB即通用串行总线(Universal Serial Bus),是一种支持即插即用的新型串行接口。

也有人称之为“菊链(daisy-chaining)”,是因为在一条“线缆”上有链接127 个设备的能力。

USB要比标准串行口快得多,其数据传输率可达每秒4Mb~12Mb(而老式的串行口最多是每秒115Kb)。

除了具有较高的传输率外,它还能给外围设备提供支持。

需要注意的是,这不是一种新的总线标准,而是计算机系统连接外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。

到现在为止,计算机系统连接外围设备的接口还没有统一的标准,例如,键盘的插口是圆的、连接打印机要用9针或25针的并行接口、鼠标则要用9针或25针的串行接口。

USB能把这些不同的接口统一起来,仅用一个4针插头作为标准插头,如图17-1所示。

通过这个标准插头,采用菊花链形式可以把所有的外设连接起来,并且不会损失带宽。

USB正在取代当前PC上的串口和并口。

第17章 USB 设备驱动431图17-1 USB 的四条传输线以USB 方式连接设备时,所有的外设都在机箱外连接,连接外设不必再打开机箱;允许外设热插拔,而不必关闭主机电源。

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

华清远见
今天的内容
Ø B及驱动框架简介
Ø
1.1 USB协议
Ø
1.2 USB驱动的体系结构
Ø 2.主机端驱动
Ø
2.1 主机控制器驱动
Ø
2.2 设备驱动
Ø 3.设备端驱动
Ø
3.1 设备控制器驱动
Ø
3.2 gadget驱动
... };
static struct usb_config_descriptor source_sink_config = {
... };
static struct usb_config_descriptor source_sink_config = {
... };
static struct usb_endpoint_descriptor fs_source_desc = {
}; MODULE_DEVICE_TABLE (usb, skel_table);
ØUSB字符设备
int usb_register_dev(struct usb_interface *intf, struct usb_class_driver *class_driver);
void usb_deregister_dev(struct usb_interface *intf, struct usb_class_driver *class_driver);
MC SYSTEM, 2008-12-12
华清远见
USB设备驱动体系结构
华清远见
USB设备驱动数据结构和API
Østruct usb_driver
static struct usb_driver skel_driver =
{
.name =
"skeleton",
.probe = skel_probe,
};
int usb_gadget_config_buf(
const struct usb_config_descriptor *config,
void
*buf,
unsigned
usb_alloc_urb()
中断:usb_fill_int_urb() 批量:usb_fill_bulk_urb() 控制:usb_fill_control_urb() 等时:手工初始化iso urb
usb_submit_urb() usb核心、usb主机控制器处理
usb_kill_urb() usb_unlink_urb()
.disable = xxx_ep_disable,
.alloc_request = xxx_alloc_request,
.free_request = xxx_free_request,
.alloc_buffer = xxx_alloc_buffer,
.free_buffer = xxx_free_buffer,
= zero_suspend, = zero_resume,
.driver = {
.name
= (char *) shortname,
.owner = THIS_MODULE,
},
};
华清远见
USB Gadget驱动--组成(2)
Ø设备、配置、接口、端点描述符
static struct usb_device_descriptor device_desc = {
... }; static struct usb_endpoint_descriptor fs_sink_desc = {
..., }; ....
static const struct usb_descriptor_header *fs_source_sink_function [] = { (struct usb_descriptor_header *) &otg_descriptor, (struct usb_descriptor_header *) &source_sink_intf, (struct usb_descriptor_header *) &fs_sink_desc, (struct usb_descriptor_header *) &fs_source_desc, NULL,
...
};
Østruct usb_gadget_ops
static const struct usb_gadget_ops xxx_udc_ops =
{
.get_frame = xxx_udc_get_frame,
.wakeup
= xxx_udc_wakeup,
};
华清远见
USB Gadget驱动--组成(1)
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints
2
bInterfaceClass 8 Mass Storage
bInterfaceSubClass 6 SCSI
bInterfaceProtocol 80 Bulk (Zip)
iInterface
0
Endpoint Descriptor:
幻灯片 8 MS1
Starts processing a USB transfer request specified by a USB Request Block (URB). mem_flags indicates the type of memory allocation to use while processing this URB.
.get_frame_number =
xxx_hcd_get_frame_number,
.hub_status_data = .hub_control =
xxx_hcd_hub_status_data, xxx_hcd_hub_control,
};
API:
struct usb_hcd *usb_create_hcd (const struct hc_driver *driver, struct device *dev, char *bus_name);
Østruct usb_gadget_driver
static struct usb_gadget_driver zero_driver = {
#ifdef CONFIG_USB_GADGET_DUALSPEED
.speed = USB_SPEED_HIGH,
#else
.speed = USB_SPEED_FULL,
UDC驱动(omap/pxa2xx...)
USB控制器OHCI/EHCI/UHCI
USB总线
USB控制器OHCI/EHCI/UHCI
华清远见
USB主机控制器驱动
数据结构:
Østruct usb_hcd
Ø struct hc_driver
static const struct hc_driver xxx_hc_driver = {
wTotalLength
32
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
MaxPower
200mA
直观的例子—U盘
Interface Descriptor:
bLength
9
bDescriptorType 4
xxx_hcd_start,
.stop = .urb_enqueue =
xxx_hcd_stop,
xxx_hcd_urb_enqueue, MS1
.urb_dequeue =
xxx_hcd_urb_dequeue,
.endpoint_disable =
xxx_hcd_endpoint_disable,
bLength
7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes
2
Transfer Type
Bulk
Synch Type
none
wMaxPacketSize 512
bInterval
0
Endpoint Descriptor:
bLength
urb->com ple t e()
华清远见
USB设备驱动实例分析
ØUSB骨架程序 ØUSB串口驱动 ØUSB键盘驱动
华清远见
USB设备控制器驱动
数据结构
Østruct usb_ep_ops
static struct usb_ep_ops xxx_ep_ops = {
.enable = xxx_ep_enable,
Ø 4. USB OTG
华清远见
Ø拓扑结构
主机 root hub
USB协议(1)
设备
设备 hub
设备
hub
设备
设备
设备
设备
Ø设备、配置、接口和端点
设备描述符
配置0
接口0 端点1
接口1
端点2
端点3
配置1
接口0
接口1 端点…
接口2
华清远见
Ø传输方式
Ø控制(Control)传输方式 Ø同步(Synchronization)传输方式 Ø中断(Interrupt)传输方式 Ø批量(Bulk)传输方式
.description =
xxx_hcd_name,
.product_desc =
"xxx OTG Controller",
相关文档
最新文档