マイコン工作実験日記

Microcontroller を用いての工作、実験記録

こっちも sample1

2009-03-30 00:47:36 | Weblog


25日にインターフェース5月号を買ったので、このLPC2388ボードでもTOPPERS sample1を動かしてやろうと作業していました。当面の作業で使いそうな部品をハンダ付け。JTAGコネクタについては記事にも記載がありましたが、横に穴があいているタイプのものを使わないとLEDがあたってしまいます(写真左下のLED1)。これを知らずに千石で写真の直立タイプのコネクタとL字型のコネクタの両方を買ってきたのですが、L字型は穴があいていないので使えませんでした。



とりあえずsample1が無事に動くようになりました。必要な作業はタイマとシリアルの割り込み対応ドライバを用意してやることなのですが、

  • UARTは16550と同じような仕様になっているので、すぐに理解できた。
  • 割り込みコントローラ(VIC)は、ATMELのAIC(Advanced Interrupt Controller)と良く似ているのでわかり易かった。

というように、デバイスとしての違いはそれほど気にならず、比較的スムーズに作業を進めて動かすことができました。気になったのは別の点なのですが、それに関しては別途記事にしようと思います。シリアルはCN5のUSBポートで使うためにUART0を使っています。タイマはTIMER0です。PLLの設定についてはNXPが提供しているethernet bootloaderのコードから頂戴しました。

さて、この次は何をしようかな。若松のether/SDの拡張ボードは8,000円するようなので、とりあえずはパス。自分でEther PHYつなげるかどうか悩ましいところ。拡張無しでも使えるのは、やはりUSBでしょうかね。来月のUSB関連記事を待つか、はたまた自分で勉強始めることにするか。。

TOPPERS sample1を動かす

2009-03-28 22:58:24 | ARM9
MMnet1002でTOPPERS/JSPを走らせてみました。まずは、お約束のsample1プログラムからです。

JSPを動かすためには機種依存部を準備してればいいわけですが、AT91SAM9260とAT91SAM7とは周辺デバイスの仕様はほぼ共通になっているため、最小限の変更でSAM7用のコードをSAM9260で使えるようにすることができました。変更した点といえば、クロック周波数を示す定数(MCK)を定義しなおしたことと、TOPPERSの動作開始時にベクターテーブルを0番地にコピーする処理を加えたことの2点くらいです。

本来であればARM9であるために、クロックの初期化手順がSAM7の時とは異なっていたり、キャッシュの有効化のためにMMUを制御するCP15の設定をしなければなりませんが、これらの初期化はAT91Bootが動作した時点で行われているようなので、省略してしまいました。

まずはSDRAMを使って動作試験です。SAM-BAを起動したら、SDRAMのタブを選択します。書き込み開始番地として0x23F00000番地を指定して、Send Fileしてやることでメモリ上にイメージがロードされます。SAM-BAからSDRAMの初期化も行えるようになっているのですが、AT91Bootが動いた時点で初期化がされているので、いきなりロードしても問題ないようです。



tclshのウィンドウから go 0x23f00000 と入力することで実行開始です。シリアルポートから 'r' を入力して走るタスクが変化することを確認。シリアルとタイマが問題無く動いているようです。



続いて、同じコードをフラッシュに書き込んでみます。こんどはAT91Bootと作成したバイナリの2つのファイルを書き込まねばならないので、tclのスクリプトファイルを作成して、バッチモードで書き込みました。SAMBAジャンパをはずして、リセットするとめでたくAT91Bootがsample1をロードして、実行開始するようになりました。



ブート手順を決める

2009-03-26 23:21:59 | ARM9
SAM-BAが動いたので、自分のプログラムを走らせる算段を考えることにします。動作環境としては引き続きTOPPERS/JSPを使います。自分でデバイスつないで実験して遊ぶにはLinuxよりもTOPPERSの方がやりやすいしですし。

