Linux で使う P8210



★Linux インストールはあっさり過ぎるほど簡単
 Vine Linux3.2をインストールしたら、あっさりと成功。今回買ったマシンはHDは60Gを搭載していて、30Gずつにわかれていて、D:ドライブは空な ので、これをつぶしてそこにVine Linuxを入れた。
 デフォルトどうりのLilo起動でちゃんとWindowsXPとデュアルブートできた。
 一番悩んだのは、CD-RW/DVDコンボドライブがどうしてもブートCDを読んでくれなかった時だ。

 原因は「使用するときには取り除いてください」と書いてある厚紙(ヘッダ 部の輸送中の防護のた めに入れてあった)をつけたままだったからだった。

 つまり、そういう人災(原因はおまえだ>わし)がない限り、インストールはスムースに終了してしまうのである。
 今のところファイルの使用状況はこんな感じ。

fdiskによるパーティションテーブル

Disk /dev/hda: 60.0 GB, 60011642880 bytes
255 heads, 63 sectors/track, 7296 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス ブート 始点 終点 ブロック ID システム
/dev/hda1 * 1 3648 29302528+ 7 HPFS/NTFS
/dev/hda2 3649 3681 265072+ 83 Linux
/dev/hda3 3682 3812 1052257+ 83 Linux
/dev/hda4 3813 7296 27985230 f Win95 拡張領域 (LBA)
/dev/hda5 3813 4073 2096451 82 Linux スワップ
/dev/hda6 4074 5117 8385898+ 83 Linux
/dev/hda7 5118 6161 8385898+ 83 Linux
/dev/hda8 6162 7296 9116856 b Win95 FAT32


dfの出力

ファイルシステム 1k-ブロック 使用中 空き 使用% マウント場所
/dev/hda3 1035692 619432 363648 64% /
/dev/hda2 256665 10745 232667 5% /boot
/dev/hda7 8254240 3968676 3866272 51% /home
none 122876 0 122876 0% /dev/shm
/dev/hda6 8254240 1577752 6257196 21% /usr
/dev/hda8 9107944 857200 8250744 10% /dos2
/dev/hda1 29302528 3796984 25505544 13% /dos

mountの出力

/dev/hda3 on / type ext3 (rw)
none on /proc type proc (rw)
none on /proc/bus/usb type usbfs (rw)
/dev/hda2 on /boot type ext3 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda7 on /home type ext3 (rw)
none on /dev/shm type tmpfs (rw)
/dev/hda6 on /usr type ext3 (rw)
/dev/hda8 on /dos2 type vfat (rw,uid=500,gid=500)
/dev/hda1 on /dos type ntfs (ro,uid=500,gid=500)

 /dev/hda1は最初からあったntfsでフォーマットされたWindows領域。
 あまったところ(/dev/hda8)をFAT32でフォーマットして、windowsでもlinuxでも使える領域にしたんだけど、もうすこしここの 容量増やしておいた方がよかったかな。
 いきなり/homeが4G使われているが、これはこれまで使ってきたLOOXのホームディレクトリをコピーしてきたから。

 P8210は1024x600という変な解像度なので、はたしてX-Windowは大丈夫?というのが心配だったのだが、Vineの インストーラ はディスプレイの選択のメニューに、ちゃんと「LCD 1024x600」を含んでいた。で、とりあえず無事に動いている。目玉であるタッチスクリーンについてはを 見よ。

★ソフトウェアサスペンド
 Vine Linux3.2付属のカーネルは、ACPIによるソフトウェアサスペンドに対応していて、ちゃんと/etc/lilo.confに

append=" resume2=swap:/dev/hda5"

を追加してくれている(ここにはスワップに使っているデバイスが入る)。

 で、後はsoftware suspend2のダウンロードページから、サスペンドに入るためのスクリプトを手に入れるだけ。これで、

/usr/sbin/hibernate

