基于Linux的USB从设备驱动研究

发布者:快乐舞步最新更新时间:2013-03-13 来源: dzsc关键字:Linux  USB从设备  驱动研究 手机看文章 扫描二维码
随时随地手机看文章
    引言

  USB是英文Universal Serial Bus的缩写,意为通用串行总线。USB是一种快速、双向、同步、低成本、动态可连接的串行接口。USB现在已经广泛应用到各种设备上,尤其是手持设备,几乎都采用了USB接口。现在,USB即可用来与其他设备连接后高速地传递数据,又可用来充电,使手持设备可以发挥U盘、MODEM、无线网卡等作用。

  事实上,USB只是主机和外围设备之间的连接。如何来促使这种连接发挥作用,就需要驱动程序。驱动程序主要解决硬件“需要提供什么功能”以及“如何使用这些功能”。在linux系统中,USB设备可以作为主机使用,也可作为从设备使用。对应的USB驱动程序有两种主要的类型:宿主系统上的驱动程序和设备上的驱动程序。从宿主的观点来看(例如普通的左桌面计算机),宿主系统的USB驱动程序控制插入其中的USB设备,而USB设备的驱动程序则控制该设备如何作为一个USB设备和主机通信。

  1 USB设备基础

  USB设备的构成包括配置接口和端点,以及USB驱动程序如何绑定到USB接口上。端点是USB通信最基本的形式,USB端点只能是往一个方向传送数据,即从主机到设备(称为输出端点)或者从设备到主机(称为输入端点),故可以看作是单向管道。USB有四种不同的类型,分别对应不同的传输类型:控制、中断、批量、等时。其次接口,USB端点被绑定即为接口。USB的一个接口只处理一种USB逻辑连接;一个USB设备可以有多个接口,不同的接口可以代表不同的功能,因此,功能不同的USB接口需要不同的驱动程序。另外就是配置,USB接口本身被绑定为配置。一个USB设备可以有多个配置,而且可以在配置之间切换以改变设备的状态;一个时刻只能激活一个配置,怛一个配置通常具有一个或者更多的接口。

  USB设备可由许多不同的逻辑单元组成,实际上,也就是这三种逻辑单元组合而成的。Linux内核中的USB代码一般要用URB (usbrequst block)与USB设备通信。URB用struct urb结构体描述,它能以一种异步的方式往/从特定的USB端点发送/接收数据。USB设备驱动程序可能会为单个端点分配许多的URB,也可能对许多不同的端点重用单个URB,这取决于驱动的需要。当USB驱动程序只发送或接收一些简单的USB数据时,可以使用两个很简单的接口函数:usb_bulk_msg、usb_control_msg。

  2 USB设备驱动程序的结构

  图1所示是Linux环境下USB驱动的总体结构。从图l中可以看到:在主机侧层次结构中,实现USB驱动有两类方式:USB主机控制器驱动和USB设备驱动;USB主机控制驱动主要控制插入其中的USB设备,主机控制器可以分为三类,分别对应于三种USB主控制器;USB设备驱动则用于控制USB设备如何与主机通信;USB核心负责USB驱动管理和协议处理的主要工作。


  USB核心向上可为设备驱动提供编程接口,向下可为USB主机控制器驱动提供编程接口;它可以通过全局变量维护整个系统的USB设备信息,从而完成设备的热插拔控制和总线数据传输控制等驱动。

  另外,在从设备侧,Linux内核中的USB设备侧驱动程序可分为3个层次:USB设备控制器(UDC)驱动程序、Gadget API和Gadget驱动程序;UDC驱动程序可直接访问硬件,控制USB设备和主机间的底层通信,并向上层提供和硬件相关的操作回调函数。不同的设备控制器硬件有不同的设备控制器驱动程序;Gadget驱动主要控制USB设备功能的实现,它使用Gadget API传递控制信息给UDC驱动程序,以便实现具体功能。

  Gadget API是设备控制器的控制功能抽象接口,Gadget驱动程序可以试用Gadget API,它可以把下层的UDC驱动程序和上层Gadget驱动程序相隔离,以使得在linux系统中编写USB设备侧驱动程序时,能够把功能的实现和底层通信相分离。

  如果要在S3c24.10上实现大存储类从设备,则需要运行file_storage.c和s3c2410_udc.c这两个驱动程序。file_stoarge.c具体控制USB设备功能的实现,它使用Gadget API来控制s3c2410.c以实现其功能。s3c2410.c驱动程序可直接访问硬件,以控制USB设备和主机间的底层通信,同时向上层提供和硬件相关操作的回调函数。

  3 USB从设备驱动

  驱动程序完成的功能包括初始化设备、为各类设备提供服务、负责内核与设备间的数据交换、以及检测和处理设备工作过程中出现的错误等。[page]

  基于完成这些功能,每个驱动程序都需要注册和注销,这样,内核才能知道有这个驱动的存在或者驱动的卸载。下面是两个最基本的模块:

  module_init(usb_skel_init);

  module_exit(usb_skel_exit);

  对于USB从设备而言,结构USB_gadget就可以代表。Gadget通过“Gadget驱动程序”来实现设备功能,处理所有的USB配置和接口。通过操作函数集,Gadget驱动程序与硬件特定代码间接通信。它将Gadget驱动程序与那个硬件细节隔开,并通过I/O队列包装硬件端点。 “usb_gadget”“usb_ep”接口则可提供对硬件的隔离。

  其结构usb_gadget的代码如下:




  结构usb_gadget_ops是USB设备控制期的设备控制函数集,其操作包括get_frames、wakeup、pullop、ioctl等。结构struct usb_ep是USB端点从设备侧的代表,总线控制器驱动程序中列出了在gadget->ep_list里所有的通用端点,但控制端点不在列表中,它仅在回应驱动程序的setup 0 回调函数时才被访问,其代码如下:


  4 结束语

  本文主要通过在S3C2401上实现USB从设备的驱动程序,介绍了USB从设备驱动的研究方法。Linux作为一个开源操作系统,设备驱动程序的开发有着其它操作系统不可比拟的优势,大量的开放源代码无疑可以加速USB从设备驱动,并使其应用更加广泛。因此,USB作为一种新型的高速外设总线,它必将更加促进linux系统源码的开发和完善,同时亦会促进自身的更广泛的应用。

