Howto

Armadillo-800 EVAのUSBデバイス機能を使用する

Armadillo-800 EVA を Debian GNU/Linux で起動し、USB デバイス機能を使用する方法を説明します。

本Howtoで使用するソフトウェアは次のとおりです。

Linux カーネルソースアーカイブlinux-2.6.35-a800eva-at2.tar.gz
Linux カーネルパッチlinux-2.6.35-a800eva-at2_usb-gadget.patch
Debian GNU/Linux ルートファイルシステムアーカイブdebian-squeeze_a800eva_20120222.tar.gz

本Howtoで作成するソフトウェアのバイナリファイルは以下よりダウンロードすることが出来ます。

Linux カーネルイメージlinux-a800eva-usb-gadget.bin
USB ガジェットカーネルモジュールアーカイブmodules.tar.gz

本Howtoで動作確認を行った作業用PCの環境は次のとおりです。

OSWindows 7 Professional Service Pack 1
VMwareVMware Workstation 7.1.5
ATDE4(amd64向け VMware仮想イメージファイル)atde4-20111228-amd64.zip

1. Linux の USB デバイス機能

Linux の USB デバイス機能は、USB ファンクションコントローラードライバおよび USB ガジェットドライバが提供します。

ドライバ 機能
USB ファンクションコントローラードライバ USB ファンクションコントローラーの制御を行う
USB ガジェットドライバ USB 周辺機器が持つ Ethernetやマスストレージなどの機能を提供する

ユーザーランドからUSB デバイス機能を使用するためのアプリケーションは、使用する USB ガジェットドライバが持つ機能により異なります。Ethernet機能を使用する場合はifconfigなどを、マスストレージ機能を使用する場合は、mountなどを使用します。

2. LinuxカーネルイメージとUSBガジェットカーネルモジュールの作成

USBファンクションコントローラードライバを有効化したLinuxカーネルイメージと、USBガジェットカーネルモジュールを作成します。

はじめに、ソースコードの準備を行います。Linux カーネルのソースアーカイブを展開し、パッチを適用します。

[atde ~]$ ls
linux-2.6.35-a800eva-at2.tar.gz  linux-2.6.35-a800eva-at2_usb-gadget.patch
[atde ~]$ tar zxvf linux-2.6.35-a800eva-at2.tar.gz
[atde ~]$ cd linux-2.6.35-a800eva-at2
[atde ~/linux-2.6.35-a800eva-at2]$ patch -p 1 < ../linux-2.6.35-a800eva-at2_usb-gadget.patch

次に、カーネルコンフィギュレーションの変更を行います。Armadillo-800 EVAのデフォルトコンフィギュレーション(armadillo800eva_android_defconfig)を適用した後に、USBファンクションコントローラードライバ(USB_GADGET_R8A66597)を有効に設定します。USBガジェットドライバはモジュールに設定します。

Armadillo-800 EVA で動作確認済みの USB ガジェットドライバは以下の通りです。

カーネルコンフィギュレーション 機能
USB_ETH Ethernet
USB_MASS_STORAGE マスストレージ
USB_G_SERIAL シリアル
USB_CDC_COMPOSITE Ethernet + シリアル
USB_G_ARMADILLO Ethernet + シリアル + Webカメラ
USB_G_WEBCAM Webカメラ

Webカメラ機能を使用するためには、専用のアプリケーションを作成する必要があります。Webカメラ機能の使用方法については「Howto: Armadillo-800 EVAをUVCカメラとして使用する」を参照してください。

[atde ~/linux-2.6.35-a800eva-at2]$ make ARCH=arm armadillo800eva_android_defconfig
[atde ~/linux-2.6.35-a800eva-at2]$ make ARCH=arm menuconfig
Device Drivers  --->
  [*] USB support  --->
    <*>   USB Gadget Support  --->
      USB Peripheral Controller (Renesas R8A66597 USB Peripheral Controller)
      (X) Renesas R8A66597 USB Peripheral Controller
      ( ) Renesas M66592 USB Peripheral Controller
      ( ) Dummy HCD (DEVELOPMENT)
      <M>   USB Gadget Drivers
      <M>     Ethernet Gadget (with CDC Ethernet support)
      [ ]       RNDIS support
      [*]       Ethernet Emulation Model (EEM) support
      <M>     Mass Storage Gadget
      <M>     Serial Gadget (with CDC ACM and CDC OBEX support)
      <M>     CDC Composite Device (Ethernet and ACM)
      <M>     Armadillo composite gadget (EXPERIMENTAL)
      [ ]       RNDIS + CDC Serial + UVC configuration
      [*]       CDC Ethernet + CDC Serial + UVC configuration
      <M>     USB Webcam Gadget

最後に、ビルドを実行します。作成されるLinuxカーネルイメージ(Image)は、linux-a800eva-usb-gadget.binと同じです。また、USBガジェットカーネルモジュール(*.ko)は、modules.tar.gzに含まれている同名のファイルと同じです。

[atde ~/linux-2.6.35-a800eva-at2]$ make ARCH=arm armadillo800eva_android_defconfig
[atde ~/linux-2.6.35-a800eva-at2]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
    :(ビルドには数分かかります)
