日記ブログ、または雑多なメモ
2008年3月17日

USB mouse auto selective suspend @ LinuxX31





 以前書いたしょぼ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にしないといけないところか。 これはさすがにドライバ内でなんとかしてもらわないとどうにもならず。


コメント欄
(投稿なし)

コメントなどありましたらこちらからどうぞ
名前
内容
 ※名前、内容ともに入力必須です
- C'sGallery Blogっぽく見えるシステム3.2 -
小武 (管理人) eta2@tim.hi-ho.ne.jp