USB大容量存储设备浅析

news2024/9/28 13:17:23

一 USB 设备类

SB 引入了设备类的概念,根据每一类驱动程序的功能将USB设备分为几大类,标准的几大类包括:

大容量存储类
网络类
集线器类
串行转换器
音频类
视频类
图像类
调制解调器
打印机
HID(Human Interface Device 人机接口设备)

每一大类的驱动程序对属于这类的所有设备通用,不需要另外再开发和安装驱动程序就可以使用。Linux-USB子系统支持主要的几类设备驱动程序。

每个USB设备都有类代码和子类代码。如 大容量存储设备类(0x08)就包含 光盘存储器(0x02)、磁带(0x03)、固态存储器(0x06)。设备驱动程序的 usb_device_id结构体包含类代码成员和子类代码成员。

也可以从 /proc/bus/usb/devices 输出结果的"I:"行看到设备的类代码和子类代码信息。

存储设备的接口有五大类
 IDE、SCSI、USB,并行口,串口,其中并行口与串口的速度非常慢,不提也罢,最主要的就是IDE,usb, SCSI。IDE。

二 USB大容量存储设备

通常来讲USB大容量存储设备(Mass Storage) 主要是指 U盘,USB硬盘,笔驱动器,CD-ROM,软驱以及类似的存储设备。USB大容量存储设备利用 SCSI(Small Computer System Interface 小型计算机系统接口)协议和主机系统通信。

SCSI 接口
SCSI是“Small Computer System Interface”的缩写,即小型计算机系统接口。同IDE(ATA)完全不同的接口, IDE接口是普通PC的标准接口,而SCSI并不是专门为硬盘设计的接口,是一种广泛应用于小型机上的高速数据传输技术。

SCSI 协议
Scsi 协议是U盘,读卡器这些大容量存储所使用的协议。整个协议是工作在批量传输,分为IN、OUT两个方向。当插入U盘,USB主机控制器会识别到该设备是一个海量存储设备,然就就会根据SCSI协议,先发送CBW命令块包,U盘收到后根据SCSI协议解析该报,并回复命令执行状态包(CSW),就是应答,作为对前一个CBW命令块包处理结果的回应。Host 根据 CSW 来决定是否继续发 送下一个CBW 或是数据。

当一个U盘插入主体后,主机会拿到USB设备的描述符,从而识别到该USB设备是一个支持 Bulk-Only传输协议的海量存储设备。并使用Bulk-Only传输协议,即进入Bulk-Only传输方式,主机与USB设备间的所有数据都是通过Bulk input(批量输入端点)、 Bulk ouput(批量输出端点) 进行传输。不再通过控制端点传输任何数据。在这种传输方式下,有三种类型数据在主机和usb设备之间传输:命令块包(CBW)、命令执行状态包(CSW)、普通数据包。

Bulk-Only传输协议:Bulk-Only协议是USB组织针对大容量存储设备制定的一种块存储类协议,是USB大容量数据存储的基础协议,BOT协议用于主机和USB设备之间进行大容量数据传输。,U盘属于海量存储类。USB定义了海量存储存储设备类的规范。主要是指USB总线上的传输方法与存储介质的操作命令。海量存储设备只支持一个接口,即数据接口,此接口有三个端点, Bulk input(批量输入端点)、 Bulk ouput(批量输出端点)、中断端点。

大容量存储设备驱动程序把自己注册成一个虚拟的SCSI适配器。该虚拟适配器在上行方向上通过SCSI命令和上层通信,在下行方向通过URB与块存储器减缓数据。

在USB集线器枚举过后,USB系统发现插入设备是大容量设备 U盘,就会调用 storage_probe()。目前分析的主要工作就是,申请一个 SCSI适配器,并绑定USB接口 与 该适配器的关系,最后注册该SCSI适配器到 SCSI总线。SCSI总线扫描到该设备后,调用 sd_prob(),即sd驱动, sd驱动为该U盘在系统中生成 /dev/sd* 节点,从这以后,应用程序就可以用该接口访问这个U盘了。SCSI子系统把发向虚拟适配器的磁盘操作命令排队,在虚拟适配器这端,排队的命令以URB的形式传递给设备。

drivers\usb\storage\usb.c

在这里插入图片描述

static int storage_probe(struct usb_interface *intf,
			 const struct usb_device_id *id)
{
	struct us_unusual_dev *unusual_dev;
	//私有数据结构
	struct us_data *us;
	int result;
	int size;

...
	/*
	//私有数据结构
	struct us_data *us;
	
	USB设备接口
	struct usb_interface *intf
	
	struct usb_device_id *id
	
	struct us_unusual_dev *unusual_dev;
	
	scsi协议主机信息模板 ??
	struct scsi_host_template usb_stor_host_template
	*/
	result = usb_stor_probe1(&us, intf, id, unusual_dev,
				 &usb_stor_host_template);
	if (result)
		return result;

	/* No special transport or protocol settings in the main module */
	result = usb_stor_probe2(us);
	return result;
}


