イカ醤油ポッポ焼きはイカにして生まれたか(´(ェ)`;

2013年,夏のある日.お昼ごはんを食べたあと,オフィスへ戻る道すがら恵比寿アトレの長いエスカレータを上りながのらツイッターへの投稿.これがそもそものきっかけだった.

イカ醤油ポッポ焼き 以前

その前のしばらくの間,LPC1114FN28とLPC810にmbedオンラインコンパイラでいくつかのデモを作ったり,その変更を行ったりすることがよくあった.
当時はまだmbed LPC1114FN28のような便利な環境は誕生しておらず,ユーザは何らかの方法で実行コードをチップ内部のフラッシュメモリに書き込みを行わなければならなかった.
これを手っ取り早く行うにはLPCXpressoのような統合開発環境とLPC-Linkのようなデバッグ・ハードウェアを組み合わせればいいのだけれど,せっかくmbedでビルドしたコードをわざわざ別環境で書き込むのは煩わしかった.便利なmbedのD&D環境に慣れてしまうとフツーの環境で作業しなければならないのが非常に苦痛になってしまう(^ ^;
ところでこれらのDIPパッケージ・チップには実行コードを書き込む方法がもうひとつ用意されている.InSystemProgramming.略してISP.シリアル(UART)インターフェースを介して書き込みが行える.
ISPを行うにはPCとケーブルとISPの手順を実行するソフトが要る.
今となってはシリアルポートを持ったPCなど無いので,USBとUART(シリアル)の変換ができるインターフェースが必要になる.「変換ケーブル」になった便利なものもあるが,それを使うにもPCにドライバを入れたり,ちょっと面倒.
ISPはこのシリアルを使ってマイコンチップと所定の手順を実行しながら書き込みを行う.
この手順を実行するソフトはFlashMagiclpc21ispなどWindows・Macの両環境で使えるソフトがある.しかしFlashMagicはbinフォーマットをそのまま扱うことが出来ず,インテルhexに変換してから使わなくてはならない.PCのポート番号設定もやたらと面倒.
lpc21ispはオープンソースで自由度も高いが,コマンドラインのインターフェースに慣れていない人にはとっつきにくい.

そんなわけで「面倒だなぁ」と思いつつも,ずーっとそういう環境を使い続けていた.

一方,とても便利なmbedはUSBシリアルの変換などお手のもの.
実際にISPの機能を使ってLPC1768に書き込む方法として,青mbedにUSB-シリアル変換をさせる例もごく初期から公開されていた. USB-シリアルのケーブルをわざわざ買ってこなくても,同じことができる.なのでLPC1114やLPC810への書き込みのUSB-シリアル変換はmbedにさせてたりしてた.

口は災いの元

で,思いついた.
(´(ェ)`).oO( せっかくmbedを使っているのだから,PCで実行している書き込み手順をmbedでやってみたらどうよ? )
それがお昼ごはんを食べた後のエスカレータの上から投稿したツイート(このツイートへの返信に注目)だった.
lpc21ispをmbedにポートしたら済む話と思ったんですね.

しかしこの投稿をしてから思い出した.私のツイッターのタイムライン/mbed界隈の鉄の掟:『言い出しっぺの法則』
口は災いの元.多言は身を害す.病は口より入り禍は口より出ず.

