• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Linux系統(tǒng)下PCIE to RapidIO橋驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

      2018-07-10 11:17:08李紅兵
      雷達(dá)與對(duì)抗 2018年2期
      關(guān)鍵詞:驅(qū)動(dòng)程序字符內(nèi)核

      李紅兵

      (中國(guó)電子科技集團(tuán)公司第十研究所, 成都 610036)

      0 引 言

      目前,國(guó)內(nèi)二次雷達(dá)系統(tǒng)的顯控終端通常采用X86架構(gòu)CPU為核心的硬件平臺(tái),對(duì)外數(shù)據(jù)交互通過(guò)千兆以太網(wǎng)或者PCIE接口,以完成雷達(dá)系統(tǒng)的控制、狀態(tài)顯示和人機(jī)交互等功能。[1]千兆以太網(wǎng)存在速率低、包開(kāi)銷大、對(duì)處理器有特定要求等問(wèn)題。PCIE總線形成樹(shù)形層級(jí)架構(gòu),適合點(diǎn)對(duì)點(diǎn)通信,不支持多設(shè)備間數(shù)據(jù)交換功能。為了滿足二次雷達(dá)系統(tǒng)高速通信的需求,使用新的總線來(lái)替代原有的通信接口。

      RapidIO總線是當(dāng)前廣泛應(yīng)用的一種嵌入式系統(tǒng)內(nèi)部互聯(lián)架構(gòu),具有高帶寬、低延遲、支持多處理器等特征。它比千兆以太網(wǎng)提供更高的傳輸速率,比PCIE更適合組建平行通信網(wǎng)絡(luò),能滿足當(dāng)前二次雷達(dá)系統(tǒng)中的數(shù)據(jù)傳輸需求。

      本文在某型二次雷達(dá)系統(tǒng)的工程研制中設(shè)計(jì)并實(shí)現(xiàn)了Linux操作系統(tǒng)下PCIE to RapidIO橋芯片Tsi721的驅(qū)動(dòng)程序,將RapidIO總線技術(shù)成功應(yīng)用于顯控終端,使得整個(gè)二次雷達(dá)系統(tǒng)形成基于RapidIO網(wǎng)絡(luò)的高速互聯(lián)架構(gòu),提高了該雷達(dá)系統(tǒng)的作戰(zhàn)性能。

      1 Tsi721橋芯片介紹

      Tsi721是美國(guó)IDT公司生產(chǎn)的PCIE to RapidIO橋接芯片。它提供了在PCIE與RapidIO總線間進(jìn)行協(xié)議無(wú)縫轉(zhuǎn)換的硬件解決方案。Tsi721芯片能夠?qū)?shù)據(jù)傳輸從PCIE總線轉(zhuǎn)換到RapidIO總線,或者相反從RapidIO總線轉(zhuǎn)換到PCIE總線,并保證數(shù)據(jù)傳輸在轉(zhuǎn)換過(guò)程中的高效性和可靠性。[2]通過(guò)Tsi721,可以設(shè)計(jì)一個(gè)系統(tǒng)以提供基于RapidIO的網(wǎng)絡(luò)連接性能,同時(shí)使用只有PCIE能夠支持的處理器結(jié)構(gòu)。圖1為Tsi721的功能框圖。

      該芯片具有以下硬件特性:

      ◆ PCIE接口兼容PCIE 2.1規(guī)范,速率支持5/2.5Gbps,物理鏈路支持x4/x2/x1連接,12KB輸入輸出阻塞/非阻塞TLP緩存;

      ◆ RapidIO接口兼容RapidIO串行協(xié)議2.1規(guī)范,速率支持5/3.125/2.5/1.25Gbps,物理鏈路支持x4/x2/x1連接;

      ◆ 集成映射引擎,實(shí)現(xiàn)PCIE到RapidIO地址轉(zhuǎn)換(PC2SR)和RapidIO到PCIE地址轉(zhuǎn)換(SR2PC);

      ◆ 集成消息引擎,實(shí)現(xiàn)PCIE接口與RapidIO接口之間的消息通信,包含8路輸出消息DMA通道和8路輸入消息DMA通道,消息中傳送的數(shù)據(jù)最大可達(dá)4 KB;

      ◆ 集成BDMA引擎,支持塊DMA傳輸,每個(gè)BDMA通道均以鏈?zhǔn)矫枋龇姆绞焦ぷ?,用于?shù)據(jù)包或維護(hù)包的讀寫(xiě)訪問(wèn)。

      顯控終端使用Tsi721芯片實(shí)現(xiàn)RapidIO接口功能,使得顯控終端能通過(guò)RapidIO接口連接到圖2所示的二次雷達(dá)系統(tǒng)中。

      該雷達(dá)系統(tǒng)以交換模塊為核心,顯控終端、信號(hào)處理、信息處理、綜控等各個(gè)模塊通過(guò)交換模塊連接在一起。每個(gè)模塊與交換模塊之間都存在一條單獨(dú)的x1 RapidIO通道。模塊通過(guò)唯一的節(jié)點(diǎn)ID來(lái)定位。節(jié)點(diǎn)間數(shù)據(jù)包傳輸采用RapidIO協(xié)議中的Nwrite和Nread命令。數(shù)據(jù)傳輸可以是點(diǎn)對(duì)點(diǎn)、廣播或者組播的形式。相比以太網(wǎng)或者PCIE總線的樹(shù)形架構(gòu),該系統(tǒng)內(nèi)部通信方式更靈活,性能更高。

      2 Tsi721驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

      Linux內(nèi)核集成的RapidIO子系統(tǒng)驅(qū)動(dòng)在內(nèi)核中形成了全局層、總線層和設(shè)備層共3層數(shù)據(jù)結(jié)構(gòu),用于維護(hù)、管理RapidIO網(wǎng)絡(luò)中各節(jié)點(diǎn)的枚舉、地址分配、路由表建立、節(jié)點(diǎn)動(dòng)態(tài)入網(wǎng)出網(wǎng)等。[3]內(nèi)核把Tsi721芯片虛擬為一個(gè)以太網(wǎng)設(shè)備,驅(qū)動(dòng)通過(guò)RapidIO的message機(jī)制通信。這就要求RapidIO網(wǎng)絡(luò)上其他設(shè)備節(jié)點(diǎn)也通過(guò)message機(jī)制和Tsi721芯片通信。本文的二次雷達(dá)系統(tǒng)要求RapidIO網(wǎng)絡(luò)中各節(jié)點(diǎn)間采用Nwrite命令和Nread命令通信,這就不能滿足系統(tǒng)要求。因此本文借助Linux字符設(shè)備的驅(qū)動(dòng)框架,將Tsi721芯片實(shí)現(xiàn)的RapidIO節(jié)點(diǎn)設(shè)計(jì)成為一個(gè)字符設(shè)備,對(duì)應(yīng)用層提供字符設(shè)備的讀寫(xiě)訪問(wèn)方式,驅(qū)動(dòng)采用全局共享存儲(chǔ)器的方式實(shí)現(xiàn)Nwrite命令和Nread命令。[4]

      Tsi721橋芯片驅(qū)動(dòng)由PCIE設(shè)備驅(qū)動(dòng)、Tsi721及RapidIO子系統(tǒng)配置及字符設(shè)備驅(qū)動(dòng)部分組成。

      2.1 Tsi721的PCIE設(shè)備驅(qū)動(dòng)

      PCIE總線是一種即插即用的總線,在Linux內(nèi)核的支持下,當(dāng)探測(cè)到設(shè)備以后能夠確定其總線號(hào)、設(shè)備號(hào)和功能號(hào)[5],然后自動(dòng)地為設(shè)備分配所需要的IO端口、內(nèi)存資源和中斷號(hào)。

      如圖3所示,驅(qū)動(dòng)作為模塊加載以后,tsi721_probe函數(shù)先根據(jù)Tsi721芯片的設(shè)備標(biāo)識(shí)Device ID(0x80A)和供應(yīng)商標(biāo)識(shí)Vendor ID(0x111D)遍歷內(nèi)核中PCIE設(shè)備鏈表,一一進(jìn)行匹配。匹配之后,從pci_device結(jié)構(gòu)中獲取內(nèi)核分配給Tsi721芯片設(shè)備的資源。然后,調(diào)用函數(shù)pci_enable_device把Tsi721配置空間的Command域的bit 0和bit 1置成1,從而達(dá)到開(kāi)啟該P(yáng)CIE設(shè)備的目的,再調(diào)用函數(shù)pci_request_regions通知內(nèi)核該設(shè)備對(duì)應(yīng)的IO端口和內(nèi)存資源已經(jīng)使用。其他的PCIE設(shè)備不能再使用這個(gè)區(qū)域。調(diào)用pci_ioremap_bar把剛剛申請(qǐng)到得物理內(nèi)存映射成為虛擬內(nèi)存以供驅(qū)動(dòng)訪問(wèn)。再根據(jù)分配的中斷號(hào)調(diào)用函數(shù)reques_irq掛載中斷服務(wù)程序,中斷服務(wù)程序處理BDMA中斷、doorbell中斷和message中斷等。

      2.2 Tsi721及RapidIO子系統(tǒng)配置

      Tsi721作為PCIE設(shè)備初始化完成以后,驅(qū)動(dòng)就可以通過(guò)PCIE的配置空間訪問(wèn)Tsi721芯片內(nèi)部的寄存器,以完成芯片的其他初始化工作。如圖4所示,函數(shù)tsi721_init_pc2sr_mapping和tsi721_init_sr2pc_mappin實(shí)現(xiàn)PC2SR和SR2PC引擎的初始化,逐一配置8個(gè)輸出、輸入窗口。然后,驅(qū)動(dòng)調(diào)用tsi721_bdma_maint_init初始化塊DMA通道,申請(qǐng)DMA緩存為每個(gè)通道建立鏈?zhǔn)矫枋龇糜诰S護(hù)包的讀寫(xiě)訪問(wèn)。tsi721_doorbell_init函數(shù)使能輸入doorbell的接收,建立doorbell接收緩存隊(duì)列。函數(shù)tsi721_messages_init配置消息請(qǐng)求和相應(yīng)的超時(shí)時(shí)間,清除上電中斷標(biāo)志位及狀態(tài)位。tsi721_setup_mport函數(shù)向RapidIO子系統(tǒng)注冊(cè)Tsi721作為RapidIO網(wǎng)絡(luò)的管理端口。函數(shù)rio_request_inb_dbell注冊(cè)doorbell的回調(diào)函數(shù),用于收到doorbell之后的處理。驅(qū)動(dòng)最后調(diào)用函數(shù)rio_map_inb_region映射dma_alloc_coherent申請(qǐng)的DMA緩存區(qū)到RapidIO子系統(tǒng),用于全局共享存儲(chǔ)器的方式實(shí)現(xiàn)Nwrite命令和Nread命令。

      2.3 Tsi721字符設(shè)備驅(qū)動(dòng)

      Linux系統(tǒng)字符設(shè)備是能夠像字節(jié)流一樣被訪問(wèn)的設(shè)備,即對(duì)數(shù)據(jù)的讀寫(xiě)是以字節(jié)為單位的,應(yīng)用程序通過(guò)字符設(shè)備文件(比如/dev/xyz)來(lái)訪問(wèn)對(duì)應(yīng)的硬件設(shè)備。[6]Tsi721字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)包括字符設(shè)備初始化及文件操作函數(shù)(open、close、read、write 等標(biāo)準(zhǔn)系統(tǒng)調(diào)用)的實(shí)現(xiàn)。

      Tsi721字符設(shè)備的初始化步驟如5所示。先調(diào)用cdev_init函數(shù)初始化一個(gè)字符設(shè)備tsi721_cdev,并注冊(cè)其操作函數(shù)結(jié)構(gòu)體tsi721_file_operations,然后調(diào)用alloc_chrdev_region為該字符設(shè)備動(dòng)態(tài)分配“主設(shè)備號(hào)”和“次設(shè)備號(hào)”,再調(diào)用cdev_add函數(shù)向內(nèi)核中增加該字符設(shè)備tsi721_cdev,驅(qū)動(dòng)最后調(diào)用class_create( )函數(shù)和device_create( )函數(shù),在sysfs中注冊(cè)該字符設(shè)備自己的class以及在/dev目錄下創(chuàng)建一個(gè)tsi721的設(shè)備文件,當(dāng)系統(tǒng)啟動(dòng)時(shí)udev能自動(dòng)產(chǎn)生相應(yīng)的設(shè)備節(jié)點(diǎn)/dev/tsi721_rio。驅(qū)動(dòng)中實(shí)現(xiàn)的字符設(shè)備文件操作函數(shù)如圖6所示。

      (1) tsi721_dev_read讀函數(shù)

      static ssize_t tsi721_dev_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)

      當(dāng)二次雷達(dá)系統(tǒng)中信號(hào)處理模塊、信息處理模塊或綜控模塊通過(guò)RapidIO寫(xiě)入數(shù)據(jù)到顯控終端的內(nèi)存中后,通過(guò)“門鈴”消息機(jī)制通知顯控終端,驅(qū)動(dòng)程序從本地內(nèi)存中讀取數(shù)據(jù),然后調(diào)用copy_to_user( )將size個(gè)內(nèi)核數(shù)據(jù)復(fù)制到用戶空間buf中。

      (2) tsi721_dev_write讀函數(shù)

      static ssize_t tsi721_dev_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)

      驅(qū)動(dòng)程序調(diào)用copy_from_user( )從用戶空間buf中將size個(gè)數(shù)據(jù)拷貝到內(nèi)核地址空間,然后調(diào)用tsi721_nwrite( )函數(shù)啟動(dòng)BDMA向其他RapidIO節(jié)點(diǎn)的內(nèi)存中寫(xiě)入數(shù)據(jù)。

      (3) tsi721_dev_open函數(shù)

      static int tsi721_dev_open(struct inode *inode, struct file *filp)

      設(shè)備打開(kāi)函數(shù),該函數(shù)主要實(shí)現(xiàn)獲取設(shè)備資源信息。

      (4) tsi721_dev_ioctl函數(shù)

      static long tsi721_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

      該函數(shù)提供設(shè)備相關(guān)控制命令的實(shí)現(xiàn),如命令RIO_LC_WRITE(本地配置寫(xiě)Tsi721寄存器)、RIO_LC_READ(本地配置讀Tsi721寄存器)、RIO_DBELL_TX(門鈴發(fā)送)、RIO_DBELL_RX(門鈴接收)、RIO_LOCAL_ID_SET(本地RapidO節(jié)點(diǎn)ID設(shè)置)。

      (5) tsi721_dev_release函數(shù)

      static int tsi721_dev_release(struct inode *inode, struct file *filp)

      設(shè)備釋放函數(shù),該函數(shù)釋放注冊(cè)的中斷資源等。

      (6) 驅(qū)動(dòng)測(cè)試

      Tsi721驅(qū)動(dòng)以內(nèi)核模塊的形式編譯及加載[7],以方便對(duì)驅(qū)動(dòng)程序的修改和測(cè)試,最后為該驅(qū)動(dòng)程序編寫(xiě)1個(gè)簡(jiǎn)單的Makefile文件:

      obj-m=tsi721.o

      KVERSION=$(shell uname-r)

      all:

      make-C/lib/modules/$(KVERSION)/build M=$(PWD) modules

      clean:

      make-C/lib/modules/$(KVERSION)/build M=$(PWD) clean

      在控制臺(tái)窗口使用insmod tsi721.ko命令將裝載該驅(qū)動(dòng)。

      3 驅(qū)動(dòng)性能測(cè)試

      測(cè)試平臺(tái)見(jiàn)圖2。RapidIO網(wǎng)絡(luò)的速率為2.5 GHz,物理連接方式為x1。顯控終端分別安裝windows 7操作系統(tǒng)和基于Linux內(nèi)核的Centos 7操作系統(tǒng)。windows平臺(tái)下Tsi721的驅(qū)動(dòng)由芯片廠家IDT公司提供。Centos平臺(tái)下驅(qū)動(dòng)由自己開(kāi)發(fā),分別測(cè)試在不同操作系統(tǒng)平臺(tái)下RapidIO網(wǎng)絡(luò)的通信速率。

      模塊間通信速率主要取決于Tsi721芯片的BDMA傳輸速度及內(nèi)存讀寫(xiě)速度,二者均受到硬件條件限制。測(cè)試用數(shù)據(jù)包大小分別設(shè)置為4、8、16、32、64、128、256、512 KB和1 MB。測(cè)試流程如圖7所示。顯控終端使用Nwrite命令類型發(fā)送數(shù)據(jù),經(jīng)過(guò)交換模塊寫(xiě)入綜控模塊的內(nèi)存中。寫(xiě)入數(shù)據(jù)前后分別記錄當(dāng)前的系統(tǒng)時(shí)間,然后根據(jù)時(shí)間和數(shù)據(jù)包大小計(jì)算出寫(xiě)速率。使用Nread命令類型從綜控模塊的內(nèi)存中讀取數(shù)據(jù),讀取數(shù)據(jù)前后分別記錄當(dāng)前的系統(tǒng)時(shí)間,然后根據(jù)時(shí)間和數(shù)據(jù)包大小計(jì)算出讀速率。測(cè)試結(jié)果見(jiàn)表1。從表1可以看出,基于Linux內(nèi)核的顯控終端通信速率遠(yuǎn)高于基于windows系統(tǒng)的顯控終端。

      表1 通信速率對(duì)比結(jié)果 (MByte/s)

      4 結(jié)束語(yǔ)

      經(jīng)過(guò)測(cè)試,基于Linux系統(tǒng)開(kāi)發(fā)的Tsi721橋芯片驅(qū)動(dòng)程序?qū)崿F(xiàn)了RapidIO通信的主要功能,通信速率相比windows系統(tǒng)下有明顯提升。該驅(qū)動(dòng)程序已經(jīng)成功應(yīng)用于某型號(hào)二次雷達(dá)顯示終端中,取得了良好的經(jīng)濟(jì)、社會(huì)效益。X86+Linux的構(gòu)架為各種嵌入式顯示應(yīng)用提供了一個(gè)友好的開(kāi)發(fā)平臺(tái)。本文基于模塊化開(kāi)發(fā)的驅(qū)動(dòng)程序可以廣泛應(yīng)用于其他基于Linux內(nèi)核的X86平臺(tái)上。

      猜你喜歡
      驅(qū)動(dòng)程序字符內(nèi)核
      萬(wàn)物皆可IP的時(shí)代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
      尋找更強(qiáng)的字符映射管理器
      強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
      字符代表幾
      一種USB接口字符液晶控制器設(shè)計(jì)
      電子制作(2019年19期)2019-11-23 08:41:50
      基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
      Linux內(nèi)核mmap保護(hù)機(jī)制研究
      消失的殖民村莊和神秘字符
      驅(qū)動(dòng)程序更新與推薦
      驅(qū)動(dòng)程序更新與推薦
      宜良县| 尖扎县| 嘉荫县| 巴南区| 抚顺市| 三门县| 环江| 逊克县| 英德市| 鹰潭市| 威宁| 安泽县| 郓城县| 马尔康县| 榆中县| 海安县| 钟山县| 民勤县| 西乌| 环江| 霞浦县| 临颍县| 赤壁市| 茶陵县| 威远县| 瑞丽市| 北川| 新建县| 广饶县| 东山县| 三门峡市| 鄄城县| 曲靖市| 道真| 大洼县| 关岭| 灵丘县| 泊头市| 神农架林区| 定陶县| 莲花县|