Android usb client mass-storage不能自动挂载到主机端的问题(1)

测试平台:Nvidia ARM架构

操作系统:Andorid(Nvidia修改)

 

       最近在搞Android usb client,发现当将client线分别接上Android系统机器的client端以及主机Host端的时候,Android的USB client两大功能中的ADB可以使用,而mass-storage无法使用,即装有Android系统的机器不能将自己的sdhc卡,以及自身的内存卡挂到host主机端,并且显示。

       输入 ls -l /dev/sd*

       发现终端显示了个叫/dev/sdb 的节点,尝试mount ,提示 无法mount 未知的文件系统。

 

       Okay,查看Android系统端的init.rc发现 挂载方式是vold.

 

       查看vold原代码,发现需要读取vold.conf,并且检测UMS

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

       那么大致猜测下和问题有关的可能是Android系统的这么几个:

       1.rootfs  /etc/vold.conf配置可能有问题

       2.vold 的程序可能有问题

       3.linux driver  /driver/usb/gadget/f_mass_storage.c有问题

       4.UMS功能可能有问题

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

 

大致猜测了问题的所在,那么下一 步就是一步一步确认了。

1.先看看/etc/vold.conf文件,代码在/out/target/product/XX/system/etc/vold.conf

 

 

       

进入/sys/devices/platform

这时候会有两种现象出现:1,就是有相应的节点;2,没有

1.如果有,则应该确定该节点是否和你的f_mass_storage驱动相对应,也就是说,这个节点是你的mass_storage驱动创建的,如果不是需要你去创建。

2.如果没有,那么需要在f_mass_storage.c里面去创建它。

 

我的情况是第一个,目录下有个叫shdc-udc.0/lun0的节点,但是并没有和我的g_android中的mass-storage驱动对应,所以我必须重新创建个。

在nvidia提供给我门的/arch/arm/mach-XXX/nvodm_board.c中会有一系列的device_register的动作

创建/sys/devices/platform下的节点 在这需要加入两句

 

我们会发现/sys/devices/platform/usb_mass_storage/lun0这个目录产生了

这些动作是和你的linux driver中mass-storage的驱动内容相对应的。

最后一步,就是需要将新创建的UMS(负责启动usb mass-storage功能) Path加入到你的vold.conf中

 

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

 

打开机器,灌入系统,启动,发现还是不行,在ADB终端中输入sdutil ums enabel 启动ums 实际上我机器已经在开机就启动了UMS功能

logcat显示UMS 挂掉了 一大堆的 堆栈问题 stack 什么的。

估计和内存分配或者指针有关。

估计是vold的代码有问题。

进入android源代码目录/system/core/vold

打开该目录下所有代码,加入打印语句,进行跟踪。

发现当你ums enable时候

1.会进入cmd_dispatch.c执行do_set_ums_enable函数

 

它又调用了volmgr.c文件中的volmgr_enable_ums(bool enable)

 

 

首先我们看看,程序是如何读取/etc/vold.conf配置信息并存储的

主要是这么几个函数volmgr_readconfig, volmgr_config_volume,等等,这里不详细讲,只是大概讲下,

首先 会建立一个大的链表,通过比配vold.conf中volume_XX来确定有多少成员 如volum_sdcard1 volum_sdcard2

表示有两个成员

然后,会在每个成员里在建一个链表,用于存储ums_path mount_point这些

最后再将这些东西重新在组织成个链表v。

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

继续上面的代码说

跟踪volmgr_shutdown_volume()--->volmgr_stop_volume()--->_cb_volstopped_for_ums_enable()

 

继续跟下去到blkdev.c

 

继续返回跟踪 ,发现v->dev->disk始终是空

怪不得,马的又没作异常处理,草了

在其他地方 发现v->dev和v->dev->disk是相同类型,有的地方用v->dev->major,有的地方用v->dev->disk->major

看了 下没见到v->dev->disk的初始化,悲剧阿。。。

于是尝试将v->dev作形参传入,而不是v->dev->disk

发现okay.汗查看/dev/vold/下面的设备号 和v->dev->major:v->dev->minor打出来的一致。

当机器启动时,插入usb client cable.主机端可以自动挂载mass-storage。

 

 

Oh, yeah success! 

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

不知道为什么v->dev->disk是空的。正在继续看。。估计这几天应该能搞清除。

写的不好,也不怎么详细,只是自己一点调试的看法和经验希望能帮助自己和大家,谢谢

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值