2011年03月05日 ARMedslack 13.1 on zaurus [長年日記]
_ ARMedslack 13.1 on zaurus
ARMedslackの存在を知ってから約1年経った。
当時はAngstromのカーネルしか利用する術がなかったので、ARMedslackのユーザーランドとの整合性が合わずに、導入を断念した経緯があった。
その後、Debian lenny armelの導入に成功し、それはそれで十分満足できる環境を手にいれ、さらにカーネルをセルフビルド出来るようにもなった。
Debianを使い続けるという選択肢も有った。既にスケジュール管理等の実用環境に成っていたから。でも、最新カーネルをビルド出来るということは、ARMedslackを動かせる可能性が有るという事。
期は熟した。ついにSlackware-13.1のARMポートであるARMedslackをzaurus(SL-C760 Husky)に導入した。
ポイントのみメモしておく。
前提条件
このあたりのお話しは、以前のブログに紹介しているので、詳細はそちらで。
母艦(Slackware-12.2 intel)にて
SDHC(32GB)のパーティション分けを行う。
# fdisk -l /dev/mmcblk0
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1          34      273073+   c  W95 FAT32 (LBA)
/dev/mmcblk0p2              35          68      273105   82  Linux swap
/dev/mmcblk0p3              69        3927    30997417+  83  Linux
# mkdosfs /dev/mmcblk0p1
# mkswap /dev/mmcblk0p2
# mke2fs -j /dev/mmcblk0p3
先頭のFAT領域は必須ではない。ただなんとなく便利な場面もあるかと想像してのこと。
また、試してはいないが、最新のkexecbootであれば、rootパーティションを ext4で構築できるかもしれない。
ARMedslack-13.1を取得し、/dev/mmcblk0p3へ展開する。
# mount -t ext3 -o rw,noatime /dev/mmcblk0p3 /mnt/card # cd (ARMedslack-13.1取得ディレクトリ)/slackware # installpkg -root /mnt/card */*tgz
ARMedslack-13.1に含まれるカーネルはzaurusを対象とした物ではないので利用できない。なので、Debian lenny on SL-C760でビルドしたカーネルとモジュールをSDHC上に追加で展開する。
# cd /mnt/card # tar xvzpif zImage-modules-2.6.36.3.tar.gz # cd boot # ln zImage-2.6.36.3 zImage
ちなみに、元々のARMedslack-13.1のカーネルは Ver. 2.6.33.5。当初 Ver. 2.6.33.7をセルフビルドしたもので動かそうとしたが、サスペンドからの復帰動作に若干難があったので、Ver. 2.6.36.3にバージョンアップした。
boot/boot.cfgを編集する。
# Show this label in kexecboot menu. ##LABEL=angstrom LABEL=ARMedslack 13.1 # # Specify full path to the kernel. KERNEL=/boot/zImage # # Append this tags to the kernel cmdline. APPEND=console=ttyS0,115200n8 console=tty1 noinitrd psplash=false debug # # Specify full path for a custom distro-icon for the menu-item. # If not set, use device-icons as default (NAND, SD, CF, ...). #ICON=/boot/icon.xpm # # Priority of item in kexecboot menu. # Items with highest priority will be shown at top of menu. # Default: 0 (lowest, ordered by device ordering) #PRIORITY=10 #
etc/fstabを編集する。
/dev/mmcblk0p2 swap swap defaults 0 0 /dev/mmcblk0p3 / ext3 rw,noatime,data=writeback 1 1 devpts /dev/pts devpts gid=5,mode=620 0 0 proc /proc proc defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 /dev/hda1 /media/cf auto rw,noatime,noauto 0 0 # SD/MMC in kernel 2.4 #/dev/mmcda1 /media/card auto rw,noatime,noauto 0 0 # SD/MMC in kernel 2.6 /dev/mmcblk0p1 /media/card auto rw,noatime,noauto 0 0
暫定的にAngstromのキーマップファイルをコピーする。そうしないと後々困ることになる。
# cp keymap-2.6.map /mnt/card/ # cp keymap-2.6.map /mnt/card/root/
etc/shadowのrootのパスワード欄に、母艦の/etc/shadowのrootのパスワード欄をコピペする。これも、そうしないと後々困ることに...。
SL-C760にて(1)
上記の設定を行ったSDHCをSL-C760に挿して電源を入れる。
kexecbootが起動したら、メニューにARMedslackを展開したパーティションが表示されるので、カーソルキーで選択し、エンターキーで起動する。
この時点のブートでは、母艦のSlackware(12.2)とARMedslack(13.1)の(fdiskの)バージョン違いによる影響か、
『ルートパーティションがおかしいので、rootのパスワードを入力してshを起動し、fsckをかけやがれ!』
との旨のメッセージが表示され、起動が途中で止まってしまう。
事前に母艦のrootパスワードを/etc/shadowに設定していたのは、パスワードが空白(エンターキーのみの入力)だと、shが起動できないため。
さて、rootのパスワードを入力してshを起動させても、今度はキーマップが部分的にSL-C760と合ってなくてfsckがかけれない(「/」が入力できない)ので、あらかじめコピーしておいたAngstromのキーマップをロードする。
# loadkeys keymap-2.6.map
その後、fsckをかける。
# e2fsck -f -y -v /dev/mmcblk0p3
で、リブート。
SL-C760にて(2)
今度は無事ログインできたので、粛々と設定作業を進めて行く。
タイムゾーンを設定する。
# cd /etc # ln -s /usr/share/zoneinfo/Asia/Tokyo localtime
ホストネーム(/etc/HOSTNAME)を設定する。
# cat /etc/HOSTNAME c7x0.hoge.org
参照するDNSサーバを設定する。
# cat /etc/resolv.conf search foo.org nameserver 192.168.0.100
ネットワーク関係の設定をする。
# cat /etc/rc.d/rc.inet1.conf # Config information for eth0: IPADDR[0]="192.168.0.76" NETMASK[0]="255.255.255.0" USE_DHCP[0]="" DHCP_HOSTNAME[0]="" # Default gateway IP address: GATEWAY="192.168.0.100" IFNAME[4]="wlan0" IPADDR[4]="192.168.0.76" NETMASK[4]="255.255.255.0" WLAN_ESSID[4]=MY_ESSID WLAN_MODE[4]=Managed WLAN_KEY[4]="WEPキー(16進)"
いまだにWEPなのは御愛嬌。
モジュール関係の設定をする。
サウンド関係と、無線LAN関係のモジュールが自動でロードされなかったのでスクリプトからロード。本来は、dbusとかhalあたりの設定を見直すべき(?)。
# cat /etc/rc.d/rc.modules # sound support: /sbin/modprobe snd_soc_corgi # wireless card support: /sbin/modprobe hostap_cs
SDHCのアクセスチューニングを行う。
# cat /etc/rc.d/rc.local
if [ -x /bin/echo ]
then
        echo 8192 >/sys/block/mmcblk0/queue/nr_requests
        echo deadline >/sys/block/mmcblk0/queue/scheduler
        echo 128 >/sys/block/mmcblk0/queue/iosched/fifo_batch
        echo 8 >/sys/block/mmcblk0/queue/iosched/writes_starved
        echo "setting mmcblk0."
