2010年7月28日水曜日

Fonera 2202でWillcom/Emobile接続 その3  PPP設定

 

PPP設定の各ファイルについて記載します。

1. /etc/config/network

/etc/config/network - 下記のPPP設定をファイルの最後に追加します。device, speed, username, password, connectcmdは、hotplug in処理の際に該当するUSB modemの設定情報から書き換えられます。

config 'interface' 'ppp'
    option 'ifname' 'wan'
    option 'proto' 'ppp'
    option 'mtu' '1500'
    option 'linkname' 'wan'
    option 'ipparam' 'wan'
    option 'device' '/dev/ttyUSB0' 
    option 'speed' '921600'
    option 'username' 'em'
    option 'password' 'em'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T*99#'

    option 'attached' '0'

config ‘interface’ ‘ppp’: PPP接続用のセクションです。

ifname: pppdに渡すparameterとなります。今回は’wan’固定となります。

proto: Protocol指定となります。今回は’ppp’固定となります。

mtu: 1500固定です。

linkname: pppdに渡すlink nameです。今回は’wan’固定となります。

ipparam: ‘wan’固定となります。

device: ppp通信用のdevice file nameとなります。D02HW, H12HWを接続すると制御用ポートの /dev/ttyUSB1 も作成されます。3GUMTSでは /dev/ttyUSB1も利用しますが、ppp dialup接続では /dev/ttyUSB0 のみの利用となります。

speed: 回線のinterface速度です。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。

username: ppp接続アカウント名です。Emobileの場合には固定の’em’となります。Willcomの場合には、個別のアカウントとなります。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。

password: ppp接続パスワードです。Emobileの場合には固定の’em’となります。Willcomの場合には、個別のアカウントとなります。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。

connectcmd: chat scriptのコマンドラインとなります。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。同じく /tmp/chat_dailerもhotplug in処理中に作成されます。

attached: D02HW, H12HWのような3GUMTS対応のmodemを利用した場合に、/dev/ttyUSB0と/dev/ttyUSB1の2回 hotplug in処理が起動されるためttyUSB0の処理中に設定しれた値がttyUSB1の処理で上書きされるのを防ぐためのflagです。この値が 1 であると、ttyUSB0のhotplug in 処理が完了したことを示します。

 

2. /etc/config/ttyusb

/etc/config/ttyusb - 新規ファイル追加のサンプル。WSIM接続のusername, passwordはdummyの’*’としています。

config 'ttyusb' '12D11003'
    option 'vendor' 'Huawei'
    option 'driver' 'option'
    option 'modemtype' 'dialup'
    option 'username' 'em'
    option 'password' 'em'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T*99#'
    option 'speed' '921600'
    option 'atinit' 'AT'
    option 'vidpid' '12D11003'
    option 'product' 'D02HW(E220)'

config 'ttyusb' '12D11008'
    option 'vendor' 'Huawei'
    option 'product' 'H12HW'
    option 'driver' 'option'
    option 'modemtype' 'dialup'
    option 'username' 'em'
    option 'password' 'em'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T*99#'
    option 'speed' '921600'
    option 'atinit' 'AT'
    option 'vidpid' '12D11008'

config 'ttyusb' '04BB0940'
    option 'product' 'IO Data WSIM'
    option 'driver' 'pl2303'
    option 'modemtype' 'dialup'
    option 'username' '********'
    option 'password' '********'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T0570572744##64'
    option 'speed' '115200'
    option 'atinit' 'AT&D2&C1&K3S0=0'
    option 'vidpid' '04BB0940'
    option 'vendor' 'Willcom INC'

config ‘ttyusb’ VIDPID: VIDPIDによって識別されるUSB dialup modemの設定情報セクションです。

vendor: ベンダー名

product: 製品名

vidpid: dialup modemのvendor idとproduct idを連結した16進8桁の値となります。dailup modemの識別のためにセクション名とこちらの2重に保持しています。

driver: device driverの種類を設定します。IO Data WSIMの場合にはpl2303, Huawei (Emobile)についてはoptionです。他にusbserialも選択できます。この項目は、以前のimplementationにおいて利用していました。現在は利用していません。

modemtype: モデムタイプ。’dialup’ or ‘3gumts’。’dialup’のときには今回のdialup処理とし、3GUMTS処理が起動されないようにします。’3gumts’の場合には、その逆となります。

username: PPP接続のアカウント名です。USB dialup modemのhotplug in処理中、ttyusbの該当情報が/etc/config/networkの’interface’ ‘ppp’セクションのusernameにコピーされます。

password: PPP接続のパスワードです。USB dialup modemのhotplug in処理中、ttyusbの該当情報が/etc/config/networkの’interface’ ‘ppp’セクションのpasswordにコピーされます。

connectcmd: PPP接続のchat script起動用コマンドラインです。-T以降の電話番号のみ変更するようにしてください。Emobileの場合は、-T*99#になります。USB dialup modemのhotplug in処理中、ttyusbの該当情報が/etc/config/networkの’interface’ ‘ppp’セクションのconnectcmdにコピーされます。

speed: PPP接続のインターフェース速度(bps)です。IO Data WSIMの場合は 115200(bps)が上限のようです。Huawei (Emobile)のH12HWの場合には921600(bps)

atinit: USB dialup modemの初期化コマンドです。空でも差し支えはないでしょう。/tmp/chat_dialerの中で “ATZ” は発行しています。3GUMTSの場合は、ATZとATHを発行しているようです。(/App/umtsd.lua)

 

3. /etc/ppp/options

/etc/ppp/options - パラメーターの修正(bold部分)

#debug
#logfile /dev/null
noaccomp
nopcomp
#nocrtscts
crtscts
lock
maxfail 0
lcp-echo-failure 5
lcp-echo-interval 3

Hardware flow controlを有効にするために nocrtsctsをコメントにします。そしてctsctsを追加します。また、lcp-echo-intervalの値を3に変更します。オリジナルの1では、IO Data WSIM接続の場合に LCP Timeoutが発生することがありました。

 

4. /etc/hotplug.d/ttyusb/10-umts

/etc/hotplug.d/ttyusb/10-umts - 修正 (ファイルの先頭に追加)

modemtype=`uci get ttyusb.${VIDPID}.modemtype`
if [ "${modemtype}" != "3gumts" ] ; then
  exit 1
fi

modemtypeが”3gumts”ではないデバイスが装着されたときに3GUMTSが起動されるのを防ぎます。

 

5. /etc/hotplug.d/ttyusb/11-dialup

/etc/hotplug.d/ttyusb/11-dialup - 新規ファイルの追加

DIALER="/tmp/chat_dialer"

modemtype=`uci get ttyusb.${VIDPID}.modemtype`

if [ "${modemtype}" != "dialup" ] ; then
  exit 1
fi

