0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

xilinx zynq RapidIO系統(tǒng)的初始化啟動(dòng)過(guò)程概述

454398 ? 來(lái)源:CSDN 博主 ? 作者:黑客三遍豬 ? 2020-12-26 11:22 ? 次閱讀

參考

書(shū)籍《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的初始化,一些底層的比如物理層鏈路層之類(lèi)的不需要關(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)路徑,就是所謂的枚舉算法的目的,可以是最短路徑或者包含一些用戶(hù)約束。

啟動(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ù)湫畔?。所以host的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

xilinx zynq RapidIO系統(tǒng)配置

xilinx zynq RapidIO系統(tǒng)配置

xilinx zynq RapidIO系統(tǒng)配置

列舉用到的4個(gè)寄存器,詳細(xì)參考pg007。

1. Port General Control CSR,使能Master Enable。

xilinx zynq RapidIO系統(tǒng)配置

2. Base Device ID CSR,設(shè)置器件ID,host可設(shè)為1,默認(rèn)值在vivado里設(shè)置。

xilinx zynq RapidIO系統(tǒng)配置

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

xilinx zynq RapidIO系統(tǒng)配置

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

xilinx zynq RapidIO系統(tǒng)配置

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

xilinx zynq RapidIO系統(tǒng)配置

IDT CPS1848

1. CPS1848結(jié)構(gòu)圖,注意的是port從0到17,即0x00到0x11。

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寄存器確定。

xilinx zynq RapidIO系統(tǒng)配置

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。

xilinx zynq RapidIO系統(tǒng)配置

4. 多播編程,用到再說(shuō)。

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

xilinx zynq RapidIO系統(tǒng)配置

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

xilinx zynq RapidIO系統(tǒng)配置

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

xilinx zynq RapidIO系統(tǒng)配置

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

xilinx zynq RapidIO系統(tǒng)配置

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

xilinx zynq RapidIO系統(tǒng)配置

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. 寫(xiě)入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è)備類(lèi)型,決定下一步拓?fù)浞绞?。如果是Endpoint類(lèi)型,關(guān)閉Master Enable,置位Discovered,分配ID號(hào),配置該port的路由表。如果是Switch類(lèi)型,則遞歸調(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)配置,也不滿(mǎn)足用戶(hù)的需求。 所以現(xiàn)在需要按照設(shè)計(jì)需求,生成路由表然后寫(xiě)到各個(gè)Switch。

zynq SRIO驅(qū)動(dòng)

