11/07/2011

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

本日はシリアルドライバを作り始めます。ターミナルでシリアルコンソールを動かす目論みです。

実はBLDKには元々レガシーのシリアルドライバが含まれています。(IntelFrameworkModulePkg\Bus\Isa\IsaSerialDxe)

SIOとかのシリアルならこれで動くのですが、残念ながらPCIシリアルだと動かないのです。Tx-50にはSIOが乗ってなくてPCIシリアルしかないので、このIsaSerialDxeドライバを元にPCIシリアルドライバを作る方向でいっちょやってみます。

というわけで、おもむろにIsaSerialDxeをディレクトリごとCrownBayPlatformPkgディレクトリにPciSerialDxeという名前でコピーしてしまいます。そしてファイル中のIsaSerialと名のつくものは片っ端からPciSerialに置き換えまして、EFI_ISA_IO_PROTOCOLというプロトコルを使ってるやつもEFI_PCI_IO_PROTOCOLに置き換えます。

そして、SerialControllerDriverSupported()関数はこのままじゃちょっとまずそうです。他のPCI系のドライバソースを参考に、HIDの0x501のチェックをコメントアウトして、PCIコンフィグレーション空間のクラスコードとサブクラスコードが16550互換のシリアルデバイスかどうかチェックする処理を加えました。あと、このままだと、Tx-50の4つのPCIシリアルポートが4つともドライバ当たってしまって話がややこしくなるので、PCIのベンダーIDとデバイスIDもチェックしてRS232Cのコネクタがついてるポート(bus:2/dev:0a/func:1)だけにドライバが当たるように処理を追加しました。と、あとコマンドレジスタのI/O Space Enableもこの段階で有効にしてしまうことにしました。

ほんで、SerialControllerDriverStart()関数もちょっといじる必要がありそうです。BaseAddrssを取得するところをACPIのリソースリストから取得しているところを、PCIコンフィグレーション空間のベースアドレスレジスタから取得するように変更です。
で、CrownBayPlatformPkg.dscとCrownBayPlatformPkg.fdfの適当なところにCrownBayPlatformPkg/PciSerialDxe/PciSerialDxe.inf と書いとけば、ビルドされます。ビルドエラーがちょこまかと出ますが、姑息なつじつま合わせを駆使しつつ、どうにかビルドを通しました。

うーん。こんな力づくでいいんだろうか。まあスタート地点としては良しとしよう。こまいところは今後仕上げていくとして、動かす目処を立てることを優先します。

で、電源入れてみたけど、まあ動きません。とはいえ、ちまちま思考錯誤を繰り返し、一応ドライバが当たるところまでは行きました。

EfiShellのdevicesコマンドとdriversコマンドの出力です。

Shell> 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 0000000A B - -  1  1 PCI Serial Driver                   PciSerialDxe

