您的位置:首页 > 其它

freescale usb wakeup的中断号是怎样来的

2014-09-05 10:33 225 查看
1. arch/arm/plat-mxc/usb_wakeup.c

<span style="font-size:18px;">243 static struct platform_driver wakeup_d = {
244     .probe   = wakeup_dev_probe,
245     .remove  = wakeup_dev_exit,
246     .driver = {
247         .name = "usb-wakeup",
248     },
249 };
250
251 static int __init wakeup_dev_init(void)
252 {
253     return platform_driver_register(&wakeup_d);
254 }
</span>
注册了一个叫usb-wakeup的driver, 这个设备是在哪里被add到系统的呢?

2. arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c

这个文件中有个函数

<span style="font-size:18px;"> 36 struct platform_device *__init imx_add_fsl_usb2_wakeup(
37         const struct imx_fsl_usb2_wakeup_data *data,
38         const struct fsl_usb2_wakeup_platform_data *pdata)
39 {
40     struct resource res[] = {
41         {
42             .start = data->irq_phy,
43             .end = data->irq_phy,
44             .flags = IORESOURCE_IRQ,
45         }, {
46             .start = data->irq_core,</span>
<span style="font-size:18px;"> 47<span style="white-space:pre">		</span>.end = data->irq_core,
 48             .flags = IORESOURCE_IRQ,
 49         },
 50     };
 51     return imx_add_platform_device_dmamask("usb-wakeup", data->id,
 52             res, ARRAY_SIZE(res),
 53             pdata, sizeof(*pdata), DMA_BIT_MASK(32));
 54 }
</span>
在这个函数里面可以看到usb-wakeup这个设备被add了,问题是这个函数又在哪里被调用呢?

3. arch/arm/mach-mx6/devices-imx6q.h

找啊找,找到了这里

97 #define imx6sl_add_fsl_usb2_hs_wakeup(id, pdata)    \
98     imx_add_fsl_usb2_wakeup(&imx6sl_fsl_hs_wakeup_data[id - 1], pdata)
99
现在变成了找imx6sl_add_fsl_usb2_hs_wakeup在哪里被调用了。

4.arch/arm/mach-mx6/usb_h1.c



<span style="font-size:18px;">static int  __init mx6_usb_h1_init(void)
421 {
......
465     if (cpu_is_mx6sl())
466         pdev_wakeup = imx6sl_add_fsl_usb2_hs_wakeup(1, &usbh1_wakeup_config);
467     else
468         pdev_wakeup = imx6q_add_fsl_usb2_hs_wakeup(1, &usbh1_wakeup_config);
469     platform_device_add(pdev);//其实这个pdev的name也是“usb-wakeup”,但是为什么pdev的platform_data是在下面赋值呢?为什么前面</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">imx_add_platform_device_dmamask已经调用过platform_device_add,这里还要这样调用呢?</span><span style="font-size:18px;">
470     ((struct fsl_usb2_platform_data *)(pdev->dev.platform_data))->wakeup_pdata =
471         (struct fsl_usb2_wakeup_platform_data *)(pdev_wakeup->dev.platform_data);
472     return 0;
473 }
474 module_init(mx6_usb_h1_init);</span>
就这样在开机时被注册了。

回到题目: 要找irq是从哪来了

先回到文件 arch/arm/plat-mxc/usb_wakeup.c看函数

static int wakeup_dev_probe(struct platform_device *pdev){
.....
205     ctrl->wakeup_irq = platform_get_irq(pdev, 1);//这里就是irq的由来
206     ctrl->usb_irq = platform_get_irq(pdev, 1);
207     ctrl->thread_close = false;
208     if (ctrl->wakeup_irq != ctrl->usb_irq)
209         interrupt_flag = IRQF_DISABLED;
210     else
211         interrupt_flag = IRQF_SHARED;
212     status = request_irq(ctrl->wakeup_irq, usb_wakeup_handler, interrupt_flag, "usb_wakeup", (void *)ctrl);
213     if (status)
214         goto error1;
215
....
}
platform_get_irq(pdev, 1);返回的其实是
<pre name="code" class="html">60 int platform_get_irq(struct platform_device *dev, unsigned int num)
61 {
62     struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);
63
64     return r ? r->start : -ENXIO;
65 }



所以这个irq是在imx_add_fsl_usb2_wakeup中被赋值的。

这个会从imx_fsl_usb2_wakeup_data里面找,这东西又在哪里被赋值呢?

在 arch/arm/mach-mx6/devices-imx6q.h中需要imx6q_fsl_hs_wakeup_data[id - 1],这个东西

会在arch/arm/mach-mx6/usb_h1.c文件的函数 mx6_usb_h1_init被赋值为struct imx_fsl_usb2_wakeup_data imx6q_fsl_hs_wakeup_data[] = {

        imx_fsl_usb2_wakeup_data_entry_single(MX6Q, 1, HS1)};

最终会变成

arch/arm/mach-mx6/usb.h:
.irq_phy = soc ## _INT_USB_PHY ## _id,
\

arch/arm/plat-mxc/include/mach/mx6.h:#define MX6Q_INT_USB_PHY0
76
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: