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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值