參考
書籍《RapidIO The Embedded System Interconnect》
xilinx手冊(cè)pg007《Serial RapidIO Gen2 Endpoint v4.1 LogiCORE IP Product Guide》
Zynq-Linux移植學(xué)習(xí)筆記之14-RapidIO驅(qū)動(dòng)開(kāi)發(fā)
host初始化
直接看RapidIO的初始化,一些底層的比如物理層鏈路層之類的不需要關(guān)心,用到了再去看,畢竟都是基于芯片或者IP來(lái)開(kāi)發(fā)。先從高層了解這個(gè)過(guò)程。
系統(tǒng)啟動(dòng)過(guò)程概述
1. host CPU獲取引導(dǎo)代碼,啟動(dòng),如果有兩個(gè)host,則兩者是同時(shí)啟動(dòng)的。
2. 開(kāi)始執(zhí)行系統(tǒng)探測(cè)和枚舉算法。
3. 枚舉所有器件并將相關(guān)器件信息記錄到器件數(shù)據(jù)庫(kù),建立host和所有endpoint之間的路由。
? 計(jì)算并配置host和所有endpoint之間的最優(yōu)路徑。
? 用最優(yōu)路徑信息配置switch。
? 更新路由表。
4. 映射地址空間。
上面提到的最優(yōu)路徑,就是所謂的枚舉算法的目的,可以是最短路徑或者包含一些用戶約束。
啟動(dòng)要求
系統(tǒng)初始化之后,所有器件都會(huì)擁有一個(gè)ID,在系統(tǒng)初始化之前,按照下面設(shè)置。RapidIO系統(tǒng)應(yīng)該只有一個(gè)引導(dǎo)代碼器件。
? 設(shè)置endpoint ID為0xFF(0xFFFF)。
? 設(shè)置引導(dǎo)代碼器件ID為0xFE(0x00FE)。
? 設(shè)置host ID為0x00(0x0000)。
枚舉
枚舉過(guò)程中,將給每個(gè)endpoint分配唯一的器件ID,為了增強(qiáng)容錯(cuò)性,RapidIO系統(tǒng)可以有兩個(gè)host,經(jīng)過(guò)競(jìng)爭(zhēng),最終只有一個(gè)host來(lái)完成枚舉,如果主機(jī)枚舉過(guò)程失敗并發(fā)生超時(shí)事件,則另一主機(jī)重新枚舉。枚舉算法根據(jù)器件ID大小設(shè)置優(yōu)先級(jí),ID大的host競(jìng)爭(zhēng)獲勝,在枚舉同一個(gè)endpoint時(shí)會(huì)發(fā)生競(jìng)爭(zhēng),失敗host主動(dòng)退出枚舉,枚舉結(jié)束之后,其他主機(jī)可以通過(guò)被動(dòng)發(fā)現(xiàn)(passively discovery)收集網(wǎng)絡(luò)中的路由拓?fù)湫畔ⅰK詇ost的ID可以設(shè)置為0x00(0x0000)和0x01(0x0001),其中0x01的優(yōu)先級(jí)更高。host應(yīng)當(dāng)將自己的主機(jī)使能位置1,switch沒(méi)有這個(gè)位,當(dāng)host釋放對(duì)失敗主機(jī)的鎖定時(shí),枚舉完成,失敗host自己檢測(cè)是否被鎖定和釋放鎖定。在開(kāi)放式(open)8位器件ID系統(tǒng)中,如果host枚舉失敗,那么失敗主機(jī)重新枚舉時(shí),必須等待15秒。在閉合式(closed)或者16位器件ID系統(tǒng)中,超時(shí)等待時(shí)間需要設(shè)計(jì)。
Xilinx Srio IP
3. Host Base Device ID Lock CSR,器件鎖定寄存器,復(fù)位之后,這個(gè)寄存器只能被寫一次(之后被鎖定),配置之后如果寫入值和寄存器值相等,則寄存器值被復(fù)位為0xFFFF,向該寄存器寫入0xFFFF不會(huì)鎖定寄存器。
4. Maintenance Request Information Register,維護(hù)包配置寄存器,地址在0x10100,低16位用于配置目的ID,當(dāng)用IP發(fā)維護(hù)包之前,需要配置這個(gè)寄存器。
5. Processing Elements Features CAR,表示這個(gè)設(shè)備提供的功能,可以是Bridge,Memory,Processor,Switch 4種,SRIO IP支持前3種(endpoint),支持16位地址模式,可在vivado中通過(guò)GUI設(shè)置。
2. CPS1848路由方式,每個(gè)端口提供256個(gè)緩存來(lái)存儲(chǔ)設(shè)備路由表,還有256個(gè)緩存來(lái)存儲(chǔ)域路由表,這樣設(shè)計(jì)的目的是,在大型的系統(tǒng)里會(huì)用到域路由表,大型系統(tǒng)有很多底板,每個(gè)底板上也會(huì)有很多子板,域路由表用來(lái)選擇包被發(fā)送到哪一塊板卡,而設(shè)備路由表用來(lái)將包發(fā)送到某個(gè)處理單元(某個(gè)芯片的SRIO端口)。RIO_DOMAIN由RapidIO Domain Register寄存器確定。
3. 單播(unicast)編程,CPS1848每個(gè)端口都有自己的路由表,所以可以支持虛擬網(wǎng)絡(luò),路由配置時(shí),有寄存器The Route Port Select Register selects來(lái)控制路由表項(xiàng)是添加到所有端口還是某個(gè)端口。路由配置主要是三個(gè)寄存器Standard Route Table Entries Configuration destID Select CSR,Standard Route Table Entry Configuration Port Select CSR和Standard Route Table Entry Default Port CSR。
4. 多播編程,用到再說(shuō)。
5. 上面配置路由的方法是非直接方式(Indirect Programming),配置路由需要操作多次,在多(線程)設(shè)備的環(huán)境下要做互斥,CPS1848支持另外一種直接方式(Direct Programming)可以支持這種情況。
6. Switch Port Information CAR寄存器,這個(gè)寄存器很重要,在多個(gè)Switch互聯(lián)的系統(tǒng)里,用于確定拓?fù)潢P(guān)系。
7. Port General Control CSR寄存器,會(huì)用到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)初始化過(guò)程
1. 使能host模式。
2. 配置ID。
3. 配置CPS1848路由,使能端口收發(fā)(手冊(cè)默認(rèn)是打開(kāi)的)。
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)被鎖定(但和另一個(gè)host沖突),進(jìn)入等待退避狀態(tài),等待另一個(gè)host退避。如果等于host ID,則鎖定成功。
搜索系統(tǒng)拓?fù)?/strong>
這里只考慮Switch是CPS1848的情況,TSI578原理是一致。
1. 如果這個(gè)CPS1848是直接與host zynq相連的switch。
? 搜索CPS1848,設(shè)置0x13c寄存器Port General Control CSR的DISCV位,表示這個(gè)switch已經(jīng)被發(fā)現(xiàn),設(shè)置Component Tag CSR,它是一個(gè)設(shè)備的身份標(biāo)識(shí)。
? 讀0x14寄存器Switch Port Information CAR得到port數(shù)量,就是18。
? 循環(huán)搜索每個(gè)port,如果是host port則使能端口收發(fā),如果是其他port,讀取鏈路狀態(tài),如果正常,用默認(rèn)ID 0xFF配置路由,使能端口收發(fā),然后嘗試鎖定該端口設(shè)備(Endpoint或Switch),鎖定過(guò)程和鎖定host是一樣的。
-如果鎖定成功,讀取Processing Elements Features CAR寄存器,等到Function,判斷設(shè)備類型,決定下一步拓?fù)浞绞健H绻荅ndpoint類型,關(guān)閉Master Enable,置位Discovered,分配ID號(hào),配置該port的路由表。如果是Switch類型,則遞歸調(diào)用Switch枚舉過(guò)程。
-如果是已經(jīng)鎖定狀態(tài)(存在環(huán)路),直接更新拓?fù)洌蛔鋈魏闻渲谩?/p>
2. 如果這個(gè)CPS1848不和host直接相連。
? 設(shè)置DISCV位,得到與上級(jí)Switch相連的端口號(hào),設(shè)置host的路由,設(shè)置默認(rèn)路由為到host的端口。
? 同上。
? 同上。
現(xiàn)在拓?fù)潢P(guān)系已經(jīng)搜索出來(lái)了。下面就是配置路由,因?yàn)樯鲜鏊阉鬟^(guò)程的路由配置不一定是最優(yōu)配置,也不滿足用戶的需求。 所以現(xiàn)在需要按照設(shè)計(jì)需求,生成路由表然后寫到各個(gè)Switch。
zynq SRIO驅(qū)動(dòng)
這里實(shí)現(xiàn)Linux用戶態(tài)的驅(qū)動(dòng),數(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)注
71文章
2168瀏覽量
121695 -
RapidIO
+關(guān)注
關(guān)注
1文章
39瀏覽量
20821 -
Zynq
+關(guān)注
關(guān)注
10文章
610瀏覽量
47212
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論