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来处理。