Linux的USB子系统驱动框架简析

一、USB子系统介绍

  1. USB设备是主从结构的总线,USB设备包含HUB和功能设备
  2. 在USB2.0中,规定除Root外,USB设备层数最多6层,最多连接127个设备(7位的地址)
  3. USB设备包含一个或多个逻辑,一个逻辑体现为一个接口,一个接口包含多个端点
  4. 端点0为控制端点,USB设备的枚举使用它,控制传输默认也是端点0
  5. 每个端点都可以与数据缓冲区组成一个管道,管道传输包含:控制传输、等时传输、中断传输、块传输

二、USB驱动的结构体

//USB接口--一个逻辑
struct usb_interface{
  struct usb_host_interface *cur_altsetting;      // 保存有主机侧对接口的描述
  ...
};
struct usb_host_interface{
  ...
  struct usb_host_endpoint *endpoint;             //端点的数组,端点结构体中存储有描述符
};
//USB驱动
struct usb_driver{
  const char *name;  // 名字
  int (*probe)(struct usb_intrface *intf, const struct usb_device_id *id);
  void (*disconnect)(struct usb_intrface *intf);
  const struct usb_device_id *id_table;            // 存储USB接口的信息
};

三、驱动程序的流程

1. 使用module_usb_driver注册一个usb_driver
2. probe函数中,根据interface_to_usbdev函数得到usb_device,并在结构体成员中得到端点的描述符(usb_endpoint_descpription),构建piple,使用usb_alloc_urb分配一个urb结构体
3. 在file_operations相关的函数中,借助urb结构体和pipe实现读写操作
4. disconnect函数中usb_kill_urb和usb_free_urb,停止传输,释放结构体资源
posted @ 2025-08-06 17:24  gramming  阅读(289)  评论(0)    收藏  举报