以前書いたしょぼUSBパッチはzen-sourcesのkernelでも有効で、Microsoft Memory Mouse 8000のselective suspend
(選択的サスペンド、要するに省電力機能)で快適省電力生活中である。
ただサスペンドモードのデフォルトは常時ONなのでいちいち手動でautosuspend設定する必要があって、めんどくさい。
で、前からudevに自動でやらせてみようと思っていたのをやってみた。
/etc/udev/rules.d/10-mmm-early.rulesを作って、以下のように書く。
BLOCKDEVICE=="usb", SUBSYSTEMS=="usb", \
ATTRS{product}=="Microsoft Mobile Memory", NAME=""
ACTION=="add", KERNEL=="mouse?", SUBSYSTEMS=="usb", \
RUN+="/sbin/mmm-set.sh"
|
マウスが刺さったら自前スクリプトを実行する設定。
どうせusb-1.0な上に、サスペンドしてると使えないメモリはNAME=""でignore。
NAME=""としておくとデバイスノードが作られずに存在しないことになる。
レシーバを挿してもデスクトップにも出てこない。
自前スクリプトmmm-set.shの中身は以下の感じ。
#!/bin/sh
if [ "$1" = "on" ] ;then
POWER_MODE="on"
else
POWER_MODE="auto"
fi
TIMETO_SUSPEND="60"
DEVICES="
Microsoft Mobile Memory Mouse 8000
Microsoft Mobile Memory"
doWork() {
devp=`echo $device |sed 's/product$/power/'`
echo $POWER_MODE > $devp/level
echo $TIMETO_SUSPEND > $devp/autosuspend
echo $nam2
echo " set powermode to $POWER_MODE"
}
dev=`find /sys/devices/pci* -name "product"|grep usb`
for device in $dev
do
dname=`cat $device`
IFS=$'\n'
if [ "$dname" != "" ] ;then
for nam in $DEVICES
do
nam2=`echo $nam|sed 's/^\s*//g'`
if [ "$dname" = "$nam2" ] ;then
doWork
fi
done
fi
done
exit
|
udevの方からsysfsのdevpathを直接持ってこれそうなものだが、うまくいかないようなのでベタに検索実行。
中にはサスペンドするとそのまま帰ってこないUSBマウスもあるので、udevinfoかdmesgに出てくるプロダクト名で個体を限定。
これでマウス認識後、自動サスペンドモードに入るようになった。
めでたい。
唯一弱点は、充電中でもサスペンドしてしまい、今度はわざわざONにしないといけないところか。
これはさすがにドライバ内でなんとかしてもらわないとどうにもならず。