Linux usb mass-storage 阅读

devtools/2024/9/25 6:23:10/

usb core:实现核心的功能,为别的设备驱动程序提供服务,比如申请内存,比如实现一些所有设备都会需要的公共的函数,初始化整个usb系统,初始化root_hub
usb host 控制器:控制所有的usb设备的通信,CPU不是直接和usb设备通信,而是和控制器通信,CPU要对设备做什么动作,它会告诉控制器,HC再去负责处理
usb device :一个普通的设备要正常工作,除了设备本身之外,还要一个控制器HC,和这个控制器连接在一起的叫root hub,控制器和hub绑定集成到一起,和控制器绑定一起的hub就是root_hub,
USB设备驱动中,不用再提device,因为每个设备驱动对应的是一种Interface,每个Interface属于一个class,class下面又分了subclass,然后subclass下面又按照各种设备通信协议继续细分;
比如mass-storage的class就是0x08;这个class下面又包含不同的subclass,不日subclass 02的CD-ROM设备,04为软盘驱动器,06为SCSI类设备;通信协议主要有CBI(controll/Bulk/Interrupt)协议和Bulk-Only协议
U盘的subclass属于US_SC_SCSI,通信协议使用Bulk-Only
设备描述符,配置描述符,接口描述符,端点描述符,这是每个设备都有的,0号端点是任何一个usb设备都必须提供的,而有些描述符可有可无,比如字符串描述符,hub的hub描述符,
URB:设备驱动要发送信息,所需要做的就是建立一个urb数据结构,并把这个数据结构提交给核心层
usb驱动程序通信——》urb赋值携带所需信息——》底层usb core——》usb host controller——》通信完成通知设备驱动程序
usb_alloc_urb:为urb申请内存,两个参数,一个是iso_packets用来等时传输时指定多少包,其他模式为0,另一个参数mem_flags,申请内存的方式,一般是GFP_KERNEL
总结:usb是一种总线,它需要通信,而我们手里只有设备,所以要用usb主机控制器HC来负责统一调度控制usb设备的通信,设备驱动程序只要为每一次请求准备一个urb结构体变量,把它填充好,然后调用usb core提供的函数,把这个urb给usb HC,HC就会把所有的urb统一规划操作,这期间usb设备驱动程序通常会进入睡眠,一旦HC把urb处理完了,它会调用函数唤醒usb设备驱动程序,然后usb设备驱动程序继续走

U盘设备和驱动

1、重点函数:
storage_probe开始,storage_disconnect结束
get_device_info、get_protocol、get_transport、get-pipes、usb_stor_Bulk_max_lun
2、lun:
lun是logical unit number,逻辑单元号,lun id的作用是扩充设备target id,一个lun就是一个device中的一个driver,比如一个读卡器有两个插槽,一个支持CF卡,一个支持SD卡,它就用两个lun来表示,U盘只有一个LUN
3、usb_stor_Bulk_max_lun:
usb_stor_control_thread——》usb_stor_acquire_resources
——》usb_stor


http://www.ppmy.cn/devtools/116839.html

相关文章

网络安全:建筑公司会计软件遭受暴力攻击

黑客正在暴力破解基金会会计服务器上高权限账户的密码,这些账户广泛用于建筑行业,从而侵入企业网络。 这一恶意活动最先被 Huntress 发现,其研究人员于 2024 年 9 月 14 日检测到了此次攻击。 Huntress 已经发现这些攻击对管道、暖通空调、…

Python范例总结

一、基础功能 1、操作符 and 拥有更高优先级,会先行运算。优先级顺序为 NOT、AND、OR。 2、列表 1)列表拼接 l1 [1,2,3] l2 [4,5,6]# 方法1 # l1 l1 l2# 方法2 # l1[len(l1):len(l1)] l2# 方法3 l1.extend(l2) print(l1) 3、函数 1)范…

Android JNI 调用流程

为啥要用JNI,我个人理解是,Java 代码效率不够高,代码调用底层逻辑隔着一层Java 虚拟机,不能直接操控底层硬件,而C/C 可以直接操控硬件设备,对于需要效率更高的操作,就需要通过C/C 完成。。 比如…

网络编程的应用

目录 1.单机程序和网络程序 2.客户端与服务端 3.网络编程三要素 3.1 IP地址 3.2 port端口 4.TCP编程 5.UDP编程 1.单机程序和网络程序 之前编写的程序都是单机程序,所有的业务功能实现及数据存储都在一个主机上完成,我们称为单机程序 我们在生活…

Android数据序列化总结

Android数据序列化总结 什么是序列化 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对…

【C++】Eclipse技巧汇总

Eclipse C/C调试无法输入 在debug C/C程序时,Eclipse自带的窗口,无法读取cin等输入 解决办法: 参考:https://blog.csdn.net/sagjhdj/article/details/123271383 思路是调用外部console: 依次点击Debug>Debug Conf…

【计算机视觉】YoloV8-训练与测试教程

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 💫 欢迎来到我的学习笔记! 制作数据集 Labelme 数据集 数据集选用自己标注的,可参考以下&#xff1a…

美团中间件C++一面-面经总结

1、TCP和UDP 的区别? 速记标识符:连靠刘墉宿营 解释: 面向连接vs无连接 可靠传输vs不保证可靠 字节流vs报文传输 拥塞控制流量控制vs无 速度慢vs速度快 应用场景自己描述 2、服务端处于close wait是什么情况,是由什么造成的&…