Board logo

标题: 基于Linux的USB从设备驱动研究 02 [打印本页]

作者: samwalton    时间: 2013-10-11 20:17     标题: 基于Linux的USB从设备驱动研究 02

另外,在从设备侧,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从设备驱动
  驱动程序完成的功能包括初始化设备、为各类设备提供服务、负责内核与设备间的数据交换、以及检测和处理设备工作过程中出现的错误等。
  基于完成这些功能,每个驱动程序都需要注册和注销,这样,内核才能知道有这个驱动的存在或者驱动的卸载。下面是两个最基本的模块:
  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系统源码的开发和完善,同时亦会促进自身的更广泛的应用。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0