Wanderlst

Atmel AVR32AP7 の Linux Memo

Atmelの32bit CPUのAVR32(AT32AP7)のメモです。組込Linuxはボードメーカーが準備したLinuxしか使ったことがないので、色々苦労したことなど忘れないようにメモ書きです。日本でどれだけのAVR32ユーザがいるのかはわかりませんが…。何か参考になれば。

Amateras 3 のCPUボードにAVR32が載っているので、Linuxが必要になりました。てか、現在受けている仕事でも必要になったので、一石二鳥というか何というか。そのため、カスタムボードを対象にした話になっています。

AVR32 Linuxについて

もともとAVR32AP7がLinuxで動作させる事を前提に作っているのか、Linux環境がある程度整っていますが、Linuxを組込OSに使ったことがない人はかなり茨の道です。海外にはそれなりにドキュメントが揃っていますが、日本ではほぼ皆無です。それでもLinuxを使うメリットは多々あるのですが、一度環境が整ってしまえばいいわけで、色々模索しながらLinuxが起動するまでの手順を記します。

現在はBuildrootでgccかカーネル、u-bootまで一通り構築してくれるので、非常に楽になりました。

開発環境

AtmelがEclipseベースの開発環境をフリーで提供しています。AVRと名乗っていますが、8bitのAVRとは別物です。最低以下の2つが必要です。

プログラマとして、AVRJTACICE mk2 か AVR ONE!のどちらかのICEが必要になります。開発ツールはWindows版とLinux版がありますが、OSが好みでOKです。(ただし、Linuxカーネルの再構築にはLnux環境が必要)

あと、Atmelが提供しているBSP(Board Support Package)が必要です。isoイメージになっているので、ついでにダウンロードしておきましょう。現行バージョンは2.0です。

現在は、AtmelがBuildrootを用意しているため、BSPを使う必要はありません。Buildrootをつかった方法は下記に記述してあります。

AVR32の種類

AVR32には、2種類のタイプがあります。

  1. AP7系統
  2. UC3系統

基本的なコアやペリフェラルはどちらも同じですが、下記の違いがあります。

AP7の場合

  • 最高コアクロック 150MHz
  • MMU内蔵
  • ブートメモリ外付け
  • LCDコントローラ内蔵(ない型番もある)
  • ISI (Image Sensor Inteface)内蔵 (要するにカメラインターフェース)
  • USB 2.0 Device High Speed (480Mbps)
  • Ethernet MAC × 2

UC3の場合

  • 最高コアクロック 66MHz
  • MMUなし
  • フラッシュメモリ内蔵(64K〜512KBytes)
  • SRAM内蔵
  • USB 2.0 Device Full Speed (12Mbps) OTG
    OTG同士なら、Hostにもなれる(はず)
  • ADC内蔵
  • 1.8Vリニアレギュレータ内蔵

8bitのAVRを32bitに拡張したようなイメージなのが、UC3系統。

MMU内蔵したハイスペック版がAP7系統って感じです。SH2とSH3の違いみたいな。

どちらの系統も、AVR32 Studioで開発ができ、コアやペリフェラルがほぼ同じなので、ソースも共通になっている部分が多いです。UC3はFreeRTOSをAVR32 Studioがサポートしています。サンプルにLWIPも入っているので、結構簡単にネットに対応したプログラムが作れました。

カスタムボードについて(今後増えていく予定)

自分で設計して作成するカスタムボードについての注意事項です。

  • フラッシュメモリはAtmelが出している評価ボードのNGW100及びSTK1000と同じものにしたほうが後々楽です。プログラマのソフトウエアがこのフラッシュメモリ用に作ってあるため、他にのにすると専用のを作る場合もあります。
  • 評価ボードのクロックは20MHz(メイン)と12MHz(USB用)、32kHz(RTC用)が使われています。20MHzと12MHz両方必須ではなく、1つで統一も可能です。(ソフトウエアで経路を変更可能)
    ただし、USBを使用する場合は、12M必須です。
  • RTC用の外部バックアップ用の電源はないため、電源周りの設計が面倒くさい場合は内蔵RTCを捨てて、外部RTCを用意した方が楽。ただし、外部RTCを使う場合、Linuxのドライバを作る必要あり。
  • (重要事項)32KのRTC用は、起動時とPLLのタイミングをとっているため、これを付けないとブートしなくなります。OSCENをHにして、発振器を用いる場合は32Kの水晶が使えないので要注意。

参考リンク

日本でのブログなど

Linuxカーネル再構築(2009.1.7更新)

AtmelがBuildrootを用意してくれています。make一発でカーネルやu-boot、ファイルシステムまで作成してくれるので、非常に便利になりました。

