Android usb读卡器sd卡热插拔心得

最近跟usb打了一段时间交道,处理了一些storage方面的项目需求,现在记录一些调试思路,同时分享给一些有缘人,希望能够给予一些灵感。
平台是qnx hypervisor,但是这个usb控制器是完全pass给了Android hlos,所以纯Android这么做大概也能行。主要的需求如下介绍:

主机两个usb口,分别插u盘和usb读卡器,同时工作。第一个需求是要让usb读卡器支持sd卡的热插拔;第二个需求是要区分出sd card 和 udisk

先说热插拔的做法

先做对比,发现ubuntu20的电脑支持sd card的热插拔,然后看了看dmesg,没啥有效帮助。
然后是设备上插入读卡器尝试热插拔,发现插拔前后没有变化,看了看dmesg,也没啥帮助。
但是这一对比,发现sd card的热插拔,对于电脑来说只是partition的变化,也就是

插上读卡器会多了一个sda设备,读卡器有卡的时候会再多sda1这些分区,拔掉sd卡这些分区就消失了

以此为切入点去read the fuck code。哦对了,前面提了一嘴ubuntu20,是因为内核版本是5.4 。而我用的设备代码有两套,一套是4.14,一套是5.4.86 。当时以为该需求只是内核版本的问题,后来两个版本都试了热插拔无效。

首先,大概过了一遍probe,个人习惯,无从下手先随便喽一眼,来两套代码流,虽然没得啥子帮助

module_usb_stor_driverusb_stor_host_template_init.usb_stor_host_templateusb_register(usb_storage_driver)usb_storage_driver.storage_probe // scsiusb_stor_probe1 + usb_stor_probe2sd_probe_async -> sd_revalidate_disk -> sd_spinup_disk -> scsi_execute -> blk_execute_rq -> __blk_run_queue_uncond -> scsi_request_fn -> scsi_dispatch_cmd -> queuecommand_lck -> usb_stor_control_threadsd_probe_async -> device_add_disk -> register_disk -> blkdev_get -> rescan_partitions

提一嘴, usb storage 、 scsi 、 sd 这三块是联系在一起的。
然后想找找扫描分区的线索,发现了rescan的接口,从class设备节点中尝试rescan发现木得效果(这时是在4.14的os中),于是去看了看代码

 static void sd_rescan(struct device *dev){ struct scsi_disk *sdkp = dev_get_drvdata(dev);revalidate_disk(sdkp->disk);
}

肥肠八嘎,就是调用了probe里的 sd_revalidate_disk,没有疗效
接下来接着想办法去搜线索,发现了partprobe这个玩意可以扫描分区

用法:partprobe [选项] [设备]…
将分区表的变更通报操作系统。
-d, --dry-run 并非真的通报操作系统
-s, --summary 印出内容的概要
-h, --help 显示这个说明然后离开
-v, --version 输出版本信息然后离开
如果没有指定任何设备,探查所有分区。

但是设备上没有,去toybox里搜了搜,是它的一个子命令。下一步,展示
这次我在两个版本os都试了, 发现4.14版本会报设备busy,而5.4版本扫描成功,实现目标

跟踪partprobe的函数流,发现其通过IOCTL向块设备做请求,最后走到了check_events, 4.14版本的check_events接口被某些老吊干掉了。重新恢复回来,然后起了一个service 定期扫描sda分区,实现sd卡热插拔。
整体看代码,综合fs、block、sd、scsi、usb_storage就能弄明白这块,有心人可以盘它

再说说区分udisk和sdcard的做法

前面看插拔usb storage全设备log时,打开scsi log开关,得到了一个线索,对这个需求有很大帮助
就是他会有一套交互协议,发送一串cmd

Command INQUIRY (6 bytes)
Command TEST_UNIT_READY (6 bytes)
Command READ_CAPACITY (10 bytes)
Command MODE_SENSE (6 bytes)
Command ALLOW_MEDIUM_REMOVAL (6 bytes)
Command READ_10 (10 bytes)

而这个INQUIRY能够获取很多基本信息存入了scsi_device中记录。 在sd_probe中利用好这些信息,通过strcmp来比较vendor、model判断读卡器和u盘,固定index来固定sdx偏移量,以及major和minor

vold在通过netlink接收 events时是根据major和minor去/dev/block/vold/下去mknod,然后进行mount挂载。固定了minor就相当于固定了这里的节点,进一步也就能够区别mount出udisk和sdcard各自的路径

Android usb读卡器sd卡热插拔心得相关推荐

  1. Android 2.3 SD卡挂载流程浅析(三)

    在前面两篇博文<Android 2.3 SD卡挂载流程浅析(一)><Android 2.3 SD卡挂载流程浅析(二)>中,主要简单介绍了SD卡的挂载流程以及所涉及的关键文件.在 ...

  2. android 6.0 sd卡读写权限,Android 6.0 读写SD卡权限问题

    一.问题描述## Android 6.0 下默认存储SD卡,使用原生FMRadio生成的文件保存到内部存储中 [预置条件]插入T卡[操作步骤]设置>存储设备和USB>选择SD卡为默认存储& ...

  3. c# 再次尝试 连接失败_[图]连接USB或者SD卡的PC将阻止升级Windows 10 May 2019功能更新...

    如果设备在连接外部USB设备或者读卡器的时候,计算机将会阻止升级Windows 10 May 2019(Version 1903)功能更新.在4月24日发布的技术咨询中,微软解释称当连接外部USB设备 ...

  4. Android rom ram sd卡 区别

    1.RAM 首先是RAM,广义上的RAM指的是"随机存取存储器",狭义上的RAM就是所谓的内存.它有断电后数据会消失的特性. RAM越大,机子的速度就会越快.当然太大了会用不完,就 ...

  5. Android存储设备(U盘,SD卡)状态监测(《Android 2.3 SD卡挂载流程浅析1234567)

    我们是以DV6300-T的平台来做测试的,发现有2种方式来检测android中external media(包括SD卡,USB)的状态. 一种是使用StorageListener监听,还有一种是使用广 ...

  6. Android实例]------获取sd卡图片显示出来

    [Android实例] 获取sd卡图片显示出来 ON 六 02 2012 IN ANDROID代码仓库, ANDROID项目代码 BY ANDROID智能手机 | 评论 package com.fil ...

  7. Android模拟器中sd卡的创建和文件的上传

    在使用android 模拟器的sd卡上传文件的时候出现过如下的错误: ailed to push selection: Invalidargument Failed to push the item( ...

  8. android获取sd的大小,Android实现获取SD卡总容量,可用大小,机身内存总容量及可用大小的方法...

    本文实例讲述了Android实现获取SD卡总容量,可用大小,机身内存总容量及可用大小的方法.分享给大家供大家参考,具体如下: 可能有的同学不知道系统已经提供了获取获取SD卡总容量,可用大小,机身内存总 ...

  9. /mnt/sdcard或者/sdcard这是Android手机中SD卡的文件夹路径

    Android系统的开放,使其用户可以自己查看系统和SD卡中的文件夹.就系统和SD卡中常见的目录代表什么意思,下面是一个较实用的总结: 一.SD卡中 1. /mnt/sdcard或者/sdcard这是 ...

最新文章

  1. 机器学习基础:理解梯度下降本质「附Python代码」
  2. 卡巴斯基:警惕IE拦截器恶意推广导航网站
  3. python合并文件_python把多个文件合并到一个新文件
  4. HDU - 5978 To begin or not to begin(简单博弈)
  5. resnet50加入fpn_FPN+SSD同时兼顾速度和精度的检测器(二)
  6. mongodb dsl_具有Java DSL的Spring Integration MongoDB适配器
  7. linux运行程序时,中途出现意外怎么办?
  8. (3)fastjson带有转义字符的数据格式处理
  9. 显卡排行榜天梯图2022 显卡性能天梯图2022
  10. 戴尔服务器上装vmware esxi
  11. win10无限蓝屏_windows10系统蓝屏无限重启命令解决教程
  12. ts定义数组类型_ts中类型
  13. 有个程序猿很忧桑:一个命令rm -rf/ ,他把整个公司删没了...
  14. 爪哇国新游记之三十----十九个正则表达式示例
  15. linux cut命令学习,Linux中的cut 命令详解
  16. 基于区块链技术的性能测试
  17. Pycharm 让编辑区/代码区背景色为白色或与主题色不同
  18. 我用Python写了个网课查题小助手
  19. foxmail联系人插件_软件开发公司_软件外包_项目外包平台支持outlook,foxmail等邮件客户端通讯录同步插件...
  20. 成功说服别人的20个技巧

热门文章

  1. python爬虫下载电影百度文档_写一个python 爬虫爬取百度电影并存入mysql中
  2. redis通关面试宝典
  3. 创业者复盘长文:心有菩提手有刀,欲成舍利却成妖
  4. 如何在Mac电脑中输入多种标点符号和文字表情
  5. c语言中pow函数用法,C++ pow() 函数使用方法及示例
  6. html老师祝福语,给数学老师的祝福语
  7. TM影像7个波段的介绍;NDBI、NDWI和NDVI的区别
  8. 大佬们帮忙看看蜂鸣器为什么不响!
  9. win10更新并关机 和 更新并重启解决办法
  10. 我的浙大MEM上岸经验分享