fi
LED発行の設定をする。
# cat /etc/rc.d/rc.local
if [ -x /bin/echo ]
then
##      /bin/echo none >/sys/class/leds/corgi\:green\:mail/trigger
        /bin/echo mmc0 >/sys/class/leds/corgi\:green\:mail/trigger
        echo setting led.
fi
キーマップのカスタマイズを行う。
showkeyコマンドで各キーのキーコードを調べることができる。それを元にしてカスタマイズを行う。
# zcat /usr/share/kbd/keymaps/zaurus/zaurus-c760.map.gz
# Default kernel keymap. This uses 7 modifier combinations.
keymaps 0-2,4-5,8,12
# Change the above line into
#       keymaps 0-2,4-6,8,12
# in case you want the entries
#       altgr   control keycode  83 = Boot
#       altgr   control keycode 111 = Boot
# below.
#
keycode   1 =
keycode   2 = one              exclam
        control alt     keycode  2 = Console_1
        altgr keycode 2 = F1
keycode   3 = two              quotedbl
        control alt     keycode  3 = Console_2
        altgr keycode 3 = F2
keycode   4 = three            numbersign
        control alt     keycode  4 = Console_3
        altgr keycode 4 = F3
keycode   5 = four             dollar
        control alt     keycode  5 = Console_4
        altgr keycode 5 = F4
keycode   6 = five             percent
        control alt     keycode  6 = Console_5
        altgr keycode 6 = F5
keycode   7 = six              ampersand
        control alt     keycode  7 = Console_6
        altgr keycode 7 = F6
keycode   8 = seven            apostrophe
        altgr keycode 8 = F7
keycode   9 = eight            parenleft
        altgr keycode 9 = F8
keycode  10 = nine             parenright
        altgr keycode 10 = F9
keycode  11 = zero             asciitilde
        altgr keycode 11 = F10