Buildrootを使った構築についてはここページを見れば、すべて書いてあります。

  1. AVR32 GNU Toolchainをインストールします。
    Ubuntu(Debian系統)の場合、tarで展開した後、下記のコマンドを実行します。
    sudo dpkg -i avr32-binutils_2.18.atmel.1.0.1-1_i386.deb
    sudo dpkg -i avr32-buildroot-essentials_1.0.0-2_i386.deb
    sudo dpkg -i avr32-gcc-newlib_4.2.2-atmel.1.1.3-1_i386.deb
    sudo dpkg -i avr32-gdb_6.7.1.atmel.1.0.3-2_i386.deb
    sudo dpkg -i avr32gdbproxy_3.1.5-1_i386.deb
    sudo dpkg -i avr32-gnu-toolchain_2.1.4-1_i386.deb
    sudo dpkg -i avr32headers_2.0.5-1_all.deb
    sudo dpkg -i avr32parts_2.0.3-1_all.deb
    sudo dpkg -i avr32program_3.1.4-1_i386.deb
    sudo dpkg -i avr32trace_2.1.0-1_i386.deb
    sudo dpkg -i avrfwupgrade_1.1.2-1_i386.deb
    sudo dpkg -i libavr32ocd_3.1.3-1_i386.deb
    sudo dpkg -i libavr32sim_0.2.4-1_i386.deb
    sudo dpkg -i libavrtools_3.1.6-1_i386.deb
    sudo dpkg -i libelfdwarfparser_2.1.3-1_i386.deb
    sudo apt-get install -f

    これでインストール完了。
  2. Buildrootをダウンロードして適当なフォルダに展開します。
  3. Ubuntu 8.04の場合、ビルドに必要なパッケージが不足しているので、 apt-get等でインストールします。 Package Managerとかから検索してインストールしてもOK。必要なパッケージは、
    sed
    flex
    bison
    patch
    gettext
    libtool
    texinfo
    autoconf (version 2.13 and 2.61)
    automake
    ncurses library (development install)
    zlib library (development install)
    libacl library (development install)
    lzo2 library (development install)
    確かUbuntu 8.04で標準インストールで入っていないのは、イタリックで表示されているパッケージだったはず
  4. 後は、使っているボードに合わせて、下記のコマンドを実行します。
    make atstk1002_defconfig
    make atngw100_defconfig
    ※ATSTK1000な人は、ATSTK1002とします。
  5. 必要なソースはWebからとってくるので、インターネットに接続できる状態になっているか確認して、次のコマンドでソースをダウンロードします。
    make source
  6. あとはそのままmakeするだけ。
    make

SDカードからブートする場合は、SDカードをext2でフォーマットした後、make完了後にできるbinaries/atstk1002/rootfs.avr32.tar.bz2をSDカードのルートに展開すればOK。

再度makeとかして、差分をコピーしたい場合は、project_build_avr32/atsrk1002/root/ からコピーできます。

なお、Linuxカーネル本体を改造して、カーネル本体だけ再構築する場合は、project_build_avr32/amateras3/linux-2.6. 25.10/ にソースがあります。

make ARCH=avr32 KBUILD_HAVE_NLS=yes menuconfig

これでカーネル設定変えられます。

WindowsでのLinuxカーネル再構築環境

