usb

 

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

标签: androidfunctionstructclassmodule

2012-08-20 17:59 6177人阅读 评论(0) 收藏 举报

25151826_3m75.jpg 分类:

 

Android开发(19) 25151827_NdzJ.jpg

版权声明:本文为博主原创文章,未经博主允许不得转载。

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。下一篇博客继续分析。


转载于:https://my.oschina.net/tplinuxhyh/blog/535398

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值