Android usb client mass-storage挂载单个存储设备研究

来源:互联网 发布:js insertafter 编辑:程序博客网 时间:2024/05/17 00:58

     上次,初步接触Android usb client 的挂载问题,所以写了第一篇研究的感受,许多地方还有点问题,有些现象还不够清晰,所以想继续写下去。

     首先,通过上次的验证,看到的现象,是可以挂载了,但是每一次只能挂载一个存储设备。

     其次,我上次所说的关于驱动的设备节点,也有问题,其实本身就有一个tegra-udc.c创建的/sys/devices/platform/tegra-udc.0/lun0这么个节点在,所以不需要在创建什么mass-storage节点。

 ===========================================================================   

(一)首先,我们看看第一个问题,怎么每次只挂了一个设备在上面呢?

    1.VOLD首先会去读取vold.conf的文件中配置内容(尾插入的链表方式)存储存储设备的必要信息(上次讲过,就是EMMC的partition 4)

    接着,会去通过uevent读取动态插入的存储设备信息,以头插入链表的方式,并将第一个链表和这次的链表结合起来(auto_add_volume函数),使得动态存储设备在链表头几个,而静态存储设备在链表后面。这种顺序,在我的环境中是正确的,因为我的虽有的动态存储设备是挂载在partition 4上面的。用过手机或者有一点挂载卸载经验的人都知道,如果想要顺利卸载partition 4 需要卸载它的里面目录,否则partition 4一直显示busy而不能卸载。为什么要卸载了存储设备再挂呢,这是因为防止两边同时操作。

这里要说明下,就是如果想要动态存储设备通过ums_path路径的检测,需要在auto_add_volume函数里的ums_path下,明确指定目录,使得动态存储设备,能够被正确挂载。

    2.当在client卸载成功时,就需要挂载到host端了,我一路跟踪,发现这段vold的volmgr.c代码起了作用

     

    最主要的是ums_enable(),是这句话让设备挂载到主机端,继续跟下去

    在同目录下的ums.c代码中

     

    open 一个"/sys/devices/platform/tegra-udc.0/lun0/file"文件

    然后向file文件 写入一个 "/dev/block/vold/major:minor"的path路径,而这个路径对应的是各个存储设备

    我尝试了写入不同的路径到file里(通过adb 中写入 如:echo "/dev/block/vold/179:0">/sys/devices/platform/tegra-udc.0/lun0/file)。

 

    每写一个路径,就会挂载一个相应的存储设备到host端,但是当你挂载下个设备时候必须echo  "">file中,先从host端unmount前一个设备才能挂载当前设备。

    继续跟踪代码到kernenl,发现/driver/usb/gadget/f_mass_storage.c作了某些动作,挂载了设备

    

   知道sysfs的原理的人 都知道static DEVICE_ATTR(file, 0444, show_file, store_file);是负责读(cat/read)或直写(echo/write)设备属性文件的宏,具体实现就是上面这句(写)。

   看来看去 主要就是open_backing_file()函数的作用。还没怎么研究透,只知道肯定是这句起了作用,它打开了vold目录下的设备节点,并且初始化了一些东西。看到的现象就是,host端只识别单设备不同分区的挂载,但是不识别多存储设备的同时挂载。

   我不知道,到底是什么问题,让所有设备只挂载到一个设备节点上去了(冲突),而不是以往的/dev/sdb sdc sde等。

   希望能够学习解决

======================================================================

(二)第二个问题 其实也没什么,只是 先从UDC(usb device controller)的驱动走了下,当时没注意。

 

不知道Android手机是不是驱动有这种只挂载单一存储设备的限制,至少目前看是这样的。想想也正常,手机一般只有一个SD插槽,自己本身内存有限,挂一个SD的存储设备无可厚非。。。

希望是自己代码的问题,还在解决中,希望有研究的达人,一起研究分享下这方面的经验。谢谢,估计很快会写(三),还在尝试,希望写下一篇的时候,能解决这个问题。