新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式Linux下USB驱动程序的设计

嵌入式Linux下USB驱动程序的设计

作者:时间:2013-10-08来源:网络收藏

  一、引言

本文引用地址:http://www.amcfsurvey.com/article/237803.htm

  (Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不同速度的、可扩充的并且使用方便的外围设备接口,同时也是为了解决计算机接口的太多的弊端而设计的。一个系统主要有三部分组成:互连、USB主机、USB设备三部分组成的,其结构如图1所示。在编写USB设备设计时,可以分为三部分编写:主机端设备、主机控制器设计和设备端驱动程序三部分,在本文中重点介绍主机端驱动程序的设计。

  二、USB设备驱动程序的设计

  USB设备驱动程序的设计包括主机端设备驱动程序设计、主机控制器驱动程序设计和设备端驱动程序设计三部分组成。主机端设备驱动程序就是通常说的设备驱动程序,它是主机环境中为用户应用程序提供一个访问USB外设的接口。为这部分驱动程序提供编程接口,驱动程序设计者只要按照需求编写驱动程序框架,通过调用操作系统提供的API接口函数可以完成对USB外设的特定访问。

  主机控制驱动主要是对USB主机控制器的驱动,在大多数PC环境下,主机控制器都是由操作系统提供。设备一般都没有USB主机控制器,只是工作在Slave模式下。如果要使USB具有主机功能,那么设备中需要选用一个带主机控制器的USB接口控制芯片, 同时自己还要有实现该主机控制器的驱动程序。目前内核中只提供USB主机控制器的开放主机控制器和通用主机控制器接口两种规格,而这两种规格主要用在PC架构中。USB主机端驱动程序与主机控制器的结构如图2所示。其中USB核是的一个子模块,集中定义了一组USB相关的数据结构、宏以及API函数。

  USB设备驱动程序是常说的设备固件程序的一部分,提供设备信息与主机的通信接口。设备端USB驱动程序设计由以下几部分处理程序组成。初始化例程:完成描述符指针、端点、配置改变等操作。数据传输例程:完成控制传输、批量传输、中断传输及同步传输等传输方式下的数据收发工作。标准设备处理请求:处理标准设备请求。厂商请求处理:处理生产商指定请求。其他操作:处理主机发出的端口复位、配置改变等操作。

  1.USB设备驱动程序框架

  USB驱动程序首先要向Linux内核注册自己,并告诉系统它所支持的设备类型以及它所支持的操作。这些信息通过一个usb_driver结构来传递。usb_driver结构如下:

  static struct usb_driver skel_driver = {

  name: "skeleton";/*驱动程序的名称*/

  probe: skel_probe; /*设备列举时被调用*/

  disconnect: skel_disconnect; /*设备被卸载时被调用*/

  fops: skel_fops; /*指向一个file_operation结构,内核通过它来访问驱动程序的文件操作函数,与用户程序的read、write等操作进行交互*/

  minor USB_SKEL_MINOR_BASE; /*指向设备的次设备号,用于系统识别主设备号相同的设备(即一个驱动程序可以同时支持多个USB设备*/

  id_table: skel_table; /*保存设备的厂商ID和产品ID,作为该设备的唯一标识,驱动程序向系统注册后,当下次插入时,系统根据这个标识查找正确的驱动程序,实现设备的即插即用*/

  };

  static struct file_operation skel_fops={

  {

  owner:THIS_MODULE,

  read:skel_read,

  write:skel_write,

  ioctl:skel_ioctl,

  open:skel_open,

  release:skel_release,

  };

  (1)注册和注销

  USB驱动程序注册,就是把在初始化函数中填好的use_driver结构作为参数传递给

  use_register()函数即可,函数的调用方法为:

  result=usb_register(skel_driver);

  当要从系统卸载驱动程序时,也是将use_driver结构作为参数传递给usb_deregister 函数处理。 函数的调用格式为:

  static void __exit usb_skel_exit(void)

  { /* deregister this driver with the USB subsystem */

  usb_deregister(skel_driver);

  }

  module_exit(usb_skel_exit);

  当USB设备插入时,为了使linux-hotplug(Linux中PCI、USB等设备热插拔支持)系统自动装载驱动程序,需要创建一个MODULE_DEVICE_TABLE。核心代码如下(这个模块仅支持某一特定设备):

  /* table of devices that work with this driver */

  static struct usb_device_id skel_table [] = {

  { USB_DEVICE(USB_SKEL_VENDOR_ID,

  USB_SKEL_PRODUCT_ID) },

  { } /* Terminating entry */

  };

  MODULE_DEVICE_TABLE (usb, skel_table);

  USB_DEVICE宏利用厂商ID和产品ID提供了一个设备的唯一标识。当系统插入一个ID匹配的USB设备到USB总线时,驱动会在USB core中注册,驱动程序中probe 函数也就会被调用。usb_device 结构指针、接口号和接口ID都会被传递到函数中。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程



上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