怎样写linux下的USB设备驱动程序

怎样写linux下的USB设备驱动程序,第1张

USB驱动程序基础在动手写USB驱动程序这前,让我们先看看写的USB驱动程序在内核中的结构,如下图:

USB驱动程序存在于不同的内核子系统和USB硬件控制器之间,USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。USB是一个非常复杂的设备,linux内核为我们提供了一个称为USB的核心的子系统来处理大部分的复杂性,USB设备包括配置(configuration)、接口(interface)和端点(endpoint),USB设备绑定到接口上,而不是整个USB设备。如下图所示:

USB通信最基本的形式是通过端点(USB端点分中断、批量、等时、控制四种,每种用途不同),USB端点只能往一个方向传送数据,从主机到设备或者从设备到主机,端点可以看作是单向的管道(pipe)。所以我们可以这样认为:设备通常具有一个或者更多的配置,配置经常具有一个或者更多的接口,接口通常具有一个或者更多的设置,接口没有或具有一个以上的端点。驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否已经安装了硬件。USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序,热插拨脚本使用它来确定当一个特定的设备插入到系统时该自动装载哪一个驱动程序。

上面我们简要说明了驱动程序的基本理论,在写一个设备驱动程序之前,我们还要了解以下两个概念:模块和设备文件。

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

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

哪个发行版支持USBFS?

已知提供USBFS支持:

Ubuntu 9.04或以上,

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

CentOS的4.8,

CentOS的5.4,

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

已知不提供USBFS支持:

Ubuntu 10.04,

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

方法1:USBFS支持

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

mount -t usbfs none /proc/bus/usb -o devmode=0666

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

none /proc/bus/usb usbfs defaults,devmode=0666 0 0

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

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

mount /proc/bus/usb

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

方法2:没有USBFS支持

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

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

SUBSYSTEM!="usb|usb_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/usb作为文件的位置。

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

mount --bind /dev/bus/usb /proc/bus/usb

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8903584.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存