深入探究Linux USB驱动的实现原理 (linux u驱动)

在现代计算机系统中,USB(Universal Serial Bus)设备已经成为了必不可少的部分。USB设备能够向计算机系统提供大量的外围设备,包括存储设备、网络设备、声卡等等。而这些设备的驱动都由计算机系统来承担。在Linux系统中,USB设备的驱动由USB驱动程序来实现,本文将。

一、USB的基本概念

USB是一种新型的串行总线,它是一种供应商和设备之间的通信协议。USB通过在设备和主机之间的连接线上传递电信号来进行通信。与传统的串口(RS-232)相比,USB具有更快的传输速率、更简单的物理连接方式和更可靠的数据传输。USB总线可以支持多达127个设备在一个USB主机上运行。

二、Linux USB系统架构

Linux USB的总体架构是在Linux内核中实现了一个USB子系统,用于处理USB设备的连接和驱动。USB子系统包括USB核心层、USB设备层和USB设备驱动层三个组件。

USB核心层包括了USB总线驱动和USB核心模块。USB总线驱动对USB总线进行枚举、配置和管理;USB核心模块用于实现USB设备的注册、设备驱动的注册等。

USB设备层由USB设备驱动模块和USB驱动模块组成。USB设备驱动模块用于向系统中提供设备特定的控制,例如USB设备的端点描述符、设备功能、USB设备协议等。USB驱动模块则用于管理USB设备的IO请求,包括读、写、控制、同步波动等操作。

USB设备驱动层包括了不同类型的USB设备驱动,当系统检测到一个特定类型的USB设备时,会自动加载相应的设备驱动程序,从而使得这个设备可以正常地工作。

三、USB驱动程序

USB设备驱动程序是USB子系统的核心组件,它用于将USB设备与Linux内核相连接。USB设备驱动程序可以分为三种类型:HCD驱动、USB主机控制驱动和USB设备驱动。

HCD(Host Controller Driver)驱动是用于控制USB主机控制器和USB总线的驱动程序。HCD驱动程序是USB总线驱动程序的组成部分,它的主要作用是向USB总线产生唯一的信号用于控制USB设备间的通讯。

USB主机控制驱动用于提供直接对USB设备进行控制的API,通常由系统中的第三方设备驱动提供支持。USB主机控制驱动是USB设备的入口,它允许在USB总线上添加、删除和更新USB设备。

USB设备驱动程序是用于连接Linux内核和USB设备的驱动程序。有许多种类型的USB设备,它们各有不同的属性和特点。因此USB设备驱动程序必须是特定于某个USB设备的。当Linux内核探测到某个USB设备时,它会自动调用相对应的驱动程序,从而实现对设备的控制和管理。

四、USB驱动程序的注册

在Linux中,USB驱动程序是通过USB设备驱动模块来实现的。USB驱动程序可以注册到USB子系统的设备驱动列表中,当Linux内核检测到一个USB设备时,它将自动调用相应的USB驱动程序。

注册USB驱动程序的一般流程包括以下几个步骤:

1. 定义USB驱动程序结构体

struct u_driver {

const char *name;

};

2. 初始化USB驱动程序

static struct u_driver my_driver = {

.name = “my-driver”,

}

3. 注册USB驱动程序

static int __init my_driver_init()

{

return u_register_driver(&my_driver);

}

四、USB设备的操作

在Linux中,USB设备的操作通常通过USB设备驱动程序进行。USB设备驱动程序是特定于某个USB设备的,因此需要对每个不同的USB设备编写不同的驱动程序。

USB设备驱动程序的功能包括为USB设备分配内存、初始化USB设备、读/写数据传输、中断处理等。下面是一些常用的USB设备驱动程序的函数:

1. probe函数:用于识别USB设备,若识别成功则返回0,否则返回错误码。

static int u_device_probe(struct u_interface *interface, const struct u_device_id *id)

{

return 0;

}

2. disconnect函数:用于移除USB设备。

static void u_device_disconnect(struct u_interface *interface)

{

}

3. ioctl函数:用于控制USB设备的一些参数,例如设备状态、电源状态、波特率等。

static int u_device_ioctl(struct u_interface *interface, unsigned int code, void *buf)

{

return 0;

}

4. write函数:用于向USB设备写入数据。

static ssize_t u_device_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)

{

return count;

}

5. read函数:用于从USB设备读取数据。

static ssize_t u_device_read(struct file *file, char __user *buf, size_t count, loff_t *offset)

{

return count;

}

