Archives

October 2009 の記事

SD ブートで好きなだけ実験できる環境が出来たので次はカーネルをカスタマイズします。

●仮想マシン

Windows に VirtualBox をインストール。
あらかじめ Ubuntu 9.04 のインストール iso をダウンロードしておく。

VirtualBox で仮想マシンを [新規] 作成

OS タイプ: Linux
バージョン: Ubuntu または Ubuntu (64bit)
(64bit 仮想マシンに 32bit OS を入れてもかまわない)

RAM 適量 (HOST PC の RAM 容量と相談)
可変容量で新規ディスク作成 20GB くらい

仮想マシンが出来たらいったん [設定] を開く

[設定]
→ ネットワーク
  アダプタの割り当てを「NAT」から「ブリッジアダプタ」に変更

→ CD/DVD-ROM
 CD/DVD ドライブのマウント→iso イメージファイル
 仮想メディアマネージャーからダウンロードしておいた ubuntu の iso を選択
  ubuntu-9.04-desktop-i386.iso や ubuntu-9.04-desktop-amd64.iso 等

VirtualBox の「ファイル」→「環境設定」を開いてホストキーの確認
 入力 の中の ホストキー
 必要なら変更しておく。特にキーボードに右 ctrl キーがない場合は要変更。

作成した仮想マシンを起動して ubuntu をインストール。
右 Control キー、または設定したホストキーでマウスが HOST 側に戻る。
パーティショニングは「ディスク全体を使用する」にしておく。


●クロスコンパイル

下記ページを参考にさせていただきました。

ひまじめ 組み込みLInux

「ARMクロス開発環境構築」の手順に従い ARM EABI (armel) 用ツールをインストール。
設定したら gcc-4.3-arm-linux-gnueabi binutils-multiarch を入れます。
クロス開発用ライブラリはここでは不要です。

$ sudo apt-get install gcc-4.3-arm-linux-gnueabi binutils-multiarch libncurses5-dev

次は「ARM用Linuxカーネルをソースからビルドする」を参照します。
libncurses5-dev も install 。

NetWalker のカーネルソースとビルド方法は下記ページを参考にさせていただきました。

Android Zaurusの日記 NetWalkerのカーネルをリビルド

手順に従い上記ページ "*2" の場所から tar.gz をダウンロード。
解説の通りコンパイルしてみます。
CROSS_COMPILE は arm-linux-gnueabi- を指定。
config.gz はあらかじめ NetWalker の /proc からコピーしておく。

$ tar -zxvf linux-fsl-imx51_2.6.28-15.50fsl1araneo7.tar.gz
$ zcat config.gz > jaunty-arm/arch/arm/configs/netwalker_defconfig
$ cd jaunty-arm
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-  netwalker_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-  menuconfig

menuconfig でオプション確認と変更
以前作った 「[Ctrl] と [A] の併用化」 を動かすなら下記を enable に
( space キーを押して '<*>' にする)

Input device support --->
  Miscellaneous devices --->
    <*> User level driver support


$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-  zImage modules

できあがった arch/arm/boot/zImage を 起動確認用 micro SD の /boot に
ファイル名 zImage-10 としてコピー
/boot/boot.conf の最初のパスを zImage-10 に変更
microSD からの起動を確認。

あとはカーネルの設定を変更しつついろいろテストできます。

[Ctrl] と [A] の併用化 を試すなら

# wget http://dench.flatlib.jp/arfiles/ctrla.tgz
# tar -zxvf ctrla.tgz
# cd ctrla
# mknod /dev/uinput c 10 223
# ./ctrla /dev/input/event5

動きました。左手小指を使って Ctrl-H とか Ctrl-U とか使えています。
長かったけど、この設定を常用化できれば自分としては目的達成です。


関連エントリ
NetWalker PC-Z1 Debian (2)
NetWalker PC-Z1 Debian


容量増やして NetWalker の Debian に gdm, gnome を入れてみました。
入れてみただけでまだいろいろ問題があります。
取りあえず SD からの起動で環境を切り替えを行うテストなので。

netwalker_d04.jpg

オプティカルポイントの左右ボタンでクリックがきかないのに、ドラッグでウィンドウの移動はできる。
クリックしつつカーソルをわずかに動かすとボタンも反応する。
タッチパネルは補正されてないので位置がばらばら。
USB の外付けマウスだと普通に使えます。

netwalker_d03.jpg

起動直後の gdm でキー入力できない場合あり。
ネット経由で gdm を restart するか、しばらくして gdm が勝手に起動し直せば直るようです。


関連エントリ
NetWalker PC-Z1 Debian


カーネルの再構築をテストするために SD からの boot を少々試しました。

取りあえずリカバリ microSD の中身を書き換えるだけで起動します。
/boot だけ残して本体フラッシュの中身をまるごとコピーするだけでも ubuntu が
SD から立ち上がるようです。カーネルのテストだけならこれで十分かもしれません。

手持ちが 2GB SD しかなく、ただのコピーだと入りきらなかったので Debian 入れてみました。
下記ページを参考にしました。ほぼこの手順通りに作業しています。

