freescale usb wakeup的中断号是怎样来的
2014-09-05 10:33
225 查看
1. arch/arm/plat-mxc/usb_wakeup.c
2. arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c
这个文件中有个函数
3. arch/arm/mach-mx6/devices-imx6q.h
找啊找,找到了这里
4.arch/arm/mach-mx6/usb_h1.c
回到题目: 要找irq是从哪来了
先回到文件 arch/arm/plat-mxc/usb_wakeup.c看函数
所以这个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
<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
相关文章推荐
- PXA300+WINCE5 第一次supend 用USB wake up,activesync 连接失败问题
- STM32F4, USB HS with ULPI and Suspend/Wakeup
- fsl disable usb wake up
- PowerManager & Wake-up Function of USB Client
- PowerManager & Wake-up Function of USB Client
- 【 D3.js 入门系列 --- 4 】 怎样使用scale(比例)
- Deposit 30 Free 50 Promotion(free bonus, sky3888, sky3888 registerdeposit promotion, sky3888 top up)
- Scale-up和Scale-out(转)
- wait_event_interruptible()与wake_up()的使用
- wl18xx module crash with "wlcore: ERROR ELP wakeup timeout!"
- SVN之下载项目一半下载中断了转圈圈无响应解决办法cleanup failed to process the following path
- 怎样绕开QQ通讯录和360的广播中断
- 关于Dialer在win7/vista下上网卡在不同USB口来顺插拔导致的dial-up属性意外修改的问题的解决
- 针对up-tech 2410LCD和触摸屏、USB,NE2000移植!
- Linux电源管理_Wakeup events framework--(二)
- 7 Ways To Free Up Hard Disk Space On Windows
- USB中断进不去的问题,
- UP Board USB无线网卡选购指南
- stm32的usb与上位机通过中断传输进行通信控制led--LibUsbDotNet
- MyWakeUpTunes:声色俱佳的闹钟提醒应用