作者:小田BSP
一、PCI總線
在PC時代,為了解決CPU主頻和外部設(shè)備訪問速度的問題,發(fā)展了幾代I/O總線:
1、第一代總線:ISA、EISA等
2、第二代總線:PCI、PCI-X等
3、第三代總線:PCIE、mPCIE、m.2等
PCI(Peripheral Component Interconnect),外部設(shè)備互聯(lián),Intel公司提出,主要功能是連接外部設(shè)備。PCI引腳如下:
PCI引腳
PCI總線特點(diǎn)如下:
1、PCI總線是并行總線,有32/64根地址線,地址和數(shù)據(jù)都是通過這32/64根地址線進(jìn)行傳輸,分時復(fù)用
2、PCI總線上可同時掛載多個設(shè)備,設(shè)備分為主設(shè)備和從設(shè)備。主設(shè)備一般是主控芯片PCI控制器,需要負(fù)責(zé)PCI總線上的仲裁
3、PCI設(shè)備共享總線,通過片選引腳、地址范圍、總線號、設(shè)備號、功能號等機(jī)制來確定當(dāng)前和哪個設(shè)備通信。
4、PCI總線通信大致分為:配置階段和地址訪問階段。
5、配置階段:PCI總線控制器依次掃描連接在PCI總線上的所有設(shè)備,訪問設(shè)備的配置空間,知道設(shè)備的類型、要申請的資源,然后給設(shè)備分配總線號、設(shè)備號、功能號、地址空間,并寫進(jìn)設(shè)備的配置空間。
6、地址訪問階段:在配置階段,給每個PCI設(shè)備分配PCI地址范圍,并寫進(jìn)設(shè)備寄存器,以后設(shè)備會監(jiān)聽地址線,當(dāng)監(jiān)聽到地址線上傳輸?shù)牡刂肥亲约旱牡刂贩秶蜁幚怼?/p>
7、PCI采用同步時序協(xié)議,信號線里有clk時鐘線。
8、PCI有三個相互獨(dú)立的物理地址空間:內(nèi)存地址空間、I/O地址空間和配置空間。配置空間是PCI特有的一個物理空間,PCI設(shè)備支持即插即用。
9、PCI總線規(guī)范定義的配置空間總長度為256字節(jié),前64字節(jié)的配置空間稱為配置頭,對于所有的設(shè)備都一樣。配置頭的主要功能是用來識別設(shè)備、定義主機(jī)訪問PCI卡的訪問方式(I/O訪問或者存儲器訪問,還有中斷信息),其余192字節(jié)稱為本地配置空間(設(shè)備有關(guān)區(qū)),主要定義卡上局部總線的特性、本地空間基地址和范圍等。
其中:
1)Vendor ID:廠商ID,F(xiàn)FFFh是一個非法廠商ID,根據(jù)它判斷PCI設(shè)備是否存在。
2)Device ID:設(shè)備ID,某廠商生產(chǎn)設(shè)備的ID,驅(qū)動根據(jù)Vendor ID和Device ID找對應(yīng)驅(qū)動程序。
3)Base Address0 ~ 5:簡稱BAR寄存器,保存PCI設(shè)備使用的PCI總線域的基地址。PCI設(shè)備復(fù)位后,BAR寄存器存放的是設(shè)備需要使用的地址空間大小、類型(I/O或MEM),如果是MEM則是否可預(yù)?。≒refectchable是否為1)
4)IRQ Line:IRQ 編號,支持管理24個中斷。
5)IRQ Pin:中斷引腳,PCI有4個中斷引腳,該寄存器表示該設(shè)備連接的是哪個引腳。
PCI枚舉過程:嘗試所有的BUS/DEV/FUNC組合,判斷廠商ID是否為FFFFh。
訪問配置空間方法:
通過訪問0xCF8h/0xCFCh端口實(shí)現(xiàn)。
1)0xCF8h:CONFIG_ADDRESS,PCI配置空間地址端口。CONFIG_ADDRESS寄存器格式:
31: Enable位
23~16:總線號
15~11:設(shè)備號
10~8:功能號
7~2:配置空間寄存器編號
1~0:0
2)0xCFCh:CONFIG_DATA,PCI配置空間數(shù)據(jù)端口。
二、PCIE介紹
PCIE(PCI Express)是在PCI的基礎(chǔ)上發(fā)展而來,是目前PC和嵌入式系統(tǒng)中最常用的高速總線,PCIE與PCI是軟件向后兼容,PCI的系統(tǒng)軟件可以用在PCIe系統(tǒng)中。
PCIE采用的是樹形拓?fù)浣Y(jié)構(gòu),體系架構(gòu)包括:root complex,switch、bridge和endpoint等類型的PCIE設(shè)備組成。PCIE總線拓?fù)浣Y(jié)構(gòu)如下:
Root Complex:根復(fù)合體,簡稱RC,CPU和PCIE之間的接口。RC位于PCIE倒立拓?fù)涞母⒋鞢PU與系統(tǒng)的其余部分進(jìn)行通信。PCIE端口在配置空間中被標(biāo)記為根端口。
Bridge:橋提供了與其他總線(如:PCI或PCI-X)的接口,允許舊的PCI或PCI-X卡插入新系統(tǒng)。反向橋接允許一個新的PCIE卡插入一個舊的PCI系統(tǒng)。
Switch:提供擴(kuò)展或聚合能力,允許更多的設(shè)備連接到一個PCIE端口。充當(dāng)包路由器,根據(jù)地址或其他路由信息識別給定包需要走哪條路徑。是一種PCIE轉(zhuǎn)PCIE的橋。
Endpoint:PCIE總線系統(tǒng)拓?fù)浣Y(jié)構(gòu)中的最末端,一般作為總線操作的發(fā)起者(initiator)或終結(jié)者(Completes)。Endpoint只能接受來自上級拓?fù)涞臄?shù)據(jù)包或向上級拓?fù)浒l(fā)送數(shù)據(jù)包。
PCIe插槽集中在PCIex1/x4/x8/x16四種上。
1)PCIex1插槽的長度是最短的,數(shù)據(jù)針腳14個。主要用途:獨(dú)立網(wǎng)卡、獨(dú)立聲卡和USB3.0/3.1擴(kuò)展卡。
2)PCIex4和x8插槽一樣,現(xiàn)在多數(shù)做成PCIex16插槽,或擴(kuò)展為M.2接口,用于安裝M.2 SSD、M.2無線網(wǎng)卡。
3)PCIex8,為了兼容性PCIex8插槽通常做成PCIex16插槽的形式,但數(shù)據(jù)針腳只有一半是有效的。
4)PCIex16插槽主要用于顯卡以及RAID陣列卡,向下兼容x1/x4/x8級別的設(shè)備。
在PCI總線中,所有需要提交中斷請求的設(shè)備,必須能通過INTx引腳提交中斷請求,MSI機(jī)制是一個可選機(jī)制。而PCIE總線中,PCIE設(shè)備必須支持MSI或MSI-X中斷請求機(jī)制,而可以不支持INTx中斷消息。
在PCIE總線中,MSI和MSI-X中斷機(jī)制使用存儲器寫請求TLP向處理器提交中斷請求。
三、PCIE地址空間
PCIE有三種主要的地址空間:memory-space,IO space和configuration space。
1)Memory space:數(shù)據(jù)存儲內(nèi)存空間(refetchable 和 Non-Prefetchable Memory Space)
2)IO Space:用于訪問IO設(shè)備的內(nèi)部寄存器/存儲,已被MMIO機(jī)制代替,訪問方式和Memory相同,且也分(refetchable 和 Non- Prefetchable Memory range)
3)Configuration Space:配置空間,通過bar寄存器控制Memory space映射
四、PCI和PCIE差異
1) 顏色
PCI接口通常是白色,PCIE接口一般用其他顏色。
2) 長度
PCIE接口要比PCI接口長。
3) 兼容性
PCIE在軟件層面上兼容目前的PCI技術(shù)和設(shè)備。
4) 速度
PCI的工作頻率:33MHZ和66MHZ,最大吞吐率264MB/s(66MHZ*32BIT/8)。
PCI-X的工作頻率:66MHZ/100MHZ和133MHZ,最大吞吐率1064MB/s(133MHZ*64BIT/8)。
5) 傳輸方式
PCI是并行數(shù)據(jù)傳輸,一次傳輸4/8字節(jié),半雙工。
PCIE是串行數(shù)據(jù)傳輸,全雙工。
6) 硬件
PCI信號是普通電平。
PCIE信號是差分電平。
7) 鏈路
PCI是總線的連接方式。
PCIE是點(diǎn)對點(diǎn)的連接方式。
8) 編碼方式
PCIE gen1和gen2采用8bit/10bit編碼方式,gen3以后采用128b/130b的編碼方式。
9) Inbound和outbound
PCIE設(shè)備和系統(tǒng)內(nèi)存相互訪問時,outbound是指CPU到設(shè)備方向;inbound是指device到RC(CPU端)方向。CPU讀寫RC端的寄存器時,屬于偏上系統(tǒng)的范圍,不屬于inbound或outbound。
10)PCI配置空間
PCI設(shè)備擁有256B的配置空間,PCIE還提供了另外4KB的擴(kuò)展。256B的配置空間中前64B是規(guī)范的,其他是各廠商自己定義的。
PCI設(shè)備地址:
10.1)總線號:廠家ID
10.2)設(shè)備號:設(shè)備ID
10.3)功能號:設(shè)備類
11) PCIE配置空間
PCIE一共支持256條bus,32個dev和8個fun,和PCI相同。
PCIE設(shè)備發(fā)展向前兼容PCI,每個設(shè)備的配置空間前256B是PCI空間,后(4K-256)B的空間是PCIE控制空間。
Linux用同一套驅(qū)動代碼處理PCI和PCIE驅(qū)動,只需要在配置、傳輸?shù)鹊讓硬僮魅^(qū)分兩種總線協(xié)議。
五、PCIE驅(qū)動
以RK3568 PCIE RC驅(qū)動為例。
1)compatible = "rockchip,rk3568-pcie", "snps,dw-pcie"
PCIE接口使用的是RC模式;EP模式
2)bus-range = <0x10 0x1f>
PCI bus地址范圍從0x10到0x1f。
3)interrupts
中斷號和中斷名稱。對應(yīng)RK3568 中斷號如下(-32):
4)interrupt-map-mask 和 interrupt-map
interrupt-map-mask 和 interrupt-map:標(biāo)準(zhǔn)PCI屬性值,對應(yīng)INTA ~ INTD(legacy 中斷)
5)num-lanes = <1>
PCIE設(shè)備所使用的lane數(shù)量,默認(rèn)不需要調(diào)整,軟件自動探測并關(guān)閉不需要的lane以節(jié)省功耗。
6)max-link-speed = <3>
PCIE帶寬版本,1表示Gen1;2表示Gen2;3表示Gen3,無需配置。
7)reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>
PCIE接口的perst#復(fù)位信號,插槽和焊貼設(shè)備,都需要。必須配置。
8)msi-map = <0x1000 &its 0x1000 0x1000>
PCIE設(shè)備映射到MSI控制器,格式和介紹如下:
9)phys = <&pcie30phy>
使用的PCIE PHY。
10)power-domains = <&power RK3568_PD_PIPE>
PCIE電源域
11)reg 和 reg-names
PCIE-dbi(映射總線上設(shè)備的配置空間地址)和PCIE-apb(PCIE控制器地址)寄存器地址和范圍
12)rangs
功能:設(shè)備將CPU域地址映射到PCIE域地址
格式:
<映射類型(第1個字段) PCIe基地址(第2~3字段)CPU域基地址(第4~5字段)映射區(qū)域大?。ǖ?~7字段)>
0x81000000:表示IO空間
0x82000000:表示MEM空間 (non-prefetchable)
13)vpcie3v3-supply = <&pcie30_3v3>
PCIE外設(shè)的3V3供電。PCIE phy使用1.8V或0.9V供電。
Linux系統(tǒng)查看PCI設(shè)備的命令:lspci,PCI邏輯地址:XXZ分別表示總線號:設(shè)備號:功能號。一個PCI域能容納256個總線,每個總線可支持32個PCI設(shè)備,每個PCI設(shè)備可容納8個PCI功能。
lspci -t:顯示樹狀結(jié)構(gòu)
lspci -x:顯示配置空間前64字節(jié)的內(nèi)容
lspci -s:指定PCI設(shè)備
審核編輯:黃飛
?
評論
查看更多