vxworks的pci設備驅動調試

開發環境:風河workbench3.2 —vxworks6.8  ,目標板:飛思卡爾powerpc mpc8536
        NI PXIe機箱。

問題描述:目標板由NI公司的PXIE機箱供電,並插入零槽作爲主控制器,現在實驗室有自己研發的AD數據採集模塊,也想插入機箱其他槽其作爲目標板mpc8536的外設模塊,二者通過機箱進行通信。
現在vxWorks系統起來了,串口\網口等驅動也做好了,接下來就想通過目標板控制AD模塊,將其採集到的波形傳輸到目標板,並顯示出來。

我現在的問題是一點思路都沒有,一些資料上說pcie驅動包括兩部分,一部分是pcie總線驅動,另一部分是具體的pcie外設驅動,前者vxWorks bsp包裏已經提供了,後者完全得自己編寫。有一些問題諮詢各位:

1.已有總線驅動m85xxPci.c,但這個驅動好像針對那些pci和pcie插槽直接做在板子上的,我現在是將目標板插在NI的PXIE機箱的零槽上,機箱其他槽再插外設AD模塊。那我現在做總線驅動是不是還得做針對NI機箱的驅動啊?還有就是怎麼確定pcie總線驅動是否好使?
2.目標板怎麼控制pcie外設?控制外設的什麼寄存器?

3.編寫具體的pcie外設驅動基本思路是什麼?

pcie插槽其實對應pcie控制器,所做的pcie驅動實際是控制器的驅動。
判斷pcie驅動是否好,就看加載過程就行了,能識別就行。
pcie設備就是通過pcie接口通訊。

pcie其實,跟串口、usb、網口這些都一樣,是一種接口,所以設計方法都一樣:先做接口驅動,再做設備驅動。

通過pci的接口,找到AD卡,然後獲得AD卡的地址,中斷等資源,以後就沒PCI什麼事了。
當然,前提是你的PCI驅動已經是正常的

我現在通過vxBusShow可以看到一些一些pcie設備,相關部分顯示如下:
PCI_Bus @ 0x00338880 with bridge @ 0x00339dc0
    Device Instances:
    Orphan Devices:
        (null) unit 0 on PCI_Bus @ 0x0033e4c0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033e5c0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033e6c0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033e7c0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033e8c0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033e9c0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033eac0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033ebc0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033ecc0 with busInfo 0x00000000
        (null) unit 0 on PCI_Bus @ 0x0033edc0 with busInfo 0x00000000
===============================================================
其中,我使用函數pciDevShow查看以上設備的廠商ID和設備ID知:
第1個設備Vendor ID爲0x1957代表廠商Freescale,dev ID爲0x0051代表MPC8536,爲host主橋(也就是你所說的PCIE控制器)。
第2、3、4、6、7、8個設備Vendor ID均爲0x10b5代表廠商PLX,dev ID爲0x8624代表PEX 8624,爲交換芯片(switch)PEX 8624。
第5個設備Vendor ID均爲0x104c代表廠商Texas Instruments ,dev ID爲0x8231代表XIO2000A,爲Texas Instruments的一款PCI-Express to PCI/PCI-X bridge芯片。

補充一點:我的mpc8536目標板在PCIE控制器和NI機箱之間還存在一個交換芯片——上述的PEX 8624芯片,因爲PCIE控制器出來最多1x8,而NI背板要求提供4x4或者2x8的PCI Express鏈路模式,通過交換芯片可以實現4x4模式。
我現在請問一下:
1.我現在這種情況算你說的識別了嗎?算的話,但顯示的是 Orphan Devices啊,也就是說沒有匹配驅動的設備,能使用它們的功能嗎?pcie控制器現在能使用嗎?
2.如你所見,我現在插入機箱後,能識別的設備只是pcie控制器和交換芯片,對於下一級的插在NI機箱上的pcie設備還不能識別。我現在做驅動,是不是得從上述的交換芯片做起啊?

識別是指pciDeviceShow 1/2/3/4/5... 能顯示出你的廠商ID和設備ID。
Orphan Device是因爲沒有匹配的驅動,所以不能使用它們的功能。pcie控制器現在能用了,你需要的是寫設備驅動,交換芯片的驅動一般不用寫。你可以看看pcie轉網卡的gei驅動(target/src/hwif/end/gei825xxVxbEnd.c) 或者 pcie轉sata的SI31XX驅動(target/src/hwif/storage/vxbSI31xxStorage.c)

 

我想接着問問一些細節。 
(1) pciDevShow是手工在shell裏調用查看的嗎?該函數聲明
void pciDevShow
    (
    struct vxbDev * pDev  /* Device information */
    )
如何填的指針呢?

(2)如果你直接用 pciFindDeviceShow(0x10b5, 0x8624, 0), 是否能顯示出正確找到的信息呢?看了一下pciFindDeviceShow這個函數,內部會調用獲取函數指針的接口:
method = vxbDevMethodGet(busCtrlID,PCI_CONTROLLER_METHOD_CFG_INFO);
這個method應該是m85xxPci.c文件中的
m85xxPci_methods[] =
{ ...
{ PCI_CONTROLLER_METHOD_CFG_INFO, (FUNCPTR)m85xxPciConfigInfo},
...
}
也就是m85xxPciConfigInfo()函數,我的疑問是隻需要這個m85xxPci.c文件中的函數就能獲取PEX8624的switch信息,還是要再寫一個類似pex8624Pci.c的文件,重新實現一個pex8624Pci_methods[]呢?

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(1)pciDevShow是在shell裏輸入的。其輸入參數即爲你要查看的設備在VxBus下注冊的設備ID,這個可通過使用函數vxBusShow來查看,一般爲@後的數據,比如我上段代碼中第一個設備的設備ID就是0x0033e4c0。
 當然想用這些函數需要包含相應的宏定義,才能在編譯系統時添加進去,不然找不到。
(2)我使用的是vxWorks6.8版本,裏面的查找函數升級成了vxbPciFindDeviceShow,函數原型如下:
STATUS vxbPciFindDeviceShow
(
VXB_DEVICE_ID busCtrlID,
int vendorId, /* vendor ID */
int deviceId, /* device ID */
int index /* desired instance of device */
)
該函數掃描busCtrlID指定的PCI總線,搜索屬於指定的廠商ID和設備ID的PCI設備。由於在一個PCI總線上可以掛接多個屬於同一廠商和設備ID的PCI設備,因而在使用該函數時可以使用一個索引號來決定顯示第幾個設備的信息。我的顯示可以查找,如圖

這個不需要寫關於橋芯片的驅動,因爲一般的橋芯片都是透明橋,直接通過這個函數就可查找到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章