龍芯軟體開發(31) PCI裝置查詢細節

2021-04-12 19:30:24 字數 1132 閱讀 7495

這段時間,又在對龍芯盒子的pci的匯流排進行程式設計。目前有了一點點進展,發現pci匯流排也是很複雜的東西。由於所有其它外設都是掛在pci匯流排上,如果要對外設進行程式設計,就得對pci比較了解,並且可以對它程式設計。

pci匯流排是一條平等的匯流排,所有裝置都是平等的。在某一時刻會有乙個裝置是主裝置。pci的裝置是一棵樹的結構,以cpu為根,橋裝置為樹幹,其它裝置為葉子。由於pci的裝置是即插即用的,因此它的匯流排有多少裝置不是固定的,那麼它又是怎麼樣發現所有的裝置的呢?它就是通過列舉所有裝置,也就是由匯流排上尋找所有裝置,比如從匯流排0開始,就會找到乙個橋裝置,這個橋裝置就是在北橋那裡。然後通過這個匯流排,就可以向下查詢,就會找到南橋裝置,找到顯示卡裝置,找到usb的主控器等等。pci的裝置為了能有自動配置的功能,就需要在固定的位置裡放置一些暫存器。在pci的規範裡,定義了一段叫做配置空間的暫存器組,cpu就是通過北橋裡的暫存器設定,然後根據匯流排號和裝置號就會到pci裝置的第乙個功能裝置。接著讀取pci配置空間裡的暫存器,就可以知道這個pci裝置是做什麼使用了,這個就是class編碼。比如龍芯裡的usb的主控器的分類編碼就是0x0c031043,從這個分類碼中的0c03就可以知道它是usb的裝置,後面的10說明它是ohci協議介面,43是usb主控器的版本。這樣就可以分類不同的裝置了。

找到了裝置之後,就是需要對它程式設計。而程式設計,就需要對暫存器的操作。那麼pci裝置的暫存器在那裡呢?原來pci裝置的配置空間裡就定義了這個裝置的訪問方式,比如是通過io空間方式訪問,還是通過記憶體對映的方式訪問呢。在配置空間裡就會找到相應的基位址暫存器,比如在龍芯電腦的usb基位址就是通過0x10這個暫存器讀取的,暫存器的大小是4位元組。只要把這個暫存器的值讀取出來,然後再作判斷它是io方式,還是記憶體對映方式。如果是記憶體對映方式,就需要把這個裝置的基址和系統記憶體空間的基址加起來,才能形成系統記憶體空間的位址。比如在龍芯盒子裡的就是這樣:

0xb000_0000 + 0x0600_0000.

前面乙個是系統io訪問的基址,後面乙個是pci裝置的基址。

通過上面的查詢後,就可以定義裝置的基位址,這樣就可以對它進行程式設計了。但目前的系統,還是採用中斷的方式的,因此還需要讀取它的中斷設定,才知道這個裝置是連線到那個中斷線上,以便在8259a那裡知道是什麼裝置產生的中斷。

這樣就可以進行裝置的驅動程式的編寫了。在這裡總結一下,pci裝置有三個空間:

配置空間,io空間,記憶體空間。

龍芯軟體開發(23) PCI裝置初始化

2007 01 11 00 05 00 caimouse 閱讀數 5217 更多分類專欄 嵌入式軟體開發 目前在個人電腦裡,主機板上使用區域性匯流排技術把不同的裝置連線在一起,這樣就可以隨時新增裝置到匯流排上。比如主機板上一般都有很多 pci插槽,可以插入顯示卡 音效卡 網絡卡以及符合 pci匯流排...

龍芯軟體開發(24) PCI裝置初始化2

在彙編的 裡,已經進行了串列埠初始化,在這裡更進一步初始化串列埠,它是通過呼叫下面的 實現的 define superio cfg reg 0x85 上面定義南橋裡串列埠暫存器位址。static void initserial void 接著來看初始化鍵盤,static void init keyb...

龍芯軟體開發(25) PCI裝置初始化3

上面繼續初始化南橋之後,再接著下來,就要初始化 pci匯流排上其它的裝置了。看下面的 cpu configcache 上面重新配置龍芯 2e的快取。pci businit 1 pci bus initialization 上面繼續初始化 pci匯流排上的裝置,這個函式裡要初始化完成所有其它連線到 p...