基于linux下的USB Device驱动程序设计

时间:2022-10-30 11:01:22

基于linux下的USB Device驱动程序设计

摘要:USB接口以其数据传输的高效、可靠而被广泛应用在各种嵌入式产品中。然而现有的资料对linux操作系统中USB Host 研究的比较多,鲜有对USB Device驱动进行研究的。因此论文通过对USB协议进行简单的介绍、以及对linux下USB驱动程序架构进行分析,并在此基础上设计了基于linux操作系统的嵌入式微处理器S3C2440 USB Device驱动程序。

关键词:USB协议;Linux驱动;USB Device驱动

中图分类号:TP316文献标识码:A文章编号:1009-3044(2011)22-5418-02

Design of USB Device Drver Program on linux

SUN Yong-gang, JIAO Li-fei

(College of Science, GuiZhou University, Guiyang 550025, China)

Abstract:USB interface, with its efficient, reliable and widely is used in various embedded products. However, existing data on linux operating system, more studies USB Host, USB Device driver rarely is done. Therefore this paperthrough a simpleintroduction of USB protocol, as well as analysis of USB driver architecture about linux, is about an design of USB Device driver of linux systemfor embedded microprocessor S3C2440 .

Key words: USB agreement; linux driver;USB device driver

嵌入式产品通过的USB接口品可以很方便与PC的USB进行通信以完成数据的传输与交互。ARM嵌入式处理器性以其性能高、功耗低而被广泛地应用于消费电子、工业控制等众多领域。以ARM内核为核心集成了USB功能的处理器使得产品更简洁、更灵活、更方便。S3C2440集成了ARM920T内核,带MMU功能,可运行linux操作系统,同时带有两个USB Host一个USB Device控制器,因此在此基础上完成Linux 下的USB Device驱动程序有着重要的意义。本文是以此处理器为核心的嵌入式智能终端的Linux下的USB Device驱动程序设计。

1 USB体系结构及协议

1.1 USB硬件系统结构

USB接口是由+5V电源线、电源地线、信号线D+、信号线D-四根电缆线组成接口。其中+5V电源是向设备提供电源,信号线作用是传输数据, 为了提高信号传输的抗干扰能力这两根数据线采用差分传输。主机可以通过D+和D-线的电平高低来确设备是高速设备还是全速设备。

1.2 USB数据传输通道

USB主机与USB设备由很多端点构成,它们之间通过端点进行通讯。通过设置与些端点相对应的寄存器,可以为这些端点分配唯一的地址(由端点号和传输方向组成)。USB总线支持四种传输类型,他们分别是控制传输、同步传输、中断传输、批量传输。端点O只支持控制传输。

1.3 USB总线枚举

USB总线枚举就是当USB设备连接到USB主机时,主机通过缺省管道以控制传输方式来获取USB设备发来的设备描述符、配置描述符、接口描述符、端点描述符信息,并根据这些描述相关内容对USB设备进行相应的配置。

2 Linux USB 驱动程序

在Linux系统中,USB驱动程序可以分为USB Host驱动程序和USB Device驱动程序。Linux USB Host驱动程序和USB Device驱动程序总体架构如图1所示。

从图1可以知,在Linux USB Host中,USB控制器驱动是运行在USB 控制器硬件上面的的驱动动程序。该驱动实现了对USB 控制器硬件进行控制,一般称为USB固件驱动程序。USB设备驱动处于USB驱动的最顶层,它主要实现USB设备如何与主机进行通信。处在USB主机控制器驱动与USB设备驱动之间的是USB核心层,起到驱动程序桥梁的作用,该核心层为USB主机USB主机控制器驱动提供编程接口。

Linux系统中, USB Device驱动分为UDC驱动、Gadget API、Gadget驱动三个层次结构。UDC驱动处USB Device控制器硬件之上,该驱动程序控制USB控制器硬件工作,同时向上层提供操作USB控制器硬件的回调函数。处在中间层的是Gadget API层,该API向下层和上层提供统一的编程接函数的封装。Gadget驱动程序完成设备功能的实现。通过编写不同Gadget驱动程序可以使设备具有不同的功能。

3 S3C2440 USB Device驱动

