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

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

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

1.supported_functions

  1. static struct android_usb_function *supported_functions[] = {  
  2.     &rmnet_smd_function,  
  3.     &rmnet_sdio_function,  
  4.     &rmnet_smd_sdio_function,  
  5.     &rmnet_function,  
  6.     &diag_function,  
  7.     &serial_function,  
  8.     &adb_function,  
  9.     &ccid_function,  
  10. //  &acm_function,  
  11.     &mtp_function,  
  12.     &ptp_function,  
  13.     &rndis_function,  
  14.     &mass_storage_function,  
  15.     &accessory_function,  
  16.     NULL  
  17. };  

既然是分析USB挂载流程,那就不看别的功能函数,直接跳向mass_storage_function。

2.mass_storage_function

  1. static struct android_usb_function mass_storage_function = {  
  2.     .name       = "mass_storage",  
  3.     .init       = mass_storage_function_init,  
  4.     .cleanup    = mass_storage_function_cleanup,  
  5.     .bind_config    = mass_storage_function_bind_config,  
  6.     .attributes = mass_storage_function_attributes,  
  7. };  

包括功能名、初始化、清理、绑定配置、属性。

关于android_usb_function结构体:

  1. struct android_usb_function {  
  2.     char *name;    //"mass_storage"  
  3.     void *config;  
  4.   
  5.     struct device *dev;  
  6.     char *dev_name;  
  7.     struct device_attribute **attributes;  
  8.   
  9.     /* for android_dev.enabled_functions */  
  10.     struct list_head enabled_list;  
  11.   
  12.     /* Optional: initialization during gadget bind */    //当设备驱动绑定时的初始化(可选)  
  13.     int (*init)(struct android_usb_function *, struct usb_composite_dev *);  
  14.     /* Optional: cleanup during gadget unbind */    //当设备解绑的时候清理工作(可选)  
  15.     void (*cleanup)(struct android_usb_function *);  
  16.   
  17.     int (*bind_config)(struct android_usb_function *, struct usb_configuration *);    //绑定时的配置  
  18.   
  19.     /* Optional: called when the configuration is removed */    //当配置被移除时(可选)  
  20.     void (*unbind_config)(struct android_usb_function *, struct usb_configuration *);  
  21.     /* Optional: handle ctrl requests before the device is configured */    //设备被配置前有什么请求的话会运行这个函数(可选)  
  22.     int (*ctrlrequest)(struct android_usb_function *,  
  23.                     struct usb_composite_dev *,  
  24.                     const struct usb_ctrlrequest *);  
  25. };  

init函数:mass_storage_function_init

在分析mass_storage_function_init函数之前,先要了解一个很重要的结构体:

  1. struct fsg_config {  
  2.     unsigned nluns;  
  3.     struct fsg_lun_config {  
  4.         const char *filename;  
  5.         char ro;  
  6.         char removable;  
  7.         char cdrom;  
  8.         char nofua;  
  9.     } luns[FSG_MAX_LUNS];  
  10.   
  11.     const char      *lun_name_format;  
  12.     const char      *thread_name;  
  13.   
  14.     /* Callback functions. */  
  15.     const struct fsg_operations *ops;  
  16.     /* Gadget's private data. */  
  17.     void            *private_data;  
  18.   
  19.     const char *vendor_name;        /*  8 characters or less */  
  20.     const char *product_name;       /* 16 characters or less */  
  21.     u16 release;  
  22.   
  23.     char            can_stall;  
  24. };  
上边这个结构体在f_mass_storage.c中,在C文件开头就对这个结构体有详细的介绍:

nluns    最大支持的LUN数量(LUN:Logical units)

luns      每个LUN的参数,如下

-->filename    此LUN的名字,如果不是可移除的(removable)则不需要

-->ro              FALSE(TRUE),设置read-only,如果是CD-ROM则不可能挂载成R/W

-->removable    TRUE(FALSE),说明此LUN可移除

-->cdrom      FALSE(TRUE),此LUN是否为CD-ROM

-->nofua       FALSE(TRUE),此LUN是否可忽略

还有lun_name_format  建议为lun%d形式,如果不只是一个LUN,可以用%d来引导,必须是整型数字,如果不符合,可能将出现不可预知的错误。

thread_name    默认名字是"file_storage",是应该叫内核线程名字吧


了解了这个结构体后,看mass_storage_function_init函数:

  1. static int mass_storage_function_init(struct android_usb_function *f,  
  2.                     struct usb_composite_dev *cdev)  
  3. {  
  4.     struct mass_storage_function_config *config;  
  5.     struct fsg_common *common;  
  6.     int err;  
  7.         int i;  
  8.     config = kzalloc(sizeof(struct mass_storage_function_config),  
  9.                                 GFP_KERNEL);  
  10.     if (!config)  
  11.         return -ENOMEM;  
  12.   
  13.     /* support multi luns and ro of ench lun is set to 0 to allow 
  14.      * opening "filename" in R/W mode. If the file is read-only, 
  15.      * the ro will be set to 1 automatically. 
  16.      */  
  17.     config->fsg.nluns = USB_MAX_LUNS;    //USB_MAX_LUNS=3,说明支持三个存储设备。  
  18.     for (i = 0; i < USB_MAX_LUNS; i++) {    //三个设备都可以移除,可以忽略,可以挂载为R/W,没有一个是CD-ROM  
  19.         config->fsg.luns[i].removable = 1;  
  20.         config->fsg.luns[i].nofua = 1;       
  21.     }     
  22.   
  23.     common = fsg_common_init(NULL, cdev, &config->fsg);  //交给fsg_common_init去根据配置创建设备,具体实现在f_mass_storage.c中  
  24.     if (IS_ERR(common)) {  
  25.         kfree(config);  
  26.         return PTR_ERR(common);  
  27.     }  
  28.   
  29.     /* create a symlink for each lun */  
  30.     for (i = 0; i < USB_MAX_LUNS; i++)  
  31.     {  
  32.         err = sysfs_create_link(&f->dev->kobj,      
  33.                     &common->luns[i].dev.kobj,  
  34.                     dev_name(&common->luns[i].dev));    //创建设备链接  
  35.         if (err)  
  36.         {  
  37.             fsg_common_release(&common->ref);  
  38.             kfree(config);  
  39.             return err;  
  40.         }  
  41.     }  
  42.   
  43.     config->common = common;  
  44.     f->config = config;  
  45.     return 0;  
  46. }  
至此基本的结构也就初始化完成了。配置很重要,一定不能错。明天再分析android_bind。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值