本文共 1635 字,大约阅读时间需要 5 分钟。
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来处理。
转载地址:http://rjngi.baihongyu.com/