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の環境は次のとおりです。
OS | Windows 7 Professional Service Pack 1 |
---|---|
VMware | VMware 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で設定する例を記載します。
- VMware Workstationを起動する
- ATDEをパワーオンする
- メニューの「VM(M)」「取外し可能デバイス(R)」「Ethernet Gadget」を選択する
- 「接続(ホストから切断)(C)」をクリックする
- ダイアログボックスが表示されるため「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 ~]$