[atde ~/linux-2.6.35-a800eva-at2]$ ls arch/arm/boot/Image
arch/arm/boot/Image
[atde ~/linux-2.6.35-a800eva-at2]$ ls drivers/usb/gadget/*.ko
drivers/usb/gadget/g_armadillo.ko  drivers/usb/gadget/g_mass_storage.ko
drivers/usb/gadget/g_cdc.ko        drivers/usb/gadget/g_serial.ko
drivers/usb/gadget/g_ether.ko      drivers/usb/gadget/g_webcam.ko

USBガジェットカーネルモジュールと、機能の対応は以下の通りです。

カーネルモジュール名 機能
g_ether.ko Ethernet
g_mass_storage.ko マスストレージ
g_serial.ko シリアル
g_cdc.ko Ethernet + シリアル
g_armadillo.ko Ethernet + シリアル + Webカメラ
g_webcam.ko Webカメラ

3. Linuxカーネルイメージの更新

Linuxカーネルイメージを、内蔵ストレージにインストールします。

Linuxカーネルイメージをインストールするには、Debian GNU/Linuxで起動する必要があります。ブートローダーの保守モードで以下のように設定し、起動します。

hermit> setbootdevice mmcblk0p2
hermit> setenv console=ttySC1,115200 noinitrd rootwait root=/dev/mmcblk0p2
hermit> boot

ログイン後、インストールしてください。

[armadillo ~]# ls
linux-a800eva-usb-gadget.bin
[armadillo ~]# rm -f /boot/*.bin
[armadillo ~]# cp linux-a800eva-usb-gadget.bin /boot/Image.bin
[armadillo ~]# sync

手順を誤った場合、Debian GNU/Linuxが起動できなくなる可能性があります。起動できなくなった場合は、「Armadillo-800 EVA 製品マニュアル」を参照してDebian GNU/Linuxをリカバリしてください。

4. ハードウェアの設定

ディップスイッチの設定と、USBケーブルの接続を行います。

USBデバイスインターフェース(CON24)とUSBホストインターフェース(CON20)は共通の信号を使用しているため、同時に使用することができません。USBデバイスインターフェースを有効にするには、ディップスイッチのUSB0設定(SW1.6)をONにする必要があります。ディップスイッチの設定変更は、Armadillo-800 EVAに電源を投入する前に行う必要があります。

SW1.6設定 動作
OFF USBデバイスインターフェース(CON24)無効/USBホストインターフェース(CON20)有効
ON USBデバイスインターフェース(CON24)有効/USBホストインターフェース(CON20)無効

USBデバイスインターフェース(CON24)と作業用PCは、USBケーブル(Aオス - Bオス)で接続します。

5. 動作確認

USB デバイス機能の動作確認を行います。ここでは例としてEthernet機能を使用します。

5.1. カーネルモジュールの登録

USBガジェットカーネルモジュールの登録を行います。

Armadillo-800 EVA を Debian GNU/Linux で起動し、insmodコマンドでUSBガジェットカーネルモジュール "insmod g_ether.ko" を登録します。登録が完了すると ATDE から Armadillo-800 EVA が USBデバイスとして認識されます。

[armadillo ~]# ls
g_ether.ko
[armadillo ~]# insmod g_ether.ko
g_ether gadget: using random self ethernet address
g_ether gadget: using random host ethernet address
usb0: MAC 7e:5c:95:ee:93:36
usb0: HOST MAC 6e:69:f2:bb:1d:cb
g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
g_ether gadget: g_ether ready
g_ether gadget: high speed config #1: CDC Ethernet (EEM)
[armadillo ~]#

複数のUSBガジェットドライバを同時に登録することはできません。すでに登録されたUSBガジェットドライバがある場合は、rmmodで削除後に登録してください。

ATDE から Armadillo-800 EVA を認識できない場合は、ホストOSが先に認識している可能性があります。VMware製品のドキュメントを参照し、ATDE で認識できるよう設定してください。例として、「Workstation ユーザーマニュアル」を参照し、VMware Workstation 7.1.5で設定する例を記載します。

  1. VMware Workstationを起動する
  2. ATDEをパワーオンする
  3. メニューの「VM(M)」「取外し可能デバイス(R)」「Ethernet Gadget」を選択する
  4. 「接続(ホストから切断)(C)」をクリックする
  5. ダイアログボックスが表示されるため「OK」をクリックする

5.2. ネットワークの疎通確認

pingコマンドによるネットワークの疎通確認を行います。

はじめに、USBデバイスのネットワークインターフェース(usb0)を、Armadillo-800 EVA と ATDE の両方で活動状態にします。

[armadillo ~]# ifconfig usb0 192.168.100.1 up
[atde ~]$ sudo ifconfig usb0 192.168.100.2 up

Armadillo-800 EVA および ATDEがすでにネットワークに接続している場合は、別ネットワークのIPアドレスを指定する必要があります。

pingコマンドを使用してネットワークの疎通確認を行います。

[armadillo ~]# ping -c 4 192.168.100.2
PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
64 bytes from 192.168.100.2: icmp_req=1 ttl=64 time=13.1 ms
64 bytes from 192.168.100.2: icmp_req=2 ttl=64 time=3.99 ms
64 bytes from 192.168.100.2: icmp_req=3 ttl=64 time=5.04 ms
64 bytes from 192.168.100.2: icmp_req=4 ttl=64 time=3.53 ms
[armadillo ~]#
[atde ~]$ ping -c 4 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_req=1 ttl=64 time=4.46 ms
64 bytes from 192.168.100.1: icmp_req=2 ttl=64 time=2.18 ms
64 bytes from 192.168.100.1: icmp_req=3 ttl=64 time=7.95 ms
64 bytes from 192.168.100.1: icmp_req=4 ttl=64 time=2.69 ms
[atde ~]$