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 为所有的磁盘分区创建设备文件。

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(2598) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Linux 中调试串口并不是很难,你可以使用许多不同的工具来实现。 如果你想在 Linux 中调试串口并在调试器连接到串口时触发脚本,你可以使用 inotifywait 命令。这个命令可以让你在文件系统事件发生时执行命令。 例如,你可以使用以下命令来监控串口文件,并在调试器连接到串口时触发脚本: ``` inotifywait -e create /dev/ttyS0 | while read path action file; do /path/to/script.sh done ``` 你也可以使用其他工具,比如 udev 或者 systemd 等,来实现类似的功能。 ### 回答2: Linux调试串口被连接时,可以通过编写脚本来触发一系列动作。脚本可以使用如下步骤实现: 1. 首先,可以使用udev规则来监控串口设备的连接和拔出事件。可以创建一个udev规则文件,并将其保存在`/etc/udev/rules.d/`目录下。规则文件可以定义一个触发器,当串口设备被连接时,会执行一个自定义的脚本。 2. 在自定义脚本中,可以编写一些需要执行的命令。例如,可以检查串口设备的状态,如是否已打开或是否可访问。 3. 接下来,可以在脚本中添加某些操作,如打开特定的串口终端来进行数据通信,或者对串口进行设置,如波特率、数据位、停止位等等。 4. 如果需要与其他应用程序进行通信,可以在脚本中使用命令行工具或编程语言来实现串口通信。可以发送和接收数据,以及与其他设备或系统进行交互。 5. 如果需要保存或处理串口数据,可以在脚本中添加相应的函数或命令来记录、处理或传输数据到其他位置。 总之,通过编写脚本,可以在Linux中实现对串口设备连接事件的监控和响应。根据具体需求,可以自定义脚本来执行各种操作,如检查设备状态、串口设置、通信和数据处理等。这样可以实现更灵活和自动化的串口调试过程。 ### 回答3: 在Linux系统上,要调试串口被连接时触发脚本,可以使用udev规则来实现。udev是Linux系统下的一个设备管理机制,它可以监测和控制硬件设备的插入和拔出操作。 首先,我们需要创建一个udev规则文件,在终端中使用以下命令创建一个规则文件: sudo nano /etc/udev/rules.d/99-serial-port.rules 然后,在打开的文本编辑器中,添加以下内容: ACTION=="add", KERNEL=="ttyUSB*", RUN+="/path/to/script.sh" 其中,ACTION=="add"表示当设备被插入时触发规则,KERNEL=="ttyUSB*"表示匹配以ttyUSB开头的设备名,RUN+="/path/to/script.sh"表示执行脚本文件。 保存并关闭文件。 接下来,我们需要编写一个具体的脚本文件来执行我们想要的操作,可以使用任何喜欢的脚本语言,比如Bash。以下是一个示例的Bash脚本: #!/bin/bash echo "Serial port connected!" >> /tmp/serial_log.txt 在脚本中,我们简单地向/tmp/serial_log.txt文件中写入一条日志信息,表示串口被连接了。 保存并退出脚本文件。 最后,为了使新的udev规则生效,我们需要重新加载udev服务。在终端中使用以下命令重新加载udev: sudo udevadm control --reload 现在,当串口被连接时,udev规则会自动触发我们的脚本,执行脚本中的操作。在我们的例子中,会向/tmp/serial_log.txt文件中写入一条日志信息。你可以根据自己的需求修改脚本来执行其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值