keycode  12 = minus            grave
        altgr keycode 12 = at
keycode  14 = BackSpace
        altgr keycode 14 = Delete
keycode  15 = Tab
        altgr keycode 15 = Caps_Lock
keycode  16 = q
keycode  17 = w
        altgr keycode 17 = asciicircum
keycode  18 = e
        altgr keycode 18 = equal
keycode  19 = r
        altgr keycode 19 = plus
keycode  20 = t
        altgr keycode 20 = bracketleft
keycode  21 = y
        altgr keycode 21 = bracketright
keycode  22 = u
        altgr keycode 22 = braceleft
keycode  23 = i
        altgr keycode 23 = braceright
keycode  24 = o
keycode  25 = p
keycode  28 = Return          grave
keycode  29 = Control
keycode  30 = a
keycode  31 = s
keycode  32 = d
keycode  33 = f
        altgr keycode 33 = backslash
keycode  34 = g
        altgr keycode 34 = semicolon
keycode  35 = h
        altgr keycode 35 = colon
keycode  36 = j
        altgr keycode 36 = asterisk
keycode  37 = k
    altgr keycode 37 = backslash
keycode  38 = l
        altgr keycode 38 = bar
keycode  42 = Shift
keycode  44 = z
keycode  45 = x
keycode  46 = c
keycode  47 = v
keycode  48 = b
        altgr keycode 48 = underscore
keycode  49 = n
keycode  50 = m
keycode  51 = comma             slash
        altgr keycode 51 = less
keycode  52 = period           question
        altgr     keycode  52 = greater
keycode  54 = Shift
keycode  56 = Alt
keycode  57 = space            space
        control keycode  57 = nul
keycode 59 = Control
keycode 60 = Alt
keycode 61 = AltGr
keycode 62 = Escape
keycode 63 = Return
keycode 64 = Escape
keycode 65 = Down
keycode 66 = Up
keycode 68 = F14
keycode 87 = Return
keycode 88 = F12
keycode 99 = F13
keycode 103 = Up
        altgr     keycode 103 = PageUp
keycode 105 = Left
        altgr     keycode 105 = Decr_Console
keycode 106 = Right
        altgr     keycode 106 = Incr_Console
keycode 108 = Down
        altgr     keycode 108 = PageDown
keycode 205 = F11
string F1 = "\033[[A"
string F2 = "\033[[B"
string F3 = "\033[[C"
string F4 = "\033[[D"
string F5 = "\033[[E"
string F6 = "\033[17~"
string F7 = "\033[18~"
string F8 = "\033[19~"
string F9 = "\033[20~"
string F10 = "\033[21~"
string F11 = "\033[23~"
string F12 = "\033[24~"
string F13 = "\033[25~"
string F14 = "\033[26~"
string F15 = "\033[28~"
string F16 = "\033[29~"
string F17 = "\033[31~"
string F18 = "\033[32~"
string F19 = "\033[33~"
string F20 = "\033[34~"
string Find = "\033[1~"
string Insert = "\033[2~"
string Remove = "\033[3~"
string Select = "\033[4~"
string Prior = "\033[5~"
string Next = "\033[6~"
string Macro = "\033[M"
string Pause = "\033[P"
compose 文字化けするので以下省略
カスタマイズしたキーマップファイルを起動時にロードするように設定。
# cat /etc/rc.d/rc.local
if [ -x /usr/bin/loadkeys ]
then
        /usr/bin/loadkeys /usr/share/kbd/keymaps/zaurus/zaurus-c760.map.gz
        echo setting loadkeys.