五、

本文介绍了Linux USB驱动的实现原理,包括USB的基本概念、Linux USB系统架构、USB驱动程序和USB设备的操作。,可以帮助我们更好地了解Linux操作系统的原理和机制。

相关问题拓展阅读:

如何在Linux开发工具中启动USB驱动程序

USB驱动程序支持在原生Linux提供了。

方法要求启用驱动,但是,取决于你所使用的分布和内核版本。

哪个发行版支持USBFS?

已知提供USBFS支持:

Ubuntu 9.04或以上,

Ubuntu 9.10的内核2.6.31-19服务器,

CentOS的4.8,

CentOS的5.4,

一般情况下,任何分布用内核版本 = 2.6.32

方法1:USBFS支持

如果你的发行版提供了USBFS支持,那么下面的命令将工作斗弊模:

mount -t ufs none /proc/bus/u -o devmode=0666

为了使这种更改永久,确保下面一行是在/ etc / fstab文件中:

none /proc/bus/u ufs defaults,devmode=

这将自动安装在系统启动。

一旦 /etc/fstab添加已经做完,一个简单的命令应该挂载USBFS文件系统:

mount /proc/bus/u

无论是FTDI / XTAG和XTAG-2的调试适配器空缓现在应该工作。

方法2:没有USBFS支持

为了确保在任何一个FTDI / XTAG或XTAG-2调试适配器插入时的权限是在设备上是正确的,您需要配置“udev”来识别这个设备。

创建一个文件“/etc/udev/rules.d/99-xmos.rules”,其内容如下:

SUBSYSTEM!=”u|u_device”, GOTO=”xmos_rules_end”

ACTION!=”add”, GOTO=”xmos_rules_end”

# 20b1:f7d1 for xmos xtag2

ATTRS{idVendor}==”20b1″, ATTRS{idProduct}==”f7d1″, MODE=”0666″, SYMLINK+=”xtag2-%n”

# 20b1:f7d3 for xmos startkit

ATTRS{idVendor}==”20b1″, ATTRS{idProduct}==”f7d3″, MODE=”0666″, SYMLINK+=”startkit-%n”

# 0403:6010 for XC-1 with FTDI dual-uart chip

ATTRS{idVendor}==”0403″, ATTRS{idProduct}==”6010″, MODE=”0666″, SYMLINK+=”xc1-%n”

LABEL=”xmos_rules_end”

注意:本ATTRS,MODE和SYMLINK节必须全部在同一行,因为每个规卜清则只能在一行上。

现在告诉udev进行重新加载,以确保文件添加新的规则:

service udev reload

还必须拔下并重新插上USB线,让udev的识别设备的新规则。或者触发重新插上的udev类型为“udevadm触发”或“udevtrigger”命令,取决于在你的Linux分布上udev的版本。

FTDI / XTAG其他注意事项

FTDI的库需要USB设备的文件都可以从/ proc /bus/ USB,不支持的/dev/bus/u作为文件的位置。

但是,如果你的发行版不支持USBFS(以上方法1),但确实有一个的/proc/bus/u空目录,你可以使用下面的绑定mount命令的解决方法:

mount –bind /dev/bus/u /proc/bus/u

如果你的发行版不支持USBFS,也没有一个的/proc/bus/u目录(这是较新的内核的情况下,大约从2.6.32开始),然后联系XMOS的rthe设备库的非官方补丁的版本; 发送XMOS的支持标签,其中包括“Linux的FTDI库请求”的主题。

请问Linux内核里,USB键盘和鼠标的驱动都是哪些文件?

USB鼠标薯扮驱动数隐灶在内核位置:kernel2.6.35.11/driver/hid/uhid/umouse.c

USB键盘驱动在内核位置:携扒kernel2.6.35.11/driver/hid/uhid/ukbd.c

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 驱动程序,这样一次数据传早毕输就完成了。

lspci可以看你的u情况携谈,lod 查查加载的模块,应该是u什么什么的,

驱动应该是在/lib/modules/内核版本/kernel/drives/u下,

当然另外辩悉碰还要mousedev模块吧。

我只是提供个思路,也没有试过安装

linux u驱动的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux u驱动,深入探究Linux USB驱动的实现原理,如何在Linux开发工具中启动USB驱动程序,请问Linux内核里,USB键盘和鼠标的驱动都是哪些文件?的信息别忘了在本站进行查找喔。


数据运维技术 » 深入探究Linux USB驱动的实现原理 (linux u驱动)