3.1 S3C2440 USB接口特性

S3C2440嵌入式微处理器集成了一个设备控制器。该设备控制器具有以下特征:

1) 完全兼容USB1.1的协议。设备全速运行时可达到了12Mb/s。

2) 支持控制、中断和批量传输,批量传输支持DMA接口。

3) 自带5个的端点。端点EP0带有16byte的FIFO,该端点为双向的控制端点,其余4个端点都带有128字节输入/输出的FIFO(异步双端口RAM)的,支持中断或DMA批量传输。

3.2 S3C2440 USB Device驱动程序设计

一个完整的S3C2440 USB Device驱动程序由S3C2440_UDA驱动和gadget驱动两部分构成。S3C2440_UDA驱动是用来控制S3C2440的USB Device硬件控制器器,并把对硬件控制操作抽象为函数接口供上层调用。USB gedget驱动程序运行在S3C2440_UDA驱动程序之上的,不同的gedget驱动程序使该设备具有不同的功能。

Linux gadget驱动程序主要涉及到2个重要的结构体usb_gadget_driver和struct file_operations结构。其中usb_gadget_driver结构体包括bind、setup、disconnect等一些函数。Linux Gadget提供usb_gadget_register_driver函数对Gaget驱动进行注册。当Gadget驱动被注册后,Linux内核就会调用结构体usb_gadget_driver中的bind函数把Gadget驱动与UDA驱动进行绑定,这样就可以在Gadget驱动中使用UDA提供的统一接口函数。

bind函数中需要完成以下工作:

1) 使用usb_ep_autoconfig函数申请以后用到的传输端点。

2) 通过usb_ep_alloc_request函数为Gadget驱动分配一个请求。

3) 通过调用register_chrdev_region注册设备驱动程序。

Bind函数完成这后当有USB Host 向USB设备发出请求时,Linux系统将调用setup函数来响应请求。Setup函数把设备的设备描述符、配置描述符、接口描述符以及以后需要使用的几个端点描述符发送给USB Host,这些配置信息的发送都是通过usb_ep_queue函数来完的。

struct file_operations结构包含有open、read、write等函数。通过该结构体定义的变量被register_chrdev_region函数注册后该设备就可以像字符设备那样使有了。该结构中的一些函数完成的功能如下:

1) open函数通过init_waitqueue_head完成等待队列初始化。

2) read函数通过alloc_ep_req函数分配一个读请求变量,并为该变量中的complete设置一个请求完成函数,调用usb_ep_queue函数向端点提交I/O读请求。当内核从USB Device读到数据时就会调有刚才的完成函数。在完成读数据之前可以通过add_wait_queue和schedule()函数让进程挂起,在完成函数中唤醒挂起的进程。

3) write函数通过alloc_ep_req函数分配一个写请求变量,并为该变量中的complete设置一个请求,调用usb_ep_queue函数向端点提交I/O写请求。当内核向USB Device写完数据时就会调有刚才的完成函数。在完成写数据之前可以通过add_wait_queue和chedule()函数让进程挂起,在完成函数中唤醒挂起的进程。

至此整个驱动程序就设计完成了,图2为USB Host 与 USB Device 通信测试效果。

4 结束语

USB Device 为众多电子产品提供了一个与PC信息交互的更好的方案。本文通过对USB协议介绍,以及对Linux下USB驱动程序进行分析,在此基础上实现了USB Device驱动程序进行设计。实践表明该设计是可行的。

参考文献:

[1] 冯国进.嵌入式Linux驱动程序设计从入门到精通[M]北京:清华大学出版社,2008.

[2] 薛园园.USB应用开发技术大全[M].北京:人民邮电出版社,2007.

[3] 刘少峰,韦克平.USB软件系统的开发[J].计算机应用研究,2002,19(30).

[4] 于明,范书瑞,曾祥烨.ARM9嵌人式系统设计与开发教程[M].北京:电子工业出版社,2006.

[5] 李志辉,查建中.嵌入式Linux开发平台的USB主机接口设计[J].电子产品世界,2002(23).

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:一种基于身份的多重盲签名方案 下一篇:基于校园网的流量分析技术研究及应用