D.3. Unix/Linux システムからの Debian GNU/Linux のインストール

最初にリカバリ用 micro SD を作成しており、そこから /boot 以外全部削除しています。
NetWalker がネットに繋がった状態です。

$ sudo -s
# apt-get update 
# apt-get install debootstrap 

/media/disk の microSD を /mnt/sd にマウントし直す

# umount /media/disk
# mkdir /mnt/sd
# mount /dev/mmcblk0p1 /mnt/sd

install CD-1 の iso をあらかじめ download してあるなら

# mkdir /mnt/cd
# cd
# mount -t iso9660 -o loop debian-503-armel-CD-1.iso /mnt/cd
# debootstrap --arch armel lenny /mnt/sd file:/mnt/cd

またはネットから実行する場合 ( http://www.debian.org/mirror/list)

# debootstrap --arch armel lenny /mnt/sd  http:/ftp.~.org/debian/

モジュールをコピーしておく

# cp -r /lib/modules/* /mnt/sd/lib/modules

手順通りです

# LANG=C chroot /mnt/sd /bin/bash
# mount -t proc proc /proc
# cd /dev
# MAKEDEV generic
# dpkg-reconfigure tzdata

# vi /etc/hosts

127.0.0.1 localhost netwalker

# vi /etc/network/interfaces

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp

# aptitude update 
# aptitude install locales
# dpkg-reconfigure locales

起動してみます。

# reboot

SHARP ロゴがでる前から、オプティカルポイントの左右ボタン (本体左側にあるマウスボタン)
の両方を押しっぱなしにします。そのまましばらく耐え続けて、うまく起動すると SHARP ロゴを
突き破ってコンソールが出現。root でログイン。

netwalker_d01.jpg

無線 LAN で繋がらないので、手持ちの USB LAN アダプタを試したら両方とも使えました。
USB1.1 のかなり古いものです。

corega FEther USB-TX
IO DATA Lan-Egg USB-ET/T

# /etc/init.d/networking restart

これで ssh を入れればリモートから作業できるようになりました。
コンソールだとカーソルが表示されないのでエディタの編集で少々困ります。

X を入れてみます。

# aptitude install xserver-xorg-video-fbdev
# aptitude install xinit

xorg.conf を書き換えて Section "Device" のところに Driver "fbdev" を追加。

# vi /etc/X11/xorg.conf

~
Section "Device"
        Identifier      "Configured Video Device"
        Driver       "fbdev"
        Option          "UseFBDev"      "true"
EndSection
~

startx で取りあえず起動することがわかったので

# aptitude install xterm fvwm

# vi /root/.xinitrc

xterm &
exec fvwm

起動します。

# startx

何も入っていません。

netwalker_d02.jpg

マウスボタンの同時押しを失敗しやすいのが難点ですが、micro SD から割と簡単に
起動できることがわかりました。


以前 キーボードのカスタマイズ でやりたかったのはこれです。
横に長い NetWalker の [A] キーを Ctrl キーと兼用にしています。

そのままキータイプした場合は文字 'A' が入力され、[A] を押したまま他のキーを押すと
Ctrl キー操作になります。

欠点は
 ・Ctrl-A の入力ができない
 ・文字 'A' キーのリピートができない
 ・[A] キーを離したときに文字 'A' が入力されるので表示が遅れる

Ctrl-A の入力には本物の [Ctrl] キーを使う必要があります。
[A] + [F] (Ctrl-F) など、コントロールキーとして機能する場合はリピートできます。
[A] キーは遅延判定になるので表示が遅れますが連続したキー入力には影響は出ません。


NetWalker の場合そのままでは uinput が使えないので、次のどちらかの手段が必要です。

  (1) カーネルを入れ替えて uinput が使えるようにする。
  (2) uinput の代わりに別のキーボードをつないで代用する。

(1) はまだ試していないので、本当に使えるかどうか確認していません。
他の PC の Linux 上では一応 uinput を使ってテストしています。

(2) の場合 USB の外付けキーボードをつないで代わりの出力先として流用します。
常に USB のキーボードがぶら下がっていることになるので全く実用的ではないです。


取りあえず標準状態の NetWalker で走らせるには (2) の方法を使います。
USB キーボードをつないだ状態で下記のように実行します。

 $ sudo ./ctrla -u /dev/input/event7 /dev/input/event5

プログラム ctrla.tgz v1.00
プログラム ctrla110.tgz v1.10

●アルゴリズム

[A] を押し続けている間に他のキーを押して離すと Control キーと見なします。
いったん Control キーと認識されると [A] キーを離すまで状態が続きます。
それ以外のキーストロークはバッファリングした後、判断可能な状態になったら文字
として出力します。

他にも一定時間 [A] を押し続けると Control と判定するとか、短い時間で先に [A]
より他のキーを離したときは文字と見なすとかいろいろ試しましたが、結局シンプルな
この方法が自然に扱えました。


関連エントリ
NetWalker PC-Z1 設定とキーの打ち方
NetWalker PC-Z1 と親指シフト入力
NetWalker PC-Z1 Bluetooth とキーカスタムその他
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました