參考
書籍《RapidIO The Embedded System Interconnect》
xilinx手冊pg007《Serial RapidIO Gen2 Endpoint v4.1 LogiCORE IP Product Guide》
Zynq-Linux移植學(xué)習(xí)筆記之14-RapidIO驅(qū)動開發(fā)
host初始化
直接看RapidIO的初始化,一些底層的比如物理層鏈路層之類的不需要關(guān)心,用到了再去看,畢竟都是基于芯片或者IP來開發(fā)。先從高層了解這個過程。
系統(tǒng)啟動過程概述
1. host CPU獲取引導(dǎo)代碼,啟動,如果有兩個host,則兩者是同時啟動的。
2. 開始執(zhí)行系統(tǒng)探測和枚舉算法。
3. 枚舉所有器件并將相關(guān)器件信息記錄到器件數(shù)據(jù)庫,建立host和所有endpoint之間的路由。
? 計算并配置host和所有endpoint之間的最優(yōu)路徑。
? 用最優(yōu)路徑信息配置switch。
? 更新路由表。
4. 映射地址空間。
上面提到的最優(yōu)路徑,就是所謂的枚舉算法的目的,可以是最短路徑或者包含一些用戶約束。
啟動要求
系統(tǒng)初始化之后,所有器件都會擁有一個ID,在系統(tǒng)初始化之前,按照下面設(shè)置。RapidIO系統(tǒng)應(yīng)該只有一個引導(dǎo)代碼器件。
? 設(shè)置endpoint ID為0xFF(0xFFFF)。
? 設(shè)置引導(dǎo)代碼器件ID為0xFE(0x00FE)。
? 設(shè)置host ID為0x00(0x0000)。
枚舉
枚舉過程中,將給每個endpoint分配唯一的器件ID,為了增強(qiáng)容錯性,RapidIO系統(tǒng)可以有兩個host,經(jīng)過競爭,最終只有一個host來完成枚舉,如果主機(jī)枚舉過程失敗并發(fā)生超時事件,則另一主機(jī)重新枚舉。枚舉算法根據(jù)器件ID大小設(shè)置優(yōu)先級,ID大的host競爭獲勝,在枚舉同一個endpoint時會發(fā)生競爭,失敗host主動退出枚舉,枚舉結(jié)束之后,其他主機(jī)可以通過被動發(fā)現(xiàn)(passively discovery)收集網(wǎng)絡(luò)中的路由拓?fù)湫畔ⅰK詇ost的ID可以設(shè)置為0x00(0x0000)和0x01(0x0001),其中0x01的優(yōu)先級更高。host應(yīng)當(dāng)將自己的主機(jī)使能位置1,switch沒有這個位,當(dāng)host釋放對失敗主機(jī)的鎖定時,枚舉完成,失敗host自己檢測是否被鎖定和釋放鎖定。在開放式(open)8位器件ID系統(tǒng)中,如果host枚舉失敗,那么失敗主機(jī)重新枚舉時,必須等待15秒。在閉合式(closed)或者16位器件ID系統(tǒng)中,超時等待時間需要設(shè)計。
Xilinx Srio IP





3. Host Base Device ID Lock CSR,器件鎖定寄存器,復(fù)位之后,這個寄存器只能被寫一次(之后被鎖定),配置之后如果寫入值和寄存器值相等,則寄存器值被復(fù)位為0xFFFF,向該寄存器寫入0xFFFF不會鎖定寄存器。

4. Maintenance Request Information Register,維護(hù)包配置寄存器,地址在0x10100,低16位用于配置目的ID,當(dāng)用IP發(fā)維護(hù)包之前,需要配置這個寄存器。

5. Processing Elements Features CAR,表示這個設(shè)備提供的功能,可以是Bridge,Memory,Processor,Switch 4種,SRIO IP支持前3種(endpoint),支持16位地址模式,可在vivado中通過GUI設(shè)置。

2. CPS1848路由方式,每個端口提供256個緩存來存儲設(shè)備路由表,還有256個緩存來存儲域路由表,這樣設(shè)計的目的是,在大型的系統(tǒng)里會用到域路由表,大型系統(tǒng)有很多底板,每個底板上也會有很多子板,域路由表用來選擇包被發(fā)送到哪一塊板卡,而設(shè)備路由表用來將包發(fā)送到某個處理單元(某個芯片的SRIO端口)。RIO_DOMAIN由RapidIO Domain Register寄存器確定。

3. 單播(unicast)編程,CPS1848每個端口都有自己的路由表,所以可以支持虛擬網(wǎng)絡(luò),路由配置時,有寄存器The Route Port Select Register selects來控制路由表項是添加到所有端口還是某個端口。路由配置主要是三個寄存器Standard Route Table Entries Configuration destID Select CSR,Standard Route Table Entry Configuration Port Select CSR和Standard Route Table Entry Default Port CSR。

4. 多播編程,用到再說。
5. 上面配置路由的方法是非直接方式(Indirect Programming),配置路由需要操作多次,在多(線程)設(shè)備的環(huán)境下要做互斥,CPS1848支持另外一種直接方式(Direct Programming)可以支持這種情況。