さて自分のプログラムを動かすにも、AT91SAM9260では内蔵フラッシュが無いので、これまでのSAM7とは勝手が違ってきます。ブートROMから始まり自分のプログラムに制御を移す手順を決めておく必要があります。そこで、MMnet1002のAT91Bootの動作を確認してみると、次のようになっています。
  1. NANDフラッシュの0x40000から256KBを、SDRAMの0x23F0000番地以降にロード
  2. ロードが終了したら0x23F0000番地にジャンプ

256Kもあれば当面は充分なプログラム・サイズですので、このAT91Bootをそもまま流用することにします。256Kで足りなくなったらAT91Bootをビルドし直せばいいだけですし。したがって、自分のプログラムは0x23F0000番地から実行開始するようにすれば良く、そのバイナリイメージをNANDフラッシュの0x40000番地以降に書き込んでおけばいいことになります。

AT91SAM7の内蔵フラッシュと違って、NANDフラッシュに格納されているコードをMCUが直接実行することはできません。いったんDRAMにロードしてから実行するわけですから、開発の途中ではSAM-BAを使ってDRAMにコードをロードして動作確認をおこない、問題が無くなったらNANDフラッシュに書き込めばいいことになります。ビルドの度にフラッシュに書き込む必要が無いというのは、助かります。

こんなに安いのか

2009-03-24 00:45:34 | Weblog
インターフェースの付録にLPC2388が付いちゃうなんて、ほんとARM7マイコンも安くて手軽になったものだとつくづく思います。DigikeyやMouserでも、お値段11ドル台となっています。たとえ秋葉に並んでいなくても、こうして個人で1個から買える手段があるというのは、いい時代になったものです。

しかし、どうやら市場に流れ始めたらしいLPC3131の値段をみてビックリ。Mouserで6.75USD, Digikeyで7.50USDとなっています。もともと、「USB High Speedに対応した業界最安値のARM9」とのフレコミでしたが、1個でもこんなに安いとは。。LPC3131はAT91SAM9260と同じようにARM926EJ-Sコアで内蔵フラッシュは無いのですが、AT91SAM9260の値段は15ドル近辺ですから、半額です。「こりゃ、来年くらいにはARM9が付録になっちまうかも?」と思ってしまいます。

値段が安いのはうれしいのですが、パッケージはBGAしかないようです。基板と実装で費用かかるとやっぱ雑誌付録は無理でしょうか?アマチュアは安価なモジュール/ボードの販売を待つしかないですかね。

ようやくSAM-BA

2009-03-22 20:03:08 | ARM9
千石にてチップ抵抗100Ωをゲット。ボード上にハンダづけ。SAMBAジャンパを挿して、SAM-BAに再挑戦です。



電源入れても、U-Bootが動かなくなりました。USBでつなげてデバイス・マネージャを確認するとこんな↓感じ。。



SAM-BAを起動して、ボード種別として同じAT91SAM9260を使っているAT91SAM9260-EKを選択。



Connectボタンを押すと、無事にSAM-BAが立ち上がりました。このテのソフトに良くあるように、TCLをベースに作られているようです。tclshのウインドウがあるので、試しにexprしてみました。



Linuxを書き戻すには、NandFlashのタブを選択して、書き込むファイルとそのアドレスを指定してSend Fileをしてやります。PropoxのCDには、必要な一連の操作を自動的に実行してくれるBATファイルが用意されているので、いったんSAM-BA GUIは終了して、このバッチファイルを実行してみました。



