10/24/2011

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

そして、シリアルポートについて、考えます。

シリアルポートが使えるようにしたい理由は2つあって、一つは、シリアルコンソールを使えると、便利なのと、もう一つは、BLDKのドキュメントによれば、シリアルを使ってソースレベルデバッグができるっぽいのです。

で、BLDKには、この二つをサポートするためのコードが含まれているのですが、これが、残念ながら、SuperIOのレガシーシリアルポート向けのコードで、TX-50では使えません。しかしながらPCIシリアルでなんとかならんもんかと、考えてみます。

シリアルコンソールに関しては、恐らく、PCIシリアルのDXEドライバを書けば使える可能性が高いんじゃなかろうかと思います。とはいえ、ドライバ書くのは結構時間かかりそうですねえ。

デバッガに関しては、恐らく、BIOSのかなり前のほうでシリアルが初期化されてないと駄目っぽいですね。うーん。どちらにしても、とりあえず、TX-50のPCIバストポロジをもう少し、詳しく把握しておく必要がありそうです。というわけで、EFIShellのPCIコマンドでデバイス一覧をみてみます。

Shell>pci



   Seg  Bus  Dev  Func
   ---  ---  ---  ----
    00   00   00    00 ==> Bridge Device - Host/PCI bridge
             Vendor 8086 Device 4114 Prog Interface 0
    00   00   01    00 ==> Bridge Device - Host/PCI bridge
             Vendor 8086 Device 8183 Prog Interface 0
    00   00   02    00 ==> Display Controller - VGA/8514 controller
             Vendor 8086 Device 4108 Prog Interface 0
    00   00   03    00 ==> Multimedia Device - Video device
             Vendor 8086 Device 8182 Prog Interface 0
    00   00   17    00 ==> Bridge Device - PCI/PCI bridge
             Vendor 8086 Device 8184 Prog Interface 0
    00   00   18    00 ==> Bridge Device - PCI/PCI bridge
             Vendor 8086 Device 8185 Prog Interface 0
    00   00   1B    00 ==> Multimedia Device - UNDEFINED
             Vendor 8086 Device 811B Prog Interface 0
    00   00   1F    00 ==> Bridge Device - PCI/ISA bridge
             Vendor 8086 Device 8186 Prog Interface 0
    00   01   00    00 ==> Bridge Device - PCI/PCI bridge
             Vendor 8086 Device 8800 Prog Interface 0
    00   02   00    00 ==> Device does not fit in any defined classes - 
             Vendor 8086 Device 8801 Prog Interface 0
    00   02   00    01 ==> Network Controller - Ethernet controller
             Vendor 8086 Device 8802 Prog Interface 0
    00   02   00    02 ==> Device does not fit in any defined classes - 
             Vendor 8086 Device 8803 Prog Interface 0
    00   02   02    00 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 8804 Prog Interface 10
    00   02   02    01 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 8805 Prog Interface 10
    00   02   02    02 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 8806 Prog Interface 10
    00   02   02    03 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 8807 Prog Interface 20
    00   02   02    04 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 8808 Prog Interface FE
    00   02   04    00 ==> Base System Peripherals - UNDEFINED
             Vendor 8086 Device 8809 Prog Interface 1
    00   02   04    01 ==> Base System Peripherals - UNDEFINED
             Vendor 8086 Device 880A Prog Interface 1
    00   02   06    00 ==> Mass Storage Controller - UNDEFINED
             Vendor 8086 Device 880B Prog Interface 1
    00   02   08    00 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 880C Prog Interface 10
    00   02   08    01 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 880D Prog Interface 10
    00   02   08    02 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 880E Prog Interface 10
    00   02   08    03 ==> Serial Bus Controllers - USB
             Vendor 8086 Device 880F Prog Interface 20
    00   02   0A    00 ==> Device does not fit in any defined classes - 
             Vendor 8086 Device 8810 Prog Interface 0
    00   02   0A    01 ==> Simple Communications Controllers - Serial controller
             Vendor 8086 Device 8811 Prog Interface 2
    00   02   0A    02 ==> Simple Communications Controllers - Serial controller
             Vendor 8086 Device 8812 Prog Interface 2
    00   02   0A    03 ==> Simple Communications Controllers - Serial controller
             Vendor 8086 Device 8813 Prog Interface 2
    00   02   0A    04 ==> Simple Communications Controllers - Serial controller
             Vendor 8086 Device 8814 Prog Interface 2
    00   02   0C    00 ==> Device does not fit in any defined classes - 
             Vendor 8086 Device 8815 Prog Interface 0
    00   02   0C    01 ==> Serial Bus Controllers - Other bus type
             Vendor 8086 Device 8816 Prog Interface 0
    00   02   0C    02 ==> Serial Bus Controllers - Other bus type
             Vendor 8086 Device 8817 Prog Interface 0
    00   02   0C    03 ==> Serial Bus Controllers - UNDEFINED
             Vendor 8086 Device 8818 Prog Interface 0
    00   02   0C    04 ==> Device does not fit in any defined classes - 
             Vendor 8086 Device 8819 Prog Interface 0
    00   03   00    00 ==> Network Controller - Ethernet controller
             Vendor 8086 Device 10D3 Prog Interface 0


なにやら、デバイスてんこ盛りですな。これだと、ちょっとイメージ沸きづらいので、図にしてみました。デバイス名はデータシートと照らし合わせて調べました。

TX-50 BLDK Bus Topology

六角形のはブリッジです。データシートによればATOM側にはPCI Expressのルートポート(PCIバス上ではブリッジに見える)が4つあるはずですが、2つしか見えないので、残り2つは無効にされているっぽいです。(点線のやつ)

そして、問題のシリアルはBus 2/Device 0Ah/Function 1ですね。このデバイスとHostブリッジの間にはPCI Expressのブリッジが2つ入ることがわかりました。(ピンクのやつ)それは、すなわち、このデバイスにアクセスするには2つのブリッジのI/O(またはメモリ)ウィンドウを設定する必要があるということです。
これらのブリッジがサブトラクティブデコードに対応していれば、もう少し話しは簡単だったかもしれませんが、残念ながら、データシートにそのような記述はみあたりませんでした。

しかも、PCI Expressブリッジ2つをBIOSの頭で初期化するにしても、PCI Expressにはリンクトレーニングというものがありまして、いきなり使えるとは限らないですね。そもそも、チップセットの特殊な領域を設定しないとリンクトレーニングが始まらないという可能性もあるため、うまくいくとも限りませんし、うまくいってないときに何が起きているのかも知る術がないですねー。

ま、試しに、やってみっか。

今週はここまでにしときます。来週またがんばるっすー。

0 件のコメント:

コメントを投稿