1. 開発環境 開発ツール 開発は以下のツールを使用した。 gcc-3.4.5 binutil-2.16.91 glibc-2.3.5 ベースとなるブートローダ:SH IPL+g version 0.12 ベースとなるカーネル:バージョン2.6.19 ベースとなるユーザランド:BusyBox v1.00 2. SH7722 内蔵USBファンクションドライバ対応 SuperH Linux Open Site(http://www.superh-linux.org/)にて公開されている SH7764用LinuxカーネルのSH7764内蔵USBファンクションドライバをベースにSH7722USBファンクションドライバを作成。 2.1 mtdドライバ修正 mtdブートを実行した際にSH7722 TEAのFLASHメモリの一部をUSBファンクションデバイス (大容量ストレージ)として使用するため、 mapファイル(kernelのルートディレクトリ)/ drivers/mtd/maps/sh7722se2.cの修正を行った。 mtd5の領域を大容量ストレージの領域として使用する。 { name: "boot firmware", size: 0x00020000, /* 128KB */ offset: 0 }, { name: "kernel zImage", size: 0x00400000-0x00020000, /* 4MB-128KB */ offset: MTDPART_OFS_APPEND }, { name: "/", size: 0x01000000, /* 16MB */ offset: MTDPART_OFS_APPEND }, { name: "/usr/local", size: 0x00400000, /* 4MB */ offset: MTDPART_OFS_APPEND }, { name: "/root", size: 0x00800000, /* 8MB */ offset: MTDPART_OFS_APPEND }, { name: "/root/mnt", size: 0x02000000, /* 32MB */ offset: MTDPART_OFS_APPEND }, 2.2 USBファンクションドライバ作成 SH7764をベースにSH7722内蔵USBファンクションドライバを作成した。 2.2.1 Kconfig及びMakeFileの修正 drivers/usb/gadget/Kconfigに以下を追記。 config USB_GADGET_SH7722 boolean "SH7722 USB Function driver" depends on CPU_SUBTYPE_SH7722 && !USB_SH7722_HCD select USB_GADGET_DUALSPEED help SH7722 USB 2.0 peripheral controller. It has seven configurable endpoints, and endpoint zero. Say "y" to link the driver statically, or "m" to build a dynamically linked module called "sh7722_udc" and force all gadget drivers to also be dynamically linked. config USB_SH7722 tristate depends on USB_GADGET_SH7722 default USB_GADGET select USB_GADGET_SELECTED drivers/usb/gadget/Makefileに以下を追記。 obj-$(CONFIG_USB_SH7722) += sh7722_udc.o 2.2.2 gadget_chip定義の追加 drivers/usb/gadget/gadget_chips.hに以下を追記。 #ifdef CONFIG_USB_GADGET_SH7722 #define gadget_is_sh7722(g) !strcmp("sh7722_udc", (g)->name) #else #define gadget_is_sh7722(g) 0 #endif また、同ファイル内のインライン関数usb_gadget_controller_number()に以下を追記。 else if (gadget_is_sh7722(gadget)) return 0x18; 2.2.3 ドライバファイルの追加 以下のファイルを追加(ドライバ本体)。 drivers/usb/sh7722usb.h - SH7722USBFレジスタ定義 drivers/usb/gadget/sh7722_udc.c - SH7722USBFファンクションドライバ drivers/usb/gadget/sh7722_udc.h - 上記ヘッダ 2.3 ドライバの変更について sh7722_udc.cはオリジナルとしたSH7764用ドライバと以下の点が異なる。 PIPE1のバッファモード SH7764用 :デュアルモード SH7722用 :シングルモード 3. 動作検証を行ったデバイス 動作確認を実施したデバイスの一覧を以下に示す。 機能、 デバイス、 仕様 ネットワーク、SMC 91C111、Ether コンソール、UART、外付けシリアル ストレージ、NORフラッシュメモリ(MBM29DL64DF70TN)、MTD グラフィック、LCD(HD66776)、fb(フレームバッファ) サウンド、SIOF IIC AK4537、OSS USBホスト、R8A66597、USBホスト シリアル、SCIF、内蔵シリアル タッチパネル、H8/3687 内蔵シリアル、Input Subsystem ジョグダイアル、H8/3687 内蔵シリアル、Input Subsystem RTC、H8/3687、内蔵シリアル NFSブート(ネットワーク) ホストとなるLinuxPC上で DHCPサーバを立ち上げNFSブート環境を構築し、 NFSブートを実行し、問題なくブートすることを確認した。 FLASH ROMブート及びMTDマウント SH7722 TEA Board搭載のFLASH ROMにSH-IPL+g、カーネル、ユーザランドを書き込み ROMブートを実行し、問題なくブートすることを確認した。 UART(コンソール) NFS、FLASH ROMブート実行時に、デバッグボードのDSUB9ピンコネクタとシリアルクロスケーブルにて 接続されたPCのターミナルソフトにてブートメッセージが出力されることを確認した。 LCD NFS、FLASH ROMブート実行時に、LCD上にペンギンが正しく表示されることを確認した。 SIOF(サウンド) catコマンドを使用してUSBメモリ上に保存したサウンドファイルを/dev/dspにリダイレクトし、 CN14コネクタに接続されたヘッドホンから音が出力されることを確認した。 音源ファイルには適当なwavファイル(サンプリングレート:44.1kHz)。 # cat (音源ファイル) > /dev/dsp USBホスト USBホストコネクタ(CN10)に各種USBデバイスを接続し、動作を確認した。 また、LCD上にログインコンソールを表示させ、USBキーボードからログインできることを確認した。 4. ブート環境の構築 NFSブート、FLASH ROMブートを実行するための環境の構築方法を以下に示す。 NFSブートを行うためにはNFSサーバ、DHCPサーバとなるLinuxPCが必要である。 また、ここで紹介するFLASH ROMブート環境構築のためにはNFSブートを実行しなければならない。 4.1 NFSブート 以下の手順に従いLinuxPCのDHCP、NFSの設定を行い、NFSブートが可能な環境を構築する。 使用するLinux PCにはNFSサーバとDHCPサーバがインストールされているものとする。 4.1.1 Linux PCの/etc/exportsを使用する環境に応じて編集して、NFSマウントするディレクトリを指定する。編集にはroot権限が必要となる。 /etc/exportsの例 (マウントするディレクトリ) *(rw,insecure,sync,no_subtree_check,insecure_locks,no_root_squash) 4.1.2 NFSサーバを起動する。実行にはroot権限が必要となる。 例 # /etc/init.d/nfs start 4.1.3 Linux PCの/etc/dhcpd.confを使用する環境に応じて編集して、DHCPによるネットブートの設定を行う。編集にはroot権限が必要となる。 例 use-host-decl-names on; default-lease-time 600; max-lease-time 7200; ddns-update-style none; ignore client-updates; option option-128 code 128 = string; option option-129 code 129 = string; subnet 10.0.0.0 netmask 255.255.255.0 { (割り当てるIPアドレスのサブネットを指定) # no dynamic assign option routers 10.0.0.1; (ルータのアドレス) option subnet-mask 255.255.255.0; option time-offset -18000; # Eastern Standard Time range dynamic-bootp 10.0.0.100 10.0.0.120; (割り当てるIPアドレスの範囲) default-lease-time 7200; max-lease-time 43200; } host SH7722TEA { (適当な名前を設定) hardware ethernet (LANカードのMACアドレスを指定); fixed-address (割り当てるIPアドレスを指定); filename "(カーネルイメージのパス)/(カーネルイメージファイル名) "; option root-path "(ユーザランドのパス)"; option dodes-id "DODES"; option cmdline "mem=24M console=ttySC0,115200";; } 4.1.4 DHCPサーバを起動する。実行にはroot権限が必要となる。 例 # /etc/init.d/dhcpd start  Linux PCの設定が終了した後、SH7722 TEA デバッグボードのLANコネクタとLinux PCをハブを介して ストレートのLANケーブルで接続し起動する。SH-IPL+gが起動したら"e"を入力するとNFSブートが実行される。 4.2 FLASH ROMブート 以下の手順に従い、カーネル及びユーザランドからROMイメージを作成し、SH7722 TEAのFLASH ROMに書き込む。 4.2.1 使用するLinuxPCの環境に合わせて、source/usbfOK/ mtdimage_sh7722_tea_new_070911.tgz内の   スクリプトmkfsimg.sh、mtdinstall.shを変更する。   書き換えを行わないパーティションについてはmtdinstall.shでコメントアウトする。   (mtdimage_sh7722_tea_new_070911.tgz内のイメージファイルをそのまま使用する場合はmkfsimg.shの書き換えは行わなくてよい)。 4.2.2 Linux PC上でルート権限にてスクリプトmkfsimg.shを実行してイメージファイル   firm.bin、tmp_root.img、tmp_ul.img、tmp_usrlocal.img、tmp_root_mnt.imgを作成する   (mtdimage_sh7722_tea_new_070911.tgz内のイメージファイルをそのまま使用する場合はこの工程は行わなくてもよい)。 4.2.3 NFSブートを実行して、SH7722 TEA からLinux PC上で作成したイメージファイルのあるディレクトリを、   以下のコマンドを実行してマウントする。   mount -t nfs -o nolock (Linux PCのIPアドレス):(マウントするディレクトリ) /mnt 4.2.4 NFSマウントしたディレクトリに移動し、SH Linux上でスクリプトmtdinstall.shを実行してFLASH ROMに書き込みを行う。 FLASH ROM書き込み終了後、ターゲットボードのリセットを実行して再起動し、SH-IPL+gが起動したら"r"を入力するとROMブートが実行される。