[ "$ACTION" == "add" -a "$SUBSYSTEM" == "ttyusb" ] && {

attached=`uci get network.ppp.attached`
if [ "${attached}" != "1" ] ; then
  speed=`uci get ttyusb.${VIDPID}.speed`
  username=`uci get ttyusb.${VIDPID}.username`
  password=`uci get ttyusb.${VIDPID}.password`
  connectcmd=`uci get ttyusb.${VIDPID}.connectcmd`
  atinit=`uci get ttyusb.${VIDPID}.atinit`

# Write to /etc/config/network ppp section
  uci set network.ppp.speed="${speed}"
  uci set network.ppp.username="${username}"
  uci set network.ppp.password="${password}"
  uci set network.ppp.connectcmd="${connectcmd}"
  uci set network.ppp.device="/dev/""${NODE}"
  uci commit network

echo "\
#!/usr/sbin/chat -f
TIMEOUT 10
ABORT   '\nNO ANSWER\r'
ABORT   '\nNO CARRIER\r'
ABORT   '\nNO DIALTONE\r'
ABORT   '\nBUSY\r'
''      ATZ
OK      AT
OK      ${atinit}
TIMEOUT 30
OK      ATDT\T
CONNECT \d\d" > ${DIALER}

    chmod +x ${DIALER}
uci set network.ppp.attached=1
uci commit network

    ifup ppp
fi
}

[ "$ACTION" == "remove" -a "$SUBSYSTEM" == "ttyusb" ] && {
uci set network.ppp.attached=0
uci commit network
}

modemtypeが”dialup”ではないデバイスが装着されたときにdial up接続が起動されるのを防ぎます。

Hotplug in 処理(環境変数 ACTIONの値が”add”)のときには、

  • ‘attached’ flagが1でない場合、すなわち WSIM接続時、Huawei (Emobile)接続で /dev/ttyUSB0の処理のときには、処理を進めます。 ‘attached’が1の場合には、Huawei(Emboile)接続で /dev/ttyUSB1(Control port)の処理でのすで、以下の処理はttyUSB0 (Data port)と重複するため行いません。
  • VIDPIDが環境変数として引き渡されるので、対応する設定情報を /etc/config/ttyusbより取得し、/etc/config/networkの’interface’ ‘ppp’セクションにコピーします。そして、最後に ‘attached’ を1にします。

unplug処理(環境変数 ACTIONの値が”remove”)のときには、’attached’を0として、次回のhotplug in処理用に初期化します。

 

6. /etc/hotplug.d/usb/10-umts

/etc/hotplug.d/usb/10-umts - 追加(ファイルの先頭に追加します)

fillzero() {
  id=$1
  len=`expr 4 - ${#id}`

  while [ ${len} -ge 1 ];
  do
    id="0"$id
    len=`expr $len - 1`
  done

  echo ${id}
}

# ${PRODUCT} contains vendor and product information, like 04bb/0940/1.
VID=`echo ${PRODUCT} | cut -f1 -d'/'`
PID=`echo ${PRODUCT} | cut -f2 -d'/'`
VID=`fillzero ${VID} | tr '[a-z]' '[A-Z]'`
PID=`fillzero ${PID} | tr '[a-z]' '[A-Z]'`
VIDPID=$VID$PID

# check the modemtype to prevent this script working on 3G/UMTS.
modemtype=`uci get ttyusb.${VIDPID}.modemtype`
if [ "${modemtype}" != "3gumts" ] ; then
  exit 1
fi

modemtypeが”3gumts”ではないデバイスが装着されたときに3GUMTSが起動されるのを防ぎます。

 

7. /etc/hotplug.d/usb/11-dialup

/etc/hotplug.d/usb/11-dialup - 新規ファイルの追加

DIALER="/tmp/chat_dialer"

fillzero() {
  id=$1
  len=`expr 4 - ${#id}`

  while [ ${len} -ge 1 ];
  do
    id="0"$id
    len=`expr $len - 1`
  done

echo ${id}
}

# ${PRODUCT} contains vendor and product information, like 04bb/0940/1.
VID=`echo ${PRODUCT} | cut -f1 -d'/'`
PID=`echo ${PRODUCT} | cut -f2 -d'/'`
VID=`fillzero ${VID} | tr '[a-z]' '[A-Z]'`
PID=`fillzero ${PID} | tr '[a-z]' '[A-Z]'`
VIDPID=$VID$PID

# check the modemtype to prevent this script working on 3G/UMTS.
modemtype=`uci get ttyusb.${VIDPID}.modemtype`
if [ "${modemtype}" != "dialup" ] ; then
  exit 1
fi

[ "$ACTION" == "add" -a "$HOTPLUG_TYPE" == "usb" ] && {
:
}

[ "$ACTION" == "remove" -a "$HOTPLUG_TYPE" == "usb" ] && {
        ifdown ppp
        # Remote dailup chat script
        rm -f ${DIALER}
        # Reset ppp attached flag
        uci set network.ppp.attached=0
        uci commit network
}