このバッチファイルでは、SAM-BAをバッチモードで実行し、指定したTCLスクリプトファイルの指示にしたがって必要ファイルの書き込みをおこなってくれるようになっています。生成されたログ・ファイルはこんな↓でした。
-I- Waiting ...
connection : usbARM0
board : AT91SAM9260-EK
target(handle) : 18073160
read chip ID : 0x00000010 at addr: 0xFFFFEE40
read chip ID : 0x019803A2 at addr: 0xFFFFF240
-I- Found processor : AT91SAM9260 (0x019803A0)
-I- Loading applet isp-extram-at91sam9260.bin at address 0x200000
-I- Memory Size : 0x4000000 bytes
-I- Buffer address : 0x2007C4
-I- Buffer size: 0x0 bytes
-I- Applet initialization done
-I- External RAM initialized
script file : MMnet1000_linux_nandflash.tcl
-I- === Initialize the NAND access ===
-I- NANDFLASH::Init (trace level : 3)
-I- Loading applet isp-nandflash-at91sam9260.bin at address 0x20000000
-I- Memory Size : 0x40000000 bytes
-I- Buffer address : 0x200047E4
-I- Buffer size: 0x40000 bytes
-I- Applet initialization done
-I- === Load the bootstrap: nandflash_at91sam9-ek in the first sector ===
GENERIC::SendFile AT91Boot_nandflash_MMnet1000.bin at address 0x0
-I- File size : 0xFF4 byte(s)
-I- 	Writing: 0xFF4 bytes at 0x0 (buffer addr : 0x200047E4)
-I- 	0xFF4 bytes written by applet
-I- === Load the u-boot in the next sectors ===
-I- Send File u-boot_nandflash.bin at address 0x00040000
GENERIC::SendFile u-boot_nandflash.bin at address 0x40000
-I- File size : 0x2508C byte(s)
-I- 	Writing: 0x2508C bytes at 0x40000 (buffer addr : 0x200047E4)
-I- 	0x2508C bytes written by applet
-I- === Load the u-boot environment variables ===
-I- Send File ubootEnvtFileNandFlash.bin at address 0x00080000
GENERIC::SendFile ubootEnvtFileNandFlash.bin at address 0x80000
-I- File size : 0x20000 byte(s)
-I- 	Writing: 0x20000 bytes at 0x80000 (buffer addr : 0x200047E4)
-I- 	0x20000 bytes written by applet
-I- === Load the Kernel image ===
-I- Send File uImage at address 0x00200000
GENERIC::SendFile uImage at address 0x200000
-I- File size : 0x13AFE0 byte(s)
-I- 	Writing: 0x40000 bytes at 0x200000 (buffer addr : 0x200047E4)
-I- 	0x40000 bytes written by applet
-I- 	Writing: 0x40000 bytes at 0x240000 (buffer addr : 0x200047E4)
-I- 	0x40000 bytes written by applet
-I- 	Writing: 0x40000 bytes at 0x280000 (buffer addr : 0x200047E4)
-I- 	0x40000 bytes written by applet
-I- 	Writing: 0x40000 bytes at 0x2C0000 (buffer addr : 0x200047E4)
-I- 	0x40000 bytes written by applet
-I- 	Writing: 0x3AFE0 bytes at 0x300000 (buffer addr : 0x200047E4)
-I- 	0x3AFE0 bytes written by applet


NANDフラッシュを4つの領域に分けて、それぞれに次のものを書き込んでいます。

  • AT91Boot
  • u-Boot
  • u-Bootへのパラメータ
  • Linux Image

完全なLinux環境を構築するためのは5つ目のファイルとしてLinuxのファイルシステムも書き込む必要がありますが、このスクリプトではコメントアウトしてありました。カーネルのハックを中心的にやっていて、FSの方はあまりいじっていなかった名残なのかもしれません。

フラッシュへの書き込み方法はわかったので、いよいよ自分でプログラムを作成する段階へ進めます。

SAM-BAを動かしたいが

2009-03-21 18:22:50 | ARM9
MMnet1002のSAMBAジャンパの仕掛けが理解できたので、実際にジャンパを挿してSAM-BAを動かしてみます。



SAM-BA(SAM Boot Assist)機能自体はAT91SAM7シリーズでも用意されているのですが、わたしはいつもJTAGを使って内蔵フラッシュの書き込みをおこなっていたので、実はいままで一度もSAM-BAを使ったことがありません。AT91SAM9260では内蔵フラッシュは無いので、NANDフラッシュのような外部ブラッシュに書き込む必要が生じます。わたしの使っているJTAG(USB Scarab)はそもそもARM7しかサポートしていませんし、OpenOCDも残念ながらAT91SAM9260の場合は外部NANDフラッシュへの書き込みはサポートしていないようなので、書き込みのためにはSAM-BAを使う必要が生じた次第です。

