それも、どこまで動いているのか判断もできないので、なんか動作を確認する術が必要です。
こういうときは、古から伝わるデバッグ術、シリアルポートに何か文字を出すとかして
動作を確認しようかなー。
と、その前に、まず、BLDKのデフォルト設定でまともに動く可能性はそもそも低いわけで、
まず、基板依存の設定をちゃんとやってみることにします。まずは、GPIOですかね。
ですが、TX-50の回路図も無く、GPIOの割り当てがどうなっているのか仕様も不明なため、
元のBIOSで起動してレジスタダンプして設定値をゲットする作戦でいきます。
方法としてはEFIShellを使います。ですが、元のBIOSの内臓EFIShellは簡易版のようで、最低限のコマンドしか入ってません。ここはフル機能版のEFIShellを使いたいところです。
で、久々に自分の過去のブログ記事を参考にEDKを使ってEFIShellをビルドしました。これを使えば、メモリやIOを読み書きできるMMコマンドや、PCIコマンド等、レジスタにアクセスし放題だー。
よく見たら、BLDKのソースツリー内にもバイナリのフル機能版と思われるEFIShell入ってますね。(C:\bldk\EdkShellBinPkg\FullShell)EDKでわざわざビルドする必要はなかったかもしれません。
EFIShellのバイナリは適当なUSBメモリに「EFI\BOOT\BOOTIA32.EFI」というパスにこのファイル名で置きます。ほんで、基板を起動して「F12」キーを押して、ブートメニューからそれっぽいのを選ぶと、このEFIShellから起動できました。
E600やEG20-TのデータシートからGPIOのレジスタがどうなっているかみてみました。
E600側のGPIOはLPCブリッジのPCIコンフィグレーション空間のオフセット44h-47hにベースアドレスを設定するようになってます。なので、PCIコマンドで覗いてみます。LCPブリッジはバス0、デバイス1fh、ファンクション0なのでコマンドは以下のようになります。
Shell>pci 0 1f 0
PCI Segment 00 Bus 00 Device 1F Func 00 [EFI 00001F0000]
00000000: 86 80 86 81 03 00 00 00-01 00 01 06 00 00 80 00 *................*
00000010: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000020: 00 00 00 00 00 00 00 00-00 00 00 00 86 80 70 72 *..............pr*
00000030: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000040: 40 10 00 80 80 10 00 80-00 10 00 80 C0 10 00 80 *@...............*
00000050: 00 00 00 00 3F 00 06 00-00 00 00 00 50 00 00 00 *....?.......P...*
00000060: 0B 0B 0B 0A 80 80 80 80-80 00 00 00 00 00 00 00 *................*
00000070: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000080: 00 00 00 00 00 11 00 80-00 00 00 00 00 00 00 00 *................*
00000090: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000A0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000B0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000C0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000D0: 33 22 11 00 00 00 00 FF-00 01 00 00 00 00 00 00 *3"..............*
000000E0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000F0: 01 C0 D1 FE 00 00 00 00-AD 0F 00 00 00 00 00 00 *................*
バイト単位で表示されるのでアレですが、GPIOベースアドレスは80001080hのようです。
おっと、データシートによると最上位ビットはEnableビットなので、アドレスは1080hですな。
これはI/O空間なんですって。なので、MMコマンドでこのアドレスのI/Oを覗いてみます。
オフセットはデータシートによれば、ベースアドレス+00h ~3Chまでで、それぞれ32ビットのレジスタとのことです。
なのですが、BLDKの設定ツールで設定できるのは以下の6つです。
- GPIO[4:0] Enable
- GPIO[4:0] Select
- GPIO[4:0] Level
- GPIOSUS[8:0] Enable
- GPIOSUS[8:0] Select
- GPIOSUS[8:0] Level
この値に対応するのはオフセット0、4、8、20h、24h、28hですな。
コマンドは以下のような感じです。
Shell> mm -io -w 4 -n 1080
IO 0x0000000000001080 : 0x0000001F
Shell> mm -io -w 4 -n 1084
IO 0x0000000000001084 : 0x0000001E
Shell> mm -io -w 4 -n 1088
IO 0x0000000000001088 : 0x00000001
Shell> mm -io -w 4 -n 10a0
IO 0x00000000000010A0 : 0x000001F8
Shell> mm -io -w 4 -n 10a4
IO 0x00000000000010A4 : 0x000001E0
Shell> mm -io -w 4 -n 10a8
IO 0x00000000000010A8 : 0x00000098
続いて、EG20-T側のGPIOの設定値をゲットします。データシートによると、ふむふむ、こちらは
GPIOが一般的なPCIデバイス(というか、GPIOのPCIデバイス)になってるようです。PCIコンフィグレーション空間のオフセット14hにメモリーベースアドレスがセットされるようです。そして、デバイスIDは8803hということなので、PCIコマンドを使って該当デバイスを探してみました。どうやらバス2、デバイス0、ファンクション2にいるようです。早速レジスタを覗いてみます。今回は通常のPCIデバイスなので、「-i」オプションを使って見やすくして貰います。
Shell> pci 2 0 2 -i
PCI Segment 00 Bus 02 Device 00 Func 02 [EFI 0002000200]
00000000: 86 80 03 88 06 00 10 00-00 00 00 FF 00 00 80 00 *................*
00000010: 00 00 00 00 00 40 00 A7-00 00 00 00 00 00 00 00 *.....@..........*
00000020: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000030: 00 00 00 00 40 00 00 00-00 00 00 00 0B 01 00 00 *....@...........*
00000040: 05 50 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *.P..............*
00000050: 01 00 02 08 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000060: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000070: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000080: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
00000090: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000A0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000B0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000C0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000D0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000E0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
000000F0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 *................*
Vendor ID(0): 8086 Device ID(2): 8803
Command(4): 0006
(00)I/O space access enabled: 0 (01)Memory space access enabled: 1
(02)Behave as bus master: 1 (03)Monitor special cycle enabled: 0
(04)Mem Write & Invalidate enabled: 0 (05)Palette snooping is enabled: 0
(06)Assert PERR# when parity error: 0 (07)Do address/data stepping: 0
(08)SERR# driver enabled: 0 (09)Fast back-to-back transact...: 0
Status(6): 0010
(04)New Capabilities linked list: 1 (05)66MHz Capable: 0
(07)Fast Back-to-Back Capable: 0 (08)Master Data Parity Error: 0
(09)DEVSEL timing: Fast (11)Signaled Target Abort: 0
(12)Received Target Abort: 0 (13)Received Master Abort: 0
(14)Signaled System Error: 0 (15)Detected Parity Error: 0
Revision ID(8): 00 BIST(0F): Incapable
Cache Line Size(C): 00 Latency Timer(D): 00
Header Type(0E): 80, Multi-function, PCI device
Class: Device does not fit in any defined classes - -
Base Address Registers(10):
Start_Address Type Space Prefetchable? Size Limit
--------------------------------------------------------------------------
A7004000 Mem 32 bits No 00000040 A700403F
--------------------------------------------------------------------------
Expansion ROM Disabled(30)
Cardbus CIS ptr(28): 00000000
Sub VendorID(2C): 0000 Subsystem ID(2E): 0000
Capabilities Ptr(34): 40
Interrupt Line(3C): 0B Interrupt Pin(3D): 01
Min_Gnt(3E): 00 Max_Lat(3F): 00
というわけで、ベースアドレスはA7004000hです。これはいわゆるメモリマップドIOです。なので、メモリー空間を見ます。レジスタの範囲はベースアドレス+00h ~ 3Chです。ですが、例によってBLDKのツールで設定するのは以下の8つです。
- IOH_GPIO_IEN[11:0]
- IOH_GPIO_IMASK[11:0]
- IOH_GPIO_IMASKCLR[11:0]
- IOH_GPIO_PO[11:0]
- IOH_GPIO_PM[11:0]
- IOH_GPIO_IM0
- IOH_GPIO_IM1
- IOH_GPIO_SRST[0]
コマンドは以下な感じです。
Shell> mm -w 4 -n a7004000
MEM 0x00000000A7004000 : 0x00000000
Shell> mm -w 4 -n a7004010
MEM 0x00000000A7004010 : 0x0000FFFF
Shell> mm -w 4 -n a7004014
MEM 0x00000000A7004014 : 0x00000000
Shell> mm -w 4 -n a7004018
MEM 0x00000000A7004018 : 0x00000000
Shell> mm -w 4 -n a7004020
MEM 0x00000000A7004020 : 0x00000000
Shell> mm -w 4 -n a7004024
MEM 0x00000000A7004024 : 0x00000000
Shell> mm -w 4 -n a7004028
MEM 0x00000000A7004028 : 0x00000000
Shell> mm -w 4 -n a700403c
MEM 0x00000000A700403C : 0x00000000
これで、GPIOに関する必要な設定値はゲットできました。あと、BLDKツールにはSuperIOのGPIOの設定項目があるんですが、TX-50にはSuperIOが乗っかっていないので、設定不能です。というか、SuperIOの余分なコードは本来除去すべきですが、今のところ、ほっときます。
レジスタ値からゲットした値をBLDKツールに入力します。
E600側GPIO設定 |
EG20-T側GPIO設定 |
よし。できた。ビルドします。そして、できたBIOSイメージを「70S01905D.EXE」改造作戦で、BIOSチップに書き込んで、起動させてみました。すると、フロッピーがウイーンって、USBメモリのLEDがチカチカしてます。なんか動いてそうです。しかし、依然として、画面やシリアルには何もでないですねー。試しに、キーボードから「reset」(EFIShellのリセットコマンド)と打ってみたら、なんとリセットしました。
どうやら画面表示していないだけで、EFIShellが起動しているようです。おお、やったー。もっと起動中の問題で苦戦するかと思ってましたが、思いのほか動いているようです。(もしかするとGPIO設定前から動いてのかもしれません。)
なんだか、半信半疑なので、EFIShellの「Startup.nsh」(起動スクリプト)にコマンドを書いて結果をファイルにリダイレクトして確認して
みます。
みます。
内容は以下のようにしてみます。
fs0:
drivers > drivers.txt
devices > devices.txt
pci > pci.txt
で、やってみたところ、driversコマンド以外はコマンドが無いよエラーでした。どうやらUSBメモリ内のEFIShellではなく、簡易版の内臓EFIShellが起動しているっぽいです。driversコマンドの結果は以下のようになってました。
T D
D Y C I
R P F A
V VERSION E G G #D #C DRIVER NAME IMAGE NAME
== ======== = = = == == =================================== ===================
5C 0000000A B - - 1 35 PCI Bus Driver PciBusDxe
5D 00000030 D - - 2 - Usb Ehci Driver EhciDxe
5E 00000010 D - - 6 - Usb Ohci Driver OhciDxe
5F 0000000A B - - 8 4 Usb Bus Driver UsbBusDxe
60 0000000A D - - 1 - Usb Keyboard Driver UsbKbDxe
61 0000000A D - - 1 - Usb Mouse Driver UsbMouseDxe
62 00000011 D - - 1 - Usb Mass Storage Driver UsbMassStorageDxe
63 00000020 D - - 2 - EFI SD Host Controller Driver SDController
64 00000020 D - - 2 - UEFI MMC/SD Media Device Driver SDMediaDevice
65 0000000A D - - 1 - Generic Disk I/O Driver DiskIoDxe
66 0000000A ? - - - - Partition Driver(MBR/GPT/El Torito) PartitionDxe
67 00000010 D - - 1 - SATA Controller Init Driver AhciDxe
68 0000000A D - - 1 - AHCI Bus Driver AhciDxe
69 00000001 ? - - - - <UNKNOWN> Lpc47m17x
6A 0000000A B - - 1 3 ISA Bus Driver IsaBusDxe
6B 0000000A ? - - - - ISA Serial Driver IsaSerialDxe
6C 0000000A ? - - - - PS/2 Keyboard Driver Ps2KeyboardDxe
6D 0000000A ? - - - - PS/2 Mouse Driver Ps2MouseDxe
6E 0000000A D - - 1 - Platform Console Management Driver ConPlatformDxe
6F 0000000A D - - 1 - Platform Console Management Driver ConPlatformDxe
70 0000000A B - - 1 1 Console Splitter Driver ConSplitterDxe
71 0000000A B - - 1 1 Console Splitter Driver ConSplitterDxe
72 0000000A ? - - - - Console Splitter Driver ConSplitterDxe
73 0000000A B - - 1 1 Console Splitter Driver ConSplitterDxe
74 0000000A ? - - - - Console Splitter Driver ConSplitterDxe
77 0000000A D - - 1 - UGA Console Driver GraphicsConsoleDxe
78 0000000A ? - - - - Serial Terminal Driver TerminalDxe
7B 01082032 B X - 1 1 IEGD GOP Driver FvFile(FF0C8745-32
7C 0000000A D - - 1 - FAT File System Driver FvFile(961578FE-B6
うーん。元のBIOSのDriversコマンドの結果と比較しても明らかに違います。間違いなく起動しているようです。
よし、次はなんとかして、画面を出すか、せめてシリアルコンソールが使えるようにしたいところです。
今週はここまでにします。また来週ー。
今週はここまでにします。また来週ー。
0 件のコメント:
コメントを投稿