Linux USB驱动探索:从U盘开始

需积分: 0 0 下载量 65 浏览量 更新于2024-11-06 收藏 1.18MB PDF 举报
"Linux那些事儿之我是U盘"是一份详细讲解Linux系统中U盘驱动开发的教程,适合初学者入门。教程涵盖了从基础概念到实际操作的各个环节,通过丰富的例子和深入浅出的解释,帮助读者理解Linux内核、USB总线、设备驱动以及与U盘相关的存储技术。 在Linux系统中,驱动程序是连接硬件设备和操作系统内核的桥梁,对于U盘这类外部存储设备,其驱动涉及到USB总线协议、设备模型、块I/O和SCSI命令等方面。这篇教程首先介绍了USB技术的基本概念,包括USB总线的工作原理、设备分类以及驱动模型。然后,它引导读者逐步了解如何构建和编译Linux驱动模块,以及如何管理模块的加载和卸载。 教程的"变态的模块机制"部分可能涉及Linux内核模块的动态加载机制,如insmod、rmmod和modprobe等工具的使用。"想到达明天现在就要启程"和"未曾开始却似结束"等章节可能是对驱动开发过程的比喻,强调实践的重要性。"总线,设备,和驱动"系列章节详细解析了Linux内核中的设备模型,包括总线注册、设备枚举、驱动匹配等关键流程。 从协议中来,到协议中去的部分,可能讲解了USB协议的细节,包括控制传输、批量传输、中断传输和同步传输等不同类型的传输方式,以及USB设备与主机之间的通信过程。"设备花名册"可能涉及Linux中/dev目录下的设备文件管理,而"冰冻三尺非一日之寒"可能讨论了驱动开发中遇到的挑战和解决方法。 "冬天来了,春天还会远吗?"系列章节可能讲述了驱动开发过程中遇到的问题和解决方案,以及调试技巧。"通往春天的管道"和"传说中的URB"可能涉及USB设备的异步传输机制,即USB请求块(URB)的使用。"心锁"可能涉及并发访问和同步问题,"第一次亲密接触"系列则详细介绍了与硬件设备交互的过程。 "横空出世的SCSI"章节引入了SCSI(小型计算机系统接口)协议,因为许多USB存储设备通过SCSI仿真与系统通信。后续章节深入讲解了SCSI数据结构及其在U盘驱动中的应用,包括SCSI命令的构造和执行。 教程的后半部分,"彼岸花的传说"系列章节,可能通过一系列案例进一步阐述了SCSI命令在实际驱动开发中的运用,以及处理各种情况的方法。 这份教程全面覆盖了Linux环境下U盘驱动开发的关键知识,包括USB协议、内核驱动模型、SCSI接口和设备管理等内容,是学习Linux驱动开发特别是U盘驱动的宝贵资源。
2019-08-28 上传
Linux读取U盘或者移动硬盘序列号并获取U盘或者移动硬盘分区名。基本原理如下: 当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无子目录,sata硬盘默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0) 这个数字与前面 /proc/scsi/usb-storage目录中的相对应,子目录表示sata硬盘。比如 /sys/class/scsi_device/2:0:0:0/device/block 中有USB设备,从该目录下得到U盘或者移动硬盘的分区名,比如sda1。 该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬盘接入,如果有则读取u盘或者移动硬盘的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬盘的分区。 完整代码,可直接编译和测试,嵌入式环境下也是适应的。 在linux测试如下,id表示序列号,sdb1表示是分区名称: # ./a.out udisk dev num:0 udisk id:055CE21B ret:0 dev num:0 found dir:0:0:0:1 found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1 sub founction found dir:sda found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda found dir:0:0:0:2 found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2 sub founction found dir:sdb found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb found sd sub device dir:sdb1 found dir:0:0:0:0 found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0 sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory get name return:0,disk name:sdb1 # 因为有的USB设备会有好几个,比如把CD和U盘集成到一起,就会出现上面的情况,有多个子目录去查找。