本日はシリアルドライバを作り始めます。ターミナルでシリアルコンソールを動かす目論みです。
実は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 件のコメント:
コメントを投稿