2012-10-09

OpenBlocks AX3でVyattaを動かす(ビルド編)

◆はじめに

VyattaはVyatta社が開発しているソフトウェアルータです。有償版もありますが、Vyatta COREと呼ばれるものはオープンソースとして公開されています。有償版に比べてWebベースのGUIが無い等はありますがオープンソース版でも多くの機能を使うことはできます。Vyattaは主にIntelプロセッサ向けに開発されていますが、ARMアーキテクチャのOpenBlocks AX3でオープンソース版のVyatta CORE 6.4を動かすこと目指し、今回は各パッケージのビルドまでを行います。


◆Vyattaソースコード取得

まずはVyattaのソースコードを取得します。ソースコードの取得にはgitが必要になるのでgitをインストールします。
 $ su
 # aptitude install git-core
 # exit
次にソースコードを取得します。
今回は執筆時点での最新のリリース版のVyatta CORE 6.4を利用します。
このバージョンはoxnardというブランチ名で開発されています。
 $ git clone http://git.vyatta.com/build-iso.git
 $ cd build-iso
 $ git checkout --track -b oxnard origin/oxnard
READMEファイルにビルド方法が記載されているので参考にします。
基本的にIntelプロセッサ向けに書かれていますのでARMでは多少変更する部分があります。


◆aptで必要なパッケージを導入する

まずは必要debianパッケージをインストールします。
インストール用のスクリプトがありますのでそれを実行します。
$ su
# sh ./setup-pkg-build 
400パッケージほどダウンロードされインストールされますのでかなり時間がかかります。
まだ不足しているパッケージがあるので追加でインストールします。
 # aptitude install python-central indent parted dosfstools ntp fakechroot uboot-mkimage libattr1-dev automake libsensors4-dev libboost-filesystem1.42-dev libapt-pkg-dev
このときlibsensors-devとconflictするので削除することになります。

i386やamd64ではビルド時にpackages.vyatta.comからパッケージを取得します。そのためvyatta-pubkey.gpgのインストールが必要となるのですが、armel用のパッケージはpackaegs.vyatta.comには存在しないため自前で準備する必要があります。そのため今回はvyatta-pubkey.gpgのインストールは不要となります。


◆サブモジュール群のビルド

ここからサブモジュール群のビルドに入ります。
Intel向けだとすでにビルドされたバイナリをサイトからaptで入手できますがARM向けは存在しないので自力でコンパイルする必要があります。

まずはサブモジュールを初期化します。
 $ git submodule init
次はgit submodule updateを行うのですが、その前にnfctがgitで取得できないため.git/configから以下を削除します。
ちなみにnfctはconntrack-toolsで生成されます。
 [submodule "pkgs/nfct"]
        url = http://git.vyatta.com/nfct.git
同様に.gitmoduleから以下を削除します。
 [submodule "pkgs/nfct"]
         path = pkgs/nfct
         url = http://git.vyatta.com/nfct.git

 $ git rm --cached pkgs/nfct
全てのサブモジュールを取得します。
 $ git submodule update
各モジュールのブランチをoxnardに変更します。
 $ git submodule foreach git checkout --track -b oxnard origin/oxnard
サブモジュールのビルドは基本的にはTOPディレクトリ(build_iso直下)でmake <サブモジュール名>
で行います。またエラーになった場合など一度クリアしたい場合にはmake clear-<サブモジュール名>とします。
例えばサブモジュール名がhogeの場合には以下のようになります。
 $ make hoge         (hogeのビルド)
 $ make clear-hoge   (hogeのクリア)
まずはビルド時に必要となるライブラリ等のビルドおよびインストールを行います。

squashfs-toolsをビルドしインストールします。
 $ make squashfs
 $ su
 # dpkg -i pkgs/squashfs-tools_4.1+vyatta-7+oxnard1_armel.deb
 # cat >| /etc/apt/preferences.d/squashfs-tools <<EOF
 Package: squashfs-tools
 Pin: version 4.*
 Pin-Priority: 1001
 EOF
 # exit
Debian squeezeには存在しないlibnet0 libsablot0をインストールするためにlennyのレポジトリを一時的に登録します。
 $ su
 # echo "deb http://archive.debian.org/debian/ lenny contrib main non-free" > /etc/apt/sources.list.d/lenny.list
 # aptitude update
 # aptitude install libnet0 libnet0-dev libsablot0 libsablot0-dev
 # rm /etc/apt/sources.list.d/lenny.list
 # exit
libmnlをビルドおよびインストールします。
 $ make libmnl
 $ su
 # dpkg -i pkgs/libmnl-dev_1.0.3-6_armel.deb \
           pkgs/libmnl0_1.0.3-6_armel.deb
 # exit
libcapをビルドおよびインストールします。
 $ make libcap
 $ su
 # dpkg -i pkgs/libcap-dev_2.19-3+vyatta2+oxnard1_armel.deb \
           pkgs/libcap2_2.19-3+vyatta2+oxnard1_armel.deb 

 # cat >| /etc/apt/preferences.d/libcap-dev <<EOF
 Package: libcap-dev
 Pin: version 2.*
 Pin-Priority: 1001
 EOF
 # cat >| /etc/apt/preferences.d/libcap2 <<EOF
 Package: libcap2
 Pin: version 2.*
 Pin-Priority: 1001
 EOF
iptablesをビルドおよびインストールします。
 $ make iptables
 $ su
 # dpkg -i pkgs/iptables-dev_1.4.10+vyatta+2+oxnard2_armel.deb \
           pkgs/iptables_1.4.10+vyatta+2+oxnard2_armel.deb
net-snmpをビルドおよびインストールします。
 $ make net-snmp
 $ su
 # dpkg -i pkgs/libsnmp-base_5.6.1.1-vyatta+7+oxnard6_all.deb \
           pkgs/libsnmp-python_5.6.1.1-vyatta+7+oxnard6_armel.deb \
           pkgs/libsnmp-dev_5.6.1.1-vyatta+7+oxnard6_armel.deb \
           pkgs/libsnmp-perl_5.6.1.1-vyatta+7+oxnard6_armel.deb \
           pkgs/libsnmp15_5.6.1.1-vyatta+7+oxnard6_armel.deb
daqをビルドおよびインストールします。
 $ make daq
 $ su
 # dpkg -i pkgs/libdaq-dev_0.3-2+vyatta3+oxnard1_armel.deb \
           pkgs/libdaq0_0.3-2+vyatta3+oxnard1_armel.deb
libnetfilter-conntrackをビルドおよびインストールします。
 $ make libnetfilter-conntrack
 $ su
 # dpkg -i pkgs/libnetfilter-conntrack3_1.0.0-1+vyatta10+oxnard4_armel.deb \
           pkgs/libnetfilter-conntrack3-dbg_1.0.0-1+vyatta10+oxnard4_armel.deb \
           pkgs/libnetfilter-conntrack-dev_1.0.0-1+vyatta10+oxnard4_armel.deb
