Android OTG支持USB读卡器
我们知道,三星Android手机将USB读卡器通过OTG线插入Micro USB插口后,插拔读卡器里的SD卡,文件管理器也能够识别卡的插拔;而很多手机的OTG连上USB读卡器也来插拔SD卡,会发现文件管理器无法加载SD卡。而将USB读卡器放到Windows上或者桌面Linux上,我们发现插拔读卡器里的SD卡也是有效的。
究其原因是Android的用户空间或者内核空间没有处理好SCSI 的TUR(Test Unit Ready)命令。
由于项目需要,我实现了Android OTG支持读卡器里的SD卡插拔,需要修改的地方分为两部分,一部分是kernel,一部分是vold。
对于kernel部分:
当用户空间打开诸如/dev/block/sda的设备节点时,kernel会调用到kernel/fs/block_dev.c里的__blkdev_get()函数,该函数会向USB读卡器发送TUR命令来测试读卡器里的media是否已插入,如果插入返回1,否则是0,当Kernel发现media状态从1->0或者0->1转换时,就会设置bdev->bd_invalidated为true,这样到1185行:
if (bdev->bd_invalidated) {
if (!ret) {
rescan_partitions(disk, bdev);
} else if (ret == -ENOMEDIUM){
invalidate_partitions(disk, bdev);
}
}
该函数会重新无效或者扫描分区,但事实上无论你怎么插拔SD卡,这两个函数都没有执行完毕,关键原因是有一个打开计数没有清空,把上面函数改成如下的形式:
if (bdev->bd_invalidated) {
if (!ret) {
bdev->bd_part_count = 0;
rescan_partitions(disk, bdev);
} else if (ret == -ENOMEDIUM){
bdev->bd_part_count = 0;
invalidate_partitions(disk, bdev);
}
}
配合用户空间周期性打开/dev/block/sda设备节点,你再插拔SD卡就会发现,插入SD卡时,/dev/block/sda1设备节点会出现,拔除SD卡时,/dev/block/sda1设备节点消失。代码跳到1125行,将无效或者扫描分区前同样加上bdev->bd_part_count = 0,即解决了内核无法扫描读卡器SD卡插拔的问题。
对于vold部分:
在vold进程中需要加入周期性打开和关闭/dev/block/sda设备节点的轮训线程,才能使内核周期性向读卡器发送TUR命
令来检查读卡器中的SD卡是否存在,我们可以将该轮训线程放于DirectVolume.cpp中,示例函数如下:
我们的OTG U盘是挂载在/storage/UsbDriveA、/storage/UsbDriveB、/storage/UsbDriveC、/storage/UsbDriveD、
/storage/UsbDriveE、/storage/UsbDriveF目录下的。
同时需要在DirectVolume.cpp中加入其它几个函数,由于代码保护问题,在本文中就不粘贴代码了,有需要的人可以向我索取源代码。
增加的几个函数名如下:
int DirectVolume::adjustDiskPartNum(int diskNumParts, int pendingPartMap);
bool DirectVolume::isUsbDrive(const char *tag);
bool DirectVolume::isUsbDrive();
void DirectVolume::diskRemoved(int major, int minor);
void DirectVolume::diskRemoved();
Android OTG支持USB读卡器的更多相关文章
- Android OTG之USB转串口模块通讯
微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521 1.背景简介 我们公司开发了一款室内机平板APP应用,要求平板能去控制智能门锁. ...
- Android开启OTG功能/USB Host API功能
Android USB 模式简介 设备模式 当计算机或其他USB主机需要连接安卓设备时,此时安卓设备是作为"USB设备"角色的,在计算机上显示为 USB 外设.现在的安卓设备已经被 ...
- android OTG【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7707056 一.OTG的概念 OTG是On-The-Go的缩写,是近年发展起来的技术, ...
- 【转】Android Service创建USB HOST通信
之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...
- Android Service创建USB HOST通信
之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...
- 如何让老Mac机支持USB安装Windows
一些老Mac机的用户想装Windows,却发现自己的系统上的Boot Camp Assistant(以下简称BCA)没有USB安装Windows的选项. 下面以我的MacBook Pro (13-in ...
- 手机支持USB功能、驱动文件对应关系
手机支持USB功能: 1.UMS(USB MASS Stronge) : 连接PC作为存储盘使用 2.ADB : 用于调试 3.MTP :连接PC作为存储盘使用(win XP需要安装WMP10 以上 ...
- Android 自定义支持快速搜索筛选的选择控件(一)
Android 自定义支持快速搜索筛选的选择控件 项目中遇到选择控件选项过多,需要快速查找匹配的情况. 做了简单的Demo,效果图如下: 源码地址:https://github.com/whieenz ...
- Android recovery支持adb shell
Android recovery支持adb shell 近期开发过程注意到recovery不支持adb shell.为了便于调试方便,决定添加此功能. 刚開始我们採用的是user版本号系统,进入rec ...
随机推荐
- angularjs开发总结
使用AngularJS有差不多一年时间了,前前后后也用了不少库和指令,整理了一下,分成四大类列出.有demo地址的,就直接连接到demo地址,其它的直接链到github托管库中. 图片视频类 angu ...
- 【转】Open Live Writer 插件更新
一.更新内容 cnblog 页签中增加 Lua 和 Matlab 语法高亮:(SyntaxHighlight 页签中尚未添加) 增加折叠区域插件,见效果展示: 增加 bat 执行文件,直接拷贝插件所需 ...
- 使用asp.net上传图片并且裁剪的方法
工欲善其事,必先利其器,坚持才能更好 这篇文章主要是强调怎么使用asp.net上传图片并且能够裁剪,这个功能主要使用在注册信息的时候需要上传头像并且图片格式很大的时候能够把图片裁剪成更小的图片.下面来 ...
- (二)JAVA使用POI操作excel
1,创建一个时间格式的单元格 Demo4.java package com.wishwzp.poi; import java.io.FileOutputStream; import java.util ...
- ios开发之UIView的frame、bounds跟center属性的区别(附图)
博文暂时想到什么写什么,不顺理成章,不顺章成篇. 先看几个概念 坐标点Poit:向右侧为X轴正方向的值x,原点下侧为Y轴正方向的值y 大小Size:由宽度width和高度height构成,表示一个矩形 ...
- JavaScript基础-面向对象编程<2>
2.动态添加,修改和删除对象属性和方法 例如:用类Object()创建一个空对象user,然后修改其行为. (1) 添加属性 var user=new Object(); //创建一个没有属性和方法的 ...
- 解决 IE 不支持 document.getElementsByClassName() 的方法
//create method getElementsByClassName for document if(!document.getElementsByClassName){ document.g ...
- ASP.NET输入文本框自动提示功能
在ASP.NET Web开发中会经常用到自动提示功能,比如百度搜索.我们只要输入相应的关键字,就可以自动得到相似搜索关键字的提示,方便我们快速的输入关键字进行查询. 那么在ASP.NET中,如果我们需 ...
- “微信应用号对行业影响”之一,app开发速来围观
昨天,微信张小龙的一个讲话刷爆朋友圈,除了4大价值观,最后顺便提到:要推出微信应用号! 其实,价值观也就说说听听,最后顺便提到的微信应用号,才是真正的巨型炸弹. 腾讯挟6亿高粘度用户之重,号令天下,阿 ...
- MIT 2012分布式课程基础源码解析-线程池实现
主要内容 ScopedLock 队列实现 线程池实现 在正式讲解线程池实现之前,先讲解两个有用的工具类: ScopedLock fifo队列 ScopedLock: ScopedLock是局域锁的实现 ...