をルート権限で実行すればサスペンドに入り、次の電源ONで元に復帰する。電源ボタンでサスペンドさせるには、 /etc/acpi/events/powerというテキストファイルを作って、

event=button/power.*
action=/usr/sbin/hibernate

と書けばよい。
 また、液晶を閉じた時にサスペンドに入るようにするには、/etc/acpi/events/lidというテキストファイルを作って、

event=button/lid.*
action=/etc/acpi/actions/lid

と書く。/etc/acpi/actions/lidの方には、

if grep -q closed /proc/acpi/button/lid/LID/state ; then
      /usr/sbin/hibernate
fi

と書く。

★なお、2.6系カーネルをコンパイルする時は

 上も書いたsoftware suspend2のダウンロードページから、カーネルのパッチをダウンロードして適用しとくとよい。Vine付属のカーネル同様のソ フトウェアサ スペンドができるようになる。

★自動ソフトウェアサスペンド?
 バッテリが少なくなったら自動でサスペンド状態に入って欲しいものだが、どうやらそこまでやってくれないらしい。「cat /proc/acpi/battery/CMB1/state」すると、
present: yes
capacity state: ok
charging state: discharging
present rate: 921 mA
remaining capacity: 2380 mAh
present voltage: 11982 mV
とか出てくる。「cat /proc/acpi/battery/CMB1/info」すると、
present: yes
design capacity: 2600 mAh
last full capacity: 2448 mAh
battery technology: rechargeable
design voltage: 10800 mV
design capacity warning: 322 mAh
design capacity low: 36 mAh
capacity granularity 1: 1 mAh
capacity granularity 2: 1 mAh
model number: CP229721
serial number: 1
battery type: LION
OEM info: Fujitsu
だそうな。で、これみるとcapacityが322mAh以下になったらwarningでも出してくれるか、あるいはstateの「capacity state: ok」が「capacity state: warning」に変わったりするのかな、と思って、とりあえずACアダプタ外してcapacityが下がるのを仕事しながら待っていたが、変わらなかっ た(;_;)。
 36mAh以下になると、「capacity state: critical」に変わった。しかし、ACPIのイベントは飛んでこなかった。
 しょうがないので、、、、、

colortimer

 というつまんないスクリプトを作ってみる。どういうスクリプトかというと、ACPIでバッテリの状態をチェックして、「あと6分でバッテリが切れる」と いう状況 だとわかったらカラータイマーを鳴らす(と言っても音だけ。音がぴこんぴこんぴこんとなる)。
 少しずつ音のテンポが遅くなりつつ、20回鳴らし終わって状況が変化してなかったら/usr/sbin/hibernateする。途中でACアダプタが つながれたと判断したらそのまま復帰する。
 ただ、これだけのもの。これを/usr/local/bin/colortimer.shとしてインストールしておいて、rootで 「crontab -e」して

0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * /usr/local/bin/colortimer.sh

と入力しておくと、3分ごとにこいつが起動される。

 前にはここでC++の恥ずかしいソースファイルが公開してあった(一応、今もここに残すだけ 残しておく)のだが、それはもうやめて、今後はbashスクリプト版を公開することにする。も しかして「俺も使ってみよ」という奇特な方がおられたとしても、bashスクリプトの方が移植しやすかろう。
 それぞれの環境向けに変更すべきところを書いておくと、まず最後の方の、

          if [ $i -lt 10 ]; then
              j=$(( $i+2 ))
              /usr/bin/play -v$j /dos2/Waves/PikonPikon.wav 2>/dev/null
          else
              j=$(( 30000- 1000*$i ))
              /usr/bin/play -v3 -r$j /dos2/Waves/PikonPikon.wav 2>/dev/null
          fi
      fi
      isdischarging
      if [ $isdischarge -eq 0 ]; then
          wall AC Power is recoverd.
          exit
      fi
      i=$(( $i+1 ))
    done
    /usr/sbin/hibernate
fi