static struct usb_driver usb_storage_driver = {
	.name =		DRV_NAME,
	.probe =	storage_probe,
	.disconnect =	usb_stor_disconnect,
	.suspend =	usb_stor_suspend,
...
};


/* First part of general USB mass-storage probing */
/*
//私有数据结构
struct us_data *us;

USB设备接口
struct usb_interface *intf

struct usb_device_id *id

struct us_unusual_dev *unusual_dev;

scsi协议主机信息模板 ??
struct scsi_host_template usb_stor_host_template

暂时分析的工作
	申请 SCSI 主机控制器
	绑定 SCSI 主机控制器 和 私有数据
	绑定 私有数据 和 usb接口信息

*/

int usb_stor_probe1(struct us_data **pus,
		struct usb_interface *intf,
		const struct usb_device_id *id,
		struct us_unusual_dev *unusual_dev,
		struct scsi_host_template *sht)
{
	//SCSI 主机控制器
	struct Scsi_Host *host;
	struct us_data *us;
	int result;

	dev_info(&intf->dev, "USB Mass Storage device detected\n");

	
	host = scsi_host_alloc(sht, sizeof(*us));
	if (!host) {
		dev_warn(&intf->dev, "Unable to allocate the scsi host\n");
		return -ENOMEM;
	}
...

	*pus = us = host_to_us(host);
...
	INIT_DELAYED_WORK(&us->scan_dwork, usb_stor_scan_dwork);

	/* Associate the us_data structure with the USB device */
	//us_data结构与USB设备关联s
	result = associate_dev(us, intf);
	if (result)
		goto BadDevice;

	...
}


/* Associate our private data with the USB device */
static int associate_dev(struct us_data *us, struct usb_interface *intf)
{
	/* Fill in the device-related fields */
	us->pusb_dev = interface_to_usbdev(intf);
	us->pusb_intf = intf;
	us->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
...

	/* Store our private data in the interface */
	//在接口中存储我们的私有数据
	usb_set_intfdata(intf, us);

...
	return 0;
}



/* Second part of general USB mass-storage probing */
int usb_stor_probe2(struct us_data *us)
{
	int result;
	struct device *dev = &us->pusb_intf->dev;
...
	/*
	1 关联 USB设备 -- SCSI主机控制器
	2 注册 SCSI主机控制器到 SCSI总线
	*/
	result = scsi_add_host(us_to_host(us), dev);
	if (result) {
		dev_warn(dev,
				"Unable to add the scsi host\n");
		goto HostAddErr;
	}

...

	/*
	调用 usb_stor_scan_dwork() ,请求SCSI系统扫描总线来发现插入的SCSI设备
	*/
	queue_delayed_work(system_freezable_wq, &us->scan_dwork,
			delay_use * HZ);
	return 0;

...
	return result;
}
EXPORT_SYMBOL_GPL(usb_stor_probe2);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我记不住的那些编程语言的语法(数组)-1

背景:我记不住各种语言的语法,例如C、Java、Go、Python、JavaScript,大概就是常用的这几种语言,每种语言有其自己的语法规范,有的时候会记混了,所以想记录一下细节。这个系列会不定期的更新,本期…

一路坎坷,入局到突破【2022年度总结】

秃秃 1> 来到CSDN: 2019年5月时决定只身一人去外省实习,顺便在CSDN这个“资源库”注册了一下账号。直到我20年在公司做技术分享时,才真正开始在CSDN上的创作; 21年的时候也只是把CSDN当做笔记,就自己写一写&…

行业洞察|猴子可以打字,动物走进元宇宙还有多远?

很多学者和专家认为,人类与动物的区别在于语言的使用。人类可以使用语言,但是动物不会。其实也许是我们人类听不懂动物的语言,并不是他们不会使用。本质在于沟通的媒介不同,导致我们无法相互交流。但是,埃隆马斯克&…

App原型设计规范

