いろいろ記録しておこう。
_ nsmm を cygwin で動かしてみる。ぼちぼちやってみよう。
_ OpenBlockS 関連。
CONFIG_MINITOR_BASE を変えただけではダメみたい。
_ board/OpenBlockS/ppcboot.lds の
をコメントにする。 なんとかリンクは通るようになる。コマンドの取捨選択が必要か。. = env_offset;
_ 規格 IEEE 802 LAN/MAN Standards ファイルを Get 802でダウンロード出来ることを発見。5月からフリーダウンロード開始して いたみたい。2000年版は 100Base-X とか全部統合されているわけね。 ありがたく Get しまくり。
_ cpu/mpc8xx/start.S: ここから開始。
_start は 0x00210100 。本物の Reset Entry ではない。 in_flash は 0x00210188 。 CFG_MONITOR_BASE は 0x00210000 にする。 in_flash - _start + EXC_OFF_SYS_RESET は 0x00210188 - 0x00210100 + 0x0100 = 0x0188 。 で良く分からんがとにかく in_flash 0x00210188 へ mtlr で絶対分岐。
GET_GOT は何をやっているか。
0x002101a8 + 0x22ac = 0x00212454.
0x00212454 の中身は 0x0001bd58.
+ 0x002101a8 すると 0x0022bf00. これを r14 に設定。r14 は常に固定。
これは .section ".got2","aw"; で .LCTOC1 = .+32768 の位置である。
_GOT2_TABLE_ は 0x00223f00 (section .reloc) 。
cpu/mpc8xx/cpu_init.c void cpu_init_f(volatile immap_t *immr) 関数へ。 引数は r3 0xff000000 である。
common/board.c void board_init_f(ulong bootflag) 関数へ。 ここからは戻ってこない。
_ cpu/mpc8xx/cpu_init.c: cpu_init_f() CONFIG_I2C は後回し。
_ common/board.c: void board_init_f(ulong bootflag) 関数の中身。
board_pre_init() をやる。これは board/OpenBlockS/OpenBlockS.c の中に 必要であれば作る。まあ必要なしかな。
get_gclk_freq().
init_timebase(). udelay() で使う。EEPROM から情報をリードする時にも使うかも。
dpram_init(). コメントよむ。serial, scc and i2c で必要か。
include/config_GENIETY.h
env_init(idata).初期値テーブル初期化。
include/config_cogent_mpc8xx.h
include/config_hermes.h
を読むべし。CFG_ALLOC_DPRAM を設定することにする。
baudrate を初期値テーブルから読み出す。
serial_init(idata->cpu_clk, baudrate)._ cpu/mpc8xx/speed.c: ulong get_gclk_freq(void)
これは CONFIG_8xx_GCLK_FREQ を返す。
_ ppc/time.c: void init_timebase(void)
PPC architecture 定義のタイムベースレジスタをクリア。8xx シリーズは動作の 許可/禁止が出来るので、ここで許可する。
_ cpu/mpc8xx/commproc.c: void dpram_init(void)
なんかやる。初期データは内部 DPRAM の先頭。
_ common/cmd_nvedit.c: void env_init(init_data_t *idata)
ifndef 側にする。ほっとけば default になる。
よって夜更かししながら、ソースでもよむか。
_ cpu/mpc8xx/serial.c: void serial_init(ulong cpu_clock, int baudrate)
OpenBlockS のシリアルポートは SCC1 である。よって CONFIG_8xx_CONS_SCC1 にして Console on SCC1 にすることにする。
_ board/OpenBlockS/flash.c: write_word()
バグってないか。使わないからいいけど。
_ OpenBlockS:
ちなみに FlashROM は 4[MByte] である。でポートサイズは 16[bit] であるはず。 0xffc00000 と 0xffe00000 の 2 つのバンクに分かれている。 で、CSNT, BIH, SCY=5 and EHTR である。
_ えっと、ppcboot-1.0.1 まで出ているがこれでがんばることにする。
_ common/board.c: void board_init_f(ulong bootflag) 関数の中身の続き。
serial_init() の次から。
console_init_f().ここでコンソール (シリアル) 関数を登録して
display_options().ここではじめて使うことになる。
"Initializing..." メッセージ表示。_ common/console.c: void console_init_f(void)
再配置前に呼び出される。シリアル関数群を初期値テーブルに登録する。
idata->bi_mon_fnc.getc = serial_getc; idata->bi_mon_fnc.tstc = serial_tstc; idata->bi_mon_fnc.putc = serial_putc; idata->bi_mon_fnc.puts = serial_puts; idata->bi_mon_fnc.printf = serial_printf;_ ppc/display_options.c: void display_options (void)
version_string[] を printf する。 version_string は cpu/mpc8xx/start.S および include/version.h の中。"ppcboot 0.9.2",日付,時間となる。
_ 若林さんにより linux-2.4.6-pre5 の起動報告。すばらしい。私も前線復帰しなくては。
_ さっさと ppcboot を片付けたいところだ。
_ 東京ビッグサイト。湾岸線渋滞。事故りやがって。
_ センチェリー・システムズのあれはあのへんから出るとかなんとか。ほしいな。
_ common/board.c: void board_init_f(ulong bootflag) 関数の中身の続き。
checkcpu(). CPU のクロック周波数を渡す。 CPU を正確に認識できないと hang() する。
"Board: " 表示。 checkboard(). 名前表示。board を正確に認識できないと hang() する。
もっと何か初期化したい場合はこの辺で misc_init_f() を呼べばよい。
" DRAM: " 表示。
まああとは動くかな。_ cpu/mpc8xx/cpu.c: int checkcpu(long clock)
IMMR は MPC860 に固有のパーツナンバがある。PVR は PowerPC 共通のバージョン レジスタ。で check_CPU() する。
_ cpu/mpc8xx/cpu.c: int check_CPU(long clock, uint pvr, uint immr)
CPU のリビジョンとか色々表示する。
_ board/OpenBlockS/OpenBlockS.c: int checkboard(void)
"OpenBlockS \n" を表示してみたり。とりあえず無条件で表示するにした。 汎用性を持たせるにはなにかの識別レジスタを用意して判別をすればよい。
_ 焼いてみた。動かない。ふむ。
ちゅうことか。0x00210000 48 00 01 00 b 210100
_ Flash 周りの CONFIG をちょと直す。cmd_nvedit.c でなんかやっている。
common/board.c:void board_init_r() まで動いた。あまり追いかけなかったが ちゃんと再配置したようだ。_ flash.c を直す。TOSHIBA 用定義の追加とか。ここでちゃんとした値を 返さないと hang() するわけ。
_ ブートした。
_ 一気に Ver.1.0.1 まで上げる。
_ LED:
CONFIG_STATUS_LED を設定してみた。