锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Android系统USB读卡器

时间:2023-01-19 11:30:00 20usb连接器

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.6showcase
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 secification 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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章