准备搞一个linux系统下的BPI-BIT(CH340)板子插入检测和自动烧录,开始接触udev,之前也算是接触过,当时板子的串口芯片介入系统,普通用户权限不够,然后自动检测插入后更改读写权限。
关于udev的介绍,我看了一篇文章:Linux┊详解udev
udev 键/值对操作符
| 操作符 | 匹配或赋值 | 解释 |
|---|---|---|
| == | 匹配 | 相等比较 |
| != | 匹配 | 不等比较 |
| = | 赋值 | 分配一个特定的值给该键,他可以覆盖之前的赋值。 |
| += | 赋值 | 追加特定的值给已经存在的键 |
| := | 赋值 | 分配一个特定的值给该键,后面的规则不可能覆盖它。 |
这有点类似我们常见的编程语言,比如C语言。只是这里的键一次可以处理多个值。有一些键在udev规则文件里经常出现,这些键的值可以使用通配符(*,?,甚至范围,比如[0-9]),这些常用键列举如下:
常用udev键
| 键 | 含义 |
|---|---|
| ACTION | 一个时间活动的名字,比如add,当设备增加的时候 |
| KERNEL | 在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备 |
| DEVPATH | 内核设备录进,比如/devices/* |
| SUBSYSTEM | 子系统名字,比如sound,net |
| BUS | 总线的名字,比如IDE,USB |
| DRIVER | 设备驱动的名字,比如ide-cdrom |
| ID | 独立于内核名字的设备名字 |
| SYSFS{value} | sysfs属性值,他可以表示任意 |
| ENV{key} | 环境变量,可以表示任意 |
| PROGRAM | 可执行的外部程序,如果程序返回0值,该键则认为为真(true) |
| RESULT | 上一个PROGRAM调用返回的标准输出。 |
| NAME | 根据这个规则创建的设备文件的文件名。注意:仅仅第一行的NAME描述是有效的,后面的均忽略。 如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。 |
| SYMLINK | 根据规则创建的字符连接名 |
| OWNER | 设备文件的属组 |
| GROUP | 设备文件所在的组。 |
| MODE | 设备文件的权限,采用8进制 |
| RUN | 为设备而执行的程序列表 |
| LABEL | 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务) |
| GOTO | 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO |
| IMPORT{ type} | 导入一个文件或者一个程序执行后而生成的规则集到当前文件 |
| WAIT_FOR_SYSFS | 等待一个特定的设备文件的创建。主要是用作时序和依赖问题。 |
| PTIONS | 特定的选项: last_rule 对这类设备终端规则执行;ignore_device 忽略当前规则; ignore_remove 忽略接下来的并移走请求。all_partitions 为所有的磁盘分区创建设备文件。 |
这里面比较详细的介绍了udev的由来,也介绍了几种基本用法,但是它里面提到了查看设备信息,以便后面为设备适配做准备。
udevinfo -a -p ...
但是经过尝试和查询,在debian系发行版下面这个命令改为如下形式
udevadm info -a -p并且-p参数用起来不是很方便,需要提供在/sys/路径下面的地址,所以可以选择使用-n但是,可以省略,直接使用/dev/*这样的设备节点或者软连接的名字。
关于udevadm info的详细信息,可以使用-h参数查看帮助文件,可以看udevadm中文手册