まぁそもそもISPの手順ははユーザマニュアルで定義されているし,実装例もあるからそんなに手間はかからないだろうと思ってた.なのでやってみることにした.
実際,仕事の片手間で,空き時間にいろいろ実験しながら進めていった.
でも細かいところで,いろんな問題が出た.と言ってもそんなに致命的なものではなくて,「それに対応するのはメンドクサイなー」程度のものだったけど (;´Д`)

作業開始

まずやったのはlpc21ispのコードのどの部分を移植するか確認することだった.でも思いのほかコードが冗長.しかもいくつかの問題もあった.
なので早々に移植は諦めて別のコードを作ることにして,確かLPC1114向けのコードを書きはじめた.
ユーザマニュアルを読んで,ロジアナ/プロトコルアナライザで通信の様子を確認しながら,mbedでその手順を真似てみる.
余分な手順は省いて必要なところだけ.行の長さが固定されたuuencodeデータの扱いが面倒だけど,シリアルからRAM.さらにflashへの書き込みコマンドも動いた.
このとき書き込むデータをどう用意するか悩んだのだけど,せっかく青mbedを使ってるのだし,そのローカルストレージを使うことにした.
しかし問題が1点.青mbedは拡張子が「bin」の,タイムスタンプが最も新しいファイルを自身の実行コードとして使ってしまう.LPC1114用のコードも同じ拡張子が付く.LPC1114用にビルドしたコードを後からmbedにコピーすると,こちらを青mbedが使おうとしてしまう.
(これより後になって,このあたりを何とかしようと,ARMコンパイラがstdioをどう扱うのかFILE構造体の中を見ようとしてもどうやら非公開で再度諦めた)
この点でも妥協して,書き込みを行う元ファイルは拡張子無しの「bin」とすることにした.

命名・公開

これで未完成ながら(サイズも4KBまでしかサポートしてなかったし)公開してみた.まだやることはたくさんあったけど,僕のアカウントにはまだ会社のバッジは付いてなかったし.いい加減だけどとりあえず動いたから(^ ^;
http://twilog.org/tedd_okano/date-130824 (16時過ぎのツイート辺りから)
このアプリケーションの命名には悩んだ.先に公開したIAPプログラムのように「ISP」とその機能を示すものにしようかと思ったけど面白味がない.なので以前から我々の間で流行っていたISPの別名「イカ醤油ポッポ焼き」にすることに.この時点ではこのプログラムは純粋に自分(と一部のユーザ)用だったし,こんなにたくさんインポートされるものになるなんて思いもしなかった.
いろんな方に使って頂けるようになったのは,このページ(「[lang:ja] mbed LPC1114での遊び方」)で紹介いただき,様々なフィードバックを頂いたお陰です.

ところでISPのことを誰が「イカ醤油ポッポ焼き」と言い始めたのかは次の「ネタまとめ」ページを見てみてください.

公開後

公開後には予想以上のコメントが頂けた.
機能追加の提案や問題点の指摘など,改良を行うための意見を寄せていただいた.

最初の公開後のツイートと公開履歴を見ているとLPC810は早めに対応できたみたい.というのもLPC1114はuuendodeしたデータを送る必要があるのに,LPC810ではバイナリをそのまま送る仕様になってて,これはより簡単だった.
しかしこの仕様の違いが,もうすこしコードを書くきっかけになった.LPC1114は転送後にチェックサムを確認した結果が返ってくるのだけど,LPC810はそのまま.なので書けたコードが正しいかどうか読み出しを行わないといけない.
読み出し検証を行うのをLPC810だけに限定するのも妙だからLPC1114用にuudecodeもしなくちゃいけないとか.
またシリアル経由で読み出しをする際に,どうしても解決できない問題があった.16バイトをシリアルで連続して受信するとデータが落ちる.これはSDKでは解決できなくて,調べてみた結果MODSERIALを使うことで解決した.これがMODSERIALを使い始めた理由です.

このほかLPC812での動作を確認いただいたり,書き込み終了→ターゲット・リセットで書き込んだプログラムが起動した後にmbedがUSB-シリアルとして動作するシリアル・スルー機能を提案いただいて追加したり,またあるときにはこんなうれしい言葉をいただいたり (^ ^)

暫く時間を置いて,小さいサイズのデータを欠けないという問題も発覚.
これはイカ醤油ポッポ焼きはデータを書き込む前にCodeReadProtection(CRP)をチェックしているのですがこれの副作用がありました.
CRPはフラッシュの特定場所に特定の4バイトのコードを書くと,書かれたコードを読めなくしたり,それ以上の書き込みを禁止する機能.ユーザが作成したコードにたまたまそれに該当するコードが含まれていたりするとそれ以上の上書きができなくなる可能性があります.これを防止するためのチェック機能を仕込んでいたのですが,そのオフセットに満たないサイズのファイルを扱う場合に,不用意なfseekによって問題が出ていました

翌年の1月には,なんと99インポートもされました.各地で不定期で開催されるmbed祭りでは「日本で最も有名なプログラム」と紹介頂くこともありうれし限り.

これから

最近では,最新のLPC82xへの対応の声も聞かれ,今後の発展に(?)大いに期待したいです (^o^)/

  • 追記(2014年12月11日):思いつきでLPC1768,LPC1769への書き込みにも対応してみました.このデバイスについては現在のところ書き込みのみが可能で,読み出し検証はできません.

Import programika_shouyu_poppoyaki

this transfers data (which is stored in "bin" file in mbed storage) into LPC1114, LPC1115, LPC81x, LPC82x, LPC1768/LPC1769 and LPC11U68/LPC11E68 internal flash memory through ISP.


Please log in to post comments.