mbedを買ってその便利さに感動したものの、それが非常にmbedという枠に閉じ込められていているという気がしてしまい、結局LPCXpressoを買い足してきた。すでに持っているLPC1769版とLPC1343版もあるのだが、ちょっと目的もあるのでCortex-M0なLPC1114版。半ば意地でOSX環境で開発したいので、買ってきておもむろに真ん中で切り離した。

そしてノリノリでUSBで繋ぐべく、MiniUSBのコネクタを付け、プルアップ抵抗を付け、USBの配線をしてLDOを付けて。ここまでやってから大きなミスに気づいた。シルクスクリーンにUSB_DP, USB_DMという記載があったのでろくに調べずUSBでMass Storageでの書き込みが出来るだろう、と思っていたら、実はそれは出来なかったのだ。だからMARYもわざわざUSB-Serial変換チップが載っていたわけで。よくよくLPCXpressoのデータシートを見てみたら、

なるほど。もちろんLPC1114のデータシートにもUSBなんて文字はなく、思い切りウッカリしていた形になった。

ということでこれじゃUSBが使えないのだが、それでは色々進まないので、ホットエアを持ち出してチップの張り替えをしてしまった。ちょうど石はちょっと前にdigikeyから仕入れておいたLPC11U24で、ピンアサインもほぼ一緒(細かいところは違うが肝心なピンは同じ)なので、そのまま剥がして付け替えただけ。

さて、付け替えたはいいが、今度はどうやって中身を書くか。まずtoolchainだが、MacPortsだけでなんとかしようと試行錯誤したのだがどうしても駄目(これはさらに追って調査するつもりだが、newlibの新しい版の都合でarm-none-eabi-gccがちゃんとビルド出来ない)で、とりあえずはYAGARTO toolchainを使うことにした。頂いてきて展開してパスを通す。

次、ソースコードを書く方。CMSISなんていう胡散臭いものに手を出すのは結局mbedからエクスポートしてくるのと殆ど同じでブラックボックスが残って気持ち悪いし、とはいえ世の中には何故か「まずはどこそこからライブラリをコピーしてきて展開して」だとか「LPCXpressoを使って」ばかりでこれも落ち着かない。32kしかフラッシュがないM0クラスごとき、本当ならアセンブラで書いたって良いはず。とおもって調べていたら、同じような意図でChaNさんが32bitへの誘いというコンテンツで余計なライブラリに触れないで済む生っぽいコードを公開してくれているのを見付けた。これ幸いとこれを頂いてきてビルド、ビルドは通るけれどうまくいかない。なんでだ。

追って調べていくと、メモリアドレス先頭の0x0000 001c(割り込みベクタの頭から8つめ)にチェックサムがないとユーザプログラムがvalidとされないらしい。gccさんにここら辺やってもらう方法もあるのかもしれないが、これも調べていたらmicrobuilderさんのlpc1343codebaseをgoogle codeからチェックアウトしてきて、tools/lpcrc/以下でMakeしてlpcrcツールを入手。ちなみにこのときに

gcc -Wall -O4 -std=c99 -o lpcrc lpcrc.c
ld: lto: could not merge in /var/folders/6f/j0df6rz90jxbpfgg053_k0l80000gn/T//cc6uDMQK.o because Invalid ALLOCA record for architecture x86_64
collect2: ld returned 1 exit status
make: *** [lpcrc] Error 1

みたいなエラーがでたら、Makefileをいじって-O4を-O3にすれば回避できる。

ここまでやって、生成されたbinファイルをlpcrcに食わせることでその辺まで正しいバイナリを作れるようになったんじゃないかと思うのだけど、、、まだ動かないので結局まだ調査中。無念。調べて何かわかったら随時反映の予定で。

2012/2/20 うごいたー!

ポイントはいくつか。

  • ファームを動かすときはPORT0_1/FTOGGLEを解放するだけでなく、VBUSも解放してあげないと駄目
  • LPC11xxとLPC11UxxはGPIOレジスタがてんで違う。ばらっばら。
  • ChaNさんの公開してくださっているstartup.c最強。ちょっとだけいじったので後ほどコピーライト無し権利主張無しライセンス無しで公開予定。ありがたやありがたや・・・

複合要因すぎる。

次の調査は、CRP(Code Read Protection)を設定したときの隙間埋め。CRPは0x2fcにあるのだが、LPC11Uxxの割り込みベクタは0x00c0まで。普通に書いたらその間は00で埋めるしかなくて、572bytesほど無駄がでてしまう。0x2fcに入るのがマジックワード(32bit値4つ)でなければ良いとはいえ気持ち悪いし、そもそもCRPを使いたいときにそれでは使えない。どうもLPCXpressoなんかは頭から0x2fcまでの間に初期化コードを突っ込んだりして使ってるみたいなのだけど、そちらも調べなければわからない。これは追って別のポストに。ひとまずこの話完結。何かの参考になれば幸い。

Something to say?