這里實(shí)現(xiàn)Linux用戶(hù)態(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


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Xilinx
    +關(guān)注

    關(guān)注

    71

    文章

    2152

    瀏覽量

    120739
  • RapidIO
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    20786
  • Zynq
    +關(guān)注

    關(guān)注

    9

    文章

    607

    瀏覽量

    47084
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    淺談zynq啟動(dòng),BootROM和FSBL等的執(zhí)行過(guò)程

    可在非POR復(fù)位后直接運(yùn)行(不經(jīng)過(guò)硬件啟動(dòng)),其內(nèi)容固化在內(nèi)部ROM中,不能修改,主要初始化MMU和一些系統(tǒng)資源(以使其滿(mǎn)足
    發(fā)表于 11-23 14:53 ?9172次閱讀
    淺談<b class='flag-5'>zynq</b><b class='flag-5'>啟動(dòng)</b>,BootROM和FSBL等的執(zhí)行<b class='flag-5'>過(guò)程</b>

    RT-Thread自動(dòng)初始化詳解

    初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過(guò)宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過(guò)程中被執(zhí)行,非常的方便。 1 普通初始化 前面也講了,我們?cè)趯?xiě)單片機(jī)的程序時(shí),需要對(duì)硬件進(jìn)行初始化
    的頭像 發(fā)表于 06-25 21:38 ?1.1w次閱讀
    RT-Thread自動(dòng)<b class='flag-5'>初始化</b>詳解

    自動(dòng)初始化機(jī)制原理詳解

    自動(dòng)初始化機(jī)制是指初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過(guò)宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過(guò)程中被執(zhí)行。這篇文章就來(lái)探索一下其中的奧秘, 簡(jiǎn)單理解其原理!
    的頭像 發(fā)表于 12-16 09:33 ?928次閱讀
    自動(dòng)<b class='flag-5'>初始化</b>機(jī)制原理詳解

    Linux內(nèi)核啟動(dòng)過(guò)程和Bootloader(總述)

    初始化過(guò)程中一般都會(huì)初始化一個(gè)串口做為內(nèi)核的控制臺(tái),這樣內(nèi)核在啟動(dòng)過(guò)程中就可以通過(guò)串口輸出信息以便開(kāi)發(fā)者或用戶(hù)了解系統(tǒng)
    發(fā)表于 08-18 17:35

    Linux和Windows系統(tǒng)啟動(dòng)過(guò)程的簡(jiǎn)單分析

    AT PPC.....bootloader特性:以命令為基礎(chǔ)。一旦引導(dǎo)啟動(dòng)系統(tǒng)后,bootloader就不存在。Linux和Windows啟動(dòng)過(guò)程中,基本的原理都差不多,都先加載一個(gè)bootloader來(lái)
    發(fā)表于 08-28 11:27

    玩轉(zhuǎn)Zynq連載1——Zynq的linux啟動(dòng)過(guò)程

    是stage 0 - BootROM、stage 1 - FSBL和stage 2 - 操作系統(tǒng)啟動(dòng)。 硬件初始化相對(duì)簡(jiǎn)單明了,不多費(fèi)口舌。下面我們看看軟件啟動(dòng)過(guò)程。2 BootROM階段
    發(fā)表于 04-16 06:56

    如何解決Xilinx rapidio ip核端口不能初始化問(wèn)題?

    我用ise產(chǎn)生了rapidio的核,然后做功能仿真沒(méi)有問(wèn)題,我把自己的邏輯與核結(jié)合起來(lái)后做功能仿真,卻發(fā)現(xiàn)端口不能初始化了,具體情況是port_initialized變成了不定值。求幫忙??!
    發(fā)表于 05-16 09:39

    Zynq在非JTAG模式下的啟動(dòng)配置流程

    BootROM 加載到 OCM 中的啟動(dòng)鏡像。FSBL 完成的任務(wù)是 Zynq 啟動(dòng)過(guò)程中的關(guān)鍵一環(huán),可以分為以下4項(xiàng):  1. 完成 PS 的初始化  2. 加載 PL 的bit流
    發(fā)表于 01-08 16:33

    STM32啟動(dòng)過(guò)程

    一、STM32 啟動(dòng)過(guò)程通過(guò)Boot引腳設(shè)定,尋找初始地址初始化棧指針 __initial_sp指向復(fù)位程序 Reset_Hander設(shè)置異常中斷 HardFault_Handler設(shè)置系統(tǒng)
    發(fā)表于 08-11 06:02

    FreeRTOS系統(tǒng)啟動(dòng)過(guò)程

    FreeRTOS系統(tǒng)啟動(dòng)過(guò)程主要分為三部分:匯編部分、main函數(shù)初始化部分、開(kāi)啟任務(wù)調(diào)度部分。對(duì)于匯編部分主要是設(shè)置一些中斷向量表、設(shè)置堆和棧等一些C語(yǔ)言運(yùn)行需要的條件,當(dāng)這些部分設(shè)置完成時(shí)候
    發(fā)表于 12-13 07:07

    系統(tǒng)啟動(dòng)過(guò)程

    系統(tǒng)啟動(dòng)過(guò)程系統(tǒng)啟動(dòng)過(guò)程主要由一下幾步組成(以硬盤(pán)啟動(dòng)為例):1. 開(kāi)機(jī)2. BIOS 加電自檢 ( Power On Self Test -- POST ),內(nèi)存地址為 0ffff:00003. 將硬盤(pán)第一個(gè)
    發(fā)表于 10-11 12:17 ?2244次閱讀

    交換機(jī)的啟動(dòng)過(guò)程及運(yùn)作原理

    交換機(jī)的通常啟動(dòng)過(guò)程包括啟動(dòng)裝載軟件的操作,完成以下任務(wù):完成低級(jí)交換機(jī)CPU初始化。它將初始化控制映象的物理內(nèi)存、CPU寄存器,包括數(shù)量、速度等參數(shù)。為CPU子
    發(fā)表于 11-15 11:52 ?1.9w次閱讀

    Xilinx FSBL如何操作啟動(dòng)Zynq器件

    了解Xilinx FSBL如何操作以啟動(dòng)Zynq器件。 包括程序執(zhí)行概述,調(diào)試技巧以及有關(guān)特定引導(dǎo)設(shè)備的信息。 還包括FSBL角度的啟動(dòng)
    的頭像 發(fā)表于 11-23 06:32 ?4511次閱讀

    Armlinux內(nèi)核移植及系統(tǒng)初始化過(guò)程分析

    Armlinux內(nèi)核移植及系統(tǒng)初始化過(guò)程分析說(shuō)明。
    發(fā)表于 04-06 15:53 ?11次下載

    認(rèn)識(shí)linux文件系統(tǒng)——文件系統(tǒng)啟動(dòng)過(guò)程介紹

    系統(tǒng)啟動(dòng)流程 1)內(nèi)核啟動(dòng)包括初始化串口、內(nèi)存、中斷等必要的設(shè)備以及其他設(shè)備初始化(當(dāng)然初始化東西很多,這里不一一列舉); 2)內(nèi)核
    發(fā)表于 10-28 11:05 ?1次下載