modemtypeが”dialup”ではないデバイスが装着されたときにdialup接続が起動されるのを防ぎます。そして、unplug処理(環境変数ACTIONの値が”remove”のときにはppp の接続断、chat script (/tmp/chat_dialer)の削除、’attached’を0にします(重複していますが)。

 

8. /lib/network/ppp.sh

/lib/network/ppp.sh - 修正(太字部分)

start_pppd() {
        local cfg="$1"; shift

        # make sure only one pppd process is started
        lock "/var/lock/ppp-${cfg}"
        local pid="$(head -n1 /var/run/ppp-${cfg}.pid 2>/dev/null)"
        [ -d "/proc/$pid" ] && grep pppd "/proc/$pid/cmdline" 2>/dev/null >/dev/null && {
                lock -u "/var/lock/ppp-${cfg}"
                return 0
        }

        # Workaround: sometimes hotplug2 doesn't deliver the hotplug event for creating
        # /dev/ppp fast enough to be used here
        [ -e /dev/ppp ] || mknod /dev/ppp c 108 0

        config_get device "$cfg" device
        config_get unit "$cfg" unit
        config_get username "$cfg" username
        config_get password "$cfg" password
        config_get keepalive "$cfg" keepalive

        config_get connect "$cfg" connect
        config_get disconnect "$cfg" disconnect
        config_get pppd_options "$cfg" pppd_options
        config_get_bool defaultroute "$cfg" defaultroute 1
# -- Start
# 2010/06/14
# Added overwriting "connect" paramter.
# Added linkname and ipparam
        config_get connect "$cfg" connectcmd
        config_get linkname "$cfg" linkname
        config_get ipparam "$cfg" ipparam
# – End

        [ "$defaultroute" -eq 1 ] && defaultroute="defaultroute replacedefaultroute" || de

        interval="${keepalive##*[, ]}"
        [ "$interval" != "$keepalive" ] || interval=5

        config_get_bool peerdns "$cfg" peerdns 1
        [ "$peerdns" -eq 1 ] && peerdns="usepeerdns" || peerdns=""

        config_get demand "$cfg" demand
        [ -n "$demand" ] && echo "nameserver 1.1.1.1" > /tmp/resolv.conf.auto

        config_get_bool ipv6 "$cfg" ipv6 0
        [ "$ipv6" -eq 1 ] && ipv6="+ipv6" || ipv6=""

# 2010/06/14
        /usr/sbin/pppd "$@" \
                ${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[,
                ${demand:+precompiled-active-filter /etc/ppp/filter demand idle }${demand:
                $peerdns \
                $defaultroute \
                ${username:+user "$username" password "$password"} \
                unit "$unit" \
                linkname "$linkname" \
                ipparam "$ipparam" \
                ${connect:+connect "$connect"} \
                ${disconnect:+disconnect "$disconnect"} \
                ${ipv6} \
                ${pppd_options}

        lock -u "/var/lock/ppp-${cfg}"
}

setup_interface_ppp() {
        local iface="$1"
        local config="$2"

        config_get device "$config" device
# 2010/06/14
        config_get speed "$config" speed

        config_get mtu "$cfg" mtu
        mtu=${mtu:-1492}
        start_pppd "$config" \
                mtu $mtu mru $mtu \
                "$device" "$speed"

  • connectcmd, linkname, ipparamの値を /etc/config/networkの’interface’ ‘ppp’より取得します。connectcmdはconnectを上書きします。
  • linknameとipparamをpppdの引数として追加します。
  • speedの値を取り出し、同じく引数として追加します。

 

9. /lib/uci/schema/defaults/network

/lib/uci/schema/defaults/network - 追加(ファイルの最後)

config variable
        option name     'connectcmd'
        option title    'Connect command"
        option section  'network.interface'
        option datatype 'string'
        option minlength 0
        option maxlength 64
        list   depends  'proto=ppp'

config variable
        option name     'linkname'
        option title    'pppd option linkname"
        option section  'network.interface'
        option datatype 'string'
        option minlength 0
        option maxlength 64
        list   depends  'proto=ppp'

config variable
        option name     'ipparam'
        option title    'pppd option ipparam"
        option section  'network.interface'
        option datatype 'string'
        option minlength 0
        option maxlength 64
        list   depends  'proto=ppp'

config variable
        option name 'speed'
        option title 'Connection bit rate'
        option section 'network.interface'
        option datatype uint

config variable
        option name 'attached'
        opiton title 'Dialup 1st data device attached'
        option datatype 'boolean'

/etc/config/networkに追加した値の定義をします。

 

10. /lib/uci/schema/defaults/ttyusb

/lib/uci/schema/defaults/ttyusb - 新規ファイル

package ttyusb

config section
        option name     'ttyusb'
        option package  'ttyusb'
        option unique   true

config variable
        option name     'driver'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'vendor'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'product'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'modemtype'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'device'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'connectcmd'
        option title    'Connect command'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 64

config variable
        option name 'speed'
        option title 'Connection bit rate'
        option section 'ttyusb.ttyusb'
        option datatype uint

config variable
        option name 'atinit'
        option title 'AT INIT command line'
        opiton section 'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        opiton maxlength 64

/etc/config/ttyusbの値の定義をします。

 

更新履歴

  • 2010/07/28: Initial release

2010年7月23日金曜日

Fonera 2202でWillcom/Emobile PPP接続 その2 (building kernel/firmware)

 

以下に最新開発環境の取得とUSB driverの変更点について記載します。

 

1. 開発環境の準備

Kernel / Firmware build環境はCent OS 5.5にて行いました。

参考リンクの「Sources and toolchain to build fon-ng and application」の記載がすべてなのですが、必要とするpackageについては Cent OS用に読替える必要があります。yumによるpackage適用となります。このときtftp server packageも一緒にインストールしておきます。

 

rootユーザーにてログインし、Yumから必要なpackageをインストールします。

# yum install binutils cpp gcc kernel-headers make zlib-devel ncurses-devel gawk bison flex unzip bzip2 autoconf intltool python subversion

次にPerlのmoduleをロードします。

# cpan

…  最初のCPANの機動の場合には、質問がされます。基本敵にはEnterでOKです。ダウンロード先は国内のサイトを選択します。CPANのpromptが表示れさたら、Diget, Digest::CRC, YAMLをインストールします。

CPAN> install Digest

CPAN> install Digest::CRC

CPAN> install YAML

CPAN> exit

 

Cent OSには一般ユーザーにてログインし、最新の開発環境をdownloadします。
% svn co http://svn.fonosfera.org/fon-ng/trunk

環境の初期化処理を行います。
% cd trunk
% sh ./install.sh

 

2. WSIM / H12HW用の修正

Cent OSのコンソールから trunk/openwrt/build_dir/linux-fonera2_developer/linux-2.6.26.2/drivers/usb/serial に移動します。bold字体の箇所が今回の追加です。

pl2303.h: WSIMのproduct IDを追加します。

#define IODATA_VENDOR_ID        0x04bb
#define IODATA_PRODUCT_ID       0x0a03
#define IODATA_PRODUCT_ID_RSAQ5 0x0a0e
#define IODATA_PRODUCT_ID_WSIM  0x0940

 

pl2303.c: IODATAのvendor IDとWSIMのproduct IDの組をtableに追加します。

{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_WSIM) },

 

option.c: H12HWのproduct IDを追加します。D02HWはE220として記載されています。

#define HUAWEI_VENDOR_ID                        0x12D1
#define HUAWEI_PRODUCT_E600                     0x1001
#define HUAWEI_PRODUCT_E220                     0x1003
#define HUAWEI_PRODUCT_E220BIS                  0x1004
#define HUAWEI_PRODUCT_H12HW                    0x1008

HUAWEIのvendor IDとH12HWのProduct IDの組をtableに追加します。

{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_H12HW, 0xff, 0xff, 0xff) },

 

3. kernel/firmwareのbuildとFonera 2202 firmwareの更新

「Sources and toolchain to build fon-ng and application」の記載に沿って、build作業を実施します。

% cd openwrt
% make menuconfig

ここで、Fon 2.0g (2202)用の設定となっているか、developer modeとなっているかの確認とpl2303の追加を行います。

 
f-1
Target Systemとdeveloper modeであるかどうかの確認をします。この場合、上図の一行目と二行目がそれぞれLa Fonera 2.0, developerと表示されております。値が異なる場合には、Enterキーを押して、sub menuに入り、設定を変更します。


f4   
pl2303 追加のために “Kernel modules”を選択、Enterキーを押します。

f5  
USB Supportを選択、Enterキーを押します。

f6 
kmod-usb-serial-pl2303を選択し、spaceキーを2回押してbuilt-in とします。ESCでtopに戻ります。

f7
Yesを選択して、configurationの更新をします。

 

kernel/firmwareのbuildを実施します。
% cd trunk/openwrt
% make V=99

 

Firmware(trunk/openwrt/bin/openwrt-fonera2.image)をtftp serverに置きます。ここでは Cent OS にtftp server packageをインストールしました。

Fonera 2202は以下のように接続します。

  • Fonera 2202のInternet側のコネクタ(白)をCent OSと同じLANに接続します。
  • Fonera 2202の筐体を開け、シリアルケーブル(カモン携帯電話用ケーブルの改造品、TxDのためにVCC pull upが必要)を接続します。

「Firmware update instructions」に従って、作成したfirmwareに入れ替えます。この作業については、更新に失敗するとFoneraが起動しなくなることもあります。もとのfirmwareに戻すには、Fonのダウンロードサイト(http://download.fonosfera.org/)から該当firmwareをdownloadし、同様の手順にて戻します。ダウンロードサイトに用意されているFirmwareは以下のようです。

 

Code name Version Desctiptions
Gari 2.3.6.0 Fon 2303用firmwareが用意されている。
Elan 2.3.0.0 Fon 2303用firmwareが用意されている。
Cheeky 2.2.6.0 Fon 2303用firmwareが用意されている。
Flipper 2.2.5.0 Fon 2202用firmwareが用意されている。
Platero 2.2.4.0 Fon 2202用firmwareが用意されている。
Caterpillar 2.2.3.0 Fon 2202用firmwareが用意されている。
OktoPussy 2.2.2.0 Fon 2202用firmwareが用意されている。
Trantor 2.2.1.0 Fon 2202用firmwareが用意されている。
failsafe N/A Fon 2204用のfailsafe firmwareと思われる。※1

※1 私自身は試したことはありません。

 

Fonera 2202 の接続は以下のようにして行いました。
Fonera 2202:
シリアルピン -- カモンケーブル -- シリアルUSB変換 -- Note PC
  Ethernet(白) – Ethernet HUB ----- Cent OS 5.5 (tftp server)



1. Foneraにシリアル接続したNote PCにて、端末ソフト(e.g. TeraTerm)を起動し、シリアルUSB変換機が設定したCOM port (e.g. COM6)に割り当てる。
2. Fonera 2202を機動。起動後、RedBootから ^Cの入力を促すpromptが表示されたところで、Note PCの端末ソフトから ^C を入力。

 +Ethernet eth0: MAC address **:**:**:**:**:**
IP: 0.0.0.0/255.255.255.0, Gateway: 0.0.0.0
Default server: 0.0.0.0

RedBoot(tm) bootstrap and debug environment [ROMRAM]
OpenWrt certified release, version 1.1 - built 12:40:38, Sep  3 2007

Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.

Board: FON 2202
RAM: 0x80000000-0x82000000, [0x80040290-0x80fe1000] available
FLASH: 0xa8000000 - 0xa87f0000, 128 blocks of 0x00010000 bytes each.
== Executing boot script in 3.000 seconds - enter ^C to abort
^C


3. ここでは、Fonera 2202のIP addressを192.168.0.1、tftpserverのIP addressを192.168.0.100と設定します。

RedBoot> ip_address -l 192.168.0.1/24 -h 192.168.0.100

4. tftp serverより、firmwareをダウンロードし、設定を行います。resetで再起動し、新規firmwareが機動します。

RedBoot> load –r –b %{FREEMEMLO} openwrt-fonera2.image

RedBoot> fis delete image

RedBoot> fis create image

RedBoot> reset

 

Firmwareが更新されますと、それまでの設定がクリアされてしまいます。Foneraの自動更新スクリプトでは、/etc/以下のファイルの一部を保存して、更新後に戻してしいるようです。

pl2303をbuiltin したkernel/firmwareが起動すると以下のメッセージが記録されます。

# dmesg
…

usbserial: USB Serial support registered for pl2303
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver

USB Hub経由で WSIMをFonera 2202に接続したときのメッセージは以下のようになります。

WSIM接続の構成は以下のようになります。

Fonera 2202:
USB port – USB 2.0 Hub – IO Data WSIM – NetIndex W-SIM

# dmesg

…

pl2303 1-1.1:1.0: pl2303 converter detected
usb 1-1.1: pl2303 converter now attached to ttyUSB0
ttyusb -> 1 ttyUSB0 pl2303 04BB0940

 

参考リンク

変更履歴

  • 2010/07/29: yum installとcpanについて記載を追加

2010年7月21日水曜日

Fonera 2202でWillcom/Emobile PPP接続  その1

1. はじめに

Fonera 2202にて、USB接続modemを利用したdialup PPP接続と設定編集のGUI(Lua/Luci)を作成してみました。現在テスト中ですが、なんとか動いているようです。USB接続のdialup modemの情報とdialup PPPの設定(account, 電話番号等)を登録しておくと、該当のUSB dialup modemが接続された際にhotplug inのキックからPPPで接続できるようになります。IO Data WSIM(W-SIM)とemobile H12HWにて接続テストをしています。emobileは当初D02HWにて行っていましたが、突然赤LEDの点灯状態(圏外表示)のままとなり、壊れてしまいました。そのため、H12HWにてテストを実施しています。D02HWでも問題なく動作するものと思われます。

2. 各設定の概要

2-1. Kernel/Firmwareの構築

WSIMとH12HWの認識ために、USB serial driverのpl2303/optionのソースに設定を追加してkernel/firmwareをbuildします。


(1) pl2303 driverにIO Data WSIMの設定を追加し、kernel/firmwareに組込ます。

(2) H12HW用のoption driverはkernel/firmwareに組込済みであるため、H12HWの設定のみをoption driverに追加します。

(3) build完了したfirmwareをtftpserver経由でFonera 2202に流し込みます。このときRedbootに入り込むためにFonera 2202にSerial port接続します。

folder file descriptions
drivers/usb/serial pl2303.h WSIMのproduct idを追加
  pl2303.c WSIMのvendor id, product idをid_tableに追加
  option.c H12HWのproduct id
を追加し、vendor id/product idの組をoption_idsに追加。D02HW(E220)は登録されている。
 

 

2-2. PPP接続

USBのhotplug in処理からPPP(pppd)を起動する処理については、日経Linux 2009/09月号「新FONルーターを改造する」の記事を参考にしました。記事と異なる点は以下の通りです。
3GUMTSのdaemon方式と異なり、hotplug in / unplug をベースにしたPPP接続・切断となります。

(1) 複数のUSBモデムを利用できるようにするため、/etc/config/ttyusbにUSB dialup modemの設定ファイルを用意し、USB hostplug in処理 (/etc/hotplug.d/ttyusb/11-dialup)にて、VIDPID (USBモデムのVendor IDとProduct IDを合わせた 16進8桁の値)をキーに /etc/config/ttyusbから/etc/config/networkのppp sectionに接続に必要な値をコピーするようにしました。


(2) pppdを起動する場合に、speed parameterによるInterface speedの指定がないと9600bpsでの接続になってしまうことがあるようです。ttyおよびpppdの初期化処理のソースを見てみましたが、原因の確定ができないためにspeed parameterを指定するようにしました。ちなみにWSIMは115200としました。これ以上のInerface sppedの設定では、WSIMがchat scriptに反応しないようです。/lib/network/ppp.shの修正となります。


(3) pppd接続後のfirewall設定をする必要があります。日経Linuxの記事では /etc/config/firewallにpppの設定を追加していますが、ここでは既存のWAN設定を利用します。そのためpppのlinknameとipparmを”wan”とします。


(4) Fonera 2202では 3GUMTSがimplementされています。emobile D02HWは3GUMTSの設定画面にてカスタム設定を選択し、必要なparamterを 個別設定することで接続できるようになります。ですが、今回hotplug inからPPPの接続を有効してしまうと、dialupと3GUMTS間での /dev/ttyUSB0のportの取り合いとなってしまうため、dialup接続の場合には、3GUMTSの起動を押さえるように/etc/config/ttyusbのmodemtypeを設定しました。この値を’dialup’としたUSB modemについては/etc/hotplug.d/ttyusb/10-umtsを修正して、3GUMTSの処理がキックされないようにしました。modemtypeの値を ‘3gumts’としたものについては、今回のdialup PPPではなく3GUMTSが起動するはずです。/etc/hotplug.d/ttyusb/11-dialupおよび/etc/hotplug.d/usb/11-dialupでは、modemtypeが’dialup’であるものについてのみ処理を行います。


(5) pppのdialup chat script (/tmp/chat_dialup)は、hotplug処理の中で作成します。USB modem のunplugでchat scriptも削除します。


(6) PPPのoption parameter (/etc/ppp/options)のうち hardware flow controlの設定とlcp-echo-intervalの調整が必要なようです。nocrtsctsをコメントにして、crtsctsを追加します。lcp-echo-interval はdefaultの1のままですと、WSIMの場合、頻繁にlcp timeoutが発生します。こちらの値は3程度にしておくと、だいぶLCP timeoutの発生頻度が減ります。

Folder file descriptions
/etc/config network ppp接続情報の追加
  ttyusb 各USB dialup modemの設定情報
/lib/network ppp.sh ppp接続コマンド
/etc/ppp options PPPオプション設定ファイル。crtsctsとlcp-echo-intervalを修正
/etc/hotplug.d ttyusb/10-umts VIDPIDに対応したttyusbのmodemtypeが”3gumts”のときに実行されるようにする。
  ttyusb/11-dialup VIDPIDに対応したttyusbのmodemtypeが”dialup”のときに実行されるようにする。
  usb/10-umts 何もしない。
  usb/11-dialup VIDPIDに対応したttyusbのmodemtypeが”dialup”のときに実行されるようにする。
/tmp/ chat_dialup pppdからchat scriptとして起動される。/etc/hotplug.d/ttyusb/11-dialupで作成される。
/lib/uci/schema/defaults network /etc/config/networkに追加した項目定義
  ttyusb /etc/cnfig/ttyusbに追加した項目の定義
 
2-3. USB dialup modem設定のGUI

今回、もっとも苦労した点です。基本はFoneraのWeb GUIから/etc/config/ttyusbのentry追加・編集・削除です。ですが、luciのMVC modelに不慣れなため、entryの追加・編集の画面がmodelの記述で簡単にできるであろう所をviewで記述してしまうような格好のよろしくないGUIとなっています。画面のスタイルを合わせるためにcssの設定などもmodelが生成した画面のhtmlソースを参考にview内に埋め込んでいます。
他にも 「入力した値のチェックがない」、「削除ボタン押下げ後の確認dialogがない」、「設定内容の表示がない」、「PPP接続状態の表示がない」などの手抜きがあります。


category File descriptions
Controller diaup.lua dialup GUIのメイン。各画面の記載。
View dialup/dialup.htm dialup設定のメイン画面。各設定の編集・削除と新規追加。
  dialup/addentry.htm 設定の新規追加の入力画面。「保存」を押すとmodelのttyregist.luaに処理が移る。
  dialup/edit.htm 設定の編集画面。「保存」を押すと、modelのttyregist.luaに処理が移る。
model cbi/dialup/remove.lua 指定の設定を削除する。
  cbi/dialup/ttyregist.lua 設定を登録する。VIDPIDが変更されたときは、削除・新規登録となる。
i18n dialup.en.lua 英語のメッセージファイル
  dialup.ja.lua 日本語のメッセージファイル

3. 参考資料

 

4. 更新履歴

  • 2010/07/28: 2-2. PPP 接続の表に/lib/uci/schema/defaultsの行を追加

2010年5月26日水曜日

Fonera 2.0 + emobile D02HW / Latest firmware

2010/06/18: Luciのsource code を眺めていたところ、apnなどの設定があり、custom設定の場合に表示されるような記載があり、UTMS/3Gの設定画面でカスタム設定にしてみたところ、apn等の入力ができることがわかりました。




Fonera 2.0g (2202)にlatestの開発環境にてbuildしたfirmwareを入れると、emobile D02HWを接続が可能となりました。


手順は以下の通りです。細部は省略します。
1. fonera開発環境より、latestの環境をbuild用のLinuxにcopyし、build
  • % svn co http://svn.fonosfera.org/fonng/trunk
  • trunk/fon/fonbase/files/etc/config/registeredファイルで option dev 1 がcomment outされていないことを確認。developer mode firmwareが必要なため。
  • build開始
    • % cd trunk
    • % ./install.sh
    • % cd openwrt
    • % make menuconfig           (何も変更しない)
    • % make V=99
  •  tftp server機 (Linux機にtftp-serverをいれました)にbuildされた firmware (trunk/openwrt/bin/openwrt-fonera2.image)をcopyします。


2. fonera 2.0g firmware入替
  • fonera 2.0g (2202)のfirmwareを上記のものに入れ替えます。シリアルケーブル接続もしくは、ssh接続を利用して、redbootから設定します。
  •  fonera 2.0g (2202)を起動します。このとき、背面のコネクタの黒(COMPUTER)には、fonera設定用(browserから)PCを接続(http://192.168.10.1)します。コネクタの白(INTERNET)にはInternet接続用にrouterへ接続します。
  • fonera 2.0g (2202)の起動後、設定用PCのbrowserからfoneraの設定を行います。Access password, Applicationなどです。
  • 初期設定が完了したら、以下の設定後、foneraを再起動します。
    • 白コネクタのINTERNET接続を外す
    • foneraのUSB portにUSB hubを接続。USB hubにはD02HWを接続
    • PCは黒コネクタに接続したまま
  • PCのbrowserのbrowserからfoneraに接続(http://192.168.10.1)します。 Dashboardより「UMTS/3G」を選択します。
  • UMTS/3Gの設定画面にて、下記の設定を行い、保存ボタンを押します。
    • 国: JAPAN
    • プロバイダ: e-mobile
    • PIN: ****                SIM cardに設定されているPIN codeを入力します。
  • 設定用PCからssh (teratermなど)にて、foneraに接続します。
  • foneraの /etc/config/umtsdをviにて編集します。apnの値がcdmaとなっているものをemb.ne.jpとします。   option 'apn' 'emb.ne.jp'
  • foneraを再起動して、D02HWのaccess LEDが点滅から連続点灯になるのを待ちます。chatのログは /tmp/chat_umtsに記録されるようです。これでPCから emobile 経由での接続が可能となります。PCからのPINGやbrowser accessなどの簡単なテストしかしておりません。




3. その他
  •  FON APは、emobile接続のときは有効とならないようです。UMTS/3Gの設定画面にて、FON APの制御と思われる「ホットスポットの起動」を有効にして「保存」ボタンを押しても、設定画面に戻ってしまいます。不具合と思われます。
  • APN情報は、/etc/3gsp.db.luaに記録されているようです。このファイルはbinaryとなっていますので開発環境のsourceを修正するとAPNが'emb.ne.jp'となり、設定の手間が省けるとは思われます。ですが、本来はUMTS/3Gの設定画面にてAPNの入力があるべきでしょう。
  • D02HWには携帯H12HWの黒SIMを入れています。通常の赤SIMでも問題はないでしょう。
  • firmware build時にkernel moduleの pl2303も有効にすると、willcom W-SIM用のIO DataのUSB-WSIMが認識されます。IO Addressをfonera側にて指定することかは必要ですが。W-SIMも3Gと同様の方法で、設定できると非常に楽とは思われます。


2010/05/25: Draft
2010/05/26: Initial release
2010/05/26: Fix typo
2010/06/18: cancel

2010年5月20日木曜日

Linux (CentOS) - update後、ATI graphics driverの動きがおかしい。

5月のCentOSのupdate後、catalyst control centerが起動しなくなってしまいました。

1. Catalyst Control Center(super-user)を「システム」→「設定」から起動すると、Password入力のdialogueが表示される。Passwordの入力後、GUIが開かない。
2. 「システム」→「設定」→「スクリーンセーバー」として、スクリーンセーバーのGUIを起動するとwindowsが真っ白のまま。
3. PCをしばらく放置し、Screen saverが動くと画面がblankのままとなり、復帰しない。Password入力のdialogueが表示されない。Cursorは動いている。


現在の環境
ハー ドウェア
- MB: Gigabyte GA-MA69GM-S2H
- CPU: AMD Athlon x2 BE-2400
- Memory: 6GB
- Monitor: IIYAMA AU5131DT (DVI接続)
- Graphics: ATI Xpress 1250 (Integrated)

ソフトウェア (yum 更新後) 
- OS: CentOS 5.5, Kernel 2.6.18-194.3.l.el5 (x86-64)
- X11: Release 7.1.1  xorg-x11-server 1.1.1-48.76.el5_5.1
- ATI graphics driver for Linux 64 9.3


Process listを見ると、catalyst control centerはプロセスとしては
起動しているようです。kill -9 にて止めます。

端末を開き、amdcccleを起動すると以 下のようになります。amdcccleは一般ユーザー用のcontrol centerコマンドです。

% amdcccle
X Error: BadRequest (invalid request code or no such operation) 1
  Extension:    143 (Uknown extension)
  Minor opcode: 19 (Unknown request)
  Resource id:  0x3a



また、glxgearsも。
% glxgears
X Error: BadRequest (invalid request code or no such operation) 1
  Extension:    143 (Uknown extension)
  Minor opcode: 19 (Unknown request)
  Resource id:  0x3a


どうもATI特有の問題のように見えます。Yumによる更新による影響で、X ServerからATI graphics driverへの呼出で不整合が発生したのでしょうか。
ATI Xpress 1250のLinux 64bit driverは 9.3が最新のため、graphics driverを更新しての解決はありえません。
libX11.soを個別にbuildして、ローカルにshared libraryを持てば解決するなどとの記載のあるサイトもありましたけれども。。。。

ATI catalyst driver 9.3を削除してみます。
# cd /usr/share/ati
# ./fglrx-uninstall.sh
システム再起動して、X11添付のati driverで利用します。
しかし、数秒毎に画面がブリンクする状態になってしまいました。

xorg-x11-ati packageを削除・再インストールしてみましたが、
数秒後毎にブリンクする症状に変化はありません。

ATI graphics driver 9.3を再度インストールしてみます。
# sh ./ati-driver-installer-9-3-x86.x86_64.run

なんとか、復帰したようです。
- Catalyst Control Center: OK
- glxgears: OK
- Screen Saver: 発動後、マウスを動かすとpassword入力dialogueが表示される。


念のため、nspluginwrapperでFlash player pluginも再度設定し直してみます。


X11関係の更新があった場合に毎回 ATI graphics driverの再インストールになるのでしょうか。

2010/05/20: Draft
2010/05/20: Initial release

2010年5月12日水曜日

Linux (CentOS)でのATI graphics driverのインストール

Linux (CentOS)にて、ATI (AMD) graphics driverをインストールしようとしたところ、うまくインストールできないようです。

1. 環境
Software
OS: CentOS 5.4 (kernel 2.6.18-164.15.1.el5 x86_64)
X: 7.1.1 (xog-x11-server 1.1.1-48.67.el5_4.1)

Hardware
MB: Gigabyte GA-MA69GM-S2H
CPU: Athlon X2 BE-2400
Memory: 6GB
Integrated graphics: Xpress 1250


2. 症状
AMDのweb siteからダウンロードしたATI driver 9.3 (x86_64)が正しくインストールされない。


[root]# sh ./ati-driver-instaler-9-3-x86.64_64.run
を実行。次いでxorg.confの設定変更
[root]# aticonfig --initial
X serverの再起動後、画面の同期がとれないもしくは何も表示されない状態となる。

復旧するには、Linuxの標準ドライバーで動いていた xorg.conf.backupをxorg.confにコピーして、X serverを再起動し、設定を実施する。
他のPCからsshにて入り込み、
# init 4
# kill -9
# cd /etc/X11
# cp xorg.conf.backup xorg.conf
→ 以下のようにLinux標準の状態となっていることを確認
Section "Device"
        Identifier  "Videocard0"
        Driver      "radeon_tp"
EndSection
# init 5


/var/log/messagesを見ると

May 11 21:53:44 amd64 kernel: [fglrx] Maximum main memory to use for locked dma buffers: 5645 MBytes.
May 11 21:53:44 amd64 kernel: [fglrx]   vendor: 1002 device: 791e count: 1
May 11 21:53:44 amd64 kernel: [fglrx] ioport: bar 4, base 0xee00, size: 0x100
May 11 21:53:44 amd64 kernel: ACPI: PCI Interrupt 0000:01:05.0[A] -> GSI 18 (level, low) -> IRQ 193
May 11 21:53:44 amd64 kernel: [fglrx] Driver built-in PAT support is enabled successfully
May 11 21:53:44 amd64 kernel: [fglrx:firegl_init_module] *ERROR* firegl_stub_register failed

のようなログがある。また、ati driverのインストールログ(/usr/share/ati/fglrx-install.log)によると
Kernel loadable module fglrx.koのロードが失敗との記載がある。

コマンドラインから試してみると、
[root]# cd /lib/modules/fglrx
[root]# modprobe fglrx
FATAL: Error inserting fglrx (.../fglrx.ko): Operation not permitted
失敗らしい。


3. 対処

ここで検索してみると。。。
http://wiki.cchtml.com/index.php/Ubuntu_Hardy_Installation_Guide
によるとubuntuの場合、Linux標準のradeon, drm moduleを削除するといけるらしい。

そこで上記 web siteの手順通りに
[root]# rmmod radeon
[root]# rmmod drm
念のため、ATI driverを再インストール
[root]# aticonfig --initial

X server再起動。
→いけました。

firefoxの画面スクロールが若干速くなったようです。

http://forums.fedoraforum.org/printthread.php?t=155503&pp=15&page=232
によるとradeonとdrmをblacklist.dにおいてもいいらしい。


下記screen shotは、X server再起動後のものです。



















Revision history
2010/05/11: Draft
2010/05/12: Initial release

2010年5月11日火曜日

Linux(CentOS)にてAX keyboardからのかな入力

Linux(CentOS 5.4)にてAX keyboardを利用する方法について記載します。

1. はじめに
目標は以下の通りです。
  • X windows systemにてSCIMによる仮名入力が可能となること。
  • かな配列はAX keyboardに刻印されたものであること。
  • SCIM/AnthyのON/OFFは『無変換』キーにて行う。
  • 変換は『変換』キーにて行う。

※1: 『AX』キーは利用しない。
※2: AX keyboardはPS/2 Interface接続。
※3: 以下『』ではキー自体を示します。「」はキーによって発生する文字(コード)を示します。

環境は以下の通りです。
  • M/B: Gigabyte GA-MA69SM-S2H, CPU: AMD X2 BE-2400, 6GB Memory
  • Linux: CentOS 5.4 (Kernel 2.6.18-164.15.1.el5 x86_64)
  • X windows system: 7.1.1 x86_64
  • AX keyboard: FKB8520-501


 Fig-1. AX keyboard








設定の概要は下記の通りです。

(1) Kernel AT keyboard driverに対して、AX keyboardの『無変換』、『変換』キーを押したときにOADG 106 keyboardの『無変換』、『変換』キーと同じkeycodeを発生させます。setkeycodesコマンドにて行います。Keyboardの定義は AT "us" のままとします。

(2) X11 windows systemにて、 『無変換』、『変換』のキーが押されたときに、それぞれ「Muhenkan」と「Henkan」のkeycodeを発生されるようにします。これは $HOME/.Xmodmapに記載します。

(3) SCIM/Anthyにて、かな入力のカスタマイズ定義をします。SCIM/Anthyは、かな入力のときに押された英数字キーをかなにマッピングしてい ますが、そのマッピングがOADG 106 keyboard用になっているため、AX keyboard用の配列にします。
 
(4) 『ろ』のキーが押されたときにdefaultのままでは、"<"が発生されるようになっており、かな入力の際に読点「、」が表示されます。そこで『ろ』キーを押したときに「|」を発生させます。『ろ』キーの表記通り「\」を発生させると『Back Space』左横の『¥』キーの音引き「ー」とかち合います。SCIM/Anthyの定義で「|」に対して、"ろ"のマッピングをします。


2. 設定手順
設定の手順としては以下のようになります。
2-1. Linux consoleにて、『無変換』、『変換』キーのscan codeがOADG 106 keyboardの『無変換』、『変換』キーと同じkeycode(94, 92)を発生させます。


(1) X windowsから、端末を開きます。su - にてsuper userとなり、init 4を実行して、consoleに戻ります。

(2) consoleからrootにてログインし、showkeyを実行します。
『無変換』、『変換』キーを押したときに下記のconsole messageが表示されることを確認します。
Linux consoleから『無変換』キーを押したときに表示されるmessage
atkbd.c: Unknown key pressed (translated set 2, code 0x5a on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known
atkbd.c: Unknown key released (translated set 2, cod 0x5a on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known.

Linux consoleから『変換』キーを押したときに表示されるmessage

atkbd.c: Unknown key pressed (translated set 2, code 0x5b on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known
atkbd.c: Unknown key released (translated set 2, cod 0x5b on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known.

10秒間入力がなければ、showkeyは勝手に終了します。

(3) setkeycodeコマンドにて scan code - keycodeの割り当てを行い、『無変換』、『変換』キーを押したときに想定したkeycodeが発生することを確認します。
[root]# setkeycodes 5a 94
[root]# setkeycodes 5b 92
[root]# showkey

/etc /rc.localに上記のsekeycodesを追加して、システム再起動を行い、起動時に設定されることを確認します。

[root]# cat /etc/rc.local
---------------
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

setkeycodes 5a 94
setkeycodes 5b 92
---------------

設定が完了すると init 4でconsoletからshowkeyを実行したときに以下のようになります。
[root ]# showkey
---
keycode 94 press
keycode 94 release
keycode 92 press
keycode 92 release
---

init 5でX windows systemに戻ります。


2-2.xmodmapによるX windows systemでのキー定義
X windows systemに『無変換』、『変換』キーを認識させるために$HOME/.Xmodmapを以下のように記述します。keycodeとkeysymの対応づけをするものです。keycode 94は、『ろ』キーで、「|」とshiftで「\」を発生させるためのものです。
[user]$ cat .Xmodmap
keycode  94 = bar backslash
keycode 129 = Henkan
keycode 131 = Muhenkan
remove mod5 = ISO_Level3_Shift
keycode 113 = Alt_R

gnomeの起動時に .Xmodmapを読み込むかどうか聞いてくるので読み込ませるように設定します。

2010/05/15: 追記
CentOSの新規インストール状態では、右Alt(AX『漢字』)キーは、ISO_Level3_Shiftに定義されているようです。これを外して、Alt_Rに定義し直しました。右Altも左Altも本来のAltとしてメニュー選択などに利用していますので、このような設定にしました。


2-3. X windows systemを起動し、SCIM/Anthyの設定変更を行います。
(1) ホットキーの開始/終了に Muhenkan を追加。Fig-2~Fig-6
(2) Anthy キーバインドの変換に Henkan を追加。Fig-7~Fig-12
(3) 仮名入力のレイアウトをユーザー定義として、カスタマイズを実施する。Fig-13
    カスタマイズの結果は $HOME/.scim/Anthy/config.styに保存される。直接編集でも対応できる。Appendix-1に掲載。

ここまでできる と、IMに対応したGUI applicationにて漢字入力ができるようになります。
  • ブラウザの起動後、ボックスなどのテキスト入力にfocusしたとこ、で『無変換』キーを押すと SCIM/Anthyのツールバーが表示されます。もう一度『無変換』キーを押すとツールバーは隠れます。
  • ツールバーが表示された状態で、かな入力ができます。『変換』キーを押すと仮名漢字変換されます。
  • ツールバーが表示された状態でも 左ALT, 右ALT(『漢字』キー), 左CTRL, 右CTRL(『英数/カナ』キー)は有効です。


Fig-2. SCIM/Anthy tool bar
右から2場面のプロパティアイコンをクリック


Fig-3. SCIM 開始/終了キー設定
左のペインにてフロントエンジン-全体設定
ホットキーグループの開始/終了列で右端の
ボタンをクリック





Fig-4. 設定画面
キーコード列の右端のボタンをクリック 








Fig-5. キー登録
『無変換』キーを押す



Fig-6. キー登録
追加ボタンクリックで完了






Fig-7. 『変換』キーの設定
IMエンジン-Anthyを選択
キーパインドタブを選択






Fig-8. キーバインドタブ画面







Fig-9 キー設定
キーを設定ボタンをクリック







Fig-10. 設定画面
キーコード列の右端のボタンをクリック










Fig-11.キー登録
『変換』キーを押す






Fig-12. キー登録
追加ボタンをクリック



































Fig-13. マッピング
かな入力タブ-レイアウト列のカスタマイズボタン
@ (shift+2)を押したときに「ふ」が表示されるようにマッピング済み。










4. 事前調査について
X windows system上でのAX keyboardによるかな入力について簡単に調査したところ、以下のことがわかったために、今回の設定方法にしたものです。

4-1. X windows system上のSCIM/Anthy入力は、かな入力のときには、キー入力により発生したASCIIコードに対応した「かな・かな記号」へのマッピング テーブルを持っているようです。そのマッピングテーブルはOADG 106 keyboardのASCII配列を想定しており、AX keyboardでかな入力をすると一部キーの刻印と表示される文字が異なる現象が発生してしまいます。それゆえ、そのマッピングをAX keyboard用に変更でき、かつSCIM/Anthyでのかな入力に限定するならば、X windows systemでのxkbシステムにて/usr/share/X11/xkb以下にax105用のkeyboard情報を作成して、きちんとかな文字を発生させる必要もないと思われました。

4-2. X windows systemでのOADG 106 keyboard用の『無変換』、『変換』キーの割り当ては、
hw/xfree86/common/xf86Keymap.h
--------------------
static KeySym map[NUM_KEYCODES * GLYPHS_PER_KEY] = {

#ifdef HAVE_XORG_CONFIG_H
#include
#endif

#if !defined(__SOL8__) && (!defined(sun) || defined(i386))

    /* 0x00 */  NoSymbol,       NoSymbol,       NoSymbol,       NoSymbol,
    /* 0x01 */  XK_Escape,      NoSymbol,       NoSymbol,       NoSymbol,
---

    /* 0x79 */  XK_Henkan,      XK_Mode_switch, NoSymbol,       NoSymbol,
    /* 0x7a */  NoSymbol,       NoSymbol,       NoSymbol,       NoSymbol,
    /* 0x7b */  XK_Muhenkan,    NoSymbol,       NoSymbol,       NoSymbol,
--------------------
と定義されています。すなわち、OADG 106 keyboardにて、
(1) 『無変換』が押された。scancode: 0x7b / Linux kernel AT keyboard driver
(2) 0x7bをXK_Henkanのkeysym (0xff23)に変換。/ X11 Server
(3) XK_Henkanのkeysym (0xff23)を keycode 131に変換 / X11 Server, xkb
の順で処理されているものと推測されます。

xf86Keymap.hにて、AX keyboardの『無変換』キー(scancode 0x5a)と『変換』キー(scan code 0x5b)は以下のような定義になっています。
    /* 0x5a */  XK_Up,          NoSymbol,       NoSymbol,       NoSymbol,
    /* 0x5b */  XK_Prior,       NoSymbol,       NoSymbol,       NoSymbol,

X11の keysymの定義は /usr/include/X11/keysymdef.h。

/* Japanese keyboard support */

#define XK_Kanji                         0xff21  /* Kanji, Kanji convert */
#define XK_Muhenkan                      0xff22  /* Cancel Conversion */
#define XK_Henkan_Mode                   0xff23  /* Start/Stop Conversion */
#define XK_Henkan                        0xff23  /* Alias for Henkan_Mode */


4-3. Linux Kernel AT keyboard driverでは、AT keyboardのscancode set 2を指定しているように見えます。

4-4. Keyboardからのscan codeは、atkbd_set2_keycode tableにて発生させるキーの制御をしている。AX keyboardの『無変換』、『変換』キーのscancodeに対して発生させるキーは '0' となっており、それらのキーは押しても無視されているようです。ただし、AT keyboard driverは、それぞれのキーのpress(make), release(break)でAT keyboardが変換テーブルで未割当である旨のmessageをAT keyboard driverが表示しているようです。





Appendex-1 SCIM/Anthy config file (key mapping)

[user]$ cat $HOME/.scim/Anthy/config.sty

Encoding=UTF-8
Title=User\ defined

[KanaTable/FundamentalTable]
1=ぬ
2=,ふ
3=あ
4=う
5=え
6=お
7=や
8=ゆ
9=よ
0=わ
-=,ほ
^=ぉ
q=,た
w=,て
e=い
r=,す
t=,か
y=ん
u=な
i=に
o=ら
p=,せ
@=,ふ
\[=゛
a=,ち
s=,と
d=,し
f=,は
g=,き
h=,く
j=ま
k=の
l=り
;=れ
:=れ
\]=゜
z=,つ
x=,さ
c=,そ
v=,ひ
b=,こ
n=み
m=も
\,=ね
.=る
/=め
\\=ー
!=ぬ
"=,け
\#=ぁ
$=ぅ
%=ぇ
&=ゃ
'=,け
(=ょ
)=を
~=」
\==,へ
|=ろ
Q=,た
W=,て
E=ぃ
R=,す
T=ヵ
Y=ん
U=な
I=に
O=ら
P=,せ
`=む
A=,ち
S=,と
D=,し
F=ゎ
G=,き
H=,く
J=ま
K=の
L=り
+=,へ
*=ゅ
Z=っ
X=,さ
C=,そ
V=,ゐ
B=,こ
M=も
N=み
_=,ほ
}=「



Appendix-2. xorg.conf

/etc/X11/xorg.confを記載します。

Section "ServerLayout"
        Identifier     "single head configuration"
        Screen      0  "aticonfig-Screen[0]-0" 0 0
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
EndSection

Section "ServerFlags"
        Option      "Xinerama" "off"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
        Option      "XkbModel" "pc105"
        Option      "XkbLayout" "us"
EndSection


Section "Monitor"

 ### Comment all HorizSync and VertSync values to use DDC:
        Identifier   "aticonfig-Monitor[0]-0"
        ModelName    "Mitsubishi TFT Monitor RDT150S"
        HorizSync    24.8 - 63.0
        VertRefresh  30.0 - 85.1
        Option      "VendorName" "ATI Proprietary Driver"
        Option      "ModelName" "Generic Autodetecting Monitor"
        Option      "DPMS" "true"
EndSection

Section "Device"
        Identifier  "aticonfig-Device[0]-0"
        Driver      "fglrx"
        BusID       "PCI:1:5:0"
EndSection

Section "Screen"
        Identifier "aticonfig-Screen[0]-0"
        Device     "aticonfig-Device[0]-0"
        Monitor    "aticonfig-Monitor[0]-0"
        DefaultDepth     24
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes    "1024x768" "800x600" "640x480"
        EndSubSection
EndSection


その他
AX keyboardをPS/2→USB変換機経由で接続したときにはAT keyboardとなり、『無変換』、『変換』キーは有効にならない。これはどうしようもないのか時間ができたら調査したい。
疑問点は以下の通り。
  • USB keyboard driverは、scan code set 2にしているのか。AX keyboardはscan code set 2にしないと、『無変換』、『変換』などの固有キーが有効にならないような記憶がある。
  • OADG 106 keyboardは、固有のキーが有効となるが、これはなぜか?
  • AX keyboardをUSB接続するときは、PS/2→USB変換機が必要となるが、変換機がscan code set 2への変換とキーマッピングを行っているのか。

きちんとかなコードを発生させるためにはxkb データベース (/usr/share/X11/xkb)にAX keyboardの情報を登録する必要があるようだ。


参考資料
https://wiki.ubuntu.com/handrake
http://www.asahi-net.or.jp/~WR7S-NKMR/MiddleWare/keyboard/ax.htm
http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html

history
2010/5/9: Draft version
2010/5/11: Initial release
2010/5/15: Update .Xmodmap, added xorg.conf in Appendex-2