一、界面尺寸 1.ios分辨率 2.android界面尺寸 ① 安卓分辨率 ②常见安卓手机分辨率及尺寸 一般情况下大家在设计app端原型的时候,由于现在ios和安卓慢慢在趋向一致,所以基本上都只会设计一套原型,尺寸方面一般都是按照iphone6的750*1344(2倍…

Django 数据备份dumpdata 踩的坑

项目背景: 项目使用的是sqlite数据库,要求备份除了网络表之外的所有数据 实施方案: python3 manage.py dumpdata --exclude network.TRoute --indent 2 --format json > aq3.json 方案操作结果是: 查看aq3.json如下&#xff…

一文详解GCC7、CUDA 11.2、CUDNN部署

在部署之前,需要了解下python-tensorflow-cuDNN-CUDA版本对应关系,以便能够完全兼容下文以此版本为例部署gcc-7.3.1gpu driver-460.106.00cuda-11.2cudnn-8.1.1一.gcc部署1.安装[rootgpu ~]# yum -y install centos-release-scl [rootgpu ~]# yum install devtoolse…

《收获,不止Oracle》索引细化

1.索引知识图框 2.索引探秘 2.1 BTREE索引 索引是建在表的具体列上的,其存在的目的是让表的查询变得更快,效率更高。表记录丢失关乎生死,而索引丢失只需重建即可。 索引却是数据库学习中最实用的技术之一。谁能深刻地理解和掌握索引的知识&…

Spring gateway websocket自定义负载均衡

业务需求 公司IM服务主要基于netty实现websocket,为保证在线用户channel通道畅通故一直使用单机运行。现由于公司业务增加需要增加IM集群,由于channel通道不能缓存,故急需一套可以完整兼容之前功能的方案。 技术选型 1、采用spring websocke…

Bonree ONE荣获信通院“2022IT新治理年度明星产品”

今日,由信通院主办的“GOLFIT新治理领导力论坛”正式召开,论坛上公布了2022IT新治理年度评选活动的结果,博睿数据一体化智能可观测平台Bonree ONE凭借卓越的产品力以及优秀的用户体验,从一众产品中脱颖而出,获得“2022…

spring 事务@Transantional 失效及解决方案和总结

1、线程中方法,事务会失效 2、线程中方法,事务会失效。即使在线程方法上增加Transactional注解 3、事务正常回滚,A方法调用B的普通方法 4、事务正常回滚。A方法调用B的private普通方法 6、会抛出NullPointerException异常。 Methods ann…

rock3a: 基于自建数据集+yolov5s模型的rknn模型训练部署全流程

上一篇文章其实已经详述了模型训练到部署的整个流程,但是数据集到模型都是用的官方的coco数据集,这里为了记录开发板的模型训练到部署的整个流程,重新开了一篇文章进行记录。 首先准备数据集和rockchip官方推荐的yolov5源代码 这里需要注意的…

基于Node.js Vue企业产品展示网站

摘 要随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&am…

CAN201-Computer Network(2)

文章目录4. Network Layer4.1 Router4.1.1 Input port functions4.1.2 Destination-based forwarding4.1.3 Switching fabrics4.1.4 Input port queueing4.1.5 Output ports4.2 Internet Protocol4.2.1 IP fragmentation, reassembly4.3 IPv4 addressing4.3.1 Subnets4.3.2 Net…

高等数学(第七版)同济大学 习题11-4 个人解答

高等数学(第七版)同济大学 习题11-4 函数作图软件:Mathematica 1.设有一分布着质量的曲面Σ,在点(x,y,z)处它的面密度为μ(x,y,z),用对面积的曲面积分表示这曲面对于x轴的转动惯量.\begin{aligned}&1. \ 设有一分…

IB生物课程介绍与Topic 1: Cell Biology考点分享

准备让孩子就读国际学校或者孩子正在国际学校就读的家长肯定听说过“IB”或者“IB班”,那IB究竟是什么呢?IB与IB课程 IB是International Baccalaureate(国际文凭)的简称,其课程体系国际文凭大学预科课程(In…

Educational Codeforces Round 141 (Rated for Div. 2)A——C

ps:先自我检讨...自从世界杯开始后,就一直摆烂到现在。直到打了今年的第一场cf,看见打的这么菜,真是想remake/。后面我会陆陆续续的补完前段时间没有打的比赛... Dashboard - Educational Codeforces Round 141 (Rated for Div. …

ReentrantLock

目录 ReentrantLock ReentrantLock语法 ReentrantLock可重入 ReentrantLock可打断 ReentrantLock锁超时 ReentrantLock解决哲学家就餐问题 ReentrantLock公平锁 ReentrantLock条件变量 ReentrantLock ReentrantLock 相比于synchronized的特点 : 可中断:比如A线程拥有…

基于移动最小二乘法的曲线曲面拟合论文阅读笔记

基于移动最小二乘法的曲线曲面拟合论文阅读笔记 论文地址:http://www.cnki.com.cn/Article/CJFDTotal-GCTX200401016.htm 一、Problem Statement 传统的曲线(曲面)拟合方法一般使用最小二乘法, 通过使误差的平方和最小, 得到一个线性方程组&#xff0…

通过alist挂在阿里网盘的方法

1、在github官网https://github.com/alist-org/alist/releases/download/v3.8.0/alist-windows-amd64.zip下载alist软件客户端,双击运行,可以看到默认的密码和服务器地址,打开网页http://localhost:5244/manage/accounts,填写密码…

【Linux】Linux工具

文章目录软件包管理器yumVIM编辑器Linux编译器-gcc/g使用gcc如何完成预处理(进行宏替换)编译(生成汇编)汇编(生成机器课识别代码)链接在这里涉及到一个重要的概念: 函数库函数库一般分为静态库和动态库两种gcc选项gcc选项记忆Linux项目自动化构建工具-make/Makefile背景理解实例…