/* * minimal monitor for LPC1830-Xplorer * by uratan! 2012.10.23 */ LPC1830-Xplorer にて、USART3-boot にてロード・実行する *最小の構成のたたき台*としてのファームウェアです。 シリアルを console としてメモリのダンプ・エディット、さらに SPIFI-flash の消去・書き込み他ができるモニターが走ります。 さらに本バイナリを SPIFI-flash の先頭に書き込んだ場合には 本モニターと 0x8010_0000〜に書き込まれた user program を P1_8 を見て切り替える boot-loader になります。 *FILES* 00README.txt --- このファイル Makefile --- make.exe 用の Makefile link.cmd --- リンカースクリプト (やっぱりようわからん) LPC1830.h --- レジスタ定義 Startup.S --- CPU スタートアップ (とりあえず全部いり) mem_usage.h --- メモリ用途定義 main.c --- boot-loader(?) 部分 common.h --- system 共有定義 common.c --- system 共有関数群 (GPIO, uart はここ管轄に) rprintf.c --- printf()関数 (WinARM_20060606.zip 付属のサンプルより) minimon.c --- mini monitor 本体 (独立しました) ihex.c --- intel-HEX フォーマットのファイルを読む spifi.c --- SPIFI-flash 制御 spifi_rom_api.h --- NXP, AN11206 より spifi_drv_M3.lib --- 〃 boot-test.bin --- minimon.bin を uart-boot 用に追加工したもの。 minimon.hex --- minimon.bin の hex 形式ファイル zz-boot_header.exe --- uart-boot 用に bin->bin で加工するツール zz-boot_header.c --- と そのソース test/* --- 一般プログラムのたたき台 test/test.hex --- その hex 形式ファイル コンパイラは yagarto の gcc-4.7.1(2012-0616版)です。 sh.exe と rm.exe は別途なんとかしてください。 make.exe すると minimon.bin を作成します。 uart-boot に使用するためには、これに header(16byte) と、コード長を 512バイト単位にするための filler が必要ですが、この加工を行うツールを 追加しました。zz-boot_header.c をご覧ください。 *手順* [1] Xplorer から 3.3V→RS-232C へのレベルコンバーターを経由して PC とシリアル接続します。Xplorer 側は外部コネクタ J10 の pin#13 (マニュアルでは I2C1_SDA) が U3_TxD (LPC1830が出力) に、 pin#14 (マニュアルでは I2C1_SCL) が U3_RxD (LPC1830に入力) に なります。 [2] Tera Term を使用してシリアル回線を開きます。パラメータは 例えば 57600bps/8bit/non-parity/1stopbit あたりで。 [3] Xplorer の boot-SW を #1 から ON-ON-ON-off にします。 [4] ボードリセット後に Tera Term より '?' を送信すると 'OK' が返ります。 [5] メニュー「File」→「Send file」にて 'boot-test.bin' を送信します。 オプションの「binary mode」を忘れないでください。 [6] 緑・青の LED が点灯し、端末にメッセージが表示されれば成功です。 *boot-header* 細かいことは LPC1830 のマニュアルを見ていただくとして、ダウンロード データの先頭 16バイトのヘッダーデータはおおむね以下の内容となります。 ここで下線部には、512バイトframe単位でのダウンロードデータ長を設定します。 +---------------------------------------------------------- |FFFFFFF0 : 1A FF 04 00 55 55 55 55 55 55 55 55 FF FF FF FF | ~~~~~ +---------------------------------------------------------- 最終データの長さは (16 + 512xframe長)バイトとなります。 この長さになるようにお尻にはダミーデータを追加してください。 *intel-HEX* intel-HEX ファイルの 0番地〜を、メモリ 0x2000_0000〜にロードします。 (メモリの範囲に入らないアドレスのデータは無視されます) 'L' + [RETURN] の後、例によって Tera Term の「Send file」にて送信します。 中断する場合は ':' をいくつか打ってください。 *SPIFI-flash の消去と書き込み* SPIFI のオペレーションに当たっては必ず 'I' コマンドで初期化してください。 消去 'B' では、指定したアドレスが含まれる 64kB sector が消去されます。 書き込み 'P' では、消去は行わず書き込みを行います。任意のバイト長 書き込めます。(1byte 毎に write+read-back+verify してるみたいですね) なお 'B', 'P' で与える flash のアドレスは、0x0000_0000〜0x003f_ffff でも 0x8000_0000〜0x803f_0000 でもよいみたいです。 *uart-boot でモニターとして使用する* boot-test.bin を使用します。上の手順の通りです。 *2nd boot-loader としての使用* uart-boot でモニターを立ち上げ、SPIFI-flash 先頭に minimon.hex を 書き込み後、Xplorer の boot-SW を #1 から off-ON-ON-ON にして SPIFI-flash から boot させます。この際、P1_8 が Low ならばモニターを、 High ならば 0x8010_0000〜のバイナリに実行を移します。内蔵 PULL-UP を 使いますので GPIO1[1] を GND に落とすか否か だけのスイッチを付けて ください。本操作例は web ページの screen-shot をご覧ください。 -- uratan@st.rim.or.jp