欢迎使用CSDN-markdown编辑器

来源:互联网 发布:怎样上淘宝网买东西 编辑:程序博客网 时间:2024/06/05 03:07

USB驱动

usb设备很复杂,但Linux内核为驱动工作者提供了一个称为USB core的子系统来处理大部分复杂的工作,常用的USB设备驱动只需要实现相应的设备类驱动以及和USB core交互的部分即可。

1设备、配置、借口、端点
在usb的逻辑结构中,从上到下分为设备(device)、配置(config)、接口(interface)、端点(endpoint)四个层次。

对于这四个层次的简单描述如下:
设备通常具有一个或多个的配置
配置经常具有一个或多个的接口
接口通常具有一个或多个的设置
接口没有或具有一个以上的端点

设备层
设备层代表了一个插入的USB设备,内核中使用struct usb_device 结构体来描述整个USB设备
struct usb_device {
int devnum;//设备号
char devpath [16]; //用于消息的设备ID字符串
   enum usb_device_state state; //设备状态:已配置、未连接等等
   enum usb_device_speed speed; //设备速度:高速、全速、低速或错误
  
   struct usb_tt *tt; //处理传输者信息;用于低速、全速设备和高速HUB
   int ttport; //位于tt HUB的设备口
  
   unsigned int toggle[2]; //每个端点的占一位,表明端点的方向([0] = IN, [1] = OUT)  
   struct usb_device *parent; //上一级HUB指针
   struct usb_bus *bus; //总线指针
   struct usb_host_endpoint ep0; //端点0数据

   struct device dev; //一般的设备接口数据结构
 
   struct usb_device_descriptor descriptor; //USB设备描述符
   struct usb_host_config *config; //设备的所有配置

   struct usb_host_config *actconfig; //被激活的设备配置
   struct usb_host_endpoint *ep_in[16]; //输入端点数组
   struct usb_host_endpoint *ep_out[16]; //输出端点数组
  
   char **rawdescriptors; //每个配置的raw描述符
  
   unsigned short bus_mA; //可使用的总线电流

   u8 portnum; //父端口号
   u8 level; //USB HUB的层数
  
   unsigned can_submit:1; //URB可被提交标志
   unsigned discon_suspended:1; //暂停时断开标志
   unsigned persist_enabled:1; //USB_PERSIST使能标志
   unsigned have_langid:1; //string_langid存在标志
   unsigned authorized:1;
   unsigned authenticated:1;
   unsigned wusb:1; //无线USB标志

   int string_langid; //字符串语言ID

  
   /* static strings from the device */ //设备的静态字符串
   char *product; //产品名
   char *manufacturer; //厂商名
   char *serial; //产品串号
  
   struct list_head filelist; //此设备打开的usbfs文件

  #ifdef CONFIG_USB_DEVICE_CLASS
   struct device *usb_classdev; //用户空间访问的为usbfs设备创建的USB类设备
  #endif
  #ifdef CONFIG_USB_DEVICEFS
   struct dentry *usbfs_dentry; //设备的usbfs入口
  #endif
  
   int maxchild; //(若为HUB)接口数
   struct usb_device *children[USB_MAXCHILDREN];//连接在这个HUB上的子设备
   int pm_usage_cnt; //自动挂起的使用计数
   u32 quirks;
   atomic_t urbnum; //这个设备所提交的URB计数
  
   unsigned long active_duration; //激活后使用计时

  #ifdef CONFIG_PM //电源管理相关
   struct delayed_work autosuspend; //自动挂起的延时
   struct work_struct autoresume; //(中断的)自动唤醒需求
   struct mutex pm_mutex; //PM的互斥锁 

 
   unsigned long last_busy; //最后使用的时间
   int autosuspend_delay;
   unsigned long connect_time; //第一次连接的时间
  
   unsigned auto_pm:1; //自动挂起/唤醒
   unsigned do_remote_wakeup:1; //远程唤醒
   unsigned reset_resume:1; //使用复位替代唤醒
   unsigned autosuspend_disabled:1; //挂起关闭
   unsigned autoresume_disabled:1; //唤醒关闭
   unsigned skip_sys_resume:1; //跳过下个系统唤醒
  #endif
   struct wusb_dev *wusb_dev; //(如果为无线USB)连接到WUSB特定的数据结构
};

注册
module_usb_driver()