更改USB设备设置

ubuntu 添加USB rules配置,实现USB设备的固定设备名称

Posted by 敬方 on September 18, 2019

更改USB设备配置

参考链接:

在嵌入式开发和其它过程中,往往会出现USB设备的接入。但是对于多个USB设备接入时,由于操作系统的ttyUSB*的动态分配原则,不同设备之间可能存在USB设备文件更新不及时的冲突。而且设备驱动和ROS的launch文件也经常需要更换ttyUSB*的设备编号配置。并且每一次需要更新设备读写权限,较为麻烦。

这里可以在Linux中通过设置USB rules配置文件的方式来进行配置,通过识别设备的芯片编号绑定将设备绑定到固定的设备文件符中。

主要流程如下:

  1. 查询设备的硬件编号。
  2. 根据硬件编号设置rules文件。
  3. 重新启动udev serveice 更新配置文件
  4. 重新插拔设备,查看设备文件符

查询设备硬件编号

一般USB设备插入,会自动分配ttyUSB*的设备编号,可以使用ls -ahl /dev/ttyUSB*查看所有的USB接口。显示内容如下

usb显示内容

也可以直接使用,如下命令查看USB设备的详细信息

udevadm info --attribute-walk --name=/dev/ttyUSB0

详细设备信息

其中ATTRS{idProduct}ATTRS{idVendor代表设备的硬件芯片信息。是操作系统内核识别设备的关键。

也可以使用lsusb命令直接查看所有设备的关键信息如下:

查看设备的关键信息

添加udev rules规则文件

参考链接: 如何在 Linux 中永久修改 USB 设备权限;ubuntu 16.04 中永久修改 USB 设备权限

设备规则文件在Ubuntu中存放在/etc/udev/rules.d/文件夹下。可以在此文件夹中添加自定义的以.rules的文件。

udev的规则的匹配关键键内容如下:

关键键 含义
ACTION 事件 (uevent)的行为,例如:add( 添加设备 )、remove(删除设备 )。
KERNEL 在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备
DEVPATH 内核设备录进,比如/devices/*
SUBSYSTEM 子系统名字,例如:sda的子系统为 block。
BUS 总线的名字,比如IDE,USB
DRIVER 设备驱动的名字,比如ide-cdrom
ID 独立于内核名字的设备名字
SYSFS{value} sysfs属性值,他可以表示任意
ENV{ key} 环境变量,可以表示任意
PROGRAM 可执行的外部程序,如果程序返回0值,该键则认为为真(true)
RESULT 上一个PROGRAM调用返回的标准输出。
NAME 根据这个规则创建的设备文件的文件名。注意:仅仅第一行的NAME描述是有效的,后面的均忽略。如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。
SYMLINK 为 /dev/下的设备文件产生符号链接。由于 udev只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev规则所产生的文件,推荐使用符号链接。
OWNER 设备文件的属组
GROUP 设备文件所在的组。
MODE 设备文件的权限,采用8进制
RUN  为设备而执行的程序列表
LABEL 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务)
GOTO 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO
IMPORT{type} 导入一个文件或者一个程序执行后而生成的规则集到当前文件
WAIT_FOR_SYSFS 等待一个特定的设备文件的创建。主要是用作时序和依赖问题。
PTIONS 特定的选项:
last_rule 对这类设备终端规则执行;
ignore_device 忽略当前规则;
ignore_remove 忽略接下来的并移走请求。
all_partitions 为所有的磁盘分区创建设备文件。

/etc/udev/rules.d文件夹下创建自定义my_usb_rules.rules文件内容如下

# ultrasonic_radar usb rules
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", SYMLINK+="ultrasonic_radar"
# imu usb rules
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", SYMLINK+="imu"

注意: 这里的ATTRS{idVendor}ATTRS{idProduct}是查询到的对应的设备地芯片的硬件值。SYMLINK+=对应的是对设备ttyUSB*生成的软连接名称。MODE是对设备权限的更改。一定要添加KERNEL=="ttyUSB*"生成软连接。否则直接生成对名称的设备号。一般的linux驱动无法识别。

重启服务查看 对应设备

当添加或者删除udev的rules文件后,都需要使用如下命令,进行设备读取rules的更新

sudo service udev reload
sudo service udev restart

然后重新插拔USB设备,就可以按照新的规则执行了。查看生成的设备文件符如下:

设备符

使用cutecom查看串口通信结果如下:

串口测试

表示能够正常使用。

注意:这里是根据设备芯片类进行的配置具有唯一性,一个规则只能配置一种设备,两个设备是同种设备时不能由设备芯片进行识别区分