の赤字の部分。/dos2/Waves/PikonPikon.wavな んてファイル名があるが、ここを「いかにも電池が切れかけてますよと知らせているような音」に変えましょう。
 あと、その少し上に

if [ -f /proc/acpi/video/GFX0/LCD/brightness ]; then
    if [ $charging -eq 0 ]; then
        if [ -f /etc/colortimer/blightness ]; then
            echo `cat /etc/colortimer/blightness` > /proc/acpi/video/GFX0/LCD/br
ightness
        else
            echo 5 > /proc/acpi/video/GFX0/LCD/brightness
        fi
    else
        echo 8 > /proc/acpi/video/GFX0/LCD/brightness
    fi
fi

という部分があります。ここでは、ACアダプタがつながれていたら液晶画面の明るさを8(最大)に、つながれてなかったら明るさを5に、もしくは /etc/colortimer/blightnessというファイルの内容(「3」とか「7」とか、適当な数字一文字が書き込まれたファイルを作ってく ださい)にしてます。この辺りもお好みで書き換えてみてください。
 なお、/etc/colortimer/blightnessをrootでなくても書き換えられるようにしておくと、その時の状況で明るい暗いの調整が (sudoしなくても)できるので楽です。

★ 液晶の明るさを変える
 液晶の明るさを変えるボタン(Fn+F6,Fn+F7)はLinuxでは効きません。

 echo 8 > /proc/acpi/video/GFX0/LCD/brightness

とやると最大の明るさになります(カーネルがちゃんとACPI対応してれば)。
 数を減らせばその分暗くなります。新しいcolortimer.shはAC アダプタが接続さ れているかどうかを判断して変えるようにしました。


★ペンが使えるようになり ました
 何人かの方に教えてもらいつつもなかなか成功してなかったんですが、やっとペンが使えるようになりました。

 最終的に、以下のような情報を大内さんという方からいただいた。
1. Touchscreenの有効化
まず http://www.conan.de/touchscreen/p-series.html
のサイトから最新のバイナリをもらってきます。
http://stz-softwaretechnik.com/~ke/touchscreen/fujitouch-0.6.3.tar.gz

展開するとfujitsu_drv.oがありますので、/usr/lib/xorg/modules/inputにコ
ピーします。

それから同梱のstylusスクリプトを/etc/init.dにコピーしておきます。

ここが重要なのですが、最近のLinuxは高速起動なる機能がついていて
/etc/rc.localに書かれたスクリプトはXの起動後に呼ばれるようです。

そこで、Xの起動前に呼ばれる /etc/rc.sysinitの最後に

/sbin/service stylus start

という行を追加します。
(わしはXは起動後にstartxで立ち上げているので、このあ たりの作業はいらな かった。/etc/rc.localに

/etc/rc.d/init.d/stylus start

を書いておいた)。

あとは/etc/X11/xorg.confの"ServerLayout"セクションに

InputDevice "touchscreen" "CorePointer"

を追加、別の場所に

"InputDevice"セクションとして

Section "InputDevice"
Identifier "touchscreen"
Driver "fujitsu"
Option "Device" "/dev/ttyS0"
Option "DeviceName" "touchscreen"
Option "MinX" "82"
Option "MinY" "146"
Option "MaxX" "4036"
Option "MaxY" "3999"
EndSection

を追加してシステムを再起動したら使えるようになりました。

うちの マシンの場合、MaxXは4006ぐらいが適当だった。個体差?それともWindowsでの調整が生きている??

2. LCD解像度の変更
ついでと言ってはなんですが、こいつはLCD画面が1024x600と変則的ですので、
855resolutionというツールでVIDEO BIOSの設定を書き換える必要がありました。
http://perso.wanadoo.fr/apoirier/

実際のコマンドとしては、こんな感じ…
/usr/local/sbin/855resolution 54 1024 600

このコマンドも/etc/rc.sysinitに書く必要があります。

わしは↑これやってないけど、ちゃんと動いて いるからまぁいいや。

あとは、/etc/X11/xorg.confの"Screen"セクションにモードを追加するだけです。