参考文献:

[1]. UDC datasheet http://www.dzsc.com/datasheet/UDC_1172741.html.

关键字:Linux  USB从设备  驱动研究 引用地址:基于Linux的USB从设备驱动研究

上一篇:基于Zigbee的嵌入式自动抄表系统的研究
下一篇:便携式数据采集系统的设计

推荐阅读最新更新时间:2024-03-16 13:20

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(四)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器: arm-linux-gcc-4.3.2.tgz u-boot: u-boot-2009.08.tar.bz2 二、移植步骤 上接: u-boot-2009.08在2440上的移植详解(三) 在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot引导内核我们要用到网络下载功能。 7)u-boot对CS8900或者DM9000X网卡的支持。 u-boot-2009.08版本已经
[单片机]
嵌入式<font color='red'>Linux</font>之我行——u-boot-2009.08在2440上的移植详解(四)
linux内核中的GPIO系统之(2):pin control subsystem
一、前言 在linux2.6内核上工作的嵌入式软件工程师在pin control上都会遇到这样的状况: (1)启动一个新的项目后,需要根据硬件平台的设定进行pin control相关的编码。例如:在bootloader中建立一个大的table,描述各个引脚的配置和缺省状态。此外,由于SOC的引脚是可以复用的,因此在各个具体的driver中,也可能会对引脚进行的配置。这些工作都是比较繁琐的工作,需要极大的耐心和细致度。 (2)发现某个driver不能正常工作,辛辛苦苦debug后发现仅仅是因为其他的driver在初始化的过程中修改了引脚的配置,导致自己的driver无法正常工作 (3)即便是主CPU是一样的项目,但是由于外设的不同,
[单片机]
<font color='red'>linux</font>内核中的GPIO系统之(2):pin control subsystem
linux串口终端ttySAC,Linux串口终端驱动——S3C6410平台
1、serial文件夹下Kconfig分析 config SERIAL_SAMSUNG tristate Samsung SoC serial support depends on ARM && PLAT_S3C select SERIAL_CORE help Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,为支持三星的片上UARTs控制器 providing /dev/ttySAC0, 1 and 2 (note, some machines may not provide all of these ports, depending on how
[单片机]
OK6410A 开发板 (八) 107 linux-5.11 OK6410A devtmpfs 文件系统
drivers/base/devtmpfs.c devtmpfs 分为两种实现 1. 没有定义 CONFIG_TMPFS 2. 定义了 CONFIG_TMPFS 67 static struct file_system_type internal_fs_type = { 68 .name = devtmpfs , 69 #ifdef CONFIG_TMPFS 70 .init_fs_context = shmem_init_fs_context,
[单片机]
ARM的嵌入式Linux移植体验之基本概念
  引言   ARM是Advanced RISC Machines(高级精简指令系统处理器)的缩写,是ARM公司提供的一种微处理器知识产权(IP)核。   ARM的应用已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。基于ARM 技术的微处理器应用约占据了32位RISC 微处理器75%以上的市场份额。揭开你的手机、MP3、 PDA,嘿嘿,里面多半藏着一个基于ARM的微处理器!   ARM内核的数个系列(ARM7、ARM9、ARM9E、ARM10E、SecurCore、Xscale、StrongARM),各自满足不同应用领域的需求,无孔不入的渗入嵌入式系统各个角落的应用。这是一个ARM的时代!   有人
[单片机]
ARM9学习---虚拟机中LINUX与主XP系统数据通信
我在XP系统中安装了虚拟机,VMwave,安装了redhat 的Linux系统,但是有些需要在Linux系统中安装软件等,所以需要从XP系统中把文件传输到Linux系统中。我接触 Linux系统时间不长,所以也不是特别的熟悉,所以先学了一种方法,就是利用FTP传输的方法,就是在主XP系统中安装一个FTP软件(我用的是G6 FTP Server V2.0软件)安装很简单,只要设置好IP地址和路径就可以了。我主要是用XP传输给Linux系统,所以很简单。在Linux系统终端中进入你所需要下载文件的文件夹,然后键入:ftp 192.168.50.103(我主机的IP地址) ,如果有用户名和密码,那就键入相应的用户名和密码,如果显示conn
[单片机]
电源管理的Linux技术实施应用在便携式动态设备
任何拥有笔记本电脑的人都会察觉,当依靠电池供电时,其便携设备的行为与使用交流主 电源 供电时不同——显示屏变暗、处理器的时钟变慢、系统只要有可能就会转入待机或睡眠状态。PDA用户也发现,在停止使用一段时间后显示屏将变暗,设备甚至进入睡眠状态。蜂窝电话用户也已经注意到,背景光和按键照明在完成拨号之后会熄灭。事实上,这些可见行为的背后是软硬件技术和节电机制在发挥作用。 全速运行、待机和睡眠等宏观行为利用CPU的固有能力通过降低工作电压或时钟频率来节省功耗。除了全面地改变系统状态外,大多数设备用户察觉不到的是,实际的电源管理也能够逐渐地改变系统状态,这种情况在一秒之内可以发生数百次。 任何动态 电源 管理策略的基础都是调整便携式设备中一
[电源管理]
电源管理的<font color='red'>Linux</font>技术实施应用在便携式动态<font color='red'>设备</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved