1 U盘通用知识
1.1 Windows分区知识
因为保存主分区信息的MBR(Master Boot Record)只能容纳4个分区信息,也就是说只能有4个主分区。如果你想要更多的分区,只能将其中的一个主分区再划分,再划分出来的分区叫做逻辑分区,被划分的主分区又叫扩展分区,逻辑分区信息是保存在EBR(Extended Boot Record)里的。Linux系统中规定了主分区号为sda1-sda4或者hda1-hda4,而逻辑分区只能从sda5开始。

Q:U盘被识别为/dev/sda4,而不是sda1?
A:因为U盘的这个分区写在分区表(MBR DPT,Disk Partition Table)的第四项所以是sda4(DPT每个entry的第一个字节为引导标志,0x80表示活动分区,0x00表示非活动分区),可以用命令重新写到第一项。

sudo sfdisk -d /dev/sda > sda_table
gedit sda_table
sudo sfdisk /dev/sda < sda_table

1.2 FAT32分配单元大小
FAT32分配单元大小 - 簇的大小,譬如16KB,命令chkdsk f:\

1.3 LUN
LUN - 表示一块硬盘,可以是物理上的,也可以是逻辑上,譬如Android Gadget MSG的一个mmcblk0p1分区,命令lsscsi查看
lshw
lsscsi - 返回值Host:Controller:Target:LUN
lscpu
lsusb
lsblk

SCSI Internal pinout
http://pinoutdiagram.com/scsi-internal-pinout/

1.4 Linux内核SCSI硬盘盘符分配
磁盘槽位和盘符绑定方案
http://www.voidcn.com/article/p-dvjobuge-ga.html

2 Android OTG支持USB读卡器
2.1 基本原理
我们知道,三星Android手机将USB读卡器通过OTG线插入Micro USB插口后,插拔读卡器里的SD卡,文件管理器也能够识别卡的插拔;而很多手机的OTG连上USB读卡器也来插拔SD卡,会发现文件管理器无法加载SD卡。而将USB读卡器放到Windows上或者桌面Linux上,我们发现插拔读卡器里的SD卡也是有效的。

究其原因是Android的用户空间或者内核空间没有处理好SCSI 的TUR(Test Unit Ready)命令。

2.2 SCSI Host注册使用到的函数
scsi_host_alloc()
scsi_add_host()
scsi_scan_host() - 执行INQUIRY命令,每扫描到一个lun(函数scsi_probe_and_add_lun())就创建一个struct scsi_device(譬如U盘一般只有一个lun,而读卡器和UFS可能有多个lun;每个struct scsi_device创建一个disk,可能有多个分区),与sd_probe()匹配。

2.3 TUR执行流程
2.3.1 methodology
drivers/usb/storage/scsiglue.c
queuecommand_lck()
add dump_stack() to find who calls TUR.

2.3.2 enable TUR polling
echo 2000 > \
/sys/module/block/parameters/events_dfl_poll_msecs

dfl means default.

2.3.3 Construct TUR Fail CDB
If the device is not ready, the bCSWStatus field in CSW is set to 0x01 (command failed). When device reports 00h in the bCSWStatus field in CSW, which indicates that media is ready.

// srb->sense_buffer
unsigned char
usb_stor_sense_media_notpresent[18] = {
    [0] = 0x70,
    [2] = 2,           /* Sense Key */
    [7] = 0x0a,
    [12] = 0x3a,   /* ASC */
    [13] = 0,         /* ASCQ */
};

2.4 REQUEST_SENSE auto_sense
USB host MSC(transport.c)每发送一个命令后,都会检测设备返回的CSW的状态值是否为0(Good Status),如果不为0,则USB host MSC马上发送REQUEST_SENSE命令,获取18字节的出错信息,并保存在srb->sense_buffer中供SCSI层分析。

drivers/usb/storage/transport.c
usb_stor_invoke_transport()
srb->sense_buffer

2.5 TF卡SPI模式
剪块透明胶带,粘住TF卡第1个脚(DAT2),插入USB读卡器,TF卡进入SPI模式。

2.6 showcase
sg v3: /dev/block/sda
sg v4: /dev/0:0:0:0

scsi Inquiry example

3 Abbreviations
ARC:Argonant RISC Core
AT91SAM9260:SAM means Smart ARM-based Microcontroller
ATMEL SAMBA:ATMEL Smart ARM-based Microcontroller Boot Assistant
MBR:Main Boot Record
DBR:DOS Boot Record
EBR:Extended Boot Record
bdi:backing device info - 脏页写回核心结构;文件系统page cache,使用struct address_space_operations(每个文件系统都有这个结构体,譬如 fat_aops)
CCGP:Windows USB Common Class Generic Parent,Linux内核类似的驱动就是usb_generic_driver(generic.c)
CCGP MI_:Common Class Generic Parent Multi Interface
DWC2:Design Ware Controller 2,Apple的嵌入式设备,包括iPad和iPhone都是使用的DWC2
IDA & IDR:Identification,IDR机制在Linux内核中指的是整数ID管理机制。实质上来讲,这就是一种将一个整数ID号和一个指针关联在一起的机制。IDA是用IDR来实现的ID分配机制,与IDR的区别是IDA仅仅分配与管理ID,并不将ID与指针相关联。
ISP1161:Philips' Integrated host Solution Pairs 1161,“Firms introduce USB host controllers”,https://www.eetimes.com/document.asp?doc_id=1290054
Quirks:the attributes of a device that are considered to be noncompliant with expected operation
RCU:Read-Copy Update,RCU支持一个更新者和多个读者同时访问。通过维护对象的多个版本,RCU保证读者看到的对象是前后一致的,并且保证在所有之前已存在的读者离开临界区时,这些版本才会被释放。
SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上与ISP1161(Integrated host Solution Pairs 1161)相当
TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci);产品UHC124表示USB Host Controller;收购了ARC USB技术;现已被chipidea收购,chipidea又被mips收购
TLV:TI Low Value,高性价比
TPS:TI Performance Solution
TT:Transaction Translator(事务转换器,将USB2.0的包转换成USB1.1的包)
TUR:Test Unit Ready(类似心跳信号),sd_spinup_disk()执行该命令,底层排队函数usb_stor_host_template.queuecommand()和ufshcd_queuecommand()。Linux工具sg_turs(SCSI Generic,隶属于sg3_utils)用来手工发送TUR命令
USB3 BULK Stream ID:对应到SCSI Tag或者SATA Tag
USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.
USB Host枚举时-71错误码可能原因:DP和DM走线太长导致眼图差;DP和DM接反了
W-LUNs:UFS Well Known Logical Units

Android系统USB读卡器相关推荐

  1. Android电子牌外接USB读卡器读取内容模拟键盘事件

    最近做了一个Android外接USB读卡器刷手环读取数据,模拟键盘输入事件的项目; 借鉴了https://github.com/githubRonda/BarcodeScanner 连接电子牌板子调试 ...

  2. Android 系统使用USB OTG功能/打开USB Host API功能

    步骤一:确定 Android 设备是否支持 USB Host 功能,具体可以通过以下步骤进行确认: 1. 查看手机或平板设备参数,或者直接联系厂家咨询: 2. 使用 UsbHostDiagnostic ...

  3. 高通android usb otg,Android OTG支持USB读卡器

    我们知道,三星Android手机将USB读卡器通过OTG线插入Micro USB插口后,插拔读卡器里的SD卡,文件管理器也能够识别卡的插拔:而很多手机的OTG连上USB读卡器也来插拔SD卡,会发现文件 ...

  4. 计算机usb口不识别读卡器,windows7系统下usb读卡器读不出来如何解决

    最近有windows7系统用户到本站反馈说碰到这样一个情况,就是在使用读卡器传输文件的时候,发现插入到电脑出现无法识别读卡器的情况,该怎么办呢,针对windows7系统下usb读卡器读不出来这个问题, ...

  5. Android系统添加USB共享网络

    文章目录 一.代码修改: 1.内核添加RNDIS的支持 2.init.rc中增加两个针对usb0的配置服务 3.frameworks中修改配置 二.调试 测试平台:MT2712,Android9.0, ...

  6. 为android系统添加USB AUDIO设备的放音和录音功能

    转载请注明出处:http://blog.csdn.net/adits/article/details/8242146 开发环境简介 1. 主机系统: Unbuntu10.10 2. android系统 ...

  7. 为android系统添加USB AUDIO设备的放音和录音功能(转载)

    开发环境简介 1. 主机系统: Unbuntu10.10 2. android系统版本: 4.0.3(Linux kernel 3.0.8) 综述 android的音频系统非常庞大复杂:涉及到java ...

  8. Android系统中如何添加USB网络共享

    Android系统中如何添加USB网络共享 类别 需求 索引类别 USB网络共享 问题描述 平台是RT1296,在Android系统中已经有支持USB网络共享,但相应的产品系统中还未开启USB网络共享 ...

  9. xp系统usb android,xp系统usb手机网络共享怎么设置,xp设置usb手机网络分享的方法

    随着智能手机的不断普及,如今通过USB数据线将手机与计算机绑定,从而实现计算机共享手机的互联网连接早已成为现实.但于对于Android类型的智能手机而言,通常情况下支持的绑定只限于Windows Vi ...

最新文章

  1. Using rqt_console and roslaunch
  2. java的方法什么时候加载,java – JVM什么时候加载类?
  3. 用python写注册登录_用Python实现web端用户登录和注册功能的教程
  4. android数据存储心得,android学习心得 轻量级存储SharePreferences
  5. ant文件放在ps的哪里_ant design vue按需导入icons
  6. FEA-Net论文梳理
  7. MySQL查看binlog是否开启(开启binlog)
  8. Oracle数据泵(Data Dump)错误汇集
  9. C 语言中 scanf() 的用法
  10. The run destination''''is not valid for Running the scheme
  11. wow Warlock shushia PVP DZ
  12. matlab电流表怎么读数,电压表和电流表的读数方法,你真的会了吗?
  13. android 开发比较好的学习网站和博主
  14. 显著性检测方法:LC
  15. CCF系列题解--2016年9月第四题 交通规划
  16. 如何去掉ppt模板中自带的背景音乐(没有小喇叭)
  17. 4路差分编码器脉冲计数器,转速测量,Modbus RTU模块 WJ67
  18. VM虚拟机安装Xencenter
  19. 用RP如何设计出优雅的原型图
  20. 安装ZoneAlarm提示无法找到zpeng24.dll解决方法

热门文章

  1. C语言#include的用法
  2. kindeditor=4.1.5上传漏洞复现
  3. 前端开发者使用Chrome浏览器开发用到的插件
  4. 哈夫曼树:HDU5884-Sort(队列、哈夫曼树)
  5. 通俗理解偏序关系中的八个特殊元(极大、极小、最大、最小元和上界、下界、上确界、下确界)
  6. 东北地区博友链接集合(陆续增加中)
  7. 二叉搜索树(平衡二叉搜索树)
  8. windows平台查看CPU支持的指令集 代码:__cpuid,__cpuidex
  9. Tomb.com—新域名上线
  10. 排序与分页Pagination