Modes "1024x600" "800x600" "640x480"

以上です。

 なお、同様の情報は前にももらったことがあったし、御紹介いただいたページも読みに行ってはいたのだが、成功しなかったので報告しなかった。今回自分の これまでの悪戦苦闘の後をいったん消去して上の通りにやりなおしてみたら成功した。
 どうも/etc/X11/xorg.confに余計なことを書いていたんではないかと思う。
 とりあえず、なんとかなってよかった。もっとも、最近Linuxを使わずCoLinuxばかり使っていたので、久々に使うととまどうことばかり (^_^;)。

★ヴォリュームボタン
 P8210にはファンクションキーの部分には[Fn]キーと同時押しすることで音声ミュートしたり、トラックポイントのマウス機能を殺したり、画面を明 るくしたり暗くしたり、音量を上げたり下げたりするボタンになるキーが並んでいる。ところが、Linuxからはこのボタンのキーのうち、ミュート、音量上 下、画面の明度上下のボタンが効かない。xevで調べてみると、(たぶん、カーネルにイベントドライバが組み込んでいれば)ミュートと音量上下については ちゃんとXのキー押しとキー離しのイベントが飛んでくる。というわけで、/etc/X11/xinit/Xmodmap.jpと、 /etc/X11/xinit/Xmodmapに、
keycode 176 = XF86AudioRaiseVolume ←音量アップボタン(aumix -w +10)
keycode 174 = XF86AudioLowerVolume ←音量ダウンボタン(aumix -w -10)
keycode 160 = XF86AudioMute     ←ミュートボタン (aumix -w 0)
を追加。これで、例えば音量アップボタンが押されると「XF86AudioRaiseVolumuが押されたよ」とXに連絡が行くようになる。後は、ウィ ンドウマネージャーの設定(わしの場合、WindowMakerを使っているのでwmakerconf)で、上の最後の括弧にあるコマンドを実行するよう にショートカットキーを設定する。 ミュートがトグルになってないのが残念だが、ミュート復帰するためには、ミュートする前にどんな音量だったかをどっかに覚えておかないといけないみたい だ。
 残念なのは画面の明暗調整ボタンはevent飛んでこないんだよな。これはどうすればいいのやら。

★Linuxと Windowsで安全にサスペンドするために
 LinuxとWindows両方にサスペンド機能があるわけだが、どっちもファイルをキャッシュしてたりするので、

Linuxでサスペンド→Windowsを起動してファイルをごにょごにょ→Windowsサスペンド& rarr;Linux復帰

なんてことをやると、悲惨なことになりそうである(つーか、昔なったことがある)。

 そうならないためには、Linuxで起動してサスペンドに入った時にはデフォルトでLinuxが起動し、そうでない時はデフォルトでWindowsが起 動するようにしておいた方がよい。そこで、

/etc/rc.localに

/sbin/lilo -D linux

と書いておく。これで、Linuxで起動した時にはLinuxがデフォルトになる。

 一方、/etc/rc.d/init.d/haltの最初の方に

/sbin/lilo -D windows

と書いておくと、シャットダウンする時にデフォルトをWindowsにしてくれる。どっちの場合も、プロンプトが出ている時に選べばデフォルト以外を起動 することも可能(当然、/etc/lilo.confにwindowsとlinuxというラベルをもったエントリがあること)。

★無線LAN
 我が家の無線LANアクセスポイントではWPA-PSK(TKIP)を使ってます。この状態で無線LANを動かすには、

・madwifiをインストールする。
・wpa_supplicantをインストールする。

の二つが必要らしいです。P8210の無線LANチップはAtherosのもので、これに対応した無線LANソフトがmadwifi。http://snapshots.madwifi.org/か ら、madwifi-ng-current.tar.gzを取ってきて展開してmake、make install。これで無線LAN用のモジュールが/lib/module/2.x.x/net/以下に作られます(以下のモジュール)。

