现在的位置: 首页 > 综合 > 正文

从usb的插入开始

2013年11月04日 ⁄ 综合 ⁄ 共 1656字 ⁄ 字号 评论关闭

当usb设备插入接口,电压变化会通知到usb主控器,

触发主控器中断,如果主控器不支持中断,那么会使用rh_timer方法,轮询接口

其结果都是调用usb_hcd_poll_rh_status

  1. void usb_hcd_poll_rh_status(struct usb_hcd *hcd)  
  2. {  
  3.     struct urb  *urb;  
  4.     int     length;  
  5.     unsigned long   flags;  
  6.     char        buffer[6];  /* Any root hubs with > 31 ports? */  
  7.   
  8.     if (unlikely(!hcd->rh_pollable))  
  9.         return;  
  10.     if (!hcd->uses_new_polling && !hcd->status_urb)  
  11.         return;  
  12.   
  13.     length = hcd->driver->hub_status_data(hcd, buffer);   //获取urb数据长度  
  14.     if (length > 0) {  
  15.   
  16.         /* try to complete the status urb */  
  17.         spin_lock_irqsave(&hcd_root_hub_lock, flags);  
  18.         urb = hcd->status_urb;   //获取要处理的urb  
  19.         if (urb) {  
  20.             clear_bit(HCD_FLAG_POLL_PENDING, &hcd->flags);   //清除urb主控器poll标志  
  21.             hcd->status_urb = NULL;  //清空待处理urb  
  22.             urb->actual_length = length; //获取urb数据长度  
  23.             memcpy(urb->transfer_buffer, buffer, length);    //复制urb缓冲区  
  24.   
  25.             usb_hcd_unlink_urb_from_ep(hcd, urb);   //从主控器的端点上解绑urb  
  26.             spin_unlock(&hcd_root_hub_lock);  
  27.             usb_hcd_giveback_urb(hcd, urb, 0);  //处理urb并回传urb给设备  
  28.             spin_lock(&hcd_root_hub_lock);  
  29.         } else {  
  30.             length = 0;  
  31.             set_bit(HCD_FLAG_POLL_PENDING, &hcd->flags);  
  32.         }  
  33.         spin_unlock_irqrestore(&hcd_root_hub_lock, flags);  
  34.     }  
  35.     if (hcd->uses_new_polling ? HCD_POLL_RH(hcd) :  
  36.             (length == 0 && hcd->status_urb != NULL))  
  37.         mod_timer (&hcd->rh_timer, (jiffies/(HZ/4) + 1) * (HZ/4));  
  38. }  

usb_hcd_giveback_urb函数

  1. void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status)  
  2. {  

抱歉!评论已关闭.