1. 訪問(wèn)DDR3
我們使用名為DDR3-test.c的PetaLinux應(yīng)用訪問(wèn)DDR3存儲(chǔ)器。該應(yīng)用經(jīng)過(guò)精心設(shè)計(jì),可向DDR存儲(chǔ)器位置寫入數(shù)據(jù)并從這里讀取數(shù)據(jù)。DDR3是雙列直插式存儲(chǔ)器模塊,可提供用于存儲(chǔ)用戶代碼和數(shù)據(jù)的SDRAM。如上文所述,用戶需要知道DDR存儲(chǔ)器的開(kāi)始地址和結(jié)束地址,分別是0xC0000000和0xC7FFFFFF。存儲(chǔ)器的容量為512兆字節(jié)。Linux內(nèi)核駐留在DDR存儲(chǔ)器的初始存儲(chǔ)器位置。因此需要選擇DDR3存儲(chǔ)器的寫入位置,以避免破壞Linux內(nèi)核。我們使用以下命令向DDR3存儲(chǔ)器寫入數(shù)據(jù):
#DDR3-test –g 0xc7000000 –o 15
其中DDR3-test是應(yīng)用名稱、-g是DDR3存儲(chǔ)器的物理地址、-o是輸出、15是準(zhǔn)備在0xc7000000位置寫入DDR3存儲(chǔ)器的值。為測(cè)試該值是否能寫入預(yù)計(jì)的位置,我們使用以下命令從DDR3存儲(chǔ)器讀取數(shù)據(jù):
#DDR3-test –g 0xc7000000 –i
圖7:通過(guò)QEMU運(yùn)行PetaLinux
該應(yīng)用旨在控制8位離散輸出,可通過(guò)將板載LED連接至GPIO進(jìn)行測(cè)試。
值15顯示在終端上,這說(shuō)明DDR3存儲(chǔ)器讀寫操作正在成功進(jìn)行。
2. 使用/dev/mem訪問(wèn)GPIO
對(duì)于接下來(lái)的應(yīng)用測(cè)試,我們使用名為gpio-dev-mem-test.c的PetaLinux應(yīng)用訪問(wèn)了通用I/O(GPIO)。該應(yīng)用的設(shè)計(jì)目的是控制8位離散輸出并通過(guò)將板載LED連接至GPIO來(lái)測(cè)試該輸出。要從用戶空間訪問(wèn)任何設(shè)備,就要先打開(kāi)/dev/mem,然后使用mmap()將設(shè)備映射至存儲(chǔ)器。我們所使用LED GPIO的開(kāi)始地址和結(jié)束地址分別是0x40000000 和0x4fffffff。
GPIO外設(shè)具有兩個(gè)寄存器:數(shù)據(jù)寄存器(GPIO_DATA)和方向寄存器(GPIO_TRI_OFFSET)。為了讀取GPIO的狀態(tài),我們將方向位設(shè)置為1(即GPIO_TRI_OFFSET=1)并且從數(shù)據(jù)寄存器讀取數(shù)據(jù)。為了將數(shù)據(jù)寫入到GPIO,我們?cè)O(shè)置方向位為0并寫入值到數(shù)據(jù)寄存器。在PetaLinux終端上使用下列命令將數(shù)據(jù)寫入到GPIO:
#gpio-dev-mem-test –g 0x40000000 –o 255
其中g(shù)pio-dev-mem-test為應(yīng)用名稱,-g為GPIO物理地址,-o為輸出,255為從GPIO(連接到LED)發(fā)送的值。LED按編寫的程序點(diǎn)亮?xí)r,測(cè)試的結(jié)果就得到了驗(yàn)證。
3. 使用UIO訪問(wèn)GPIO
訪問(wèn)GPIO的另一個(gè)途徑是通過(guò)用戶空間輸入/輸出。我們通過(guò)UIO,使用名為gpio-uio-test.c的PetaLinux應(yīng)用訪問(wèn)了GPIO。該應(yīng)用旨在控制8位離散輸出,可通過(guò)將板載LED連接至GPIO進(jìn)行測(cè)試。UIO設(shè)備在文件系統(tǒng)中表現(xiàn)為/dev/uioX。為通過(guò)UIO訪問(wèn)GPIO,我們打開(kāi)了/dev/uioX或sys/class/ui0,然后使用了mmap()調(diào)用。我們配置了內(nèi)核使之支持UIO,并在內(nèi)核中啟用了UIO框架。隨后我們使用名為“Compatibility”的參數(shù),根據(jù)UIO設(shè)備(而非標(biāo)準(zhǔn)GPIO設(shè)備)對(duì)LED的GPIO控制方式進(jìn)行了設(shè)置。此外,我們還將
設(shè)備的標(biāo)簽從 gpio@40000000修改成了leds@40000000。
然后我們重新構(gòu)建了PetaLinux,并使用UIO測(cè)試了GPIO訪問(wèn)。我們使用以下命令,獲得了所加載UIO模塊的詳細(xì)信息:
# ls /sys/class/uio/ uio0 uio1 uio2
UIO的名稱和地址可在/sys/class/uio/uioX下找到。我們使用以下命令通過(guò)UIO驅(qū)動(dòng)程序訪問(wèn)了GPIO LED:
# cd “/sys/class/uio/uioX
# gpio-uio-test -d /dev/uio1 -o 255
其中g(shù)pio-uio-test為應(yīng)用名稱、-d為設(shè)備路徑、-o為輸出、255為通過(guò)UIO傳遞給GPIO的值。使用以上命令,LED按寫入到GPIO線路上的數(shù)據(jù)點(diǎn)亮,驗(yàn)證了該結(jié)果。
4. 文件傳輸應(yīng)用
最后一項(xiàng)測(cè)試,我們將文件從服務(wù)器傳輸?shù)搅丝蛻舳?,這里的服務(wù)器是主機(jī)PC,客戶端是KC705電路板。在這項(xiàng)測(cè)試中,我們使用以太網(wǎng)線纜連接服務(wù)器和客戶端,并使用了小型文件傳輸協(xié)議(TFTP)。這種協(xié)議因簡(jiǎn)單而出名,通常用于自動(dòng)傳輸配置文件或引導(dǎo)文件。為測(cè)試使用TFTP從服務(wù)器向客戶端傳輸文件的情況,我們?cè)?tftpboot位置為服務(wù)器PC創(chuàng)建了一個(gè)名為test的文件。我們使用以下命令在文件中寫入了“世界,你好”并查看了該文件中的內(nèi)容(如圖8所示):
@ echo “Hello World” 》 /tftpboot/test
@ more /tftpboot/test
圖8:在服務(wù)器中創(chuàng)建文件的快照
圖9:在客戶端接收文件的快照
圖10:從客戶端到服務(wù)器傳輸文件的快照
圖11:在服務(wù)器中接收文件的快照
為從服務(wù)器接收該文件,我們?cè)谝钥蛻舳朔绞竭\(yùn)行在KC705電路板上的PetaLinux終端窗口中輸入以下獲取命令(-g):
# tftp -r test -g 192.168.25.68
# ls –a
在客戶端中創(chuàng)建了一個(gè)名為“test”的新文件(如圖9所示)。我們可以使用更多內(nèi)容命令查看該文件的內(nèi)容,如圖9所示:
同樣,如果要從客戶端向服務(wù)器傳輸文件,可先在客戶端機(jī)器上創(chuàng)建一個(gè)名為test1的文件,其內(nèi)容為“PetaLinux OS”。然后在運(yùn)行在客戶端上的PetaLinux終端中使用以下“放置”命令(-p),便可將該文件從客戶端傳輸至服務(wù)器,如圖10所示:
# tftp -r test1 -p 192.168.25.68
可在服務(wù)器中創(chuàng)建一個(gè)空白文件test1,其內(nèi)容可在文件傳輸工作完成后讀取。該內(nèi)容可圖11所示方法進(jìn)行驗(yàn)證。
在FPGA上實(shí)現(xiàn)嵌入式系統(tǒng)和運(yùn)行PetaLinux,操作起來(lái)非常簡(jiǎn)單直觀。接下來(lái),我們計(jì)劃使用遠(yuǎn)程編程實(shí)現(xiàn)設(shè)計(jì),即引導(dǎo)文件通過(guò)以太網(wǎng)傳輸,客戶端能夠運(yùn)行新應(yīng)用。
評(píng)論
查看更多