10/11/2011

TX-50開発キットで遊ぶ その6

とりあえず、なんとかBIOSを焼くことができましたが、なんだかまともに動いてなさげです。
それも、どこまで動いているのか判断もできないので、なんか動作を確認する術が必要です。

こういうときは、古から伝わるデバッグ術、シリアルポートに何か文字を出すとかして
動作を確認しようかなー。

と、その前に、まず、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]

これに対応するレジスタオフセットは0、10h、14h、18h、20h、24h、28h、3ch ですね。
コマンドは以下な感じです。

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 件のコメント:

コメントを投稿