libnetfilter-cthelperをビルドおよびインストールします。
 $ make libnetfilter-cthelper
 $ su
 # dpkg -i pkgs/libnetfilter-cthelper_1.0.1-5_armel.deb
libnetfilter-cttimeoutをビルドおよびインストールします。
 $ make libnetfilter-cthelper
 $ su
 # dpkg -i pkgs/libnetfilter-cttimeout_0.2+oxnard4_armel.deb
libnetfilter-queueをビルドおよびインストールします。
 $ make libnetfilter-cthelper
 $ su
 # dpkg -i pkgs/libnetfilter-queue-dev_1.0.1-2_armel.deb \
           pkgs/libnetfilter-queue1_1.0.1-2_armel.deb  
vyatta-cfgをビルドおよびインストールします。
 $ make vyatta-cfg
 $ su
 # dpkg -i pkgs/libvyatta-cfg-dev_0.99.73+oxnard6_armel.deb \
   pkgs/libvyatta-cfg1_0.99.73+oxnard6_armel.deb 
ここまででビルドに必要なパッケージのインストールは終わりました。
次からはパッケージのビルドだけ行います。Linuxカーネル(linux-image)は厄介なので後回しにして
Linuxカーネル以外の残りのパッケージをビルドします。
最終的に使用されるパッケージリストは livecd/config.vyatta/chroot_local-packageslists/vyatta-full.list
に記載されているので、このリストに記載されているもの以外は除外しています。

また一部コンパイルが通らないパッケージ(vyatta-cfg-systemとvyatta-biosdevname)
があるので修正します。
vyatta-cfg-system
grub-pcは不要なので削除します。また、ハイパバイザの判定にIntel Processor用アセンブラを使用している
部分を削除します。
 diff --git a/debian/control b/debian/control
 index 0b06b26..7396100 100644
 --- a/debian/control
 +++ b/debian/control
 @@ -52,7 +52,6 @@ Depends:  acpid,
   apt-transport-https,
   hostapd (>= 1:0.6.9-3),
   cpufrequtils,
 - grub-pc (>= 1.98+20100804),
   libcap2-bin (>= 2.19)
  Pre-Depends: bash-completion
  Suggests: util-linux (>= 2.13-5),
 diff --git a/src/hypervisor_vendor.c b/src/hypervisor_vendor.c
 index 0a44756..9bcef8b 100644
 --- a/src/hypervisor_vendor.c
 +++ b/src/hypervisor_vendor.c
 @@ -43,6 +43,7 @@
   */
  #define HYPERVISOR_INFO_LEAF   0x40000000
  
 +#if 0
  static inline void
  cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
  unsigned int *ecx, unsigned int *edx)
 @@ -64,6 +65,7 @@ cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
   "=d" (*edx)
  : "1" (op), "c"(0));
  }
 +#endif
  
  
  /* Use CPUID instruction to find hypervisor vendor.
 @@ -72,6 +74,7 @@ cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
   */
  static const char *get_hypervisor_cpuid(void)
  {
 +#if 0
  unsigned int eax = 0, ebx = 0, ecx = 0, edx = 0;
  char hyper_vendor_id[13];
  
 @@ -95,6 +98,7 @@ static const char *get_hypervisor_cpuid(void)
  else if (!strncmp("VMwareVMware", hyper_vendor_id, 12))
  return "VMware";
  else
 +#endif
  return NULL;
  }
vyatta-biosdevname
仮想マシンかどうかの判定の部分でIntel Processor用アセンブラを用いている部分があるので削除します。
 diff --git a/src/bios_dev_name.c b/src/bios_dev_name.c
 index e2f8454..a5b5fdd 100644
 --- a/src/bios_dev_name.c
 +++ b/src/bios_dev_name.c
 @@ -104,6 +104,7 @@ parse_opts(int argc, char **argv)
                 opts.prefix = "em";
  }
  
 +/*
  static u_int32_t
  cpuid (u_int32_t eax, u_int32_t ecx)
  {
 @@ -114,6 +115,7 @@ cpuid (u_int32_t eax, u_int32_t ecx)
         : "%ebx", "%edx");
      return ecx;
  }
 +*/
  
  /*
    Algorithm suggested by:
 @@ -125,9 +127,11 @@ running_in_virtual_machine (void)
  {
      u_int32_t eax=1U, ecx=0U;
  
 +/*
      ecx = cpuid (eax, ecx);
      if (ecx & 0x80000000U)
         return 1;
 +*/
      return 0;
  }
 以上の修正後に、以下のコマンドでビルドを実行します。
 $ make barnyard2 conntrack-tools initramfs-tools iproute ipset
 $ make live-initramfs lldpd netplug ntp pmacct ppp squidguard linux-firmware
 $ make vyatta-base vyatta-bash vyatta-busybox vyatta-conntrack
 $ make vyatta-conntrack-sync vyatta-cfg-dhcp-relay
 $ make vyatta-cfg-dhcp-server vyatta-cfg-firewall
 $ make vyatta-cfg-op-pppoe vyatta-cfg-qos vyatta-cfg-quagga vyatta-cfg-system
 $ make vyatta-cfg-vpn vyatta-cluster vyatta-config-migrate
 $ make vyatta-dhcp3-client vyatta-idp-snort vyatta-ipv6-rtradv vyatta-keepalived vyatta-nat vyatta-op
 $ make vyatta-op-dhcp-server vyatta-op-firewall vyatta-op-qos vyatta-op-quagga vyatta-op-vpn vyatta-op-xml
 $ make vyatta-openvpn vyatta-quagga vyatta-ravpn vyatta-snort vyatta-util vyatta-wanloadbalance
 $ make vyatta-webgui vyatta-webproxy vyatta-wireless vyatta-wirelessmodem
 $ make vyatta-netflow vyatta-biosdevname vyatta-lldp vyatta-zone vyatta-config-mgmt


◆OpenBlocks AX3対応のvyatta用Linuxカーネルをビルド

最後にLinuxカーネルパッケージ linux-imageをビルドします。
準備としてオリジナルのLinuxカーネルからOpenBlocks AX3用の差分を抽出します。
OpenBlocks AX3のカーネルにはunionfsのパッチが適用されています。また、vyattaのカーネルにもunionfsのパッチが適用されています。そこでオリジナルのLinuxカーネルにunionfsのパッチを適用してその後に差分をとるという手順にします。

まずはOpenBlocks AX3用のカーネルを取得します。
 $ cd ~
 $ wget ftp://ftp.plathome.co.jp/pub/OBSAX3/squeeze/3.0.6-4/source/linux-3.0.6-20120820-1.tar.gz
 $ tar zxf linux-3.0.6-20120820-1.tar.gz
 $ mv linux-3.0.6 linux-3.0.6.obsax3
次にオリジナルのカーネル3.0.6とunionfs用の差分を取得し差分を適用します。
 $ wget ftp://ftp.ne.jp/Linux/kernel.org/linux/kernel/v3.x/linux-3.0.6.tar.xz
 $ wget http://download.filesystems.org/unionfs/unionfs-2.x/unionfs-2.5.11_for_3.0.18.diff.gz
 $ tar Jxf linux-3.0.6.tar.xz
 $ cd linux-3.0.6
 $ zcat ../unionfs-2.5.11_for_3.0.18.diff.gz |patch -s -p1
 (ここで一ヶ所rejectされるので手動でパッチをあてます。)
 $ cd ..
OpenBlocks AX3用の差分を抽出します。
 $ diff -urN linux-3.0.6 linux-3.0.6.obsax3 > linux-3.0.6.obsax3.diff
準備ができたのでvyattaのlinux-imageのビルドに戻ります。
まずは準備したOpenBlocks AX3用の差分を適用します。
 $ cd build-iso/pkgs/linux-image
 $ patch -s -p1 < ~/DIFF-3.0.6 
 1 out of 5 hunks FAILED -- saving rejects to file arch/arm/kernel/smp.c.rej
 1 out of 2 hunks FAILED -- saving rejects to file drivers/tty/tty_ldisc.c.rej
 2 out of 10 hunks FAILED -- saving rejects to file fs/splice.c.rej
 The next patch would delete the file include/linux/namei.h.orig,
 which does not exist!  Assume -R? [n] 
 Apply anyway? [n] 
 1 out of 1 hunk ignored
 1 out of 2 hunks FAILED -- saving rejects to file include/linux/socket.h.rej
 1 out of 1 hunk FAILED -- saving rejects to file kernel/printk.c.rej
 3 out of 11 hunks FAILED -- saving rejects to file net/bridge/br_fdb.c.rej
rejectされた箇所を順番に確認していきます。
arch/arm/kernel/smp.c.rej
           手動で差分を適用します。
drivers/tty/tty_ldisc.c.rej
           tty_ldisc_reinit()関数への差分は不要なようなので適用しません。
fs/splice.c.rej
           該当部分を以下のように修正しました。
        int ret, more;

        ret = buf->ops->confirm(pipe, buf);
        if (!ret) {
                more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;

                if (sd->len < sd->total_len)
                         more |= MSG_SENDPAGE_NOTLAST;
                ret = file->f_op->sendpage(file, buf->page, buf->offset,
                                           sd->len, &pos, more);
        }

        return ret;

include/linux/socket.h.rej
           MSG_KERNSPACE, MSG_NOCATCHSIGはMarvellが追加したもののようで、
           MSG_SENDPAGE_NOTLASTとconflictしてしまします。
           そこで番号を以下のように変更します。
   #define MSG_KERNSPACE   0x200000
   #define MSG_NOCATCHSIG  0x400000

kernel/printk.c.rej
           手動で差分を適用します。
net/bridge/br_fdb.c.rej
           手動で差分を適用します。


続いてlinux-imageのarmel用build設定をします。
 $ cd ~/build-iso/pkgs/linux-image
 $ mkdir debian/arch/armel
 $ touch debian/arch/armel/config

debian/arch/armel/defines.obsax3-vyatta を以下のように作成します。
 $ vi debian/arch/armel/defines.obsax3-vyatta 
 [base] 
 flavours: obsax3-vyatta 
 kernel-arch: arm 
 kernel-header-dirs: arm 
 [obsax3-vyatta_build] 
 image-file: arch/arm/boot/zImage 
 [obsax3-vyatta_description] 
 hardware: OpenBlocks AX3
 hardware-long: OpenBlocks AX3
 [obsax3-vyatta_image] 
 recommends: uboot-mkimage 
 check-size: 2097080
 [obsax3-vyatta] 
 class: arm 
 longclass: arm and compatible 

armel archを追加します。
 $ vi debian/arch/defines
 arches:
  i386 amd64 armel

次にconfigを生成します。
まずはOpenBlocks AX3のデフォルトconfigをコピーしmenuconfigは必要な設定を追加します。
 $ cp arch/arm/configs/obsax3_defconfig .config
 $ make menuconfig
 (以下を追加しました)
 CONFIG_NETFILTER_NETLINK_CTHELPER=m
 CONFIG_NF_CONNTRACK_TIMEOUT=y
 CONFIG_NF_CT_NETLINK_TIMEOUT=m
 CONFIG_IP_SET_BITMAP_IP=m
 CONFIG_IP_SET_BITMAP_IPMAC=m
 CONFIG_IP_SET_BITMAP_PORT=m
 CONFIG_IP_SET_HASH_IP=m
 CONFIG_IP_SET_HASH_IPPORT=m
 CONFIG_IP_SET_HASH_IPPORTIP=m
 CONFIG_IP_SET_HASH_IPPORTNET=m
 CONFIG_IP_SET_HASH_NET=m
 CONFIG_IP_SET_HASH_NETPORT=m
 CONFIG_IP_SET_LIST_SET=m
 CONFIG_IP_VS_FTP=m
 CONFIG_IP_NF_MATCH_IPP2P=m
 CONFIG_SQUASHFS=y
 CONFIG_SQUASHFS_XATTR=y
 CONFIG_SQUASHFS_LZO=y
 CONFIG_SQUASHFS_XZ=y
 CONFIG_SQUASHFS_EMBEDDED=y
 CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
生成された .configを必要な場所にコピーします。
 $ cp .config debian/arch/armel/config.obsax3-vyatta
次にbuild-flavour.shを実行してdebian/controlファイルを生成するのですが、その前に生成されるcontrolファイルのSection: adminがSection: kernelになるようにtemplateファイルに修正を加えます。
これをしないと後ほどパッケージビルド時にエラーが起こります。
 $ for f in debian/templates/control.image.*
   do
     sed -i -e 's/^Section: admin/Section: kernel/' $f
   done