Cygwinでも再構築できるかと色々試してみましたが、ダメでした。(不足しているものをインストールすれば出来るのかも知れませんが、かえって面倒です)
なので、WindowsでVMWareを使ってLinux環境を構築する方法です。なお、LinuxディストリビューションはUbuntu 8.04で解説します。Fedora系でもいいですが、個人的にはUbuntu(Debian系統)のほうがお勧めです。

  1. VMWare Playerの取得、インストール(Workstationを持っている方や、インストール済みの方は飛ばしてください)
    ちなみに、フリーですが、ダウンロードには英語での登録が必要です。
  2. qemuのダウンロードして、展開しておきます。 (本家?旧サイトはこちら
  3. コマンドプロンプトを起動して、qemuを展開したディレクトリに移動し、次のコマンドを実行してVMWareのディスクイメージを作ります。コマンドの中にある30Gは最大容量です。好みで変更してください。
    qemu-img create -f vmdk ubuntu.vmdk 30G
    ディスクイメージが出来れば、qmenuは今後必要有りません。
  4. Ubuntu 8.04のディスクイメージをダウンロードします。 ディスクトップ版でOKです。
  5. vmx builderをダウンロードして、vmxファイルを作成し、ディスクイメージを作成したディレクトリにおいてください。(IDE1:0にはダウンロードしたisoファイルを指定すること)
  6. 作成したvmxをダブルクリックして起動します。(起動しない場合は、VMwareを起動して開くから指定してください)
  7. 問題がなければisoイメージから起動し、Ubuntuが起動します。ディスクトップのメニューにHDDにインストールするためのアイコンがあるので、起動してHDDイメージにインストールしてください。
  8. sambaで自分のホームディレクトリを共有しておいた方が色々楽できます。よく分からん人は、Googleで調べてください。

U-Boot

Buildrootで構築すると、u-bootもコンパイルしてくれるので、特に理由がなければ、そちらを使いましょう。(2009.1.7)

Linuxカーネルだけでは起動できないので、ブートローダが必要です。ブートローダはAVR32 U-Boot Custodian TreeからAVR32用のパッチが当てられたソースが取得できます。現在(2008年4月28日)の最新バージョンは1.3.2です。AtmelのBSP 2.0に入っているu-bootのバージョンは古く、1G未満のSDカードしか認識しないようなので、新しいのでOKでしょう。

  1. Masterをダウンロードする(そのままダウンロードするとハッシュ値らしき値もファイル名についてくるので、適当に取ってください)
    mv u-boot-avr32-30f1806f60978d707b0cff2d7bf89d141fc24290.tar.gz u-boot-avr32.tar.gz
  2. 展開する
    tar -xvf u-boot-avr32.tar.gz
  3. u-boot-avr32のディレクトリに移動し、使用するボードを選択する
    cd u-boot-avr32
    make atngw100_config (NGW100の場合)
    make atstk1002_config (STK1000+STK10002の場合)
  4. コンパイルする
    make ARCH=avr32

u-boort.binがカレントディレクトリに出来ていればOKです。ここで失敗する場合は、gcc開発環境がないか、 AVR32 GNU Toolchainがインストールされていません。できあがったu-boot.binをAVRICE mk2等のICEで、FlashROMに書き込めばOKです。

avr32program erase -fcfi@0

avr32program program -F bin -vfcfi@0 u-boot.bin

コンパイルしたu-boot.binをWindowsマシンにコピーしてAVR32 Studioから書き込んでもOKです。

無事起動すると、RS-232Cから、下記のメッセージが出ます。なお、まだLinuxカーネルが無いので、u-bootのプロンプトで止まります。

---------------------------------------------------------------------

U-Boot 1.3.2 (Apr 22 2008 - 08:04:10)

U-Boot code: 00000000 -> 00010a80 data: 00016a38 -> 0004d0d8
SDRAM: 32 MB at address 0x10000000
Testing SDRAM...OK
malloc: Using memory from 0x11f72000 to 0x11fb2000
DMA: Using memory from 0x11f6e000 to 0x11f72000
Flash: 8 MB at address 0x00000000
DRAM Configuration:
Bank #0: 10000000 32 MB
In: serial
Out: serial
Err: serial
Net: macb0, macb1
Press SPACE to abort autoboot in 1 seconds
### JFFS2 loading 'uImage' to 0x10400000
Scanning JFFS2 FS: done.
find_inode failed for name=uImage
load: Failed to find inode
### JFFS2 LOAD ERROR<0> for uImage!
## Booting image at 10400000 ...
Bad Magic Number
Uboot>

---------------------------------------------------------------

BSP 2.0には、STK1000のu-bootイメージはあるのですが、NGW100のがないので、面倒くさい方のためにコンパイルされたNGW100版を上げておきます。

u-boot-1.3.2-atngw100.zip

設定はデフォルトです。私のNGW100で起動確認し、SDカードからuImageのブート確認しました。

カスタムボードの再構築(記述中)

カーネル再構築時のxconfigメニュー欄にカスタムボードの名前を追加する方法

  1. linux-2.6.18/arch/avr32/boards にカスタムボードの名前でディレクトリを作り、linux-2.6.18/arch/avr32/boards/atstk1000 もしくは linux-2.6.18/arch/avr32/boards/atngwのディレクトリの中のソースとMakeFileをコピーし、ボードにあわせて改変する。
    Makefileの中身はこんな感じに。


    obj-y += setup.o flash.o
    obj-$(CONFIG_BOARD_AMATERAS3) += amateras3.o

  2. linux-2.6.18/arch/avr32/Kconfigの90行目あたりにある"AVR board type"にconfig項目を追加する


    choice
    prompt "AVR32 board type"
    default BOARD_ATSTK1000

    config BOARD_AMATERAS3
    bool "Amateras 3"

  3. するとこんな感じで出ます


  4. これで再構築を行えば、linux-2.6.18/arch/avr32/boards/amateras3/のソースをコンパイル対象に含んでくれます。