ジャンパを挿して、電源投入。あれっ? やっぱりLinuxがブートしてきてしまいます。SAMBAジャンパ効いてない? 改めてボードの配線を確認してみたら、回路図上では実装されているはずのR58(100Ω)がボード上に実装されていないために、ジャンパが機能していないことが判明。ヤラレタ。みごとに出足くじかれました。

フラッシュを焼きなおすには?

2009-03-20 21:50:05 | ARM9
MMnet1002のフラッシュからLinuxが立ち上がることは確認できたので、今度はフラッシュを消して書き直す方法を確認することにします。今後、自分で作ったソフトを書き込むためにも必要な知識ですので。普通はこの程度の説明はマニュアルに書いてあると思うのですが、どっこいPropoxのマニュアルには何にも書いてありません。

フラッシュの書き換えにはMCUが内蔵するSAM-BA(SAM Boot Assist)機能を使って、USBまたはシリアルでつないだPCからコードをダウンロードしての書き換えができるハズです。SAM-BAについてはインターフェース2008年11月号に関連記事が掲載されています。AT91SAM9260のBoot ROMコードは、
  1. 最初にSPIでつながっているデータフラッシュからブートできるか調べる
  2. 次にNANDフラッシュからブートできるか調べる
  3. SAM-BAに制御を移してシリアルまたはUSBでつながれたPC側のSAM-BAプログラムの応答を待つ
という順序で動作します。出荷時の状態では、SPIデータフラッシュはつながれていませんが、NANDフラッシュからのブートができるので、SAM-BAには制御はまわってきません。なんらかの方法でNANDフラッシュのブートができないようにしてやれば、SAM-BAが動いてくれるハズです。

MMnet1002の基板には下の写真に示したようにSAMBAというシルクの入ったジャンパがあるのですが、配線図を確認してみるとこのジャンパはPC15/NWAIT/IRQ1につながっているだけであり、NANDフラッシュとは関係無さそうに見えます。マニュアルにも説明無いし。



一方、NF, DFとシルクのあるジャンパは、それぞれNANDフラッシュとデータフラッシュのCS信号をカットするために用意されています。これら2つのジャンパは、出荷時には基板上の0Ω抵抗で結線されている実装になっています。したがって、NF側の0Ω抵抗をはずしてやれば、NANDフラッシュへCS信号が入らなくなりSAM-BAを起動できるはずです。SAM-BAが立ち上がったらジャンパを挿してCS信号を有効にするという手順で書き込みがおこなえるでしょう。しかし、これではまだSAMBAジャンパの意味が理解できません。SAMBAと書いてあるからには、ここをショートすることでSAM-BAが動くようになる仕掛けがあるはずです。実際にやってみれば動作確認はできるでしょうが、仕掛けがわからないままでは気持ち悪いので調査してみました。

まずは仕掛けを究明する手がかりを求めてATMEL純正評価キットであるAT91SAM9260-EKの資料をあたってみました。どうせPropoxのボードはこの評価キットを参考に設計されているだろうと考えたわけです。すると、AT91SAM9260-EK SAMBA Recoveryという資料があり、フラッシュに書き込むベクタを間違えて書いてしまった場合などに、SAM-BAを起動するための方策についての説明がありました。この資料によるとAT91SAM9260-EK用のAT91Bootでは、ブート時にPA31に接続されたボタンが押されているとフラッシュの最初のブロックを消去する仕掛けになっているとのことです。先頭ブロックが消去されてしまうとフラッシュからのブートができないので、SAM-BAに制御が回ることになるというわけです。

