UDEV规则和调试

root@wang:/work/7405/trunk2/release/vender/cdma2000/udev/etc/udev# cat udev.conf 
# udev.conf

# The initial syslog(3) priority: "err", "info", "debug" or its
# numerical equivalent. For runtime debugging, the daemons internal
# state can be changed with: "udevcontrol log_priority=".
udev_root="/dev/"
udev_rules="/etc/udev/rules.d/"
udev_log="err"
调试时将udev_log="err"改为udev_log="info" ,这样看以看到更多的日志信息。同理,debug可以看到比info更多的调试信息。
udev_root指定设备节点的位置。
udev_rules="/etc/udev/rules.d/" 指定udev规则的目录。udev会根据规则的名字依次查找,直到找到正确的规则。

写udev规则是需要使用udevinfo工具查看相关的信息:
udevinfo -q path -n /dev/sda,命令会产生一个该设备名对应的在sysfs下的路径,如/block/sda。然后,再用udevinfo -a -p /sys/block/sda,这个命令会显示一堆信息,信息分成很多块。这些信息实际来自于操作系统维护的sysfs链表,不同的块对应不同的路径。你就可以用这些信息来作为udev规则文件中的匹配项。但需要注意的是,同一个规则只能使用同一块中显示的信息,不能跨块书写规则。也可以使用一条命令udevinfo –a –p $(udevinfo –q path   –n /dev/hda)
第二种情况是,不知道系统产生的设备名,那就只有到/sys目录下去逐个目录查找了,反复用udevinfo -a -p /sys/path...这个命令看信息,如果对应的信息是这个设备的,那就恭喜你。否则就再换个目录。当然,在这种情况下,成功的可能性比较小

root@wang:/work/7405/trunk2/release/vender/cdma2000/udev/etc/udev/rules.d# cat 9-cdma2000.rules 
ACTION=="add",KERNEL=="sg[0-9]",ATTRS{idProduct}=="1446",ATTRS{idVendor}=="12d1",NAME="%k",RUN+="/usr/local/bin/usb_modeswitch -c /etc/usb-modeswitch.d/usb_modeswitch.conf"
ACTION=="add",KERNEL=="ttyUSB[0-9]",ATTRS{idVendor}=="12d1",ATTRS{idProduct}=="140c",RUN+="/etc/ppp/cdma.sh"
这个规则的意思就是如果发现内核设备名为sg0-sg9的设备,并且idProduct=="1446", idVendor=="12d1"的设备加入的话运行/usr/local/bin/usb_modeswitch -c /etc/usb-modeswitch.d/usb_modeswitch.conf 这条命令。这条命令的作用就是将KERNEL=="sg[0-9]",ATTRS{idProduct}=="1446",ATTRS{idVendor}=="12d1"属性改为KERNEL=="ttyUSB[0-9]",ATTRS{idVendor}=="12d1",ATTRS{idProduct}=="140c",这条属性。接下来符合下面的这条规则,就执行/etc/ppp/cdma.sh 脚本。

/etc/ppp/cdma.sh脚本是这样写的:
root@wang:/work/7405/trunk2/release/vender/cdma2000/pppd/etc.ppp# cat cdma.sh 
#!/bin/sh
#dial
killall pppd
mkdir -p /var/lock/
mkdir -p /var/run/
echo "\nhello pppd \n"
sleep 20 && /usr/local/bin/pppd call cdma2000&
基本上就是pppd拨号,pppd拨号是会有一些错误,会打不开 /var/lock/    /var/run/这两个目录,就手工建立了两个。然后sleep 20秒,如果不sleep的话会拨号失败,原因不明。
有一点需要注意的是在udev规则中的 可执行程序要加上路径,不然会出现找不到的情况。

 udev 键/值对操作符
操作符      匹配或赋值t                          解释
----------------------------------------
==             匹配               相等比较
!=             匹配              不等比较
=             赋值               分配一个特定的值给该键,他可以覆盖之前的赋值。
+=       赋值               追加特定的值给已经存在的键
:=             赋值                   分配一个特定的值给该键,后面的规则不可能覆盖它。 


这有点类似我们常见的编程语言,比如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 为所有的磁盘分区创建设备文件。

阅读(2598) | 评论(0) | 转发(0) |
0

上一篇:udev实现原理

下一篇:ubuntu 下 驱动开发环境

相关热门文章
  • Linux设备驱动程序学习(2)-...
  • GDB调试汇总
  • 理解和认识udev
  • udev简介
  • QEMU源码分析系列(三) ...
  • SHTML是什么_SSI有什么用...
  • 卡尔曼滤波的原理说明...
  • shell中字符串操作
  • 关于java中的“错误:找不到或...
  • linux设备驱动归纳总结...
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议

你可能感兴趣的:(嵌入式)