lpc1114 -> lpc11u24とYAGARTOとOSXと

Posted by ゆのじ on 2月 18th, 2012

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までの間に初期化コードを突っ込んだりして使ってるみたいなのだけど、そちらも調べなければわからない。これは追って別のポストに。ひとまずこの話完結。何かの参考になれば幸い。

mbedオフラインビルド

Posted by ゆのじ on 2月 9th, 2012

先の投稿で書いたが、mbedは大変すばらしいものの、それが無くなったことを考えると些か不安でもある。そのため、エクスポートしたプロジェクトをローカルでビルドする方法をきちんと確立しておきたかった。

で、ひとまずさんざん試行錯誤した結果、さくっとビルドする方法がわかったのでメモしておく。ちなみに、OSX Lion(10.7.3)にmacports環境なので、WindowsやLinuxユーザの方には適用できないかもしれない。

用意

  • codesourcery gcc用としてエクスポートしたソース
  • YAGARTO(http://www.yagarto.de/)から拾ってきたYAGARTO GNU ARM toolchainの最新版

展開

  • 適当なところ(うちは/opt/local/)にyagarto(最新版).appをおいて実行
    • 中身が実行したディレクトリ/yagarto(バージョン)/に展開される
    • 趣味で/opt/local/yagarto -> /opt/local/yagarto(バージョン) にsymlinkしておく
  • ~/.zshrcなり~/.bashrcなり~/.tcshrcなりにpathを追加
  • エクスポートしたソースを展開してmake
  • できあがり!

・・・あれー。これで終わるはずじゃなかったのだが。macportsのarm-none-eabi-gccでビルドすべくやってみたら、newlibの改変でエラーぼこぼこ出て、調べたら–disable-newlib-supplied-syscallsを付けろとかいうからPortfileに付けてみたらビルド出来ず、–enable-languages=c,c++付けたらarm-none-eabi-gccはビルド出来たけどcrt0.oが無くて結局ダウンロードした奴がビルド出来なくて、ついにはcodeRedのred suite 4 fullの試用版まで落としてきて試したにも関わらず駄目だったのに。

ひとまず大変シンプルなコードでしかテストしてないのでどこまでちゃんと使えるかは不明だがざくっとしたコードは問題なく動いていて、ライブラリ等も一式使えてる模様。ただ、mbed interfaceの支援がないからか、最適化オプションの都合か、バイナリは相当デカくなってしまった。mbedのサイトでビルドすると4,356bytes、エクスポートしてローカルでビルドすると56,736bytes。何かに騙されてる気がするくらいのサイズ差がある。恐らく不要なモノが大量にリンクされてるだけだろうし、この辺放置するとエラいことになりそうなので、追って調査。それと、このままだとmbedからエクスポートしてきたソースのビルドは出来る(ライブラリ類一式がアーカイブに入っている)が、一からソースを書き始めるには諸々準備がいる。その辺もそのうち時間が取れたら調べて書く。

2012/2/20追記:

上のnewlib云々の問題、がた老氏がSTM32で遭遇された問題にそっくりのような気がする。Stub書けば良いだけなら話は早い。追って調査としたい。

mbed買った

Posted by ゆのじ on 2月 7th, 2012

mbed

mbedを買った。LPC1768版とLPC11U24版と。

Macからでも開発が出来て、ファームウェアのアップロードはマウントされたドライブにbinファイルを突っ込むだけのお気軽仕様で素晴らしい。Arduinoも悪くないけどこっちのほうが楽な印象がある。ライセンス的にもmbedを1つは買わないとそのターゲット向けのビルドが出来ないものの、1つ買えばいくらでもビルド出来るしLPCXpressoのようなmbedではないボードにファームウェアを放り込むことも出来る。ライセンス的にもそういう使い方をしていいということらしい。曰く、

Can I make commercial products using an mbed?

Yes! You are free to make and sell products that were developed using the mbed libraries.

We do not offer any guarantee for the libraries, they are there for rapid prototyping purposes, but if you wish you use them, you can. here are some examples showing how you might take a prototype to a custom design.

とのこと。

使うことの出来るmbedのライブラリも良くできてるし、しかもエクスポートしてmbedの外でビルドすることも出来るらしい。このあたり、突然mbedサイトが無くなったりサービス終了したときにソフトウェア資産が無くなるのは辛いので十分調べてみたいところ。

そうそう、mbedのLPC11U24版のほう、裏側のmbed interfaceチップの45,46番ピンの間に半田ブリッジがある。twitterで話題に出したら@tedd_okanoさんが確認してくださった。結果、わざとやっていることであって、このリビジョンにおいてはそれで正しい仕様だとのこと。@tedd_okanoさん、ありがとうございました。