OTG驱动分析(二) 忘是亡心i 2022-08-13 18:40 166阅读 0赞 上回介绍了OTG功能的 OTG部分驱动,本片分析OTG功能的从设备部分驱动。从设备的注册过程和OTG的一样,首先注册设备。 流程是: 1 . 定义platform\_device结构。 2 . 定义platform\_device下的struct resource设备资源结构 3 . 定义 platform\_device下的DEV设备下的平台私有数据(就是该设备私有的数据) 4 . 调用platform\_device\_register将platform\_device结构 注 册上面4个过程调用结束后,设备的信息就被注册到系统中,等待驱动的使用 下面是按照上面顺序贴出代码 定义platform\_device结构 <table style="color:rgb(54,46,43); font-family:Arial; font-size:13.84615421295166px; line-height:25.997596740722656px; border-collapse:collapse; width:663.84619140625px"> <tbody> <tr> <td> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">struct</span> platform_device __maybe_unused dr_udc_device <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,204)">.</span> name <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(255,0,255)">"fsl-usb2-udc"</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> id <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> 1<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> dev <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,204)">.</span> release <span style="color:rgb(0,0,204)">=</span> dr_udc_release<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> dma_mask <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">&</span> dr_udc_dmamask<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> coherent_dma_mask <span style="color:rgb(0,0,204)">=</span> 0xffffffff<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">}</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> resource <span style="color:rgb(0,0,204)">=</span> otg_resources<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> num_resources <span style="color:rgb(0,0,204)">=</span> ARRAY_SIZE<span style="color:rgb(0,0,204)">(</span> otg_resources<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">}</span> <span style="color:rgb(0,0,204)">;</span></span></code></p> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,204)"><span style="color:rgb(0,0,0)">我们可以看到<span style="font-family:新宋体">resource和OTG的resource一样,使用的都是OTG那 部分资源</span></span></span></span></code></p> </td> </tr> </tbody> </table> 定义platform\_device下的struct resource设备资源结构 <table style="color:rgb(54,46,43); font-family:Arial; font-size:13.84615421295166px; line-height:25.997596740722656px; border-collapse:collapse; width:663.84619140625px"> <tbody> <tr> <td> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">struct</span> resource otg_resources<span style="color:rgb(0,0,204)">[</span> <span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,204)">[</span> 0<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,204)">.</span> start <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">(</span> u32<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">(</span> USB_OTGREGS_BASE<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> end <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">(</span> u32<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">(</span> USB_OTGREGS_BASE <span style="color:rgb(0,0,204)">+</span> 0x1ff<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> flags <span style="color:rgb(0,0,204)">=</span> IORESOURCE_MEM<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">}</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">[</span> 1<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,204)">.</span> start <span style="color:rgb(0,0,204)">=</span> MXC_INT_USB_OTG<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> flags <span style="color:rgb(0,0,204)">=</span> IORESOURCE_IRQ<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">}</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">}</span> <span style="color:rgb(0,0,204)">;</span></span></code></p> </td> </tr> </tbody> </table> 定义platform\_device下的DEV设备下的平台私有数据(就是该设备私有的数据) <table style="color:rgb(54,46,43); font-family:Arial; font-size:13.84615421295166px; line-height:25.997596740722656px; border-collapse:collapse; width:663.84619140625px"> <tbody> <tr> <td> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">struct</span> fsl_usb2_platform_data __maybe_unused dr_utmi_config <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,204)">.</span> name <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(255,0,255)">"DR"</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> platform_init <span style="color:rgb(0,0,204)">=</span> usbotg_init<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> platform_uninit <span style="color:rgb(0,0,204)">=</span> usbotg_uninit<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> phy_mode <span style="color:rgb(0,0,204)">=</span> FSL_USB2_PHY_UTMI_WIDE<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> power_budget <span style="color:rgb(0,0,204)">=</span> 500<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(255,153,0)">/* via RT9706 */</span> <br> <span style="color:rgb(0,0,204)">.</span> gpio_usb_active <span style="color:rgb(0,0,204)">=</span> gpio_usbotg_utmi_active<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> gpio_usb_inactive <span style="color:rgb(0,0,204)">=</span> gpio_usbotg_utmi_inactive<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> transceiver <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(255,0,255)">"utmi"</span> <span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> wake_up_enable <span style="color:rgb(0,0,204)">=</span> _wake_up_enable<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">}</span> <span style="color:rgb(0,0,204)">;</span> <br> /*将设备注册 进系统*/<br> <span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">inline</span> <span style="color:rgb(0,0,255)">void</span> dr_register_udc<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">void</span> <span style="color:rgb(0,0,204)">)</span> <br> <span style="color:rgb(0,0,204)">{ </span> <br> PDATA<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> operating_mode <span style="color:rgb(0,0,204)">=</span> DR_UDC_MODE<span style="color:rgb(0,0,204)">; //在OTG功能设备注册的时候这里的模式是“<span style="color:rgb(0,0,0)">FSL_USB2_DR_OTG</span> ”, 时还不知道为什么不开始就直接把模式写成这个而是后该,现在知道了 因为主从和OTG都在用一个资源,所以谁用就的把模式该了。</span></span></code></p> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,204)">/*#define PDATA (&dr_utmi_config)<span style="font-family:新宋体; color:rgb(0,0,0)">PDATA指的就是上面的结构</span> */</span> <br> dr_udc_device<span style="color:rgb(0,0,204)">.</span> dev<span style="color:rgb(0,0,204)">.</span> platform_data <span style="color:rgb(0,0,204)">=</span> PDATA<span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> platform_device_register<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> dr_udc_device<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <br> printk<span style="color:rgb(0,0,204)">(</span> KERN_ERR <span style="color:rgb(255,0,255)">"usb: can't register DR gadget/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">else</span> <br> printk<span style="color:rgb(0,0,204)">(</span> KERN_INFO <span style="color:rgb(255,0,255)">"usb: DR gadget (%s) registered/n"</span> <span style="color:rgb(0,0,204)">,</span> <br> PDATA<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> transceiver<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span></span></code></p> </td> </tr> </tbody> </table> 上面就完成了设备的注册。 下面看看驱动和设备的链接。 <table style="color:rgb(54,46,43); font-family:Arial; font-size:13.84615421295166px; line-height:25.997596740722656px; border-collapse:collapse; width:663.84619140625px"> <tbody> <tr> <td> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)">static <span style="color:rgb(0,0,255)">struct</span> platform_driver udc_driver <span style="color:rgb(0,0,204)">=</span> { <br> <span style="color:rgb(0,0,204)">.</span> remove <span style="color:rgb(0,0,204)">=</span> __exit_p<span style="color:rgb(0,0,204)">(</span> fsl_udc_remove<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">,</span> <br> /<span style="color:rgb(0,0,204)">*</span> these suspend <span style="color:rgb(0,0,255)">and</span> resume are <span style="color:rgb(0,0,255)">not</span> usb suspend <span style="color:rgb(0,0,255)">and</span> resume <span style="color:rgb(0,0,204)">*</span> <span style="color:rgb(0,0,204)">/</span> <br> <span style="color:rgb(0,0,204)">.</span> suspend <span style="color:rgb(0,0,204)">=</span> fsl_udc_suspend<span style="color:rgb(0,0,204)">, //切换到主设备后的处理过程</span> <br> <span style="color:rgb(0,0,204)">.</span> resume <span style="color:rgb(0,0,204)">=</span> fsl_udc_resume<span style="color:rgb(0,0,204)">, //切换到从设备的处理过程</span> <br> <span style="color:rgb(0,0,204)">.</span> probe <span style="color:rgb(0,0,204)">=</span> fsl_udc_probe<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,204)">.</span> driver <span style="color:rgb(0,0,204)">=</span> { <br> <span style="color:rgb(0,0,204)">.</span> <span style="color:rgb(255,0,0)">name</span> <span style="color:rgb(0,0,204)">=</span> driver_name<span style="color:rgb(0,0,204)">, //就是<span style="font-family:新宋体; color:rgb(255,0,255)">fsl-usb2-udc,用于匹配设备的</span> </span><br> <span style="color:rgb(0,0,204)">.</span> owner <span style="color:rgb(0,0,204)">=</span> THIS_MODULE<span style="color:rgb(0,0,204)">,</span> <br> }<span style="color:rgb(0,0,204)">,</span> <br> }</span></code></p> <p style="margin:5px; line-height:20.76923179626465px"><code></code> </p> </td> </tr> </tbody> </table> 将驱动注册进系统,如果发现了设备就调用Probe函数,因为我们上面注册了设备所以必然调用Probe <table style="color:rgb(54,46,43); font-family:Arial; font-size:13.84615421295166px; line-height:25.997596740722656px; border-collapse:collapse; width:663.84619140625px"> <tbody> <tr> <td> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">int</span> __init udc_init<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">void</span> <span style="color:rgb(0,0,204)">)</span> <br> <span style="color:rgb(0,0,204)">{ </span> <br> printk<span style="color:rgb(0,0,204)">(</span> KERN_INFO <span style="color:rgb(255,0,255)">"%s (%s)/n"</span> <span style="color:rgb(0,0,204)">,</span> driver_desc<span style="color:rgb(0,0,204)">,</span> DRIVER_VERSION<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> platform_driver_register<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> udc_driver<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;//驱动注册进系统</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> </span></code></p> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)">发现设备后调用PROBE函数<br> <span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">int</span> __init fsl_udc_probe<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">struct</span> platform_device <span style="color:rgb(0,0,204)">*</span> pdev<span style="color:rgb(0,0,204)">)</span> <br> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,255)">struct</span> resource <span style="color:rgb(0,0,204)">*</span> res<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">struct</span> fsl_usb2_platform_data <span style="color:rgb(0,0,204)">*</span> pdata <span style="color:rgb(0,0,204)">=</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">.</span> platform_data<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">int</span> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENODEV<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">unsigned</span> <span style="color:rgb(0,0,255)">int</span> i<span style="color:rgb(0,0,204)">;</span> <br> u32 dccparams<span style="color:rgb(0,0,204)">,</span> portsc<span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,0)">strcmp</span> <span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> name<span style="color:rgb(0,0,204)">,</span> driver_name<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> VDBG<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"Wrong device/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> <span style="color:rgb(0,0,204)">-</span> ENODEV<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> /********************************************************/</span></code></p> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)">static struct fsl_udc *udc_controller;</span></code></p> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)">全局变量定义</span></code></p> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)">/*******************************************************/<br> udc_controller <span style="color:rgb(0,0,204)">=</span> kzalloc<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">sizeof</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">struct</span> fsl_udc<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">,</span> GFP_KERNEL<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(255,0,0)">NULL</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ERR<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"malloc udc failed/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> <span style="color:rgb(0,0,204)">-</span> ENOMEM<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> pdata <span style="color:rgb(0,0,204)">=</span> pdata<span style="color:rgb(0,0,204)">; //私有变量赋值</span> <br> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(255,0,0)">ifdef</span> CONFIG_USB_OTG<br> <span style="color:rgb(255,153,0)">/* Memory and interrupt resources will be passed from OTG */</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> transceiver <span style="color:rgb(0,0,204)">=</span> otg_get_transceiver<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;//在OTG功能中已经通过<span style="font-family:新宋体; color:rgb(0,0,0)">otg_set_transceiver 设置了transceiver结构,这里面就可以GET</span></span></span></code></p> <code><span style="color:rgb(0,0,0)"></span></code> <p style="margin:5px; line-height:20.76923179626465px"><br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> transceiver<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> printk<span style="color:rgb(0,0,204)">(</span> KERN_ERR <span style="color:rgb(255,0,255)">"Can't find OTG driver!/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENODEV<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err1a<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> res <span style="color:rgb(0,0,204)">=</span> otg_get_resources<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">; //获得资源</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> res<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> DBG<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"resource not registered!/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> <span style="color:rgb(0,0,204)">-</span> ENODEV<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(0,0,255)">else</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">.</span> parent<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">&</span> <span style="color:rgb(0,0,204)">&</span> <br> <span style="color:rgb(0,0,204)">(</span> to_platform_device<span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">.</span> parent<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> resource<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> resource <span style="color:rgb(0,0,204)">=</span> <br> to_platform_device<span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">.</span> parent<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> resource<span style="color:rgb(0,0,204)">;</span> <br> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> num_resources <span style="color:rgb(0,0,204)">=</span> <br> to_platform_device<span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">.</span> parent<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> num_resources<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> res <span style="color:rgb(0,0,204)">=</span> platform_get_resource<span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">,</span> IORESOURCE_MEM<span style="color:rgb(0,0,204)">,</span> 0<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> res<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENXIO<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err1a<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> request_mem_region<span style="color:rgb(0,0,204)">(</span> res<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> start<span style="color:rgb(0,0,204)">,</span> resource_size<span style="color:rgb(0,0,204)">(</span> res<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">,</span> <br> driver_name<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ERR<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"request mem region for %s failed /n"</span> <span style="color:rgb(0,0,204)">,</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> name<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> EBUSY<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err1a<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(255,0,0)">endif</span> <br> /*将物理地址映射为驱动可以访问的虚拟地址*/<br> dr_regs <span style="color:rgb(0,0,204)">=</span> ioremap<span style="color:rgb(0,0,204)">(</span> res<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> start<span style="color:rgb(0,0,204)">,</span> resource_size<span style="color:rgb(0,0,204)">(</span> res<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> dr_regs<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENOMEM<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err1<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> regs <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">void</span> <span style="color:rgb(0,0,204)">*</span> <span style="color:rgb(0,0,204)">)</span> dr_regs<span style="color:rgb(0,0,204)">; //私有数据接收映射地址</span> <br> <span style="color:rgb(255,153,0)">/*<br> * do platform specific init: check the clock, grab/config pins, etc.<br> */</span></p> <p style="margin:5px; line-height:20.76923179626465px"><span style="color:rgb(255,153,0)">/*调用私有数据的初始化函数,关于初始化函数下面分析*/</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> platform_init <span style="color:rgb(0,0,204)">&</span> <span style="color:rgb(0,0,204)">&</span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> platform_init<span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENODEV<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err2a<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> have_sysif_regs<span style="color:rgb(0,0,204)">)</span> <br> usb_sys_regs <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">struct</span> usb_sys_interface <span style="color:rgb(0,0,204)">*</span> <span style="color:rgb(0,0,204)">)</span> <br> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">(</span> u32<span style="color:rgb(0,0,204)">)</span> dr_regs <span style="color:rgb(0,0,204)">+</span> USB_DR_SYS_OFFSET<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,153,0)">/* Read Device Controller Capability Parameters register */</span> <br> dccparams <span style="color:rgb(0,0,204)">=</span> fsl_readl<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dccparams<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> <span style="color:rgb(0,0,204)">(</span> dccparams <span style="color:rgb(0,0,204)">&</span> DCCPARAMS_DC<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ERR<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"This SOC doesn't support device role/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENODEV<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err2<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <span style="color:rgb(255,153,0)">/* Get max device endpoints */</span> <br> <span style="color:rgb(255,153,0)">/* DEN is bidirectional ep number, max_ep doubles the number */</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> max_ep <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">(</span> dccparams <span style="color:rgb(0,0,204)">&</span> DCCPARAMS_DEN_MASK<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">*</span> 2<span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(255,0,0)">ifdef</span> CONFIG_USB_OTG<br> res<span style="color:rgb(0,0,204)">+</span> <span style="color:rgb(0,0,204)">+</span> <span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> irq <span style="color:rgb(0,0,204)">=</span> res<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> start<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(0,0,255)">else</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> irq <span style="color:rgb(0,0,204)">=</span> platform_get_irq<span style="color:rgb(0,0,204)">(</span> pdev<span style="color:rgb(0,0,204)">,</span> 0<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(255,0,0)">endif</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> irq<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENODEV<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err2<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> /*注册中断,该中断和OTG的中断共享一个*/<br> ret <span style="color:rgb(0,0,204)">=</span> request_irq<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> irq<span style="color:rgb(0,0,204)">,</span> fsl_udc_irq<span style="color:rgb(0,0,204)">,</span> IRQF_SHARED<span style="color:rgb(0,0,204)">,</span> <br> driver_name<span style="color:rgb(0,0,204)">,</span> udc_controller<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> ret <span style="color:rgb(0,0,204)">!</span> <span style="color:rgb(0,0,204)">=</span> 0<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ERR<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"cannot request irq %d err %d /n"</span> <span style="color:rgb(0,0,204)">,</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> irq<span style="color:rgb(0,0,204)">,</span> ret<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err2<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(255,153,0)">/* Initialize the udc structure including QH member and other member */</span></p> <p style="margin:5px; line-height:20.76923179626465px"><span style="color:rgb(255,153,0)">/*对一些资源进行空间开辟等初始化操作*/</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> struct_udc_setup<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">,</span> pdev<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ERR<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"Can't initialize udc data structure/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENOMEM<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err3<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> transceiver<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(255,153,0)">/* initialize usb hw reg except for regs for EP,<br> * leave usbintr reg untouched */</span> <br> dr_controller_setup<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(255,153,0)">/* Setup gadget structure */</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> ops <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">&</span> fsl_gadget_ops<span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> is_dualspeed <span style="color:rgb(0,0,204)">=</span> 1<span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> ep0 <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">&</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> eps<span style="color:rgb(0,0,204)">[</span> 0<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">.</span> ep<span style="color:rgb(0,0,204)">;</span> <br> INIT_LIST_HEAD<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> ep_list<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> speed <span style="color:rgb(0,0,204)">=</span> USB_SPEED_UNKNOWN<span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> name <span style="color:rgb(0,0,204)">=</span> driver_name<span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,153,0)">/* Setup gadget.dev and register with kernel */</span> <br> dev_set_name<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> dev<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(255,0,255)">"gadget"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> dev<span style="color:rgb(0,0,204)">.</span> release <span style="color:rgb(0,0,204)">=</span> fsl_udc_release<span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> dev<span style="color:rgb(0,0,204)">.</span> parent <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">&</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">;</span> <br> ret <span style="color:rgb(0,0,204)">=</span> device_register<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> dev<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> ret <span style="color:rgb(0,0,204)"><</span> 0<span style="color:rgb(0,0,204)">)</span> <br> <span style="color:rgb(0,0,255)">goto</span> err3<span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> transceiver<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> is_otg <span style="color:rgb(0,0,204)">=</span> 1<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(255,153,0)">/* now didn't support lpm in OTG mode*/</span> <br> device_set_wakeup_capable<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">,</span> 0<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(255,153,0)">/* setup QH and epctrl for ep0 */</span> <br> ep0_setup<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,153,0)">/* setup udc->eps[] for ep0 */</span> <br> struct_ep_setup<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">,</span> 0<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(255,0,255)">"ep0"</span> <span style="color:rgb(0,0,204)">,</span> 0<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(255,153,0)">/* for ep0: the desc defined here;<br> * for other eps, gadget layer called ep_enable with defined desc<br> */</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> eps<span style="color:rgb(0,0,204)">[</span> 0<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">.</span> desc <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">&</span> fsl_ep0_desc<span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> eps<span style="color:rgb(0,0,204)">[</span> 0<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">.</span> ep<span style="color:rgb(0,0,204)">.</span> maxpacket <span style="color:rgb(0,0,204)">=</span> USB_MAX_CTRL_PAYLOAD<span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,153,0)">/* setup the udc->eps[] for non-control endpoints and link<br> * to gadget.ep_list */</span> <br> <span style="color:rgb(0,0,255)">for</span> <span style="color:rgb(0,0,204)">(</span> i <span style="color:rgb(0,0,204)">=</span> 1<span style="color:rgb(0,0,204)">;</span> i <span style="color:rgb(0,0,204)"><</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">int</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> max_ep <span style="color:rgb(0,0,204)">/</span> 2<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> i<span style="color:rgb(0,0,204)">+</span> <span style="color:rgb(0,0,204)">+</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,255)">char</span> name<span style="color:rgb(0,0,204)">[</span> 14<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,0,0)">sprintf</span> <span style="color:rgb(0,0,204)">(</span> name<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(255,0,255)">"ep%dout"</span> <span style="color:rgb(0,0,204)">,</span> i<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> struct_ep_setup<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">,</span> i <span style="color:rgb(0,0,204)">*</span> 2<span style="color:rgb(0,0,204)">,</span> name<span style="color:rgb(0,0,204)">,</span> 1<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(255,0,0)">sprintf</span> <span style="color:rgb(0,0,204)">(</span> name<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(255,0,255)">"ep%din"</span> <span style="color:rgb(0,0,204)">,</span> i<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> struct_ep_setup<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">,</span> i <span style="color:rgb(0,0,204)">*</span> 2 <span style="color:rgb(0,0,204)">+</span> 1<span style="color:rgb(0,0,204)">,</span> name<span style="color:rgb(0,0,204)">,</span> 1<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(255,153,0)">/* use dma_pool for TD management */</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> td_pool <span style="color:rgb(0,0,204)">=</span> dma_pool_create<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"udc_td"</span> <span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,204)">&</span> pdev<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> dev<span style="color:rgb(0,0,204)">,</span> <br> <span style="color:rgb(0,0,255)">sizeof</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">struct</span> ep_td_struct<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">,</span> <br> DTD_ALIGNMENT<span style="color:rgb(0,0,204)">,</span> UDC_DMA_BOUNDARY<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> td_pool <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(255,0,0)">NULL</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> ret <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(0,0,204)">-</span> ENOMEM<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> err4<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> g_iram_size<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> <span style="color:rgb(0,0,255)">for</span> <span style="color:rgb(0,0,204)">(</span> i <span style="color:rgb(0,0,204)">=</span> 0<span style="color:rgb(0,0,204)">;</span> i <span style="color:rgb(0,0,204)"><</span> IRAM_PPH_NTD<span style="color:rgb(0,0,204)">;</span> i<span style="color:rgb(0,0,204)">+</span> <span style="color:rgb(0,0,204)">+</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> iram_buffer<span style="color:rgb(0,0,204)">[</span> i<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">=</span> <br> USB_IRAM_BASE_ADDR <span style="color:rgb(0,0,204)">+</span> i <span style="color:rgb(0,0,204)">*</span> g_iram_size<span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> iram_buffer_v<span style="color:rgb(0,0,204)">[</span> i<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">=</span> <br> IO_ADDRESS<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> iram_buffer<span style="color:rgb(0,0,204)">[</span> i<span style="color:rgb(0,0,204)">]</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(255,0,0)">ifdef</span> POSTPONE_FREE_LAST_DTD<br> last_free_td <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(255,0,0)">NULL</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">#</span> <span style="color:rgb(255,0,0)">endif</span> <br> <br> <span style="color:rgb(255,153,0)">/* disable all INTR */</span> <br> fsl_writel<span style="color:rgb(0,0,204)">(</span> 0<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usbintr<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> dr_wake_up_enable<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,255)">false</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> stopped <span style="color:rgb(0,0,204)">=</span> 1<span style="color:rgb(0,0,204)">;</span> <br> <br> portsc <span style="color:rgb(0,0,204)">=</span> fsl_readl<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> portsc1<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> portsc <span style="color:rgb(0,0,204)">|</span> <span style="color:rgb(0,0,204)">=</span> PORTSCX_PHY_LOW_POWER_SPD<span style="color:rgb(0,0,204)">;</span> <br> fsl_writel<span style="color:rgb(0,0,204)">(</span> portsc<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> portsc1<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usb_clock_for_pm<span style="color:rgb(0,0,204)">)</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usb_clock_for_pm<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">false</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> create_proc_file<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> 0<span style="color:rgb(0,0,204)">;</span> <br> <br> err4<span style="color:rgb(0,0,204)">:</span> <br> device_unregister<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> dev<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> err3<span style="color:rgb(0,0,204)">:</span> <br> free_irq<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> irq<span style="color:rgb(0,0,204)">,</span> udc_controller<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> err2<span style="color:rgb(0,0,204)">:</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> platform_uninit<span style="color:rgb(0,0,204)">)</span> <br> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> platform_uninit<span style="color:rgb(0,0,204)">(</span> pdata<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> err2a<span style="color:rgb(0,0,204)">:</span> <br> iounmap<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">(</span> u8 __iomem <span style="color:rgb(0,0,204)">*</span> <span style="color:rgb(0,0,204)">)</span> dr_regs<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> err1<span style="color:rgb(0,0,204)">:</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> transceiver<span style="color:rgb(0,0,204)">)</span> <br> release_mem_region<span style="color:rgb(0,0,204)">(</span> res<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> start<span style="color:rgb(0,0,204)">,</span> resource_size<span style="color:rgb(0,0,204)">(</span> res<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> err1a<span style="color:rgb(0,0,204)">:</span> <br> kfree<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> udc_controller <span style="color:rgb(0,0,204)">=</span> <span style="color:rgb(255,0,0)">NULL</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> ret<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span></p> </td> </tr> </tbody> </table> 当设备使用主设备时 DEVICE的处理 <table style="color:rgb(54,46,43); font-family:Arial; font-size:13.84615421295166px; line-height:25.997596740722656px; border-collapse:collapse; width:663.84619140625px"> <tbody> <tr> <td> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">int</span> udc_suspend<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">struct</span> fsl_udc <span style="color:rgb(0,0,204)">*</span> udc<span style="color:rgb(0,0,204)">)</span> <br> <span style="color:rgb(0,0,204)">{ </span> <br> u32 mode<span style="color:rgb(0,0,204)">,</span> usbcmd<span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,153,0)">/* open clock for register access */</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usb_clock_for_pm<span style="color:rgb(0,0,204)">)</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usb_clock_for_pm<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">true</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> mode <span style="color:rgb(0,0,204)">=</span> fsl_readl<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usbmode<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">&</span> USB_MODE_CTRL_MODE_MASK<span style="color:rgb(0,0,204)">;</span> <br> usbcmd <span style="color:rgb(0,0,204)">=</span> fsl_readl<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usbcmd<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> pr_debug<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"%s(): mode 0x%x stopped %d/n"</span> <span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(255,0,0)">__func__</span> <span style="color:rgb(0,0,204)">,</span> mode<span style="color:rgb(0,0,204)">,</span> udc<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> stopped<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,153,0)">/*<br> * If the controller is already stopped, then this must be a<br> * PM suspend. Remember this fact, so that we will leave the<br> * controller stopped at PM resume time.<br> */</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> stopped<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> pr_debug<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"gadget already stopped, leaving early/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> udc<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> already_stopped <span style="color:rgb(0,0,204)">=</span> 1<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> out<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> mode <span style="color:rgb(0,0,204)">!</span> <span style="color:rgb(0,0,204)">=</span> USB_MODE_CTRL_MODE_DEVICE<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> pr_debug<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"gadget not in device mode, leaving early/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">goto</span> out<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> udc<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> stopped <span style="color:rgb(0,0,204)">=</span> 1<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(255,153,0)">/* if the suspend is not for switch to host in otg mode */</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">!</span> <span style="color:rgb(0,0,204)">(</span> udc<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> gadget<span style="color:rgb(0,0,204)">.</span> is_otg<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">|</span> <span style="color:rgb(0,0,204)">|</span> <br> <span style="color:rgb(0,0,204)">(</span> fsl_readl<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> otgsc<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">&</span> OTGSC_STS_USB_ID<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> dr_wake_up_enable<span style="color:rgb(0,0,204)">(</span> udc<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,255)">true</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> dr_phy_low_power_mode<span style="color:rgb(0,0,204)">(</span> udc<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,255)">true</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(255,153,0)">/* stop the controller */</span> <br> usbcmd <span style="color:rgb(0,0,204)">=</span> fsl_readl<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usbcmd<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">&</span> <span style="color:rgb(0,0,204)">~</span> USB_CMD_RUN_STOP<span style="color:rgb(0,0,204)">;</span> <br> fsl_writel<span style="color:rgb(0,0,204)">(</span> usbcmd<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,204)">&</span> dr_regs<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usbcmd<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> printk<span style="color:rgb(0,0,204)">(</span> KERN_INFO <span style="color:rgb(255,0,255)">"USB Gadget suspended/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> out<span style="color:rgb(0,0,204)">:</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usb_clock_for_pm<span style="color:rgb(0,0,204)">)</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> pdata<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usb_clock_for_pm<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">false</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> 0<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span></span></code></p> </td> </tr> </tbody> </table> 当切换到从设备时调用 <table style="color:rgb(54,46,43); font-family:Arial; font-size:13.84615421295166px; line-height:25.997596740722656px; border-collapse:collapse; width:663.84619140625px"> <tbody> <tr> <td> <p style="margin:5px; line-height:20.76923179626465px"><code><span style="color:rgb(0,0,0)"><span style="color:rgb(0,0,255)">static</span> <span style="color:rgb(0,0,255)">int</span> fsl_udc_resume<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(0,0,255)">struct</span> platform_device <span style="color:rgb(0,0,204)">*</span> pdev<span style="color:rgb(0,0,204)">)</span> <br> <span style="color:rgb(0,0,204)">{ </span> <br> pr_debug<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"%s(): stopped %d already_stopped %d/n"</span> <span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(255,0,0)">__func__</span> <span style="color:rgb(0,0,204)">,</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> stopped<span style="color:rgb(0,0,204)">,</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> already_stopped<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> <span style="color:rgb(255,153,0)">/*<br> * If the controller was stopped at suspend time, then<br> * don't resume it now.<br> */</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> already_stopped<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> already_stopped <span style="color:rgb(0,0,204)">=</span> 0<span style="color:rgb(0,0,204)">;</span> <br> pr_debug<span style="color:rgb(0,0,204)">(</span> <span style="color:rgb(255,0,255)">"gadget was already stopped, leaving early/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> 0<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> <br> <span style="color:rgb(255,153,0)">/* Enable DR irq reg and set controller Run */</span> <br> <span style="color:rgb(0,0,255)">if</span> <span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> stopped<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">{ </span> <br> dr_wake_up_enable<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,255)">false</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> dr_phy_low_power_mode<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">,</span> <span style="color:rgb(0,0,255)">false</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> mdelay<span style="color:rgb(0,0,204)">(</span> 1<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <br> dr_controller_setup<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> dr_controller_run<span style="color:rgb(0,0,204)">(</span> udc_controller<span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> usb_state <span style="color:rgb(0,0,204)">=</span> USB_STATE_ATTACHED<span style="color:rgb(0,0,204)">;</span> <br> udc_controller<span style="color:rgb(0,0,204)">-</span> <span style="color:rgb(0,0,204)">></span> ep0_dir <span style="color:rgb(0,0,204)">=</span> 0<span style="color:rgb(0,0,204)">;</span> <br> <br> printk<span style="color:rgb(0,0,204)">(</span> KERN_INFO <span style="color:rgb(255,0,255)">"USB Gadget resumed/n"</span> <span style="color:rgb(0,0,204)">)</span> <span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,255)">return</span> 0<span style="color:rgb(0,0,204)">;</span> <br> <span style="color:rgb(0,0,204)">}</span> <br> </span></code></p> </td> </tr> </tbody> </table> 上面的两个函数就是在上一篇OTG 一中介绍的 gadget\_pdrv\- > resume ( gadget\_pdev ) ; gadget\_pdrv \- > suspend ( gadget\_pdev , otg\_suspend\_state ) ; 这两处就是只想的这个函数。而把 前面的函数和上面这两个指针链接的地方就是在OTG中的 fsl\_otg\_start\_gadget 函数。 从 上面我们可以看到以下几点: 1.OTG 功能的从设备使用的资源和私有数据与OTG设备的一致,(主设备也是一致) 2. 从设备主要为OTG功能提供fsl\_udc\_resume和udc\_suspend两个函数。
还没有评论,来说两句吧...