我们知道,三星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 usb otg,Android OTG支持USB读卡器相关推荐

  1. Unity 高通AR发布到Android发生黑屏

    这两天在做Unity 高通AR发布到Android的时候发生黑屏现象 后来发觉是不调用摄像头而不是黑屏(所谓黑屏是因为摄像头背景就是黑色的) 最后发觉是高通的文件夹出现错误 重新复制之前备份的一个高通 ...

  2. 高通、猎户机型Android典型bootloader分析

    1.bootloader是什么? 简单地说,bootloader 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一 ...

  3. 使用高通QXDM工具实现Android设备网络制式更改(如仅注册LTE网络)(独家!)

    修改网络制式需要用到高通的QXDM工具,该工具包下载链接如下: 链接:https://pan.baidu.com/s/1rRNicFvlRSstUhka2JSiOg 密码:pssp 具体操作步骤如下: ...

  4. 高通发布 Gobi 4000 ,可支持多种制式的通信网络

    高通今天发布了其基于4G LTE 技 术的通信模块Gobi 4000 .这个产品提供了对CDMA2000,1xEV-DO Rev A & B, HSPA+, Dual-Carrier 双载波 ...

  5. 介绍一款小尺寸高通方案无线路由WiFi模块SKW103_支持无线中继,视频传输,智能网关

    WiFi模块根据工作频段分为2.4GHz单频WiFi模块和2.4/5GHz双频WiFi模块:根据工作模式,分为主设备WiFi模块.从设备WiFi模块:根据应用类型分为AP/Router WiFi模块. ...

  6. [高通SDM450][Android9.0]设备默认支持连接WPA3-SAE加密协议的WIFI

    文章目录 开发平台基本信息 问题描述 问题分析 解决方法 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 前段时间,有个医院的客户反馈 ...

  7. 高通旗舰芯片835亚洲发布 支持3200万像素摄像头

    3月22日下午,美国高通公司全新旗舰芯片Qualcomm骁龙835处理器在亚洲首秀.这颗采用三星10纳米制程工艺的芯片,将使搭载该芯片的智能设备拥有更低的功耗与更高的性能. 据了解,骁龙835已经投入 ...

  8. 转usb驱动cmw500 ni_支持USB Type-C接口的外置蓝光驱动器IO Data BRP-UT6 / MC2本月发售...

    IO Data以其非正统的数据设备闻名,最近IO Data新推出了一款支持USB Type-C接口的外置超薄蓝光驱动器设备 BRP-UT6 / MC2,除了支持USB-C接口,其配置是非常标准的超薄外 ...

  9. 高通Q+A平台 android gcore解析环境搭建

    QNX+LA平台在运行过程中可以在android发生crash的时候生成core文件,本文将会介绍如何搭建环境解析gcore文件. 获取gcore文件 在异常情况下或者LA侧手动触发kernel pa ...

  10. Unity3d使用高通Vuforia发布IOS工程不支持64位的一些解决办法

    1.将Unit升级至4.6.x或5.0.x,将Vuforia差距升级到最新版本(vuforia-unity-mobile-android-ios-4-0-105 ) 2.平台Other Setting ...

最新文章

  1. 一张图看懂数据库十年大格局!
  2. iOS 开发问题 书籍 价值 改名 创业大赛app
  3. 执行Bean 实例化
  4. Marketing Cloud的Contact主数据创建
  5. 画闭合的多边形 - HTML5 Canvas 作图
  6. 程序员内卷?连熬数夜肝出这份2021Java面试题核心知识点总结,近300页!
  7. 如何将日志配置文件放入到Apollo配置中心并支持热更新
  8. 16进制颜色与UIColor互转
  9. mysql insert on update_我可以始终使用INSERT…ON DUPLICATE UPDATE进行简单的更新/插入吗?...
  10. 图像加密算法毕业论文【含代码】
  11. 2020-02-24
  12. 微信小程序中下载app的方法
  13. Laravel5.4中文分词搜索-使用 Laravel Scout,Elasticsearch,ik 分词(一)
  14. 据说优秀的程序员都是这样送新年祝福的?
  15. 转:Windows8内核模式下开发NDIS应用-NDIS Filter讲解
  16. C# 使用Interop.Excel一些报错的对应
  17. EtherCAT使用与解析-SII信息提取
  18. iOS 下载量、注册量追踪统计
  19. QUIC构建1——chromium镜像,clone文件depot_tools的过程+git过程中的问题
  20. 基于Java web的购物商城

热门文章

  1. 【程序源代码】微信小程序商城管理系统(java后台+小程序)
  2. tensorflow框架下,多进程model.predict(x)无响应/暂停/无输出
  3. HBuilder X右端预览点击无反应(解决方法)
  4. 对专业学习的期望与目标
  5. 虚拟机装系统出现 ntldr is missing(NTLDR丢失)、无法正常开机、解决方法
  6. HTML5排序罗马数字,HTML5 罗马数字时钟
  7. 使用opencv调用摄像头然后录制视频和保存文件
  8. 做了一个网页版的串口调试助手
  9. Java-Excel报表开发POI(含POI保护工作表功能)
  10. H264(AVC)/H265(HEVC)/H266(VVC):GOP的区别