ath_hal.ko          wlan.ko       wlan_scan_ap.ko   wlan_wep.ko
ath_pci.ko          wlan_acl.ko   wlan_scan_sta.ko  wlan_xauth.ko
ath_rate_sample.ko  wlan_ccmp.ko  wlan_tkip.ko

 次にwpa_supplicantのインストール。http://hostap.epitest.fi/wpa_supplicant/に 行ってwpa_supplicantのソースを取ってきます(私はwpa_supplicant-0.4.9.tar.gzを使用)。
 これを展開してmakeしますが、make前に.configの

#CFLAGS += -I../madwifi/wpa

の行の#を取って、

CFLAGS += -I../madwifi-ng-r1647-20060619/

などのように、 さっきコンパイルしたmadwifiのソースディレクトリを刺すように(取ってきたmadwifiのバージョンによってディレクトリ名は違うはず)書き換 えます。あとはmake, make installでおっけい。

 wpa_supplicantのインストールが終わったら、

wpa_passphrase essid passphrase

とやる(essidとpassphraseはアクセスポイントに設定したものと同じものにする)と、

network={
        ssid="essid"
        #psk="passphrase"
        psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

のように出力されます。これをメモって(カット&ペーストでいい)おき、/etc/wpa_supplicant.confに、

network={
       scan_ssid=0
       proto=WPA
       key_mgmt=WPA-PSK
       pairwise=CCMP TKIP
       group=CCMP TKIP WEP104 WEP40
        ssid="essid"
        #psk="passphrase"
         psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

と書きます(xxxxxの部分にはもちろん、上で出力された内容をコピーする)。

 あと、/etc/sysconfig/network-scripts/ifcfg-ath0に、

DEVICE=ath0
BOOTPROTO=none
BROADCAST=192.168.0.255
IPADDR=192.168.0.41
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.1
ONBOOT=no
ESSID="essid"
MODE="Managed"
USERCTL=no
TYPE=Wireless
PEERDNS=yes
CHANNEL=2
WPA=yes
IWPRIV="mode 3"

と書いた(うちではlocalのIPアドレスは固定でやっている。192.168.0.1は外へつながるゲートウェイ)。

 これで準備は終わったので、

#!/bin/bash
wpaid=`/sbin/pidof wpa_supplicant`
until [ -z "$wpaid" ]; do
 kill -9 $wpaid
 wpaid=`/sbin/pidof wpa_supplicant`
done
/sbin/modprobe wlan_wep
/sbin/modprobe ath_pci
/sbin/modprobe wlan_tkip
/sbin/modprobe wlan_scan_ap
/sbin/ifdown ath0
/sbin/ifup ath0
COUNTER=6
until [ $COUNTER -lt 0 ]; do
 apex=`iwlist ath0 ap | grep xx:xx:xx:xx:xx:xx`
 if [ -n "$apex" ];
 then
  wall connect to my home WLAN!!
  /usr/local/sbin/wpa_supplicant -Dmadwifi -iath0 -c/etc/wpa_supplicant.conf -B
  exit
 fi
 apex=`iwlist ath0 ap | grep XX:XX:XX:XX:XX:XX`
 if [ -n "$apex" ];
 then
  wall connect to my labo WLAN!!
  /usr/local/sbin/wpa_supplicant -Dmadwifi -iath0 -c/etc/wpa_supplicant.conf2 -B
  exit
 fi
 let COUNTER-=1
 sleep 10
done

というスクリプトを用意しました。無線LANを使いたい時にこのスクリプトを実行します。まず、

wpaid=`/sbin/pidof wpa_supplicant`
until [ -z "$wpaid" ]; do
 kill -9 $wpaid
 wpaid=`/sbin/pidof wpa_supplicant`
done

の部分で、今動いているwpa_supplicantを(動いている奴全部)殺してます。

/sbin/modprobe wlan_wep
/sbin/modprobe ath_pci
/sbin/modprobe wlan_tkip
/sbin/modprobe wlan_scan_ap
/sbin/ifdown ath0
/sbin/ifup ath0

の部分では必要なモジュールをロードした後、

apex=`iwlist ath0 ap | grep xx:xx:xx:xx:xx:xx`
 if [ -n "$apex" ];
 then
  wall connect to my home WLAN!!
  /usr/local/sbin/wpa_supplicant -Dmadwifi -iath0 -c/etc/wpa_supplicant.conf -B
  exit
 fi

の部分で、IDがxx:xx:xx:xx:xx:xxなアクセスポイントがあるかどうかを判定し、もしあったらwpa_supplicantを実行しま す。次の部分では別のIDのアクセスポイントがあるかどうか判定し、存在しているアクセスポイントに対応したconfファイルで wpa_supplicantを起動するように書いてます。

 私はこれを/usr/local/sbin/wlansetupとしてchmod +xしたものをおいて置いて、無線LANが使いたい時に実行するようにしてます。あるいは、/etc/hibernate/common.confに、

OnResume 20 /usr/local/sbin/wlansetup

と書いておくと、レジュームするなりこれを実行してくれます。なお、レジュームした時に近所にアクセスポイントがないと、探し回る分だけXWindowの レジュームが遅れますが、そういう時はctl+ALT+F7でXの仮想コンソールに戻ることができます。

  サスペンド・レジュームする時は無線LANを一端止めた方がよさそうなので、 /etc/hibernate/hibernate.conf  に、

UnloadAllModules yes

と書いておきます(これでサスペンド時に全てのモジュールをunloadする)。これは、UnloadModules ath_pci だけでもよかったかも。

 これで、無線LANの使える場所(この場合自宅なんですが)にきたら/usr/local/sbin/wlansetupを実行すると無線LANが使え ます。

★W-ZERO3をモデムとして使う
 カーネル2.6.19(どのバージョンからサポートされているのかは調査してないので、これより 古くても大丈夫かも)のmenuconfigで、Device drivers -> USB support -> USB Serial Converter support -> USB PocketPC PDA Driver をONにしておいてカーネル構築します。そうしておいて、W-ZERO3の方の設定 -> 接続 -> USB接続 で「モデムとして使う」を選んでおいてから差し込むと、dmesgに

usb 2-1: configuration #1 chosen from 1 choice
ipaq 2-1:1.0: PocketPC PDA converter detected
usb 2-1: PocketPC PDA converter now attached to ttyUSB0

というメッセージが現れます。
 これでデバイス名はttyUSB0だとわかったので、kpppのモデムデバイスに/dev/ttyUSB0を設定すればよし。kpppの「モデムの調 査」で調査すると、ちゃんと「RX410IN」と、W-SIMの機種名が返ってきます。
 なお、「モデムコマンド」の一番下の「ボリューム オフ/小/大」が「M0L0」「M1L1」「M2L2」のようにL*がついていてたら、外しておきま しょう。このコマンドのせいでエラーになります。

 なお、モデムとして使った後、ZERO3の方の設定を「PCと同期する」の方に戻そうとすると、グレーになって戻せないという現象が発生しましたが (^_^;)、ソフトウェアリセットしたら戻すことが可能になりました。

★SDカードを使う
 これもW-ZERO3を買ったからなんだけど、SDカードがLinuxからも使えると便利だな、と思ったのでやってみました。やはりカーネル 2.6.19のDevice drivers -> MMC/SD Card support ->Secure Digital Host Controller Interface support をONにしてカーネル構築。

 これでSDカードを刺した後、

mount /dev/mmcblk0p1 -t vfat /mnt/SD

とかすると/mnt/SD(このディレクトリは適当に自分で作る)にSDカードがマウントされます。
 /etc/fstabに、

/dev/mmcblk0p1          /mnt/SD                 vfat    defaults,uid=500,gid=5000 0

とか書いておくと、uidが500のユーザ(わしの場合、わし本人)からも読み書き自由になるはず。