5E 00000030 D - -  2  - Usb Ehci Driver                     EhciDxe
5F 00000010 D - -  6  - Usb Ohci Driver                     OhciDxe
60 0000000A B - -  8  3 Usb Bus Driver                      UsbBusDxe
61 0000000A D - -  1  - Usb Keyboard Driver                 UsbKbDxe
62 0000000A D - -  1  - Usb Mouse Driver                    UsbMouseDxe
63 00000011 D - -  1  - Usb Mass Storage Driver             UsbMassStorageDxe
64 00000020 D - -  2  - EFI SD Host Controller Driver       SDController
65 00000020 D - -  2  - UEFI MMC/SD Media Device Driver     SDMediaDevice
66 0000000A D - -  1  - Generic Disk I/O Driver             DiskIoDxe
67 0000000A ? - -  -  - Partition Driver(MBR/GPT/El Torito) PartitionDxe
68 00000010 D - -  1  - SATA Controller Init Driver         AhciDxe
69 0000000A D - -  1  - AHCI Bus Driver                     AhciDxe
6A 00000001 ? - -  -  - <UNKNOWN>                           Lpc47m17x
6B 0000000A B - -  1  3 ISA Bus Driver                      IsaBusDxe
6C 0000000A ? - -  -  - ISA Serial Driver                   IsaSerialDxe
6D 0000000A ? - -  -  - PS/2 Keyboard Driver                Ps2KeyboardDxe
6E 0000000A ? - -  -  - PS/2 Mouse Driver                   Ps2MouseDxe
6F 0000000A D - -  1  - Platform Console Management Driver  ConPlatformDxe
70 0000000A D - -  1  - Platform Console Management Driver  ConPlatformDxe
71 0000000A B - -  1  1 Console Splitter Driver             ConSplitterDxe
72 0000000A B - -  1  1 Console Splitter Driver             ConSplitterDxe
73 0000000A ? - -  -  - Console Splitter Driver             ConSplitterDxe
74 0000000A B - -  1  1 Console Splitter Driver             ConSplitterDxe
75 0000000A ? - -  -  - Console Splitter Driver             ConSplitterDxe
78 0000000A D - -  1  - UGA Console Driver                  GraphicsConsoleDxe
79 0000000A B - -  1  1 Serial Terminal Driver              TerminalDxe
7C 01082032 B X -  1  1 IEGD GOP Driver                     FvFile(FF0C8745-32
7D 0000000A D - -  1  - FAT File System Driver              FvFile(961578FE-B6



Shell> devices

C  T   D
T  Y C I
R  P F A
L  E G G #P #D #C Device Name
== = = = == == == =============================================================
47 R - -  -  1 35 PciRoot(0x0)
76 D - -  2  -  - Primary Console Input Device
77 D - -  1  -  - Primary Console Output Device
81 D - -  1  -  - PciRoot(0x0)/Pci(0x0,0x0)
82 D - -  1  -  - PciRoot(0x0)/Pci(0x1,0x0)
83 B X -  1  1  1 IEGD Graphics Controller
84 D - -  1  -  - PciRoot(0x0)/Pci(0x3,0x0)
85 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)
86 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)
87 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)
88 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0x0,0x1)
89 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0x0,0x2)
8A D - -  1  2  - Usb Universal Host Controller
8B D - -  1  2  - Usb Universal Host Controller
8C D - -  1  2  - Usb Universal Host Controller
8D B - -  1  2  1 Enhanced Host Controller (USB 2.0)
8E D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0x2,0x4)
8F D - -  1  2  - SD Host Controller
90 D - -  1  2  - SD Host Controller
91 D - -  1  2  - IOH Serial ATA Controller
92 D - -  1  2  - Usb Universal Host Controller
93 B - -  1  2  2 Usb Universal Host Controller
94 D - -  1  2  - Usb Universal Host Controller
95 D - -  1  2  - Enhanced Host Controller (USB 2.0)
96 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xA,0x0)
97 B - -  1  1  1 PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xA,0x1)
98 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xA,0x2)
99 D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xA,0x3)
9A D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xA,0x4)
9B D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xC,0x0)
9C D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xC,0x1)
9D D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xC,0x2)
9E D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xC,0x3)
9F D - -  1  -  - PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xC,0x4)
A0 D - -  1  -  - PciRoot(0x0)/Pci(0x18,0x0)
A1 D - -  1  -  - PciRoot(0x0)/Pci(0x18,0x0)/Pci(0x0,0x0)
A2 D - -  1  -  - PciRoot(0x0)/Pci(0x1B,0x0)
A3 B - -  1  1  3 PciRoot(0x0)/Pci(0x1F,0x0)
A4 B X -  1  3  1 IEGD Graphics Controller Display Device #0
A5 D - -  1  -  - PciRoot(0x0)/Pci(0x1F,0x0)/Serial(0x0)
A6 D - -  1  -  - PciRoot(0x0)/Pci(0x1F,0x0)/Acpi(PNP0303,0x0)
A7 D - -  1  -  - PciRoot(0x0)/Pci(0x1F,0x0)/Acpi(PNP0F03,0x0)
A9 D - -  1  3  - FAT File System
AA B - -  1  1  1 PciRoot(0x0)/Pci(0x17,0x0)/Pci(0x0,0x0)/Pci(0xA,0x1)/Uart

(115200,8,N,1)
AB D - -  1  -  - PC-ANSI Serial ConsoleAC B - -  1  3  1 Generic Usb Keyboard
AD B - -  1  2  1 Generic Usb Mouse


ちなみに、TerminalDxeというやつがシリアルコンソールのドライバでBLDKに最初から含まれています。なのでシリアルドライバがうまく動けばシリアルコンソールも動く手筈です。ドライバはちゃんと当たってPC-ANSI Serial Consoleも正常に認識してそうです。

ターミナルエミュレータはTeraTermを使ってますが、起動中に一瞬反応して画面クリアかなんかが入ります。細かいところを見て直していけば、もうちょっとで動きそうな予感です。

今日はもう力尽きたので、また来週がんばります。ソースは綺麗に書き直したら載せる(かも)。

0 件のコメント:

コメントを投稿