kernel flavour の準備をします。最後にエラーがでますが無視して問題ありません。
 $ ./debian/bin/build-flavour.sh obsax3-vyatta

 (snip)
 This target is made to fail intentionally, to make sure
 that it is NEVER run during the automated build. Please
 ignore the following error, the debian/control file has
 been generated SUCCESSFULLY.
 exit 1
 make[1]: *** [debian/control-real] Error 1
 make[1]: Leaving directory `/home/ono/build-iso/pkgs/linux-image'
 make: *** [debian/control] Error 2

ようやくlinux-imageパッケージ生成の準備ができましたのでビルドします。

 $ cd ~/build-iso
 $ make linux-image


◆まとめ

今回はOpenBlocks AX3上でVyatta CORE 6.4のサブモジュールのビルドを行いました。次回はLIVE ISOイメージを作成して実際にOpenBlocks AX3で起動させてみます。

2012-10-08

[.tested] Planex GW-USHyper300 無線LANアダプタ [AX3][A6]



Planex GW-USHyper300は、802.11b/g/nに対応したUSB無線LANアダプタです。
Openblocks AX3およびA6での動作検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。


<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

1. 対応ドライバと事前準備

本デバイスは、RTL8192SUを使用しており、AX3/A6とも、標準のカーネルパッケージでは対応していません。
そのため、Realtek社のWebページより、ドライバのソースコードパッケージを入手し、ビルドして検証を行いました。

Software: Drivers & Utilities / RTL8192SU

RTL8192CUの、Linux Kernel 2.6.18~2.6.38 and Kernel 3.0.2 の項目にあるリンクからドライバパッケージをダウンロードします。
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip RTL819xSU_usb_linux_v2.6.6.0.20120405.zip

このパッケージは、ターゲットが対応する機器ならば、作成されたディレクトリへ移動し、
install.shによりインストールが行えるのですが、Openblocksは対応機器にありませんので、
以下の手順によりドライバパッケージのコンパイルおよびインストールを行います。

# cd rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405
# cd driver
# tar xvzf rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405.tar.gz
# cd rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405


Makefileを編集します。
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。
アップデートにより内容が変更されている場合は、参考にして書き換えてください。

# diff -u Makefile.orig Makefile
--- Makefile.orig       2012-10-10 17:30:21.830000038 +0900
+++ Makefile    2012-10-10 17:31:01.710000037 +0900
@@ -11,7 +11,8 @@

 CONFIG_MP_INCLUDED              =       y

-CONFIG_PLATFORM_I386_PC         =       y
+CONFIG_PLATFORM_I386_PC         =       n
+CONFIG_PLATFORM_ARM_OBS         =       y
 CONFIG_PLATFORM_ANDROID_X86     =       n
 CONFIG_PLATFORM_ARM_S3C         =       n
 CONFIG_PLATFORM_ARM_PXA         =       n
@@ -85,6 +86,17 @@
 CROSS_COMPILE ?=
 KVER  := $(shell uname -r)
 KSRC := /lib/modules/$(KVER)/build
+MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
+INSTALL_PREFIX :=
+endif
+
+ifeq ($(CONFIG_PLATFORM_ARM_OBS), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
+ARCH ?= arm
+CROSS_COMPILE ?=
+KVER  := $(shell uname -r)
+KSRC := /lib/modules/$(KVER)/build
 MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
 INSTALL_PREFIX :=
 endif


次に、includeディレクトリに移動し、autoconf.hを編集します。
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。
アップデートにより内容が変更されている場合は、参考にして書き換えてください。
(#define CONFIG_IOCTL_CFG80211 1 の行を削除するだけです)

# diff -u autoconf.h.orig
autoconf.h
--- autoconf.h.orig     2012-10-12 16:30:45.560000077 +0900
+++ autoconf.h  2012-10-12 16:30:59.050000077 +0900
@@ -33,7 +33,7 @@
 #undef  CONFIG_RTL8716


-#define CONFIG_IOCTL_CFG80211  1
+//#define CONFIG_IOCTL_CFG80211        1

 #ifdef CONFIG_IOCTL_CFG80211
 #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER


変更後、make および installを行います。

# make install

ドライバは、
/lib/modules/2.6.31/kernel/drivers/net/wireless/
の下にコピーされ、depmod -aされます。
不要になり、削除する場合は、8192cu.koを削除し、depmod -aして下さい。

デバイスをUSBポートに差し込めば認識します。
dmesgは以下の通りです。

usb 1-1: new high speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=2019, idProduct=ed18
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: GW-USH300N
usb 1-1: Manufacturer: PLANEX COMMUNICATIONS INC.
usb 1-1: SerialNumber: 00e04c000001
==DriverVersion: v2.6.6.0.20120405==
register rtl8712_netdev_ops to netdev_ops

8712_usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=83
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=4
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(2):
bLength=7
bDescriptorType=5
bEndpointAddress=6
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(3):
bLength=7
bDescriptorType=5
bEndpointAddress=d
wMaxPacketSize=200
bInterval=0

8712u : USB_SPEED_HIGH
nr_endpoint=4
Boot from EFUSE
Autoload OK!!
CustomerID = 0x   0
MAC Address from efuse= 0-22-cf-46-2e-d3
usbcore: registered new interface driver r871x_usb_drv


デバイスは、

/dev/wlan0

となります。

2. wpasupplicantパッケージの導入およびインタフェースの設定

以下の記事を参照して下さい。

[.tested] Logitec LAN-W150N/U2WH(BK) 無線LANアダプタ [AX3]

上記のドライバにより、AX3、A6においてクライアントモードでの動作を確認しました。
iwconfigでは、以下の様に表示されます。

# iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"*****"  Nickname:"rtl_wifi"
          Mode:Managed  Frequency:2.452 GHz  Access Point: **:**:**:C2:F4:00
          Bit Rate:150 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=38/100  Signal level=38/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0


3. APモードでの検証について

APモードに関しては、上記のパッケージにはhostapdのパッケージは含まれていないため、検証を行っていません。
同メーカの製品では、以下の検証記事において、realtek社から提供されるhostapdパッケージの検証を行っています。 

[.tested] Planex GW-USFang300 無線LANアダプタ [AX3][A6] 

[.tested] Planex GW-USEco300 無線LANアダプタ [AX3][A6]


2012-10-07

[.tested] Planex GW-USEco300 無線LANアダプタ [AX3][A6]



Planex GW-USEco300は、802.11b/g/nに対応したUSB無線LANアダプタです。
Openblocks AX3およびA6での動作検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。


<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

1. 対応ドライバと事前準備
AX3とA6でそれぞれ対応が異なります。

(1) AX3の場合
本デバイスは、RTL8192CUを使用しており、AX3のカーネルパッケージ3.0.6では、rtl8192cuドライバにおいてサポートされています。
本ドライバはリリースされているカーネルでは組み込み済みであり、また、上記デバイスのVendorIDおよびProductIDも登録されているため、カーネ

ルの再構築は必要ありません。

ただし、カーネルに組み込まれたrtl8192cuドライバは、別途メーカから配布されたファームウェアを読み込む仕様になっています。
このファームウェアは、debian squeezeでは

http://packages.debian.org/squeeze-backports/firmware-realtek

にあるように、firmware-realtek (0.35~bpo60+1)に含まれています。
backports/non-freeのパッケージを一時的にインストールするために、/etc/apt/sources.listに以下の行を追加します。

deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free

インストールパッケージリストをアップデートし、インストールします。
# aptitude update
# aptitude -t squeeze-backports install firmware-realtek


/lib/firmware/rtlwifi/rtl8192cufw.binがインストールされているのを確認してください。

上記作業の後、デバイスをUSBに差し込むことにより認識します。
dmesgでは以下の様に表示されます。

usb 1-1: new high speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=2019, idProduct=ab2b
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: GW-USEco300
usb 1-1: Manufacturer: Planex Communications Inc.
usb 1-1: SerialNumber: 00e04c000001
rtl8192cu: MAC address: 00:22:cf:ab:a3:d3
rtl8192cu: Board Type 0
rtl8192cu: rx_max_size 15360, rx_urb_num 8, in_ep 1
ieee80211 phy0: Selected rate control algorithm 'rtl_rc'
usbcore: registered new interface driver rtl8192cu

デバイスは、wlan0となります。

(2) A6の場合
RTL8192CUは、A6のカーネルパッケージ2.6.31では対応していません。
そのため、Realtek社のWebページより、ドライバのソースコードパッケージを入手し、ビルドして検証を行いました。

Software: Drivers & Utilities / RTL8192CU

RTL8192CUの、Linux Kernel 2.6.18~2.6.38 and Kernel 3.0.8 の項目にあるリンクからドライバパッケージをダウンロードします。
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip RTL819xC_USB_linux_v3.4.4_4749.20120806.zip

このパッケージは、ターゲットが対応する機器ならば、作成されたディレクトリへ移動し、
install.shによりインストールが行えるのですが、Openblocksは対応機器にありませんので、
以下の手順によりドライバパッケージのコンパイルおよびインストールを行います。

# cd RTL8188C_8192C_USB_linux_v3.4.4_4749.20120806/
# cd driver
# tar xvzf rtl8188C_8192C_usb_linux_v3.4.4_4749.20120730.tar.gz
# cd rtl8188C_8192C_usb_linux_v3.4.4_4749.20120730


Makefileを編集します。
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。
アップデートにより内容が変更されている場合は、参考にして書き換えてください。

# diff -u Makefile.orig Makefile
--- Makefile.orig       2012-10-10 13:02:18.721606504 +0900
+++ Makefile    2012-10-10 13:02:31.901614134 +0900
@@ -36,7 +36,8 @@
 CONFIG_RTL8192CU_REDEFINE_1X1 =n
 CONFIG_WAKE_ON_WLAN                            =       n

-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_OBS_ARM = y
 CONFIG_PLATFORM_TI_AM3517 = n
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_ARM_S3C2K4 = n
@@ -254,6 +255,17 @@
 CROSS_COMPILE ?=
 KVER  := $(shell uname -r)
 KSRC := /lib/modules/$(KVER)/build
+MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
+INSTALL_PREFIX :=
+endif
+
+ifeq ($(CONFIG_PLATFORM_OBS_ARM), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
+ARCH ?= arm
+CROSS_COMPILE ?=
+KVER  := $(shell uname -r)
+KSRC := /lib/modules/$(KVER)/build
 MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
 INSTALL_PREFIX :=
 endif


変更後、make および installを行います。

# make install

ドライバは、
/lib/modules/2.6.31/kernel/drivers/net/wireless/
の下にコピーされ、depmod -aされます。
不要になり、削除する場合は、8192cu.koを削除し、depmod -aして下さい。

デバイスをUSBポートに差し込めば認識します。
dmesgは以下の通りです。

usb 1-1: new high speed USB device using ehci_marvell and address 2
usb 1-1: string descriptor 0 read error: -75
usb 1-1: configuration #1 chosen from 1 choice
rtw driver version=v3.4.4_xxxx.20120730
Build at: Oct  5 2012 17:51:53
register rtw_netdev_ops to netdev_ops
CHIP TYPE: RTL8188C_8192C

usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=81
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_in = 1

usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=2
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_out = 2

usb_endpoint_descriptor(2):
bLength=7
bDescriptorType=5
bEndpointAddress=3
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_out = 3

usb_endpoint_descriptor(3):
bLength=7
bDescriptorType=5
bEndpointAddress=84
wMaxPacketSize=40
bInterval=1
RT_usb_endpoint_is_int_in = 4, Interval = 1
nr_endpoint=4, in_num=2, out_num=2

USB_SPEED_HIGH
Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C.
RF_Type is 2!!
EEPROM type is E-FUSE
====> ReadAdapterInfo8192C
Boot from EFUSE, Autoload OK !
EEPROMVID = 0x2019
EEPROMPID = 0xab2b
EEPROMCustomerID : 0x00
EEPROMSubCustomerID: 0x00
RT_CustomerID: 0x00
_ReadMACAddress MAC Address from EFUSE = 00:22:cf:ab:a3:d3
EEPROMRegulatory = 0x0
_ReadBoardType(0)
BT Coexistance = disable
RT_ChannelPlan: 0x02
_ReadPSSetting...bHWPwrPindetect(0)-bHWPowerdown(0) ,bSupportRemoteWakeup(0)
### PS params=>  power_mgnt(1),usbss_enable(0) ###
### AntDivCfg(0)
readAdapterInfo_8192CU(): REPLACEMENT = 1
<==== ReadAdapterInfo8192C in 320 ms
rtw_macaddr_cfg MAC Address  = 00:22:cf:ab:a3:d3
MAC Address from pnetdev->dev_addr= 00:22:cf:ab:a3:d3
bDriverStopped:1, bSurpriseRemoved:0, bup:0, hw_init_completed:0
usbcore: registered new interface driver rtl8192cu


デバイスは、

/dev/wlan0

となります。

2. wpasupplicantパッケージの導入およびインタフェースの設定

以下の記事を参照して下さい。

[.tested] Logitec LAN-W150N/U2WH(BK) 無線LANアダプタ [AX3]

上記のドライバにより、AX3、A6においてクライアントモードでの動作を確認しました。


3. hostapdによるAPモードでの使用方法

GW-USFang300と同様に、eth0とwlan0をブリッジ接続してAPモードでの設定を行いました。


上記ドライバパッケージを展開したディレクトリの下の、
wpa_supplicant_hostapdディレクトリ下にある、
wpa_supplicant_hostapd-0.8_rtw_20120510.zip
というrealtek専用のhostapdパッケージファイルを展開して、使用します。

パッケージファイルを展開し、hostapdディレクトリにてmakeを行うと、hostapdが作成されます。

hostapd.confは、wpa_supplicant_hostapdの下に、
rtl_hostapd_2G.conf
がありますので、環境に合わせて設定してください。

注意点として、このhostapdプログラムは、上記パッケージに含まれるreaktek版のドライバに依存しており、AX3のカーネル3.0.6にドライバを使用した場合は動作しません。
AX3で使用する場合は、AX3のカーネルのドライバモジュールを削除し、代わりに上記A6で導入したドライバと入れ替える必要があります。

上記のhostapdを使用して、A6とiPhone4S/Nexus7間でのWifi接続を確認しました。

2012-10-06

[.tested] Planex GW-USFang300 無線LANアダプタ [AX3][A6]




Planex GW-USFang300は、802.11b/g/nに対応したUSB無線LANアダプタです。
Openblocks AX3およびA6での動作検証を行いました。



OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。


<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

1. 対応ドライバと事前準備

本デバイスは、Realtek社のWebページの情報から推測するにRTL8192DUを使用しています。
RTL8192DUは、AX3およびA6の標準カーネルパッケージでは対応していません。
そのため、Realtek社のWebページより、ドライバのソースコードパッケージを入手し、ビルドして検証を行いました。

Software: Drivers & Utilities / RTL8192DU-VC

RTL8192DU-VCの、Linux Driver for Kernel 2.6.18~2.6.38 and 3.0.2 の項目にあるリンクからドライバパッケージをダウンロードします。
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip RTL8192DU_linux_v4.0.0_4074.20120518.zip

このパッケージは、ターゲットが対応する機器ならば、作成されたディレクトリへ移動し、
install.shによりインストールが行えるのですが、Openblocksは対応機器にありませんので、
以下の手順によりドライバパッケージのコンパイルおよびインストールを行います。

# cd RTL8192DU_linux_v4.0.0_4074.20120518
# cd driver
# tar xvzf rtl8192DU_linux_v4.0.0_4074.20120518.tar.gz
# cd rtl8192DU_linux_v4.0.0_4074.20120518


Makefileを編集します。
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。
アップデートにより内容が変更されている場合は、参考にして書き換えてください。

# diff -u Makefile.orig Makefile
--- Makefile.orig       2012-10-09 16:32:27.130006123 +0900
+++ Makefile    2012-10-09 16:33:53.650006092 +0900
@@ -36,7 +36,8 @@
 CONFIG_RTL8192CU_REDEFINE_1X1 = n
 CONFIG_INTEL_WIDI = n

-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_ARM_OBS = y
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_ARM_S3C2K4 = n
 CONFIG_PLATFORM_ARM_PXA2XX = n
@@ -219,6 +220,17 @@
 CROSS_COMPILE ?=
 KVER  := $(shell uname -r)
 KSRC := /lib/modules/$(KVER)/build
+MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
+INSTALL_PREFIX :=
+endif
+
+ifeq ($(CONFIG_PLATFORM_ARM_OBS), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
+ARCH ?= arm
+CROSS_COMPILE ?=
+KVER  := $(shell uname -r)
+KSRC := /lib/modules/$(KVER)/build
 MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
 INSTALL_PREFIX :=
 endif


変更後、make / installを行います。

# make install

ドライバは、
/lib/modules/$(KVER)/kernel/drivers/net/wireless/
の下にコピーされ、depmod -aされます。
不要になり、削除する場合は、8192du.koを削除し、depmod -aして下さい。

デバイスをUSBポートに差し込めば認識します。
dmesgは以下の通りです。

usb 1-1: new high speed USB device number 5 using ehci_marvell
usb 1-1: New USB device found, idVendor=2019, idProduct=4903
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: 802.11n NIC
usb 1-1: Manufacturer: Realtek
usb 1-1: SerialNumber: 00e04c000001
rtw driver version=v4.0.0_4074.20120518
Build at: Oct  5 2012 16:08:47
register rtw_netdev_ops to netdev_ops
CHIP TYPE: RTL8192D

usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=81
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_in = 1

usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=2
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_out = 2
nr_endpoint=2, in_num=1, out_num=1

USB_SPEED_HIGH
ReadChipVersion8192D 0xF0 = 0x4411635
Normal CHIP!!!
usb_dvobj_init(): pbuddy_padapter == NULL, Set pbuddy_padapter
EEPROM type is E-FUSE
====> ReadAdapterInfo8192D
Boot from EFUSE, Autoload OK !
E-CUT!!!
EEPROMVID = 0x2019
EEPROMPID = 0x4903
EEPROMCustomerID : 0x00
EEPROMSubCustomerID: 0x00
MAC Address from EFUSE = 00:22:cf:78:3e:78
Is D/E cut,Internal PA0 0 Internal PA1 0
PHY_SetPAMode mode 1, c9 = 0x0 cc = 0xff interface index 0
hal_ReadMacPhyModeFromPROM92DU:: MacPhyMode DUALMAC_DUALPHY
_ReadMacPhyModeFromPROM92DU(): MacPhyCrValue 1
MacPhyMode: DUALMAC_DUALPHY
PHY_ConfigMacPhyModeInfo92D(): wireless_mode = b
ChannelPlan = 16
<==== ReadAdapterInfo8192D
rtw_macaddr_cfg MAC Address  = 00:22:cf:78:3e:78
MAC Address from pnetdev->dev_addr= 00:22:cf:78:3e:78
bDriverStopped:1, bSurpriseRemoved:0, bup:0, hw_init_completed:0
register rtw_netdev_ops to netdev_ops
CHIP TYPE: RTL8192D

usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=89
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_in = 9

usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=a
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_out = a
nr_endpoint=2, in_num=1, out_num=1

USB_SPEED_HIGH
ReadChipVersion8192D 0xF0 = 0x4411635
Normal CHIP!!!
usb_dvobj_init(): pbuddy_padapter exist, Exchange Information
EEPROM type is E-FUSE
====> ReadAdapterInfo8192D
Boot from EFUSE, Autoload OK !
E-CUT!!!
EEPROMVID = 0x2019
EEPROMPID = 0x4903
EEPROMCustomerID : 0x00
EEPROMSubCustomerID: 0x00
MAC Address from EFUSE = 00:22:cf:78:3e:79
Is D/E cut,Internal PA0 0 Internal PA1 0
PHY_SetPAMode mode 1, c9 = 0x0 cc = 0xff interface index 1
hal_ReadMacPhyModeFromPROM92DU:: MacPhyMode DUALMAC_DUALPHY
_ReadMacPhyModeFromPROM92DU(): MacPhyCrValue 1
MacPhyMode: DUALMAC_DUALPHY
PHY_ConfigMacPhyModeInfo92D(): wireless_mode = 14
ChannelPlan = 16
<==== ReadAdapterInfo8192D
rtw_macaddr_cfg MAC Address  = 00:22:cf:78:3e:79
MAC Address from pnetdev->dev_addr= 00:22:cf:78:3e:79
bDriverStopped:1, bSurpriseRemoved:0, bup:0, hw_init_completed:0
usbcore: registered new interface driver rtl8192du


デバイスは、

/dev/wlan0
/dev/wlan1


となり、本アダプタには、2つの無線LANデバイスが組み込まれているのが分かります。
本アダプタには、上記ドライバパッケージのドキュメントによると、DMDPとDMSPの2つのモードがあり、上記手順でインストールすると、wlan0が2.4GHz帯、wlan1が5GHz帯のインタフェースとなるDMDPモードとなり、それぞれの最大速度は150Mbpsとなります。

2. wpasupplicantパッケージの導入およびインタフェースの設定

以下の記事を参照して下さい。

[.tested] Logitec LAN-W150N/U2WH(BK) 無線LANアダプタ [AX3]

上記のドライバにより、wlan0、wlan1それぞれ、クライアントモードでの動作を確認しました。
wlan1では5GHzでの接続になっています。

# iwconfig wlan1
wlan1     IEEE 802.11an  ESSID:"*****"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:5.18 GHz  Access Point: **:**:**:C2:F2:A0
          Bit Rate:150 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level=60/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

3. hostapdによるAPモードでの使用方法

2ポートある無線LANポートの片方をAPモードとして設定してみました。

前回、別のボードで設定した、hostapd-1.0そのままでは動作しないため、上記ドライバパッケージを展開したディレクトリの下の、wpa_supplicant_hostapdディレクトリ下にある、

wpa_supplicant_hostapd-0.8_rtw_20120510.zip

というrealtek専用のhostapdパッケージファイルを展開して、使用します。

パッケージファイルを展開し、hostapdディレクトリにてmakeを行うと、hostapdが作成されます。

hostapd.confは、wpa_supplicant_hostapdの下に、

rtl_hostapd_2G.conf

がありますので、環境に合わせて設定してください。

また、eth0とのブリッジ設定に関しては、

[.tested] Silex SX-PCEGN(P)+ PCI-E 無線LANモジュール [AX3]

を参照して下さい。
2.4G/5GHzを同時にAPで使用したい場合は、 ブリッジ設定で、eth0 wlan0 wlan1を設定しておき、
rtl_hostapd_2G.confをwlan0用に、rtl_hostapd_5G.confをwlan1用に設定し、それぞれの設定ファイルを使用してhostapdを立ち上げることになります。

上記のhostapdを使用して、AX3およびA6に対してのiPhone4SやNexus7での接続を確認しました。

4. APモードでハードウェアWPSボタンを使う方法

hostapdには、WPSのサポートがあり、hostapd_cliコマンドやキーボードでWPSのコントロールを行えます。
本デバイスに限らず、最近のWifi USBアダプタにはWPSボタンがついていますが、realtekのドライバパッケージには、このハードウェアボタン用のシグナルハンドルプログラムのサンプルが、上記パッケージの下に置いてあります。
hardware_wps_pbcディレクトリの下のsample.cをmakeし実行すると、ボタンを2秒押すと、
get HW_PBC signal from driver
というメッセージがコンソールに表示されます。
この表示の代わりに
system("hostapd_cli wps_pbs -i wlan0");
と書くと、WPSボタンを使った接続ネゴシエーションを行うための、WPSボタンハンドル用のデーモンとすることが可能になります。
ただし、あくまで評価用ですので、ハンドラ部をhostapdに組み込んだほうがいいと思います。

今回は、Nintendo DSiを使用してWPS接続が出来ることを確認しました。

2012-10-05

[.tested] MOXA UPort 1450 [AX3][A6]



MOXA UPort 1450は、4ポートのRS-232およびRS-232/422/485に対応した、USB-マルチポートシリアル・コンバータです。
OpenBlocks AX3およびA6での接続検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

1. 対応ドライバと事前準備
MOXA UPort1450のドライバは、カーネルには標準では組み込まれておらず、MOXAのサイトからドライバパッケージを入手する必要があります。

Moxa USB to Serial - UPort 1450/1450I 4-port RS-232/422/485 USB-to-serial converters with 2 KV isolation protection (optional)

Drivers & Software のページで、Driversを選択し、Operating Systemを指定してドライバパッケージをダウンロードします。
AX3は、Linux 3.x (x86)を、A6は、Linux 2.6.x (x86)を選択してください。(おそらく同じものです)

入手した、driv_linux_uport_v1.2_build_12071314.tgzを展開し、makeし、インストールします。

# tar xvzf driv_linux_uport_v1.2_build_12071314.tgz
# cd mxuport
# make install

UPort 1450をUSBポートに差し込むことによりデバイスが認識されます。

dmesgでは、以下のメッセージが表示されます。

usb 1-1: new high speed USB device using ehci_marvell and address 5
usb 1-1: configuration #1 chosen from 1 choice
mxuport 1-1:1.0: MOXA UPort 1400 series converter detected
usb 1-1: MOXA UPort 1450 detected
cpufreq: Setting CPU Frequency to 600000 KHz
cpufreq: Setting PowerSaveState to off
usb 1-1: Device firmware version v1.4.1
usb 1-1: MOXA UPort 1400 series converter now attached to ttyMXUSB0
usb 1-1: MOXA UPort 1400 series converter now attached to ttyMXUSB1
usb 1-1: MOXA UPort 1400 series converter now attached to ttyMXUSB2
usb 1-1: MOXA UPort 1400 series converter now attached to ttyMXUSB3

デバイス名は、

/dev/ttyMXUSB0
/dev/ttyMXUSB1
/dev/ttyMXUSB2
/dev/ttyMXUSB3

となります。

2. 使用方法
USB-マルチポートシリアル・コンバータは、AX3またはA6本体のUSBポートに差し込む事により使用可能となります。
起動前/後に係らず、設定は必要ありません。

デバイスが使用可能となった後は、一般的なシリアルポートの使用方法と同じです。
例えば、minicomによるターミナル操作を行いたい場合は、以下の操作になります。

# minicom -D /dev/ttyMXUSB0

minicomが無い場合は、minicomパッケージを導入してください。

# aptitude install minicom

2012-10-04

[.tested] Softbank 004Z [AX3][A6]



SoftBank 004Zは、「ULTRA SPEED」に対応した法人向けのUSBスティック型データ通信専用端末です。OpenBlocks AXおよびA6にて接続検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

1. 対応ドライバと事前準備
本デバイスは、ZTE WCDMA Technologies製品として認識され、optionドライバによりシリアルデバイスとして認識されますが、ゼロインストール機能を持つため、起動時(もしくはUSBに接続を行った時)は一旦CD-ROMデバイスとして認識されます。

usb 1-1: new high speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=19d2, idProduct=2000
usb 1-1: New USB device strings: Mfr=3, Product=2, SerialNumber=4
usb 1-1: Product: ZTE WCDMA Technologies MSM
usb 1-1: Manufacturer: ZTE,Incorporated
usb 1-1: SerialNumber: P680A1ZTED010000
scsi2 : usb-storage 1-1:1.0
usbcore: registered new interface driver uas
scsi 2:0:0:0: CD-ROM            ZTE      USB SCSI CD-ROM  2.31 PQ: 0 ANSI: 0
scsi 2:0:0:1: Direct-Access     ZTE      MMC Storage      2.31 PQ: 0 ANSI: 0
sd 2:0:0:1: [sdb] Attached SCSI removable disk
sr0: scsi-1 drive
cdrom: Uniform CD-ROM driver Revision: 3.20
sr 2:0:0:0: Attached scsi CD-ROM sr0
sd 0:0:0:0: Attached scsi generic sg0 type 0
sr 2:0:0:0: Attached scsi generic sg1 type 5
sd 2:0:0:1: Attached scsi generic sg2 type 0

この仕組みの場合、/dev/sr0をejectすることにより、シリアルデバイスに切り替わります。

usb 1-1: USB disconnect, device number 2
usb 1-1: new high speed USB device number 3 using ehci_marvell
usb 1-1: New USB device found, idVendor=19d2, idProduct=0117
usb 1-1: New USB device strings: Mfr=3, Product=2, SerialNumber=4
usb 1-1: Product: ZTE WCDMA Technologies MSM
usb 1-1: Manufacturer: ZTE,Incorporated
usb 1-1: SerialNumber: P680A1ZTED010000
scsi3 : usb-storage 1-1:1.3
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for GSM modem (1-port)
option 1-1:1.0: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
option 1-1:1.1: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
option 1-1:1.2: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems
scsi 3:0:0:0: Direct-Access     ZTE      MMC Storage      2.31 PQ: 0 ANSI: 0
sd 3:0:0:0: Attached scsi generic sg1 type 0
sd 3:0:0:0: [sdb] Attached SCSI removable disk

デバイス名は、

/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2

となります。

ゼロインストール機能は以下のATコマンドで抑止出来るとは思いますが、Windows PCでの共用する場合もあるため、お勧めはしません。

AT+ZCDRUN=8

2. 接続方法

接続は、他のモバイル通信アダプタと同様、pppconfigで設定を行います。
レンタル品はAPNの設定はcid1に設定されていたのでそのまま使用しました。
本モバイルアダプタは、/dev/ttyUSB2を使用します。

# minicom --device /dev/ttyUSB2

APNの設定状況は、以下のATコマンドで確認します。
AT+CGDCONT?

変更したい場合は、以下のATコマンドにより、事前にAPN設定を行ってもよいし、pppconfig内で設定のスクリプトを書いてもいいでしょう。

AT+CGDCONT=1,"IP","APN名"

pppconfigの設定は以下の通りとなります。( cid=1の場合 )

Provider Name sb
Configure Nameservers (DNS) Dynamic
Authentication Method for test PAP
User Name ID
Password パスワード
Speed 460800
Pulse or Tone Tone
Phone Number *99***1#
Choose Modem Config Method YES (Auto)
Select Modem Port Manual
Manually Select Modem Port /dev/ttyUSB2

eth0や他のインタフェースが有効になっている場合は、/etc/ppp/peers/sbに、以下の行を加えてください。

replacedefaultroute

上記設定により、外部のサーバにアクセス出来ることを確認しました。
ULTRA SPEEDということでftpにて速度測定をしてみましたが、ビル内からということもあり、5.8Mbps程度の結果となりました。

2012-10-03

[.tested] 勤次郎 JustTimes KTJ-100/KJT-10 [AX3][A6]



勤次郎 JustTimesは、JJY放送を受信して、USBシリアルにより時刻データを出力する機器であり、
USB接続可能な機器と接続することにより、取得した時刻データにより内部クロックの調整が可能となります。

今回、上記機器本体と、OpenBlocks AX3およびA6との接続検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8
勤次郎 JustTimes  KTJ-100/KJT-10

1. 対応ドライバと事前準備

当該デバイスは、CP210xシリーズのUSBシリアルデバイスを使用しており、
dmesgでは以下のメッセージが表示されます。

USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for cp210x
cp210x 1-1:1.0: cp210x converter detected
usb 1-1: reset full speed USB device using ehci_marvell and address 2
usb 1-1: cp210x converter now attached to ttyUSB0
usbcore: registered new interface driver cp210x
cp210x: v0.09:Silicon Labs CP210x RS232 serial adaptor driver

デバイスは、/dev/ttyUSB0

となり、9600bps/8bit/non Parityでの通信となります。

2. 勤次郎 KTJ-100について

勤次郎 KTJ-100のシステムは、送信ユニット(KTJ-100)および受信ユニット(KTJ-10)により構成されます。
受信ユニットは、USB接続によりコンピュータに接続され、受電もUSBより行います。
送信ユニットは、単4電池x2本による駆動となり、窓際など、jjyの電波の入る場所に設置します。
本送信ユニットは、決められた間隔で36bitのデータを受信ユニットに送信します。
(受信のみで、送信による強制的なデータハンドリングの手段はありません)

#電池駆動のため、データの送信は1時間に1回程度となり、
#テスト用の強制モードで3分に1回の送信とすることが出来ますが、
#強制モードの場合、evolta電池であっても1ヶ月程度しか稼動しません。

3. ntpdでの使用方法

今回、検証用にデータプロトコルを入手し、2種類のプログラムを作成しました。
プロトコルの公開に関しては、現在は本製品購入者に対してのサポート窓口での受付のみとなるため、本ブログでは現時点では公開を行いません。
評価プログラムを利用した場合も公開は行われないとのことです。
#現在、サポートなしという条件の元、公開出来るかどうかの問い合わせ中です。

(1)時刻合わせ用のプログラムによりPC内部のクロックをを設定し、ntpdは、内部クロックにより調停する。

取得したデータによりdate設定するRubyスクリプトを作成しました。
必要に応じて、cronに登録し、自動実行します。

(2)ntpdプログラムのrefclock_jjyにkjt-100のデータハンドリングを追加する。

今回は、debian squeezeのソースパッケージを展開し、ntp-4.2.6.p2+dfsgに、kjt-100のデータハンドリングを追加しました。
今回手を入れたソースコードは、以下の2つになります。

ntpd/ntp_refclock.c
ntpd/refclock_jjy.c

今回実装したプログラムに関して、いくつかのメモを書いておきます。

1. 受信データは、本来のrefclock_jjyの仕組みでは、ntp_refclock内で一旦0x7fでマスクされてバッファ格納されますが、kjt-100は、STXが0xaa、予約領域もバイナリで不定、CRC16もバイナリ情報となるため、マスクを強制的に外す処理をしています。
そのため、もしこのntpdを1-4のモードの別の対応機器に繋いだ場合、結果が保証できません。
ntp-refclockに修正を行わない場合は、refclock_jjyでのCRC16チェックをあきらめる必要があります。

2. refclock_jjyプログラム内でのデータ整合性チェックは、
受信データ長
時刻および日付が正しい値かどうか ( ex: 0-59秒範囲内にあるかどうか )
チェックサム CRC-16による
受信ステータスのデータチェック
にて行いました。CRC-16は、0x0000スタートです。

3. ntp.confの設定と動作確認について

refclock_jjyプログラムは、デバイスを/dev/jjy* がデフォルトであるため、
1台目は/dev/jjy0となります。
kjt-100自体は/dev/ttyUSB0として認識されていますので、
ln -s /dev/ttyUSB0 /dev/jjy0
として、シンボリックリンクする必要があります。
また、Openblocksのディスク併用モードおよびinitrdの場合は、ファームウェア作成時に、このデバイスのリンクを
埋め込んでおく必要があります。(もしくは、rc.localで書いてもいい)
また、refclock_jjyのデバイスを/dev/ttyUSB*にすることでも回避出来ます。

今回追加した機器は、5番になるため、設定は以下の様になります。

server 127.127.40.0 mode 5
fudge 127.127.40.0 time1 0

以上、本プログラムにより、時刻調停が行われているかどうかは、以下のコマンドにて確認をしています。

root@obsa6:~/kjt-100# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
=============================================================
*JJY(0)          .JJY.            0 l   41   64  111    0.000  211.632 146.798