Android4.0 USB挂载内核驱动层流程分析(一)

http://blog.csdn.net/airk000/article/details/7887645

1.platform_device
在arch/arm/mach-msm/Board-xx.c中:

  1. static struct platform_device android_usb_device = {  
  2. .name = "android_usb",  
  3. .id = -1,  
  4. .dev = {  
  5. .platform_data = &android_usb_pdata,  //@1  
  6. }  
  7.   
  8. };  
  9. static struct android_usb_platform_data android_usb_pdata = {  
  10. .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,  
  11. };  
在rpc_hsusb.c中:

  1. int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum)  
  2. {  
  3. int ret;  
  4.   
  5. ret = msm_hsusb_send_productID(pid);  
  6. if (ret)  
  7. return ret;  
  8.   
  9. if (!snum) {  
  10. ret = msm_hsusb_is_serial_num_null(1);  
  11. if (ret)  
  12. return ret;  
  13. return 0;  
  14. }  
  15.   
  16. ret = msm_hsusb_is_serial_num_null(0);  
  17. if (ret)  
  18. return ret;  
  19. ret = msm_hsusb_send_serial_number(snum);  
  20. if (ret)  
  21. return ret;  
  22.   
  23. return 0;  
  24. }  
在内核初始化时,先注册了名为android_usb的设备。

2.platform_driver

在drivers/usb/gadget/Android.c中:

  1. static struct platform_driver android_platform_driver = {  
  2. .driver = { .name = "android_usb"},  
  3. };  
注册了名为android_usb的paltform_driver。但是并不像其他硬件驱动那样,有.probe函数用来匹配驱动。不要着急,慢慢看。

3.module_init

其实Android.c用的是module_init的方式:

  1. static int __init init(void)  
  2. {  
  3. struct android_dev *dev;  
  4. int err;  
  5.   
  6. android_class = class_create(THIS_MODULE, "android_usb");    //在sys/class下创建android_usb目录  
  7. if (IS_ERR(android_class))    //错误处理  
  8. return PTR_ERR(android_class);  
  9.   
  10. dev = kzalloc(sizeof(*dev), GFP_KERNEL);  
  11. if (!dev)  
  12. return -ENOMEM;  
  13.   
  14. dev->functions = supported_functions;    //设备支持的一些功能,功能列表  
  15. /* 
  16. *static struct android_usb_function *supported_functions[] = { 
  17. * &rmnet_smd_function, 
  18. * &rmnet_sdio_function, 
  19. * &rmnet_smd_sdio_function, 
  20. * &rmnet_function, 
  21. * &diag_function, 
  22. * &serial_function, 
  23. * &adb_function, 
  24. * &ccid_function, 
  25. *// &acm_function,  
  26. * &mtp_function,  
  27. * &ptp_function,  
  28. * &rndis_function,  
  29. * &mass_storage_function,  
  30. * &accessory_function,  
  31. * NULL  
  32. *};  
  33. */  
  34. INIT_LIST_HEAD(&dev->enabled_functions);    //应该是加入到队列里的意思吧,使能这些功能  
  35. INIT_WORK(&dev->work, android_work);  
  36.   
  37. err = android_create_device(dev);    //创建dev,按内核目录来看:  
  38. /* 
  39. *localhost android_usb # ls                                                      
  40. *android0          f_diag            f_rmnet           f_rndis 
  41. *f_accessory       f_mass_storage    f_rmnet_sdio      f_serial 
  42. *f_adb             f_mtp             f_rmnet_smd 
  43. *f_ccid            f_ptp             f_rmnet_smd_sdio 
  44. *localhost android_usb #  
  45. */  
  46. if (err) {  
  47. class_destroy(android_class);  
  48. kfree(dev);  
  49. return err;  
  50. }  
  51.   
  52. _android_dev = dev;  
  53.   
  54. /* Override composite driver functions */  
  55. composite_driver.setup = android_setup;  
  56. composite_driver.disconnect = android_disconnect;  
  57.   
  58. platform_driver_probe(&android_platform_driver, android_probe);    //驱动是通过platform_driver_probe方式进行匹配的,匹配函数位android_probe:  
  59. /* 
  60. *static int __devinit android_probe(struct platform_device *pdev) 
  61. *{ 
  62. * struct android_usb_platform_data *pdata = pdev->dev.platform_data;    //见@1 
  63. * struct android_dev *dev = _android_dev; 
  64. * 
  65. * dev->pdata = pdata; 
  66.  
  67. * return 0; 
  68. *} 
  69. */  
  70.   
  71. return usb_composite_probe(&android_usb_driver, android_bind);    //万能USB驱动,用android_bind进行绑定  
  72. }  
  73. module_init(init);  
  74.   
  75. static void __exit cleanup(void)  
  76. {  
  77. usb_composite_unregister(&android_usb_driver);  
  78. class_destroy(android_class);  
  79. kfree(_android_dev);  
  80. _android_dev = NULL;  
  81. }  
  82. module_exit(cleanup);  
我认为是有两个重点,一个是supported_functions,另一个是android_bind。下一篇博客继续分析。


你可能感兴趣的:(Q_USB)