ARM922T核ZCP320A處理器PCI總線操作
摘要:本文簡(jiǎn)要說(shuō)明了ZCP320A處理器內(nèi)部集成的PCI總線接口、編程模式及工作模式,并介紹了作為主設(shè)備時(shí)如何訪問(wèn)外部擴(kuò)展的RTL8139 PCI網(wǎng)卡設(shè)備。為以后的設(shè)計(jì)者提供借鑒及應(yīng)用基礎(chǔ)。 關(guān)鍵詞:ARM922T ZCP320A PCI總線 RTL8139 ZCP320A采用了ARM公司的ARM922T核,ARM922T是ARM9TDMI通用處理器家族中的一員采用哈佛結(jié)構(gòu)內(nèi)部使用5級(jí)流水線支持32位的ARM指令系統(tǒng)和16位的Thumb指令系統(tǒng)包括兩個(gè)相互獨(dú)立的8KB 的數(shù)據(jù)和指令高速緩存,高速緩存行的長(zhǎng)度是8個(gè)字。ARM922T 實(shí)現(xiàn)增強(qiáng)型ARM結(jié)構(gòu)v4MMU以提供對(duì)指令和數(shù)據(jù)地址的轉(zhuǎn)換和訪問(wèn)許可檢測(cè)。ARM922T 支持ARM調(diào)試結(jié)構(gòu)協(xié)處理器以及Tracking ICE。 ZCP320A內(nèi)部使用三條AHB總線連接實(shí)現(xiàn)功能所需的主從設(shè)備。每條AHB總線連接一個(gè)主設(shè)備和多個(gè)從設(shè)備。根據(jù)總線連接的主設(shè)備的不同,三條總線分別被命名為COREBUS(ARM9 核作為該總線的主設(shè)備)、PBUS(PCI橋作為該總線的主設(shè)備)和DBUS(DMA控制器作為該總線的主設(shè)備)。這三條總線由總線管理模塊統(tǒng)一進(jìn)行管理。 ZCP320A集成的PCI總線接口是一個(gè)符合PCI協(xié)議2.2的總線接口。由于ZCP320A的內(nèi)部總線是符合AMBA AHB協(xié)議的總線,所以在ZCP320A中設(shè)計(jì)了一個(gè)AHB-PCI的橋來(lái)實(shí)現(xiàn)AMBA AHB協(xié)議到PCI協(xié)議的轉(zhuǎn)換。PCI總線通過(guò)AHB-PCI橋連接到內(nèi)部AHB總線。 1 PCI總線接口概述 在ZCP320A中設(shè)計(jì)了一個(gè)AHB-PCI的橋來(lái)實(shí)現(xiàn)AMBA AHB協(xié)議到PCI協(xié)議的轉(zhuǎn)換。PCI總線通過(guò)AHB-PCI橋連接到內(nèi)部AHB總線。如圖1所示。
AHB-PCI 橋是實(shí)現(xiàn)AHB總線和PCI總線的協(xié)議轉(zhuǎn)換,實(shí)現(xiàn)AHB總線和PCI 總線之間數(shù)據(jù)交換的一個(gè)設(shè)備,AHB-PCI橋是32位的,即AHB總線和PCI總線都是32位的地址/數(shù)據(jù)總線。在CPU內(nèi)部橋和兩條內(nèi)部總線相連接,COREBUS 和PBUS。這兩條內(nèi)部總線都符合AMBA AHB總線協(xié)議。在COREBUS上,ARM CORE 作為該總線的唯一主設(shè)備,橋則作為該總線的一個(gè)從設(shè)備。在PBUS上,橋作為該總線的唯一主設(shè)備,PCI緩沖及存儲(chǔ)器則作為其從設(shè)備。在CPU外部,橋則和PCI總線相連接。通過(guò)COREBUS, ARM CORE訪問(wèn)橋及穿過(guò)橋訪問(wèn)外部的PCI設(shè)備。外部的PCI設(shè)備則通過(guò)PCI總線訪問(wèn)該橋并穿過(guò)橋到PBUS上訪問(wèn)CPU的內(nèi)部存儲(chǔ)器等資源。橋?yàn)镻CI 總線和內(nèi)部ARM CORE及內(nèi)部存儲(chǔ)器的通信提供了數(shù)據(jù)緩沖。ARM CORE寫數(shù)據(jù)緩沖由兩個(gè)FIFO組成,每個(gè)FIFO可容納32字節(jié)的數(shù)據(jù)和4 字節(jié)的地址。ARM CORE讀數(shù)據(jù)緩沖由一個(gè)FIFO組成,該FIFO可容納32字節(jié)的數(shù)據(jù)和4字節(jié)的地址。在另一側(cè)PCI寫數(shù)據(jù)緩沖由兩個(gè)FIFO組成,每個(gè)FIFO可容納32字節(jié)的數(shù)據(jù)和4字節(jié)的地址。PCI讀數(shù)據(jù)緩沖由一個(gè)FIFO組成,此FIFO也可容納32字節(jié)的數(shù)據(jù)和4字節(jié)的地址。當(dāng)有大量數(shù)據(jù)需要進(jìn)行傳輸?shù)臅r(shí)候,橋上提供了DMA控制器供使用,可以大大提高數(shù)據(jù)通信效率。該DMA 控制器具有一個(gè)32字節(jié)的接收FIFO和一個(gè)32字節(jié)的發(fā)送FIFO。因此DMA在傳輸數(shù)據(jù)的時(shí)候可以實(shí)現(xiàn)乒乓效應(yīng),也就是說(shuō)在接收的同時(shí)發(fā)送數(shù)據(jù)。 通過(guò)AHB-PCI橋,內(nèi)部的ARM核可以對(duì)外部PCI設(shè)備進(jìn)行訪問(wèn);同時(shí),外部的PCI設(shè)備也可以對(duì)內(nèi)部的CPU資源進(jìn)行訪問(wèn)。當(dāng)AHB-PCI橋作為 COREBUS上的從設(shè)備的時(shí)候,它從COREBUS上接收ARM發(fā)出讀/寫命令,然后在PCI總線上發(fā)起相應(yīng)的傳輸,也就是說(shuō)此時(shí)橋作為PCI的主設(shè)備。當(dāng)外部PCI設(shè)備對(duì)AHB-PCI橋進(jìn)行訪問(wèn)的時(shí)候,橋作為PCI從設(shè)備接收PCI 總線上的命令,同時(shí)作為AHB主設(shè)備在PBUS上發(fā)起相應(yīng)的操作以達(dá)到訪問(wèn)CPU資源的目的。這就是CPU訪問(wèn)外部設(shè)備和外部設(shè)備訪問(wèn)CPU資源的兩條路徑。 ZCP320A的PCI橋在PCI總線仲裁方面,可以用外部的仲裁器,也可以用橋本身提供的仲裁器。設(shè)計(jì)人員可以根據(jù)需要選擇用外部的仲裁器,還是用 ZCP320A的PCI橋上的仲裁器。這個(gè)選擇通過(guò)配置PCI混合控制寄存器PCI_MISC_CTL(偏移地址是0x100)的位12。如果使用外部仲裁器則將該位配置為1,而如果使用橋內(nèi)部的仲裁器則將該位配置為0。橋上的PCI 仲裁器最多支持6個(gè)PCI主設(shè)備(包括ZCP320A本身)。其仲裁算法為分組輪循的優(yōu)先算法。 ZCP320A提供了地址轉(zhuǎn)換功能和地址空間范圍定義功能。地址轉(zhuǎn)換包括兩個(gè)方向,一是從ARM CORE到外部PCI空間的地址轉(zhuǎn)換;二是從PCI空間到PBUS空間的轉(zhuǎn)換。地址轉(zhuǎn)換和地址空間范圍都是通過(guò)一個(gè)稱為地址窗口的機(jī)制來(lái)實(shí)現(xiàn)的。在從 ARM CORE到外部PCI空間的方向定義了4個(gè)窗口,即窗口0/1/2/3,每個(gè)窗口由兩個(gè)寄存器來(lái)定義,窗口基地址寄存器(CBUS_BST0/1/2 /3)和窗口控制寄存器(CBUS_TI0/1/2/3_CTL)。在窗口基地址寄存器中定義了該窗口在COREBUS上的基地址及該窗口的屬性(存儲(chǔ)器或I/O空間是否可預(yù)取,是否可對(duì)32位的任一字節(jié)進(jìn)行訪問(wèn)),而在窗口控制寄存器中則定義了該窗口轉(zhuǎn)換到PCI空間后的基地址,該窗口的大小及窗口使能控制和地址轉(zhuǎn)換使能控制。在從PCI 空間到PBUS空間的方向也定義了4個(gè)窗口,PCI寄存器窗口和PCI從設(shè)備窗口0/1/2。其中PCI寄存器窗口由一個(gè)寄存器(PCI_BSREG)來(lái)控制該窗口在PCI總線空間的基地址及窗口屬性,而PCI 從設(shè)備窗口0/1/2則由兩個(gè)寄存器來(lái)定義,即窗口基地址寄存器(PCI_BST0/1/2)和窗口控制寄存器(PCI_TI0/1/2)。在窗口基地址寄存器中定義了該窗口在PCI總線上的基地址及窗口屬性(存儲(chǔ)器或I/O空間是否可預(yù)取,是否可對(duì)32位的任一字節(jié)進(jìn)行訪問(wèn)),而在窗口控制寄存器中則定義了該窗口轉(zhuǎn)換到PBUS空間后的基地址及該窗口的大小窗口使能控制和地址轉(zhuǎn)換使能控制。 2 PCI總線編程模式 PCI橋上的寄存器占了4K的空間,從偏移地址0x000到0xfff。其中0x000到0x0ff是PCI協(xié)議中的標(biāo)準(zhǔn)PCI配置寄存器。這部分的寄存器可以從COREBUS和PCI 總線上進(jìn)行訪問(wèn),在COREBUS上訪問(wèn)的時(shí)候是當(dāng)作存儲(chǔ)器訪問(wèn),而在PCI總線上則只能通過(guò)配置訪問(wèn)來(lái)進(jìn)行。 偏移地址從0x100到0x1ff是擴(kuò)展的PCI寄存器,用來(lái)定義橋作為PCI從設(shè)備時(shí)的窗口以及一些其它的控制。其中0x120是鎖寄存器,用來(lái)控制寄存器區(qū)的寫訪問(wèn)。 偏移地址從0x200到0x2ff是COREBUS控制寄存器,用來(lái)控制COREBUS上的窗口和地址屬性。即橋作為PCI主設(shè)備時(shí)使用該組寄存器。 偏移地址從0x300到0x3ff是錯(cuò)誤檢測(cè)和處理寄存器。這部分的寄存器是對(duì)橋的錯(cuò)誤進(jìn)行控制,對(duì)錯(cuò)誤的狀態(tài)進(jìn)行檢測(cè)并報(bào)告。 偏移地址從0x400到0x4ff是DMA控制器部分寄存器。這部分的寄存器是DMA的專用命令寄存器,用來(lái)控制和管理橋上的DMA的工作。 另外還有兩個(gè)配置寄存器0xcf8配置地址寄存器和0xcfc配置數(shù)據(jù)寄存器。ARM CORE在COREBUS上通過(guò)對(duì)這兩個(gè)寄存器的操作實(shí)現(xiàn)對(duì)外部的PCI設(shè)備的配置操作。 PCI寄存器區(qū)在COREBUS總線上的基地址是0xe0000000 ,而在PCI總線上的基地址是可配置的,在PCI_BSREG寄存器中配置。 橋上的寄存器既可以由ARM核在COREBUS上訪問(wèn),也可以由外部的PCI主設(shè)備通過(guò)PCI總線訪問(wèn)。寄存器區(qū)有一個(gè)鎖的機(jī)制,用來(lái)保護(hù)寄存器。鎖可以保證在同一時(shí)間只有一個(gè)設(shè)備可以對(duì)寄存器區(qū)的值進(jìn)行修改。當(dāng)ARM CORE通過(guò)COREBUS來(lái)訪問(wèn)橋上的寄存器或外部PCI設(shè)備通過(guò)PCI總線訪問(wèn)橋上的寄存器的時(shí)候,必須先對(duì)寄存器進(jìn)行鎖定成功以后才能對(duì)寄存器進(jìn)行寫操作,而讀操作則沒(méi)有這個(gè)限制。鎖機(jī)制的實(shí)現(xiàn)是通過(guò)鎖寄存器REG_LOCK 來(lái)實(shí)現(xiàn)的。鎖定的具體方法是:對(duì)鎖寄存器偏移地址0x120寫入0x1,然后通過(guò)讀該寄存器來(lái)查看加鎖是否已經(jīng)成功。如果讀得的該寄存器的值是0x1,則說(shuō)明已經(jīng)鎖定了橋上的寄存器區(qū),對(duì)寄存器的配置就可以進(jìn)行了。而如果讀得的結(jié)果是0x0的話,說(shuō)明鎖定失敗。對(duì)于寄存器讀操作來(lái)說(shuō),沒(méi)有加鎖的限制。因?yàn)樽x操作不改變寄存器的值。當(dāng)對(duì)寄存器配置結(jié)束后必須消除對(duì)寄存器區(qū)的鎖定,這樣其它的設(shè)備才可以對(duì)寄存器進(jìn)行配置。具體方法是對(duì)鎖寄存器0x120寫 0x0。 3 PCI主設(shè)備工作模式 由于ZCP320A處理器帶有PCI總線接口,所以我們?cè)O(shè)計(jì)一般是處理器上集成的PCI橋作為主設(shè)備,而外部擴(kuò)展的PCI設(shè)備則作為從設(shè)備。下面以外擴(kuò)的以太網(wǎng)卡RTL8139為例說(shuō)明如何操作RTL8139中的寄存器。 在輸出通道中,AHB-PCI橋作為COREBUS的從設(shè)備,同時(shí)作為PCI總線的主設(shè)備。它從COREBUS上接收命令,然后在PCI總線上發(fā)起相應(yīng)的傳輸。圖2描述了就是橋作為PCI 主設(shè)備時(shí)的內(nèi)部結(jié)構(gòu)。
3.1 初始化PCI橋 下面例程都是基于C語(yǔ)言,其中 #define REG_READ(addr,offset,data) par*data = (*(volatile UINT32*)((addr)+(offset))) #define REG_WRITE(addr,offset,data) par (*(volatile UINT32*)((addr)+(offset))) = data (1)鎖寄存器并判斷是否鎖成功 REG_WRITE(0xe0000000,0x120,1); REG_ READ (0xe0000000,0x120,%26;amp;data); if(!(data %26;amp; 0x1)) return; (2)配置COREBUS窗口基地址寄存器和控制寄存器 在COREBUS 上的地址空間分配與在PCI總線上的地址空間分配是獨(dú)立的。PCI的數(shù)據(jù)空間在COREBUS上所占的范圍是1G+512M到2G-1之間,地址范圍是 0x60000000到0x7fffffff 這里的基地址是固定的,為0x60000000。而地址范圍可以根據(jù)實(shí)際情況來(lái)確定,通過(guò)相關(guān)的控制寄存器實(shí)現(xiàn)。同時(shí),ZCP320A要訪問(wèn)的PCI設(shè)備的地址空間是不確定的,可能是所有的32位的地址空間的任意一段或幾段,所以需要一個(gè)地址轉(zhuǎn)換機(jī)制來(lái)實(shí)現(xiàn)地址空間從COREBUS到PCI總線之間的轉(zhuǎn)換。 對(duì)于RTL8139,窗口基地址寄存器和控制寄存器配置如下: REG_WRITE(0xe0000000,0x204,0x60000008); /*windows 0,BaseAddr 0x60000000,CoreBus,Prefech */ REG_WRITE(0xe0000000,0x214,0x10000043); /* PCI Bus RTL8139 BaseAddr: 0x100000000"0x1000ffff,大小為64K */ REG_WRITE(0xe0000000,0x208,0x00000000);./* Disable windows 1 */ REG_WRITE(0xe0000000,0x20C,0x00000000); /* Disable windows 2 */ REG_WRITE(0xe0000000,0x210,0x00000000); /* Disable windows 3 */ (3)使能PCI橋作為主設(shè)備 REG_WRITE(0xe0000000,0x04,0x06); /* Enable PCI Master */ 3.2 配置RTL8139網(wǎng)卡的PCI配置空間寄存器 對(duì)于ARM核來(lái)說(shuō),通過(guò)AHB-PCI橋?qū)ν獠縋CI設(shè)備進(jìn)行配置訪問(wèn)實(shí)際上是通過(guò)對(duì)配置地址寄存器(0xcf8)和配置數(shù)據(jù)寄存器(0xcfc)的訪問(wèn)來(lái)實(shí)現(xiàn)的,要對(duì)外部PCI設(shè)備進(jìn)行配置訪問(wèn)。軟件設(shè)計(jì)人員要執(zhí)行以下兩步: 第一步是將地址寫入配置地址寄存器中,如圖3所示; 第二步是對(duì)配置數(shù)據(jù)寄存器進(jìn)行讀或?qū)憽?/p>
配置地址寄存器的位31是配置使能位。在進(jìn)行配置操作時(shí)必須將該位設(shè)置為1。30-24位是保留位;23-16位是總線號(hào),直接連接在ZCP320A的 PC 接口的總線為0號(hào)總線。15-11位是設(shè)備號(hào),它主要取決于硬件信號(hào)IDSEL連接到哪個(gè)地址線(AD16-AD31)上,AD16-AD31分別表示設(shè)備號(hào)0-15。10-8位是功能號(hào),對(duì)于單功能設(shè)備,其值為0。7-2是外部PCI設(shè)備的PCI配置空間寄存器偏移量。 要訪問(wèn)RTL8139,需要對(duì)其PCI配置空間寄存器作如下配置: REG_WRITE(0xe0000000,0xcf8,0x80001814); /* Access 8139 BAR0 */ REG_WRITE(0xe0000000,0xcfc, 0x10000000); /* Set BAR0=0x100000000 */ REG_WRITE(0xe0000000,0xcf8,0x80001804); /* Access 8139 Command and Status Register */ REG_WRITE(0xe0000000,0xcfc, 0x02000147); /* Enable Bus Master and Memory , IO Access */ /* 下面是讀取8139的VID和DID */ REG_WRITE(0xe0000000,0xcf8,0x80001800); /* Access 8139 VID and DID Register */ REG_READ(0xe0000000,0xcfc, %26;amp;VIDDID); 由此,我們可以利用已知的VID和DID來(lái)查找PCI總線是否存在該設(shè)備。由于8139的INTA直接連接到ZCP320A處理器的外部中斷1引腳,所以不需要對(duì)配置空間的0x3c進(jìn)行寫操作。從此以后我們可以利用0x10000000作為RTL8139的基地址來(lái)訪問(wèn)RTL8139的寄存器。如訪問(wèn)偏移地址0x0000~0x0005來(lái)讀取8139的MAC地址,即 for(i=0;i<6;i++) mac[i] = *(UCHAR *)(0x10000000 + i); 接下來(lái)我們就可以編寫RTL8139的驅(qū)動(dòng)程序了,在此就論述了。 3.3 訪問(wèn)外部PCI設(shè)備需要注意的事項(xiàng) ZCP320A要通過(guò)PCI橋?qū)ν獠康腜CI設(shè)備進(jìn)行配置訪問(wèn)需要執(zhí)行的步驟如下: (1) 在硬件上要保證連接正確,主要有所要配置的從設(shè)備的IDSEL連接到哪一根地址線上,也就是它的設(shè)備號(hào)是多少。 (2)對(duì)PCI配置地址寄存器(0xcf8)進(jìn)行正確配置,使它和硬件連接一致,主要指總線號(hào)和設(shè)備號(hào)。 (3)對(duì)PCI配置數(shù)據(jù)寄存器(0xcfc)進(jìn)行讀/寫訪問(wèn),從而實(shí)現(xiàn)對(duì)外部PCI設(shè)備的配置訪問(wèn)。 另外要注意的是由于作配置訪問(wèn)的時(shí)候要對(duì)配置地址和數(shù)據(jù)寄存器進(jìn)行訪問(wèn),而這兩個(gè)寄存器屬于橋上的寄存器區(qū),所以要先對(duì)寄存器區(qū)進(jìn)行鎖定,然后才能進(jìn)行配置寫操作。 4 PCI從設(shè)備工作模式 在AHB-PCI 橋的輸入通道,橋作為PCI總線的從設(shè)備同時(shí)作為AHB PBUS 的主設(shè)備,外部擴(kuò)展的PCI設(shè)備則為主設(shè)備。橋從PCI總線上接收傳輸命令并在PBUS上發(fā)起相應(yīng)的操作訪問(wèn)CPU的資源并反饋回去,通過(guò)FIFO將數(shù)據(jù)在PCI總線和PBUS之間傳輸實(shí)現(xiàn)兩種總線協(xié)議的轉(zhuǎn)換。 PBUS和PCI總線是PCI橋作為PCI從設(shè)備同時(shí)作為PBUS上的AHB主設(shè)備時(shí)的兩條連接總線,這兩條總線相互獨(dú)立又通過(guò)PCI橋聯(lián)系起來(lái)。 如圖4所示。
外部PCI主設(shè)備可以通過(guò)AHB-PCI橋來(lái)訪問(wèn)PBUS上的SDRAM、FLASH以及PCI數(shù)據(jù)緩沖區(qū)A、B等。 至于PCI作為從設(shè)備,一般比較少用。所以在此不再介紹。 5 結(jié)束語(yǔ) ZCP320A內(nèi)部集成的PCI總線接口,大大簡(jiǎn)化了系統(tǒng)設(shè)計(jì)??梢詿o(wú)縫擴(kuò)展PCI設(shè)備,例如網(wǎng)卡、顯卡等。訪問(wèn)外部擴(kuò)展的PCI設(shè)備只需按照上述說(shuō)明即可。