学习了一下Openwrt的热插拔机制,编了个脚本在Widora-NEO上试验,可以实现自动播放U盘中的MP3文件,在播放的时候热插拔一下,居然也OK.
分享一下代码,一般第一个u盘的设备名总是sda, 在/etc/hotplug.d/block目录下建立一个名称为20-usb-storage的脚本文件,内容如下:
usbdev="sda"
case "$ACTION" in
add)
if [ -b "/dev/$usbdev" ]; then
mkdir /mnt/music
mount /dev/$usbdev /mnt/music
ls /mnt/music/*.mp3 >/mnt/mp3.list
screen -dmS MPLAYER mplayer -slave -input file=/mplayer/slave -playlist /mnt/mp3.list
fi
;;
remove)
if [ ! -b "/dev/$usbdev" ]; then
rm -r /mnt/music
fi
;;
esac
保存好文件后就会立即生效,可以拿个U盘来试验下。播放器可以根据自己喜好选择, 用mplayer的好处就是可以在slave模式下对其进行各种控制。
同样原理, 鼠标插拔的事件也可以被检测到,并启动自己的相关程序,不过这个相关脚本要放在/etc/hotplug.d/usb目录下。
使用udev的时候发现一个问题,hid目录下的热插拔脚本会被执行2次,看来udev和hotplug有重复的部分。
-------------- 用鼠标滚轮控制音量 --------------
参考了网上“Linux鼠标数据读取操作”的文章,稍做修改就可以用来调节alsa播放的音量大小了。
mouse的默认驱动是没有鼠标滚轮数值的,你需要增加下面的代码,将鼠标设置为Miscrosft Intellimouse类型鼠标:
… …
unsigned char setbuf[6]={0xf3,200,0xf3,100,0xf3,80};
… …
/* set mouse type to Miscrosft Intellimouse */
nwrite=write(fd,setbuf,6);
参考: https://github.com/widora/ctest/blob/master/readmouse.c
把编译出来的readmouse程序放在上面的鼠标热插拔脚本里面,就会自动加载了。用鼠标滚轮来调节音量, 手感还真不错!
另外,你也可以把左/右/中按键分别用来控制后退/前进/暂停操作,使用起来也很方便。
如果你使用无线鼠标的话就相当于一个遥控器了。
!
------------- 鼠标的热插拔脚本 ------------
鼠标的热插拔脚本本来放在usb目录下,后来觉得放在hid (Human Interface Device) 目录下比较恰当。
- 修改/etc/hotplug.json文件,在SUBSYSTME设置中增加hid ,见下:
...
[ "if",
[ "eq", "SUBSYSTEM",
[ "net", "input", "hid", "usb", "usbmisc", "ieee1394", "block", "atm", "zaptel", "tty", "button" ]
],
[ "exec", "/sbin/hotplug-call", "%SUBSYSTEM%" ]
],
...
完成后需要重启一下widora。
- 在/etc/hotplug.json目录下建立一个hid目录,在其中建立一个 名为readmouse的文件,内容如下:
case "$ACTION" in
add)
if [ "$HID_NAME"x = "Logitech USB-PS/2 Optical Mouse"x ];then
#--------- 以是鼠标数据的处理程序
screen -dmS READMOUSE /home/readmouse /dev/input/mouse0
fi
;;
remove)
if [ ! -c "/dev/input/mouse0" ];then
killall readmouse
fi
;;
esac
HID_NAME根据你的鼠标具体设置。
- 插拔一下鼠标试验一下。
另外,发现放在hid目录里的脚本在开机的时候也能自动加载,当然,前提是你的usb设备已经插入了。
做了2点改进:
- 自动获得设备名。
- 拔出时自动kill掉相关进程。
case "$ACTION" in
add)
if [ -b "/dev/$DEVNAME" ]; then
mkdir /mnt/music
mount /dev/$DEVNAME /mnt/music
ls /mnt/music/*.mp3 >/mnt/mp3.list
screen -dmS U_MPLAYER mplayer -slave -input file=/mplayer/slave -playlist /mnt/mp3.list
fi
;;
remove)
if [ ! -b "/dev/$DEVNAME" ]; then
sync
runpid=`pgrep -f U_MPLAYER`
kill $runpid
rm -r /mnt/music
fi
;;
esac