6. Switch Port Information CAR寄存器,這個寄存器很重要,在多個Switch互聯(lián)的系統(tǒng)里,用于確定拓?fù)潢P(guān)系。

7. Port General Control CSR寄存器,會用到DISCV位,是發(fā)現(xiàn)標(biāo)志位。

8. Port Error and Status CSR寄存器,第1位PORT_OK。

9. Host Base deviceID Lock CSR寄存器,同xilinx SRIO IP。

zynq SRIO系統(tǒng)初始化過程
1. 使能host模式。
2. 配置ID。
3. 配置CPS1848路由,使能端口收發(fā)(手冊默認(rèn)是打開的)。
4. 鎖定host。
5. 搜索系統(tǒng)拓?fù)洹?/p>
鎖定host
1. 讀取Lock ID CSR,如果寄存器值等于host ID,則判定已經(jīng)鎖定,退出,否則進(jìn)入2。
2. 寫入host ID,再讀取host ID,如果寄存器值大于host ID則進(jìn)入退避狀態(tài),如果小于host ID,則已經(jīng)被鎖定(但和另一個host沖突),進(jìn)入等待退避狀態(tài),等待另一個host退避。如果等于host ID,則鎖定成功。
搜索系統(tǒng)拓?fù)?/strong>
這里只考慮Switch是CPS1848的情況,TSI578原理是一致。
1. 如果這個CPS1848是直接與host zynq相連的switch。
? 搜索CPS1848,設(shè)置0x13c寄存器Port General Control CSR的DISCV位,表示這個switch已經(jīng)被發(fā)現(xiàn),設(shè)置Component Tag CSR,它是一個設(shè)備的身份標(biāo)識。
? 讀0x14寄存器Switch Port Information CAR得到port數(shù)量,就是18。
? 循環(huán)搜索每個port,如果是host port則使能端口收發(fā),如果是其他port,讀取鏈路狀態(tài),如果正常,用默認(rèn)ID 0xFF配置路由,使能端口收發(fā),然后嘗試鎖定該端口設(shè)備(Endpoint或Switch),鎖定過程和鎖定host是一樣的。
-如果鎖定成功,讀取Processing Elements Features CAR寄存器,等到Function,判斷設(shè)備類型,決定下一步拓?fù)浞绞?。如果是Endpoint類型,關(guān)閉Master Enable,置位Discovered,分配ID號,配置該port的路由表。如果是Switch類型,則遞歸調(diào)用Switch枚舉過程。
-如果是已經(jīng)鎖定狀態(tài)(存在環(huán)路),直接更新拓?fù)?,不做任何配置?/p>
2. 如果這個CPS1848不和host直接相連。
? 設(shè)置DISCV位,得到與上級Switch相連的端口號,設(shè)置host的路由,設(shè)置默認(rèn)路由為到host的端口。
? 同上。
? 同上。
現(xiàn)在拓?fù)潢P(guān)系已經(jīng)搜索出來了。下面就是配置路由,因為上述搜索過程的路由配置不一定是最優(yōu)配置,也不滿足用戶的需求。 所以現(xiàn)在需要按照設(shè)計需求,生成路由表然后寫到各個Switch。
zynq SRIO驅(qū)動
這里實現(xiàn)Linux用戶態(tài)的驅(qū)動,數(shù)據(jù)結(jié)構(gòu)定義,
struct srioEndpoint
{
unsigned int devId;
unsigned int hopCnt;
struct srioSwitch* pSw;
unsigned int port;
};
#define SRIO_SW_MAX_PORT 18//get from cps1848
struct srioSwitch
{
unsigned int hopCnt;
unsigned int componentTag;//component tag
unsigned int portNum;
struct srioEndpoint* pEp[SRIO_SW_MAX_PORT];//port connected
unsigned int epNum;
unsigned int portEp[SRIO_SW_MAX_PORT];//for get ep info for certain port fastly
struct srioSwitch* pSw[SRIO_SW_MAX_PORT];//switch connected, complicate and will be implenmented laterly
unsigned int swNum;
unsigned int portSw[SRIO_SW_MAX_PORT];//for get sw info for certain port fastly
struct srioSwitch* pSwParent;
unsigned int portParent;
};
#define SRIO_SYS_MAX_EP_NUM 64
#define SRIO_SYS_MAX_SW_NUM 4
struct srioSystem
{
struct srioEndpoint epInfo[SRIO_SYS_MAX_EP_NUM];
unsigned int epNum;
struct srioSwitch swInfo[SRIO_SYS_MAX_SW_NUM];
unsigned int swNum;
};
編輯:hfy
-
Xilinx
+關(guān)注
關(guān)注
73文章
2200瀏覽量
131137 -
RapidIO
+關(guān)注
關(guān)注
1文章
42瀏覽量
21525 -
Zynq
+關(guān)注
關(guān)注
10文章
630瀏覽量
49448
發(fā)布評論請先 登錄
淺談zynq啟動,BootROM和FSBL等的執(zhí)行過程
RT-Thread自動初始化詳解
自動初始化機(jī)制原理詳解
xilinx zynq RapidIO系統(tǒng)的初始化啟動過程概述
評論