文/劉旸
現(xiàn)代社會(huì)對(duì)嵌入式雙核系統(tǒng)的需求越來(lái)越大,同時(shí)Linux的巨大優(yōu)勢(shì)使得它在嵌入式領(lǐng)域的應(yīng)用備受關(guān)注。本文中的硬件平臺(tái)采用國(guó)產(chǎn)CCFC9000PA(一下簡(jiǎn)稱C9000)嵌入式微處理器和JXCSX95T(以下簡(jiǎn)稱95T)FPGA芯片,在嵌入式Linux系統(tǒng)下設(shè)計(jì)并實(shí)現(xiàn)了CPU與FPGA之間的硬件接口以及相應(yīng)的驅(qū)動(dòng)程序、測(cè)試程序,完整地實(shí)現(xiàn)并驗(yàn)證了該雙核通信接口的設(shè)計(jì)。
C9000處理器有一個(gè)外部總線控制模塊即External Bus Controlloer(EBC控制器)。CPU通過(guò)此存儲(chǔ)控制器與外部設(shè)備進(jìn)行數(shù)據(jù)的傳輸。目前能支持的外部設(shè)備包括ROM、EPROM、SRAM、Flash等。因此CPU可以經(jīng)過(guò)EBC總線控制器與95T內(nèi)部的RAM進(jìn)行數(shù)據(jù)傳輸。C9000與95T的硬件電路如圖1所示。
C9000通過(guò)外部總線與95T進(jìn)行數(shù)據(jù)通信,即CPU發(fā)出相應(yīng)的使能信號(hào)、讀寫(xiě)信號(hào)以及地址信號(hào),然后通過(guò)16位數(shù)據(jù)總線實(shí)現(xiàn)與FPGA內(nèi)部SRAM的讀寫(xiě)交互。另外,當(dāng)95T有數(shù)據(jù)需要上報(bào)到C9000時(shí),95T將產(chǎn)生中斷通知C9000,C9000收到此中斷后,發(fā)起對(duì)95T的讀操作??刂菩盘?hào)說(shuō)明如表1所示。
表1:控制信號(hào)說(shuō)明
圖1:C9000與95T的硬件連接
圖2:驅(qū)動(dòng)主要流程
圖4:測(cè)試結(jié)果
在本系統(tǒng)中的軟件設(shè)計(jì)主要是Linux下的FPGA設(shè)備驅(qū)動(dòng)程序。在 Linux下,設(shè)備驅(qū)動(dòng)程序位于應(yīng)用程序和硬件之間,為二者傳遞數(shù)據(jù)、消息等。Linux應(yīng)用程序可以通過(guò)設(shè)備驅(qū)動(dòng),把硬件設(shè)備當(dāng)成一個(gè)普通文件進(jìn)行操作。本驅(qū)動(dòng)的主要功能有:
(1)注冊(cè)FPGA設(shè)備、申請(qǐng)中斷等;
(2)接收并處理來(lái)自FPGA的中斷信號(hào),然后接收FPGA發(fā)送來(lái)的數(shù)據(jù);
(3)將CPU側(cè)的數(shù)據(jù)寫(xiě)入FPGA內(nèi)部RAM,即發(fā)送數(shù)據(jù)到FPGA設(shè)備。
驅(qū)動(dòng)主要流程如圖2所示。
在Linux內(nèi)核中,file_operations結(jié)構(gòu)體是字符設(shè)備驅(qū)動(dòng)的操作接口。本系統(tǒng)中的文件操作結(jié)構(gòu)體定義如下:struct fi le_operations FPGA_fops = {
open主要用于提供驅(qū)動(dòng)初始化,首先調(diào)用ioremap(addr,size)把95T的內(nèi)部RAM映射到一個(gè)驅(qū)動(dòng)程序可以訪問(wèn)的虛擬地址上 去:fpga_base=ioremap (FPGA_PHY_START,FPGA_PHY_SIZE)。其次,在打開(kāi)設(shè)備時(shí)通過(guò)request_irq(GPIO_IRQ,FPGA_ISR,0,DEV_NAME,NULL)申請(qǐng)95T發(fā)送來(lái)的中斷。close執(zhí)行與open相反的操作。
在通過(guò)ioremap將95T內(nèi)部RAM的物理地址映射成Linux虛擬地址后,驅(qū)動(dòng)模塊就可以通過(guò)標(biāo)準(zhǔn)的讀寫(xiě)函數(shù)訪問(wèn)95T內(nèi)部RAM了。讀寫(xiě)函數(shù)原型如下:
unsinged int readw(void *address);
void writew(unsinged int data,void*address);
當(dāng)應(yīng)用程序通過(guò)read函數(shù)調(diào)用驅(qū)動(dòng)中的FPGA_read時(shí),如果FPGA設(shè)備暫無(wú)數(shù)據(jù)可供CPU讀取時(shí),進(jìn)程進(jìn)入休眠。如果95T有數(shù)據(jù)需要上報(bào)C9000,95T將通過(guò)下降沿中斷通知C9000可以進(jìn)行讀操作了,open函數(shù)中注冊(cè)的中斷程序FPGA_ISR會(huì)接收此中斷,完成讀操作。讀操作主要通過(guò)調(diào)用readw和copy_to_user將讀取到的數(shù)據(jù)從內(nèi)核空間傳入用戶空間,完成應(yīng)用層的讀操作。寫(xiě)操作與讀操作類似,不再重復(fù)。
測(cè)試方案如圖3所示:測(cè)試程序使用pthread_create系統(tǒng)函數(shù)創(chuàng)建讀寫(xiě)子線程,讀線程負(fù)責(zé)接收來(lái)自95T的數(shù)據(jù);同時(shí),寫(xiě)線程向95T發(fā)送數(shù)據(jù)。如果接受和發(fā)送的數(shù)據(jù)一致,則測(cè)試通過(guò)。測(cè)試結(jié)果如圖4所示。
隨著現(xiàn)代半導(dǎo)體產(chǎn)業(yè)的發(fā)展,嵌入式雙核系統(tǒng)必將迎來(lái)廣闊的發(fā)展。本文系統(tǒng)地介紹了一種CPU和 FPGA雙核通信接口的設(shè)計(jì)方案,實(shí)現(xiàn)并驗(yàn)證了數(shù)據(jù)的雙向傳輸。