android的usb作为从设备的程序流程

android手机或着平板,作为从设置的时候,也就是链接PC电脑的时候,这时PC机是主设备,android手机或平板是从设备。作为从设备,是不主动发送命令或数据的;

只是被动的接收命令或者数据,接收命令的代码是作为一个中断程序来处理的;代码入口如下:

1、代码位置:/kernel/cht/drivers/usb/dwc3/gadget.c

        初始化中断函数:

           

1668     irq = platform_get_irq(to_platform_device(dwc->dev), 0);
1669     ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt,
1670             IRQF_SHARED, "dwc3", dwc);
1671     if (ret) {
1672         dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
1673                 irq, ret);
1674         goto err0;
1675     }
1676 

          当主机有命令来后,触发中断,首先触发下面中断函数:

           

2820 static irqreturn_t dwc3_interrupt(int irq, void *_dwc)
2821 {
2822     struct dwc3         *dwc = _dwc;
2823     int             i;
2824     irqreturn_t         ret = IRQ_NONE;
2825 
2826     spin_lock(&dwc->lock);
2827 
2828     for (i = 0; i < dwc->num_event_buffers; i++) {
2829         irqreturn_t status;
2830 
2831         status = dwc3_check_event_buf(dwc, i);
2832         if (status == IRQ_WAKE_THREAD)
2833             ret = status;
2834     }
2835 
2836     spin_unlock(&dwc->lock);
2837 
2838     return ret;
2839 }
2840 

            当上面的中断函数执行完后,会触发下面的线程中断函数,代码如下:

             

2779 static irqreturn_t dwc3_thread_interrupt(int irq, void *_dwc)
2780 {
2781     struct dwc3 *dwc = _dwc;
2782     unsigned long flags;
2783     irqreturn_t ret = IRQ_NONE;
2784     int i;
2785 
2786     spin_lock_irqsave(&dwc->lock, flags);
2787 
2788     for (i = 0; i < dwc->num_event_buffers; i++)
2789         ret |= dwc3_process_event_buf(dwc, i);
2790 
2791     spin_unlock_irqrestore(&dwc->lock, flags);
2792 
2793     return ret;
2794 }
2795 

            在上面的中断函数中,实际处理,接收到的usb Event命令,例如枚举等命令。处理完命令后,重新打开使能中断的寄存器;以保证下一次,中断可以正常触发。

下一步的动作,可以根据不同的Event来处理。







你可能感兴趣的:(usb)