fi
- [Shift]+[-] = [`]
- [Fn]+[1-9,0] = F1〜F10
- [On/Off] = F11
- [Menu] = F12
- [Home] = F13
- [Mail] = F14
- [Address] = Alt
- [Calendar] = Control
バックライトの調整。
#
# 0 <= brightness <= ${dir}/max_brightness
#
dir=/sys/devices/platform/pxa2xx-spi.1/spi1.1/backlight/corgi_bl
echo ${brightness} >${dir}/brightness
サスペンドの方法。
echo mem >/sys/power/state
サスペンドからの復帰はキーボード上の、任意のキーを押せば行われる
X.Org X Server 1.7.7 (fbdev)
デフォルトのデスクトップ環境はKDEに設定されているが、当然SL-C760には重すぎるのでtwmに変更しておく。
# cd /usr/lib/X11/xinit # rm xinitrc # ln -s xinitrc.twm xinitrc
特に設定無しに(xorg.conf無し)、startxでXが起動する。ただし、キーマップは合っていない状態。
ぼちぼちと設定していく。
/etc/X11/xorg.confを設定する(xorg.conf-versatileをベースに)。
###################################################################
# File...: /etc/X11/xorg.conf-c760
# Purpose: Xorg config file for zaurus(sl-c760)
# Author : Masahiko Ito <m-ito@myh.no-ip.org>
# Date...: 27-Feb-2011
####################################################################
Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 1"
#    InputDevice "Mouse0" "CorePointer"
    InputDevice "touchscreen" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
    # If HAL causes trouble, it can be disabled like this:
    #Option    "AutoAddDevices"  "off"
    # Allow the keyboard & mouse to work:
    # (I thought previously this was related to HAL being on or off
    # but unless this is set in Xorg 7.5, the mouse does not work)
    Option  "AllowEmptyInput" "off"
EndSection
Section "Files"
        ModulePath   "/usr/lib/xorg/modules"
        ModulePath   "/usr/local/lib/xorg/modules"
#        FontPath     "/usr/X11R6/lib/X11/fonts/local"
        FontPath     "/usr/X11R6/lib/X11/fonts/TTF"
        FontPath     "/usr/X11R6/lib/X11/fonts/OTF"
        FontPath     "/usr/X11R6/lib/X11/fonts/Type1"
        FontPath     "/usr/X11R6/lib/X11/fonts/misc"
#        FontPath     "/usr/X11R6/lib/X11/fonts/CID"
        FontPath     "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
        FontPath     "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
        FontPath     "/usr/X11R6/lib/X11/fonts/75dpi"
        FontPath     "/usr/X11R6/lib/X11/fonts/100dpi"
        FontPath     "/usr/X11R6/lib/X11/fonts/cyrillic"
EndSection
Section "Module"
    Load        "dbe"  	# Double buffer extension
    SubSection  "extmod"
    Option    "omit xfree86-dga"   # don't initialise the DGA extension
    EndSubSection
    Load       "freetype"
    Load       "glx"
    Load       "dri"
EndSection
Section "InputDevice"
    Identifier	"Keyboard1"
##    Driver	"kbd"
    Driver	"evdev"
  # Option     "AutoRepeat" "500 30"
    Option     "XkbRules"      "xorg"
    Option     "XkbModel"      "pc105"
  # UK keyboard mapping:
    Option     "XkbLayout"     "gb"
  # US keyboard mapping:
  # Option     "XkbLayout"     "us"
EndSection
Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/mouse"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection
Section "InputDevice"
	Identifier "touchscreen"
	Driver "tslib"
	Option "Device" "/dev/input/event1"
	Option "DeviceName" "tslib"
EndSection
Section "Monitor"
        UseModes "Forced Monitor Modes"
        Identifier   "Monitor0"
EndSection
# Make X check our modes first rather than deciding for itself:
Section "Modes"
        Identifier "Forced Monitor Modes"
        # 800x600 @ 56Hz (VESA) hsync: 35.2kHz
        ModeLine "800x600"    36.0  800  824  896 1024    600  601  603  625 +hsync +vsync
        # 1024x768 @ 70Hz (VESA) hsync: 56.5kHz
        ModeLine "1024x768"   75.0 1024 1048 1184 1328    768  771  777  806 -hsync -vsync
        # 1280x1024 @ 75Hz (VESA) hsync: 80.0kHz
        ModeLine "1280x1024" 135.0 1280 1296 1440 1688   1024 1025 1028 1066 +hsync +vsync
EndSection
Section "Device"
    Identifier  "VESA Framebuffer"
    Driver      "fbdev"
#    Option	"Rotate" "CCW"
EndSection
Section "Screen"
    Identifier  "Screen 1"
    Device      "VESA Framebuffer"
    Monitor     "Monitor0"
    DefaultDepth 16
    SubSection "Display"
        Depth           16
        Modes           "640x480"
    EndSubSection
EndSection
Section "DRI"
    Mode 0666
EndSection
- Section "ServerLayout" の InputDevice "touchscreen" "CorePointer" → タッチスクリーンを利用する際の設定。
- Section "Files" に ModulePath "/usr/local/lib/xorg/modules" を追加 → tslib関連モジュールをインストールする場所。
- Section "Files" から FontPath "/usr/X11R6/lib/X11/fonts/local"、FontPath "/usr/X11R6/lib/X11/fonts/CID" をコメントアウト → 最初、rxvtでk12等のごく当り前の漢字フォントが表示できなくて困った。どうやら存在しないディレクトリを指定していると、フォントのロードに失敗するみたい。
- Section "InputDevice" の Identifier "Keyboard1" の Driver "kbd" を Driver "evdev" に変更 → キーのオートリピートを止める機能が "kbd" では利用できなかった。(何故か)マウスカーソルのブルブルが劇的に治まる(これはかなり嬉しい副作用)。
- Section "InputDevice" の Identifier "touchscreen" の Driver "tslib" 等 → タッチスクリーン関連ドライバの指定。他にも選択肢として "evtouch", "evdev" が有るが、"evtouch"は画面が暗転して表示されなかった。"evdev"はこれから主流になっていくと思われるのだが、キャリブレーションの設定が良く分からず今回は見送った。
タッチスクリーンドライバとしてtslibを利用する為のもろもろをインストールする。
...のだが、tslibのビルドにautomake-1.6が要求されるので、あえて古いautomakeをインストールする。
# tar xvzf automake-1.6.3.tar.gz # cd automake-1.6.3 # ./configure --prefix=/usr/local/automake-1.6 # make # make install
次にtslib-1.0をインストール。ソースはDebianから拝借。
# tar xvzf tslib_1.0.orig.tar.gz
# cd tslib-1.0
# zcat tslib_1.0-7.diff.gz | patch -p1
# cat debian/patches/*patch | patch -p1
# PATH="/usr/local/automake-1.6/bin:${PATH}" ./autogen.sh
# ./configure
# make
# make install
キャリブレーションを行う(コンソールから)。
# TSLIB_TSDEVICE=/dev/input/event1 ts_calibrate
/etc/pointercal に結果が書き込まれる。設定ファイルは /usr/local/etc/ts.conf。特に編集する必要は無し。
xf86-input-tslib-0.0.6をインストール。ソースはDebianから拝借。
# tar xvzf xf86-input-tslib_0.0.6.orig.tar.gz # cd xf86-input-tslib-0.0.6 # tar xvzf xf86-input-tslib_0.0.6-5.debian.tar.gz # cat debian/patches/95_update-manpage.diff | patch -p1 # cat debian/patches/0001-fix-segfault.patch | patch -p1 # ./configure # make # make install
xevでキーコードを確認し、.Xmodmapを作成する。
本当は、コンソールでの設定をそのまま引き継いでくれれば楽なのだが、xorg-1.7から XkbDisableの設定が廃止になったとの事である。かと言って、zaurus用の"XkbModel"や"XkbLayout"定義が用意されている分けではないので、全てのキーをxmodmapで再定義してやる。
# xmodmap -pke >.Xmodmap
でベースを作成し、それをカスタマイズする。
# cat .Xmodmap keycode 8 = keycode 9 = keycode 10 = 1 exclam F1 keycode 11 = 2 quotedbl F2 keycode 12 = 3 numbersign F3 keycode 13 = 4 dollar F4 keycode 14 = 5 percent F5 keycode 15 = 6 ampersand F6 keycode 16 = 7 apostrophe F7 keycode 17 = 8 parenleft F8 keycode 18 = 9 parenright F9 keycode 19 = 0 asciitilde F10 keycode 20 = minus grave at keycode 21 = keycode 22 = BackSpace NoSymbol Delete keycode 23 = Tab keycode 24 = q Q keycode 25 = w W asciicircum keycode 26 = e E equal keycode 27 = r R plus keycode 28 = t T bracketleft keycode 29 = y Y bracketright keycode 30 = u U braceleft keycode 31 = i I braceright keycode 32 = o O keycode 33 = p P keycode 34 = keycode 35 = keycode 36 = Return keycode 37 = Control_L keycode 38 = a A keycode 39 = s S keycode 40 = d D keycode 41 = f F backslash keycode 42 = g G semicolon keycode 43 = h H colon keycode 44 = j J asterisk keycode 45 = k K backslash keycode 46 = l L bar keycode 47 = keycode 48 = keycode 49 = keycode 50 = Shift_L keycode 51 = keycode 52 = z Z keycode 53 = x X keycode 54 = c C keycode 55 = v V keycode 56 = b B underscore keycode 57 = n N keycode 58 = m M keycode 59 = comma slash less keycode 60 = period question greater keycode 61 = keycode 62 = Shift_R keycode 63 = keycode 64 = Kanji keycode 65 = space keycode 66 = keycode 67 = Control_L keycode 68 = Alt_L keycode 69 = Mode_switch keycode 70 = Escape keycode 71 = Return keycode 72 = Escape keycode 73 = Down keycode 74 = Up keycode 75 = keycode 76 = F14 keycode 77 = keycode 78 = keycode 79 = keycode 80 = keycode 81 = keycode 82 = keycode 83 = keycode 84 = keycode 85 = keycode 86 = keycode 87 = keycode 88 = keycode 89 = keycode 90 = keycode 91 = keycode 92 = keycode 93 = keycode 94 = keycode 95 = Return keycode 96 = F12 keycode 97 = keycode 98 = keycode 99 = keycode 100 = keycode 101 = keycode 102 = keycode 103 = keycode 104 = keycode 105 = keycode 106 = keycode 107 = F13 keycode 108 = keycode 109 = keycode 110 = keycode 111 = Up NoSymbol Prior keycode 112 = keycode 113 = Left keycode 114 = Right keycode 115 = keycode 116 = Down NoSymbol Next keycode 117 = keycode 118 = keycode 119 = keycode 120 = keycode 121 = keycode 122 = keycode 123 = keycode 124 = keycode 125 = keycode 126 = keycode 127 = keycode 128 = keycode 129 = keycode 130 = keycode 131 = keycode 132 = keycode 133 = keycode 134 = keycode 135 = keycode 136 = keycode 137 = keycode 138 = keycode 139 = keycode 140 = keycode 141 = keycode 142 = keycode 143 = keycode 144 = keycode 145 = keycode 146 = keycode 147 = keycode 148 = keycode 149 = keycode 150 = keycode 151 = keycode 152 = keycode 153 = keycode 154 = keycode 155 = keycode 156 = keycode 157 = keycode 158 = keycode 159 = keycode 160 = keycode 161 = keycode 162 = keycode 163 = keycode 164 = keycode 165 = keycode 166 = keycode 167 = keycode 168 = keycode 169 = keycode 170 = keycode 171 = keycode 172 = keycode 173 = keycode 174 = keycode 175 = keycode 176 = keycode 177 = keycode 178 = keycode 179 = keycode 180 = keycode 181 = keycode 182 = keycode 183 = keycode 184 = keycode 185 = keycode 186 = keycode 187 = keycode 188 = keycode 189 = keycode 190 = keycode 191 = keycode 192 = keycode 193 = keycode 194 = keycode 195 = keycode 196 = keycode 197 = keycode 198 = keycode 199 = keycode 200 = keycode 201 = keycode 202 = keycode 203 = keycode 204 = keycode 205 = keycode 206 = keycode 207 = keycode 208 = keycode 209 = keycode 210 = keycode 211 = keycode 212 = keycode 213 = F11 keycode 214 = keycode 215 = keycode 216 = keycode 217 = keycode 218 = keycode 219 = keycode 220 = keycode 221 = keycode 222 = keycode 223 = keycode 224 = keycode 225 = keycode 226 = keycode 227 = keycode 228 = keycode 229 = keycode 230 = keycode 231 = keycode 232 = keycode 233 = keycode 234 = keycode 235 = keycode 236 = keycode 237 = keycode 238 = keycode 239 = keycode 240 = keycode 241 = keycode 242 = keycode 243 = keycode 244 = keycode 245 = keycode 246 = keycode 247 = keycode 248 = keycode 249 = keycode 250 = keycode 251 = keycode 252 = keycode 253 = keycode 254 = clear Shift add Shift = Shift_L Shift_R clear Lock clear Control add Control = Control_L clear Mod1 add Mod1 = Alt_L clear Mod2 add Mod2 = Mode_switch clear Mod3 clear Mod4 clear Mod5
[Fn],[Calendar],[Address],[Mail],[Home],[Menu]キーはモディファイヤキーとして使うことを考慮してオートリピートを止めたい。
# xset -r
だと全てのキーのオートリピートが停止するのでまずい。なので、次のコマンドを作った。
/*
 * setxkbrepeat by Masahiko Ito <m-ito@myh.no-ip.org>
 *
 * 2011.03.01 Ver. 0.1 First release
 * 2011.03.18 Ver. 0.2 Some update (Special Thanks to nn)
 *
 * Build    : cc -o setxkbrepeat setxkbrepeat.c -L/usr/X11R6/lib -lX11
 * Function : set key repeat on/off
 * Usage    : setxkbrepeat keycode [on|off]
 */
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
main(argc, argv)
	int	argc;
	char	*argv[];
{
	Display* display;
	XKeyboardControl values;
	if ((display = XOpenDisplay (NULL)) == (Display *)NULL){
		fprintf(stderr, "%s: unable to open display\n", argv[0]);
		exit(1);
	}
	if ((argc != 3) ||
	    (atoi(argv[1]) < 8 || atoi(argv[1]) > 254) ||
	    (strncmp(argv[2], "on", 2) != 0 && strncmp(argv[2], "off", 3) != 0)){
		fprintf(stderr, "Usage : setxkbrepeat keycode [on|off]\n");
		fprintf(stderr, "  keycode must be 8 to 254.\n");
		exit(1);
	}
	values.key = atoi(argv[1]);
	if (strncmp(argv[2], "on", 2) == 0){
		values.auto_repeat_mode = AutoRepeatModeOn;
	}else if (strncmp(argv[2], "off", 3) == 0){
		values.auto_repeat_mode = AutoRepeatModeOff;
	}
	XChangeKeyboardControl(
		display,
		(KBKey | KBAutoRepeatMode),
		&values
	);
	XCloseDisplay (display);
}
このコマンドを .xinitrc から、
setxkbrepeat 69 off # Fn setxkbrepeat 67 off # Calendar setxkbrepeat 68 off # Address setxkbrepeat 76 off # Mail setxkbrepeat 107 off # Home setxkbrepeat 96 off # Menu
と実行する。...と効くはずだったのだが、Xの実装に依存した問題なのか、なぜか効かない(xset -rも)。仕方がないので、この部分だけ別スクリプトにしておいて、ログイン後に手動で実行している。
fvwm-1.24との連係。
# cat .fvwmrc Key Left A M CursorMove -1 0 Key Right A M CursorMove 1 0 Key Up A M CursorMove 0 -1 Key Down A M CursorMove 0 1 Key Left A MC CursorMove -5 0 Key Right A MC CursorMove 5 0 Key Up A MC CursorMove 0 -5 Key Down A MC CursorMove 0 5 Key F14 A N Exec "click1" exec /usr/local/bin/key2mouse 1 Key F14 A C Exec "click2" exec /usr/local/bin/key2mouse 2 Key F14 A M Exec "click3" exec /usr/local/bin/key2mouse 3 Key F13 A N Exec "suspend" exec sudo /home/m-ito/bin/zzz.sh Key F11 A N Exec "suspend" exec sudo /home/m-ito/bin/zzz.sh Key F12 A N PopUp "Utilities" Key 3 A C Exec "lcdoff" exec sudo /home/m-ito/bin/loff.sh Key 4 A C Exec "lcdon" exec sudo /home/m-ito/bin/lon.sh Key 3 A M Exec "brightdown" exec sudo /home/m-ito/bin/bd.sh Key 4 A M Exec "brightup" exec sudo /home/m-ito/bin/bu.sh
- [ALT]+[←] : マウスカーソルを左へ1ドット移動
- [ALT]+[→] : マウスカーソルを右へ1ドット移動
- [ALT]+[↑] : マウスカーソルを上へ1ドット移動
- [ALT]+[↓] : マウスカーソルを下へ1ドット移動
- [Ctrl]+[ALT]+[←] : マウスカーソルを左へ5ドット移動
- [Ctrl]+[ALT]+[→] : マウスカーソルを右へ5ドット移動
- [Ctrl]+[ALT]+[↑] : マウスカーソルを上へ5ドット移動
- [Ctrl]+[ALT]+[↓] : マウスカーソルを下へ5ドット移動
- [Mail] : 左クリック
- [Ctrl]+[Mail] : 中クリック
- [ALT]+[Mail] : 右クリック
- [On/Off] : サスペンド
- [Home] : サスペンド
- [Menu] : fvwmメニュー表示
- [Ctrl]+[3] : LCD off
- [Ctrl]+[4] : LCD on
- [ALT]+[3] : LCD 輝度UP
- [ALT]+[4] : LCD 輝度DOWN
一部のスクリプトをsudoで実行しているので、そのスクリプトに関してはNOPASSWDで実行できるように/etc/sudoersを設定しておく事。
key2mouse.c(マウスボタンイベント発生プログラム)
/*
 * 2004.06.10 create Masahiko Ito (Special Thanks to nn)
 *
 * Build : cc -o key2mouse key2mouse.c -lXtst -lX11
 *
 * Usage : key2mouse [1|2|3]
 *
 */
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
int
main(argc, argv)
int argc;
char** argv;
{
    Display* display;
    int screen;
    Window root;
    if (argc < 2 ||
        strncmp(argv[1], "-h", strlen("-h")) == 0 ||
        strncmp(argv[1], "--help", strlen("--help")) == 0){
        printf("Usage : %-s [1|2|3]\n\n", argv[0]);
        exit(0);
    }
    display = XOpenDisplay (NULL);
    screen = DefaultScreen (display);
    root = DefaultRootWindow(display);
    if (strncmp(argv[1], "1", 1) == 0){
        XTestFakeButtonEvent (display, Button1, True, 0);
        XTestFakeButtonEvent (display, Button1, False, 0);
    }else if (strncmp(argv[1], "2", 1) == 0){
        XTestFakeButtonEvent (display, Button2, True, 0);
        XTestFakeButtonEvent (display, Button2, False, 0);
    }else if (strncmp(argv[1], "3", 1) == 0){
        XTestFakeButtonEvent (display, Button3, True, 0);
        XTestFakeButtonEvent (display, Button3, False, 0);
    }
    XCloseDisplay (display);
}
zzz.sh(サスペンド実行スクリプト)
#! /bin/sh echo mem >/sys/power/state
loff.sh(LCD消灯スクリプト)
#! /bin/sh
dir=/sys/devices/platform/pxa2xx-spi.1/spi1.1/backlight/corgi_bl
#dir=/sys/class/backlight/corgi-bl
min_brightness=0
brightness=${min_brightness}
#
echo ${brightness} >${dir}/brightness
lon.sh(LCD点灯スクリプト)
#! /bin/sh
dir=/sys/devices/platform/pxa2xx-spi.1/spi1.1/backlight/corgi_bl
#dir=/sys/class/backlight/corgi-bl
max_brightness=`cat ${dir}/max_brightness`
brightness=${max_brightness}
#
echo ${brightness} >${dir}/brightness
bd.sh(LCD輝度ダウンスクリプト)
#! /bin/sh
dir=/sys/devices/platform/pxa2xx-spi.1/spi1.1/backlight/corgi_bl
#dir=/sys/class/backlight/corgi-bl
diff=5
min_brightness=1
##max_brightness=`cat ${dir}/max_brightness`
brightness=`cat ${dir}/brightness`
#
brightness=`expr ${brightness} - ${diff}`
if [ ${brightness} -lt ${min_brightness} ]
then
	brightness=${min_brightness}
fi
#
echo ${brightness} >${dir}/brightness
bu.sh(LCD輝度アップスクリプト)
#! /bin/sh
dir=/sys/devices/platform/pxa2xx-spi.1/spi1.1/backlight/corgi_bl
#dir=/sys/class/backlight/corgi-bl
diff=5
min_brightness=1
##max_brightness=`cat ${dir}/max_brightness`
brightness=`cat ${dir}/brightness`
#
brightness=`expr ${brightness} - ${diff}`
if [ ${brightness} -lt ${min_brightness} ]
then
	brightness=${min_brightness}
fi
#
echo ${brightness} >${dir}/brightness
top
topコマンドでメモリーの消費順で表示したもの。
top - 02:02:51 up 7:50, 4 users, load average: 0.08, 0.13, 0.17 Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie Cpu(s): 26.5%us, 17.7%sy, 0.0%ni, 55.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 61704k total, 48704k used, 13000k free, 656k buffers Swap: 273100k total, 16744k used, 256356k free, 13676k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 929 m-ito 20 0 31404 10m 2896 S 0.0 16.8 1:20.96 emacs 873 root 20 0 22652 6108 1240 S 0.3 9.9 4:12.42 X 835 bin 20 0 6852 3928 572 S 0.0 6.4 0:03.00 cannaserver 884 m-ito 20 0 6952 1868 1060 S 0.0 3.0 0:53.34 urxvt 883 m-ito 20 0 6036 1716 1152 S 0.0 2.8 0:22.95 kinput2 915 m-ito 20 0 4692 1652 1060 S 0.0 2.7 0:00.71 bash 961 m-ito 20 0 4684 1632 1080 S 0.0 2.6 0:00.73 bash 914 m-ito 20 0 4320 1260 796 S 0.0 2.0 0:28.42 screen 930 m-ito 20 0 4684 1244 904 S 0.0 2.0 0:00.79 bash 7477 m-ito 20 0 2720 1180 944 R 2.9 1.9 0:01.98 top
常用している emacs と Xが群を抜いてでかい。
emacsに関しては不要な機能は外してビルドし直すか、懐かしの nemacs に入れ換えるかすればまだ小さくできる。
X に関しても kdriveをビルドできれば良いのだが...(今回はAngstromからXimageonのバイナリを拝借するのは避けたい)。
そして...
後は、Slackwareの精神に則り、必要なものはソースからどんどんビルドして放り込めばよいかと...。
ともかく、これで念願のDebian lenny armelからSlackware arm(ARMedslack)への鞍替えが完了した。
非常に満足している。