深度解析Linux USB通信技术,从驱动到协议全面了解 (linux u通信)

USB(Universal Serial Bus)是一种数据传输协议,它被设计用于连接计算机和外部设备。USB通信技术已经成为现代计算机系统的重要组成部分,特别是在嵌入式系统中具有广泛应用。在Linux系统中,USB通信技术也是一个非常重要的话题,本文将从驱动到协议全面剖析Linux系统下的USB通信技术。

一、USB通信概述

USB通信是计算机主机与外部设备之间的数据传输方式,它的特点是简单、可靠、高速、灵活、通用。USB是一种热插拔设备接口,可以连接多种不同的设备。USB设备使用一根数据线和一根供电线(或者使用HUB进行供电),该数据线可同时承载数据和供电信号。

二、USB系统架构

在Linux系统中,USB通信是由USB内核模块和一系列驱动程序组成的。USB系统由以下四个层次组成:

1.物理层:主要定义了USB数据线的电气特性和连接方式。

2.数据链路层:定义了USB数据包的格式和传输方式,并包括一个用于处理帧的CRC校验。

3.USB驱动层:负责实现USB与Linux系统的交互,并提供了一些常用的API函数。

4.USB子系统:维护着USB设备树,包括对设备的发现、枚举、分配地址、管理管道和请求等工作。

三、USB驱动开发

在Linux系统中,驱动程序是USB通信的核心部分。USB驱动的开发需要遵循以下步骤:

1.定义设备结构:USB驱动程序需要定义一个结构,该结构包含与硬件相关的信息。在Linux系统中,通常使用u_device结构体来表示一个USB设备。

2.注册驱动程序:驱动程序需要向系统注册,以便系统能够检测到设备的插入和拔出事件,并加载相应的驱动程序。

3.启动设备:驱动程序在设备被检测到时会被自动加载,此时需要执行一些初始化操作,包括打开设备、分配内存、初始化管道等。

4.实现读写函数:驱动程序需要实现读写函数,用于完成数据的传输。在Linux系统中,通常使用read、write、ioctl等标准函数来实现这些功能。

5.释放设备:当设备不再需要时,驱动程序需要释放设备,并清理内存资源。

四、USB协议

USB协议定义了USB设备和主机之间的通信方式。USB协议包括以下方面:

1.设备描述符:USB设备在连接到主机时,需要通过设备描述符向主机描述设备的功能、厂家等相关信息,以便主机正确识别设备。

2.控制传输:主机通过控制传输向设备发送控制命令,如读写设备寄存器等。

3.中断传输:用于处理不需要连续传输数据的设备。

4.批量传输:用于处理大量数据的传输,可以使用控制传输来读写数据块。

5.异步传输:可以用于流媒体数据传输等。

五、USB调试工具

在开发USB驱动时,有时我们需要对USB设备进行调试,Linux系统提供了一些方便开发人员调试的USB工具,如:

1.lsu:用于查看USB设备的详细信息。

2.cat /proc/bus/u/devices:用于查看系统中已经连接的USB设备树。

3.umon:用于监控USB设备和主机之间的通信数据。

4.Udevmonitor:用于监控USB设备树的变化。

USB通信技术是计算机系统中非常重要的一部分,Linux系统下的USB技术也是开发人员需要掌握的技能。本文从驱动到协议全面阐述了Linux下的USB通信技术,并介绍了常用的USB调试工具,希望对开发人员对于深入理解USB通信技术有所帮助。

相关问题拓展阅读:

Linux 应用层怎么对USB设备发送URB请求

uhid和umouse.c都在/usr/src/linux/drivers/hid/uhid目录下

USB 总线引出两个重要的链表!

一个 USB 总线引出两个重要的链表,一个为

USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(u

device driver)和 USB 驱动程序(u driver)。

USB 设备驱动程序(u device driver)和 USB 驱动程序(u driver)的区别是什么?

USB 设备驱动程序包含 USB 设备的一些通用特性,将与所有 USB 设备相匹配。在 USB core 定义了:struct u_device_driver u_generic_driver。u_generic_driver 是 USB 子系统中唯一的一个设备驱动程序对象。而 USB 驱动程序则是与接口相匹配,接口是一个完成特定功能的端点的。