MMnet1002でも同じ仕掛けになっているに違いないと考え、付属CDのAT91Bootのソースコードを確認すると、やはりPC15の状態を見てフラッシュの先頭ブロックを消去するようになっています。これで、ようやく疑問解消。NFジャンパはいじらずとも、SAMBAジャンパを結線してやればSAM-BAを起動できるハズです。

Linuxをブートしてみる

2009-03-17 22:27:49 | ARM9


昨日の続きです。とりあえず、火を入れてLinuxをブートしてみました。電源は秋月の9Vアダプタを使用。コンソールはヌルモデム・ケーブルを使って、JTAGの仮想シリアルポート経由でPCのUSBにつないでいます。AT91SAM9260データシートのブート仕様から調べて、通信速度を115,200bpsにするとメッセージが見えてきました。
RomBOOT
>AT91Boot-20081201


U-Boot 1.1.5 (Sep  5 2008 - 10:23:06)

DRAM:  64 MB
NAND:  NAND device: Manufacturer ID: 0x2c, Chip ID: 0xd3 (Micron NAND 1GiB 3,3V 8-bit)
NAND: Pagesize: 2048, Blocksize: 256K, OOBsize: 64
1024 MiB
In:    serial
Out:   serial
Err:   serial
DM9161A PHY Detected
No link
MAC: error during RMII initialization
Hit any key to stop autoboot:  1  0 

NAND read: device 0 offset 2097152, size 1290208 ...  1290208 bytes read: OK
## Booting image at 22200000 ...
   Image Name:   Linux-2.6.28-rc6
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1290144 Bytes =  1.2 MB
   Load Address: 20008000
   Entry Point:  20008000
   Verifying Checksum ... OK
OK

Starting kernel ...

Linux4SAMの説明を参考にすると、ブート手順は次のようになっているようです。
  1. まず最初にMCU内のROMブートが動いてNANDフラッシュからAT91Bootを4KBのSRAMにロードして、こいつに制御を移す。
  2. AT91Bootは最低限必要な初期化をおこない、フラッシュからU-Bootを読み出しDRAM内にロードして制御を移す。
  3. U-BootがLinuxをロードして制御を移す。

