ColdFire MCF52233 基板 (4)

この記事のテーマは「Ethernet を全く使わない方法での開発の可能性」ということですが、CodeWarrior + BDM ケーブルでは Ethernet は全く使わないのは自明ですから、そのケースは省きます。
インターフェース誌 9 月号 pp.88 の図 2 のような配線で、RS232C インターフェースを接続すると、シリアル・コンソールから SilentC を利用できます。
とは言っても、シリアル経由と Ethernet 経由で 2 セッション張れるというわけではありません。
telnet 接続していない時にはシリアル・コンソールで入出力できますが、telnet セッションを張ると、出力は telnet 側にリダイレクトされます。
この場合、シリアル側は入力だけ有効になっています。
さらに別の telnet セッションを張ると、前の telnet セッションは強制的に閉じられて、新しいセッションのみ有効になります。
一方、シリアル側のセッションは、張ったり、閉じたりということはなく、電源 ON 時から有効になっており、「SilentC (May 13 2008)」というバナーメッセージは最初しか出ません。
SilentC インタプリタの機能だけを利用し、ターミナル・ソフトによるテキストファイルの受け渡しだけで話がすむなら、Ethenet 機能は全く使わず、シリアル接続だけで開発できます。
シリアル / telnet のセッションを許可するかどうかのフラグが、「SilentC_Registry」ファイルの中に記述されていて、それぞれ、Term / Telnet 変数の値が 1 なら許可、 0 なら不許可になります。
このファイルが読み込まれるのは電源 ON / リセット時なので、ファイルを書き換えてもすぐには有効にならず、次回の電源 ON / リセット時に初めて有効になります。
Term / Telnet 変数を両方とも 0 にしてしまうと、おそらく、SilentC のコンソールを起動することができなくなると思います。
その場合には「tftp」コマンドを使って「SilentC_Registry」ファイルを書き換えれば回復できるはずです。
内蔵フラッシュ ROM には、あらかじめ Ethernet 対応の GDB スタブが書き込まれていますが、これをシリアル対応のスタブに書き換えれば、GCC + GDB で開発できるのは自明ですから、それ以外の方法について考えます。
デバッグ」については考慮せず、「フラッシュ書き込み」についてだけ考えることにします。

シリアル経由でのバイナリファイルの扱い

Ethernet 経由の「tftp」コマンドでは、通常は内蔵フラッシュ ROM 上のファイルシステムに対して操作を行いますが、例外として、次の表に示すファイルについては、特別な処理を行います。

ファイル名 アドレス
SILENTC.BIN 0x00000000〜0x00013FFF
FILEDATA.BIN 0x00014000〜0x0001FFFF
COLDFILE.BIN 0x00020000〜0x0003FFFF

これらのファイルを「get」すると、内蔵フラッシュ ROM の上記のアドレスからデータを読み出し、バイナリ・イメージ・ファイルとしてホストPCに送ります。
「put」すると、ホストPC上の上記のファイルをバイナリ・イメージ・ファイルとして、内蔵フラッシュ ROM の上記のアドレスに書き込みます。
上記の3つのファイルで 256 Kバイトのフラッシュ ROM 全体をカバーしているので、フラッシュ ROM の内容のセーブ / リストアに利用できます。
これらのファイルについては、たとえば「put」の場合には、ファイル全体をバッファリングすることなしに、一定量のデータが貯まると直ちにフラッシュへ書き込んでいると思われます。
なぜなら、たとえば、「COLDFIRE.BIN」のサイズは 128 Kバイトであるのに対し、内蔵フラッシュ ROM 上のファイルシステムのサイズは 48 Kバイト、内蔵 RAM は 32 Kバイトで、両方フルに活用してもファイル全体を格納するには容量が足りないからです。
したがって、何らかの方法で、シリアル経由で上記のファイルをファイルシステム上に作成しても、特別な処理は行われないものと思われます。
唯一の例外が「UserDriver.bin」で、SilentC の起動時に、このファイルをファイルシステム上に発見すると、このファイルをバイナリ・イメージとみなして、内蔵フラッシュ ROM の 0x00013000 から書き込み、ファイル自体は消去します。
SilentC のコンソール入力には、バイナリファイルの転送機能はないので、書き込むべきバイナリ・イメージを、たとえばモトローラ S フォーマットで用意しておき、SilentC で書いた S フォーマット-バイナリ変換プログラムを実行するなどしてバイナリ・ファイル化する必要があります。
結論としては、次のような手順を踏めば、手間はかかりますが、Ethernet なしでシリアルだけをつかってオブジェクト・プログラムを内蔵フラッシュ ROM の後半 128 Kバイトに書き込めると思います。

  1. SilentC インタプリタ上に S フォーマット-バイナリ変換プログラムを作成する
  2. UserDriver( ) 関数呼び出しで実行される ColdFilre ネイティブ・コードのフラッシュ書き込みファンクションを作成する
  3. 1. のプログラムを実行して、ターミナル・ソフトから 2. のオブジェクトの S フォーマットファイルを送り、「UserDriver.bin」ファイルを作成する
  4. SilentC を立ち上げ直し、UserDriver をフラッシュに書き込む
  5. UserDriver( ) のフラッシュ書き込みファンクションを利用して、コンソール入力から S フォーマットファイルを読み込みながら「オン・ザ・フライ」でユーザ・フラッシュに書き込む、SilentC インタプリタ上のプログラムを作成する
  6. 5. のプログラムを実行し、目的のアプリケーションの S フォーマット・オブジェクトをターミナルソフトから送信する。

1. から 5. までは、あらかじめ実行しておけばよく、アプリケーションのオブジェクト書き込みごとに実行する必要があるのは 6. だけです。

EzPort の利用

EzPort 機能を利用すれば、内蔵フラッシュ ROM を仮想的な SPI EEPROM として扱うことができます。
この方法は、付属基板を 2 枚使ったリカバリ処理に使われています。
SPI モードでの書き込みと言えば、AVR の ISP (In-System Programming) に使われているので、AVR 用の ISP モードでの書き込みハード / ソフトを改造して使えるのではないかと考えています。
ハード的には、パラレルポート接続の JTAG ケーブル (Altera、Xilinx) 利用のものや、シリアルポートに接続するもの、汎用 USB-SPI ブリッジ、EZUSB 利用のものなどがあります。
ソフトとしては、「avrsp」、「avrspx」、「avrezusb」(EZUSB 用) などがあります。