设备是如何添加到设备链表上去的?

在设备插入 USB 控制器之后,USB core 即会将设备在系统中注册,添加到 USB 设备链表上去。

USB 设备驱动程序(u device driver)是如何添加到驱动链表上去的?

在系统启动注册 USB core 时,USB 设备驱动程序即将被注册,也就添加到驱动链表上去了。

接口是如何添加到设备链表上去的?

在 USB 设备驱动程序和 USB 设备的匹配之后,USB core 会对设备进行配置,分析设备的结构之后会将设备所有接口都添加到设备链表上去。比如鼠标设备中有一个接口,USB core 对鼠标设备配置后,会将这个接口添加到设备链表上去。

USB 驱动程序(u driver)是如何添加到驱动链表上去的?

在每个陆谨芹 USB 驱动程序的被注册时,USB 驱动程序即会添加到驱动链表上去。

比如鼠标驱动程序,u_mouse_init 函数将通过 u_register(&u_mouse_driver)

将晌族鼠标驱动程序注册到 USB core 中,然后就添加到驱动链表中去了。其中 u_mouse_driver 是描述鼠标驱动程序的结构体。

已配置状态(configured status)之后话

当鼠标的设备、接口都添加到设备链表,并且鼠标驱动程序也添加到驱动链表上去了,

系统就进入一种叫做已配置(configured)的状态。

要达到已配置状态,将经历复杂的过程,USB core 为 USB

设备奉献着无怨无悔。在这个过程中,系统将会建立起该设备的的设备、配置、接口、设置、端点的描述信息,它们分别被

u_device、u_configuration、u_interface、u_host_interface、

u_host_endpoint 结构体描述。

设备达到已配置状态后,首先当然就要进行 USB 驱动程序和相应接口的配对,对于鼠标设备来说则是鼠标驱动程序和鼠标中的接口的配对。USB core 会调用u_bus 总线的u_device_match

函数,通过比较设备中的接口信息和 USB 驱动程序中的 id_table,来初步决定该 USB 驱动程序是不是早毕跟相应接口相匹配。通过这一道关卡后,USB core 会认为这个设备应该由这个驱动程序负责。

然而,仅仅这一步是不够的,接着,将会调用 USB 驱动程序中的 probe 函数对相应接口进行进一步检查。如果该驱动程序确实适合设备接口,对设备做一些初始化工作,分配 urb 准备数据传输。

当 鼠标设备在用户空间打开时,

将提交 probe 函数构建的 urb 请求块,urb 将开始为传送数据而忙碌了。urb 请求块就像一个装东西的“袋子”,USB

驱动程序把“空袋子”提交给 USB core,然后再交给主控制器,主控制器把数据放入这个“袋子”后再将装满数据的“袋子”通过 USB core

交还给

USB 驱动程序,这样一次数据传输就完成了。

如何在linux下读写u设备的数据

Linux不直接支持NTFS文件系统,如果U盘是NTFS文件系统就无法直接挂载使用。首先用llk列出所有块设备:

llk

sd表示SCSI磁盘,后面跟a,b,c之类的字母表示第几个磁盘,字母之后再跟数茄档则字表示这个磁盘的第几个分区。大部分人只有一个硬盘,此时再接一个U盘,这个U盘就是sdb,U盘上的分区就是sdb1。除此以外,还可以根据显示的容量判断U盘设备名是sdb还是sdc。其他情况以此类推。

然后可以在用户目录创建一个u目录:(也可以根蠢袭据喜好设置在其他地方,下面的挂载地址跟着改变即可)

mkdir ~/u1

最后把U盘分区挂载到这个目录即可:(可能会提示输入密码,输入密码后回车即可)

sudo mount /dev/sdb1 ~/u1

然后就可以通过访问 ~/u1目录来访问U盘:

cd ~/u1

ls

最后要拔出U盘以前,要卸载U盘:(卸载时要退出u1目录,不然无法卸载)(可能会提示输入密码,输入密码后颤棚回车即可)

关于linux u通信的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深度解析Linux USB通信技术,从驱动到协议全面了解 (linux u通信)