この後、Linuxの起動メッセージが出力されるのですが、途中でちょっと気になる出力が。。。
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xd3 (Micron NAND 1GiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 272 at 0x04400000
Bad eraseblock 310 at 0x04d80000
Bad eraseblock 318 at 0x04f80000
Bad eraseblock 319 at 0x04fc0000
Bad eraseblock 360 at 0x05a00000
Bad eraseblock 695 at 0x0adc0000
Bad eraseblock 1060 at 0x10900000
Bad eraseblock 1159 at 0x121c0000
Bad eraseblock 1257 at 0x13a40000
Bad eraseblock 1385 at 0x15a40000
Bad eraseblock 1736 at 0x1b200000
Bad eraseblock 2214 at 0x22980000
Bad eraseblock 2472 at 0x26a00000
Bad eraseblock 2873 at 0x2ce40000
Bad eraseblock 3156 at 0x31500000
Bad eraseblock 3425 at 0x35840000
Bad eraseblock 3478 at 0x36580000
Bad eraseblock 3704 at 0x39e00000
Bad eraseblock 3905 at 0x3d040000

1GBもあると、この程度はBad blockがあるものなのでしょうか?

ブートが終わったところで、リターンを押してみるとプロンプトが出てきました。
BusyBox v1.11.3 (2008-12-03 11:05:39 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 KAMIKAZE (bleeding edge, r13340) -------------------

 Propox MMnet1000
  www.propox.com
 ---------------------------------------------------
root@MMnet:/# 

OpenWrtというワイアレスアクセスポイントの代替え用Linuxディストリが使われているようです。

ARM9に手をだそうか

2009-03-16 21:28:23 | ARM9
AT91SAM7シリーズもSAM7S256, SAM7SE256, SAM7X256, そしてSAM7A3と使ってきたので、かねてより次はARM9とかLPC23xxあたりを使ってみたいと思っていました。LPC23xxについてはインターフェース5月号の付録(LPC2388)でもいいと思うので、ちょっとARM9を触ってみようかと思います。

安価なボードはOLIMEXからも出ていますが、わたしはまたまたPropoxからAT91SAM9260を搭載したMMnet1002を買ってみました。実は1月に入手してあったのですが、そのまま封も切らずに放置状態だったので、あえて日記に書き始めることで自分を奮い立たせようかと。。。このボード、上記のページでは129 USDとか書いてあるのですが、Shopの方を覗くと90 USD/67 EUROくらいになっています。この半年ほどの間に為替が大きく動いている影響で、両ページの記述が一致しなくなっているんじゃないかと想像します。OLIMEXのSAM9-L9260が140EUROくらいですから半値です。

ただし、実際にはこれにTAXと送料がかかります。税率は22%のようです。ほんとは、EU域外に輸出する場合には税金かからないはずなのですが、そのためには送料の高いDHLを使う必要があると言われるので、1枚買うだけなら22%のTAXを払った方が安くついてしまいます。



MCUであるAT91SAM9260は、電池ホルダの下に配置されています。電池の下側にあるのは64MBのDRAM, そして電池の左上から顔をだしているのはPHYであるDM9161Aです。電源はDC8V~DC35Vが必要です。



裏側には1GBのNANDフラッシュが載っています。その右側はオプションでSPIデータ・フラッシュを載せるパターンです。NANDフラッシュにはあらかじめLinuxが書き込まれており、電源をつなげばLinuxが立ち上がるはず。Linux関連ソースとバイナリは全て付属のCDに入っているのですが、説明文書は一切ありません。ただ、ファイルが書き込まれているだけ。マニュアルはWebからダウンロードできますが、ハードの説明が中心で、コンソールつなぐ際のボーレート説明すらありません。Propoxではフォーラムとか運営してないのでユーザ同士での情報交換もできないし、ソフトのバージョンアップとかもやってくれなさそうです。まぁ、サポート体制が無いに等しいのはPropoxの他の製品でも同じでいつものことです。これまでの経験から言うと、そもそも在庫状況や出荷時期もよくわからないし、メールで問い合わせても返事がこなかったりするのですが、待ってさえいればちゃんと注文した品物が届くことだけは確かなようです。

回路図とソースコードは揃っているので、丁寧な説明なんかなくても、自分でこれらを読んで理解できれば、ちゃんと使えるハズです。趣味ですから、少しずつ不明なところを解明していく過程も楽しんでいくことにしましょう。

アクセス速度の改善

2009-03-14 19:39:15 | USB
Mass Storageでのアクセス速度が遅かったので、改善を試みてみました。

SDへの書き込みが遅い原因としては、前回も予想したように書き込み時のACMD23を使っていないことが考えられます。一方、SDからの読み込みも満足できる数字ではないので、これも改善したいところです。こちらの方は、USBのコードを確認したところ、すぐに原因に思いあたりました。なんと、FIFOのPING-PONG機能を使っていませんでした。PING-PONG機能とはダブルバッファリング機能のことで、USBエンジンのFIFOに書き出した送信データをUSBホスト側に送信している間に、次の送信データをあらかじめもうひとつのFIFOに貯め込んでおける機能のことです。

上記2点を改善したところ12MBのファイルで

READ: 約15秒 (800KB/sec)
WRITE: 約35秒 (342KB/sec)

というところまでは改善できました。およそ倍ですね。SDとのI/Oは8ブロック(4KB)単位でおこなっていますが、Windows XPからは128ブロック(64KB)単位でのI/O要求がきているようです。したがってマイコン内の処理単位も大きくしてやればさらなる改善も可能かと思われますが、32KBしかないRAMをこれ以上割くのはもったいないので、こんなところで我慢することにしようかと思います。READの方は800KB * 8 = 6.4Mbpsですから、USBフルスピード12Mbpsの半分は出ていることになります。

気がつくと、なんだかんだで1か月くらい複合デバイスやっていたので、いい加減何か違うことやりたくなってきました。