[KOZOS]Step4(p124): シリアル経由でファイル転送
4thステップの目的として、今後ブートローダを作ってやれば、
シリアル経由で更新版プログラムを転送できるようになるため、
フラッシュROM書き換え回数が減らせるというもの。
目的のブートローダは以下の機能を持つ。
- シリアル経由でOS実行形式をダウンロードし、RAMへ一時保存。
- 保存した実行形式ファイルを適切にRAMへ展開。
- RAM上に展開したOSを実行。
シリアルポートで通信する転送プロトコルはXMODEMを使うため、
XMODEM機能の実装、他修正してmake。
書籍通りに写しただけだが、プログラム起動してTeraTerm上に
プロンプト表示をさせて、loadコマンドでファイル転送開始までは
うまく行ったのだが、ファイル転送中に長時間固まる。
本書にも時間かかる旨説明があったが、ファイル転送が終わったと思われる
ようにTeraTermのXMODEMウィンドウが閉じても、ターミナル上にはプロンプト
が返って来なくて、そのまま固まってしまった。
本書と挙動が違うので、どこかミスってるのだろう。
(2012.12.1追記)
http://kozos.jp/kozos/osbook/osbook_03/04/bootload/
サポートWebから正しいソースを入手して比較した結果、
ミスってる箇所発見。
//block_number ^= serial_recv_byte(SERIAL_DEFAULT_DEVICE); /* receive reversed block number */
block_num ^= serial_recv_byte(SERIAL_DEFAULT_DEVICE); /* receive reversed block number */
代入先はblock_numなのに、block_numberになってたからだ。
これが原因で、
TeraTerm > ファイル > 転送 > XMODEM > 送信 > File選択して開始。
とした時に、そのままフリーズしてしまっていた。
上記の通り修正して実行してみたら、成功したようだ。
kzload> load
★ ここで、上記のXMODEM送信手順でdefine.hを選択し、転送してる。
XMODEM receive succeeded.
kzload> dump
size: 100
23 69 66 6e 64 65 66 20 5f 44 45 46 49 4e 45 53
5f 48 5f 49 4e 43 4c 55 44 45 44 5f 0d 0a 23 64
65 66 69 6e 65 20 5f 44 45 46 49 4e 45 53 5f 48
5f 49 4e 43 4c 55 44 45 44 5f 0d 0a 0d 0a 23 64
65 66 69 6e 65 20 4e 55 4c 4c 20 28 28 76 6f 69
64 20 2a 29 30 29 0d 0a 23 64 65 66 69 6e 65 20
53 45 52 49 41 4c 5f 44 45 46 41 55 4c 54 5f 44
45 56 49 43 45 20 31 0d 0a 0d 0a 74 79 70 65 64
65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72
20 75 69 6e 74 38 3b 0d 0a 74 79 70 65 64 65 66
20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20
75 69 6e 74 31 36 3b 0d 0a 74 79 70 65 64 65 66
20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 75
69 6e 74 33 32 3b 0d 0a 0d 0a 23 65 6e 64 69 66
0d 0a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
kzload>
(2014.1.4追記)
・今回、VMware上のCentOSでやってるので、本書p142に従い、まずはlrzszをインストール。
っと思ったら、既にインストールされてた。
・以下の手順でファイル転送をやってみて成功した。
# cd /mnt/hgfs/vm_share/kozos/121201_2050/src/04/serial_file_tx
# make
# make image → 書き込み準備=DIPスイッチをON,ON,OFF,ON(電源OFF不要) & リセットボタン
# make write → リセットボタンをしっかり押してからやると成功する。
# minicom -s -o → フルスクリーンでminicom起動。
※ 各種設定: /dev/ttyUSB0、9600 8N1、HW Flow Ctrl=OFF
その後、Exitでminicomは終了しないが設定を終了して待ち受けモードへ。
それから動作モード(ON,OFF,ON,OFF)にしてリセットボタン。
これで画面上にプロンプト「kzload>」が出る。
kzload> kzload (kozos boot loader) started.
kzload> load
Linuxターミナル上(kzload>と出ている画面)で、Ctrl+A → s(sだけ。Ctrlは不要)
こうする事で、ファイル転送メニュー画面が出る。
転送モードでxmodemを選択。
ファイル選択画面ではdefaultが/rootディレクトリになっている。
左キーを押して、Prevを選択する事で、実行フォルダに切り替わる。
上下キーでdefines.hを選択して、左右キーでOkayを選択し、Enterを押す。
ファイル名が表示されてなかったら、手打ちでdefines.hと入力してEnter。
本書p145で言うように、loadコマンドを打ってから、ここまでの作業を素早く実行し、成功すると、
Transfer Completeと表示される。
その後、Press any key to continueと出るが、Ctrl-Cで終了させる。
XMODEM receive succeeded.
kzload> dump
size: 100
23 69 66 6e 64 65 66 20 5f 44 45 46 49 4e 45 53
5f 48 5f 49 4e 43 4c 55 44 45 44 5f 0d 0a 23 64
65 66 69 6e 65 20 5f 44 45 46 49 4e 45 53 5f 48
5f 49 4e 43 4c 55 44 45 44 5f 0d 0a 0d 0a 23 64
65 66 69 6e 65 20 4e 55 4c 4c 20 28 28 76 6f 69
64 20 2a 29 30 29 0d 0a 23 64 65 66 69 6e 65 20
53 45 52 49 41 4c 5f 44 45 46 41 55 4c 54 5f 44
45 56 49 43 45 20 31 0d 0a 0d 0a 74 79 70 65 64
65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72
20 75 69 6e 74 38 3b 0d 0a 74 79 70 65 64 65 66
20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20
75 69 6e 74 31 36 3b 0d 0a 74 79 70 65 64 65 66
20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 75
69 6e 74 33 32 3b 0d 0a 0d 0a 23 65 6e 64 69 66
0d 0a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
kzload>