S04_CH01_搭建工程移植LINUX/測試EMMC/VGA


S04_CH01_搭建工程移植LINUX/測試EMMC/VGA

1.1概述:

本章內容是在已經提供安裝了VIVADO2015.4 的ubuntu系統下,進行。大家可以下周我們已經提供的虛擬機鏡像,我們提供的虛擬機鏡像是安裝了VIVADO的ubuntu系統,系統版本是ubuntu14.04。

主要完成的內容如下:

1)、利用VIVADO搭建VDMA Frambuffer 工程 修改VTG IP模塊 支持1024X600分辨率(主要考慮支持7寸HDMI液晶顯示器)

2)、產生FSBL文件

3)、環境變量的批量設置

4)、基於linux kernel部分zynq_zed.dts(miz702n需要使用到)/zynq_zybo(miz701n需要使用到) 修改設備樹

5)、修改kernel其他文件

6)、通過menuconfig 向導配置 frambuffer驅動

7)、編譯kernel、編譯uboot

8)、測試顯示器輸出和串口打印信息

9)、測試讀EMMC內存、寫EMMC內存、讀寫EMMC內存

10)、測試frambuffer應用程序

1.2 LINUX開發環境搭建

1.2.1虛擬機環境配置(提供下載虛擬機已經完成)

Step1:

本例程的工作環境(包括 FPGA及嵌入式 Linux的開發)是在 ubuntu14.04 操作系統下完成,對於 其它 Linux操作系統可能需要解決相關包的依賴問題。

Step2:

例子放在/mnt/workspace/linux目錄下,讀者可以在該目錄下正確編譯、運行。而 /mnt/workspace/linux目錄是為讀者實驗准備的。

Step3:

單擊桌面上的控制台或者(ctrl+alt+T)即可打開命令行,然后輸入 su,根據提示輸入root密碼即可切換到 root用 戶。

Step4:

對於新安裝的ubuntu操作系統需要命令行下運行一下scripts目錄下的 fix_xilinx_deps.sh腳本, 該腳本主要是解決編譯 u-boot、kernel源碼等所需要的包依賴。而提供的虛擬機已經解決了這些問題。 # /mnt/workspace/linux/scripts/fix_xilinx_deps.sh

注意:開機的時候可能系統會提示正在檢查更新(如 ),此時可以打開圖 示的有個勾的那個圖標,然后點擊 Install Updates,待其完成更新后再運行該腳本(如下圖所示)。當 然,在平時的開發過程中,可以在打開虛擬機之前,禁止網絡功能,提供的虛擬機已經禁止了。

Step5:

對於 Vivado開發工具的安裝,將下載的壓縮包解壓后,從命令行進入該目錄,執行 xsetup即可像在 Windows一樣安裝。注意:為減少虛擬機所占用硬盤空間,虛擬機里提供的開發套件是直接將本人PC中安裝好的 Vivado和 SDK等復制到/mnt/workspace/toolchains目錄中的,這里不提供全新安裝 Vivado的步驟,若需要幫助的話,可以通過郵件聯系我。

Step6:

本開發使用的是 Vivado開發套件里提供的交叉編譯器,無須再安裝其它交叉編譯器。 Step7:

整個開發過程主要使用腳本進行操作,故在每次開發前,需要執行如下圖所示操作來設置好環境變量。如果需要支持新的開發板時,只需要建立新的目錄(如 miz702等),然后把 scripts復制到新的目 錄中,修改相關設置(如 uboot版本等),十分方便。

1.2.2下載資源

使用 get_xilinx_sources.sh腳本下載 uboot、kernel、device tree等源碼及 ramdisk到 packages目錄中,並 解壓 uboot和 kernel等源碼。若需要更改源碼的版本,則打開 get_xilinx_sources.sh文件后,修改相應的 設置即可。當網絡不是很好時,可以直接壓縮包目錄中的包復制到 packages目錄下即可。

1.3 VIVADO 工程的搭建

計 FPGA 這部分相信讀者已經相當熟悉了,這里只是對工程里的一些關鍵地方進行說明。在命令行下切換到/mnt/workspace/MIZ702N(工程目錄讀者可以自己指定)目錄下,通過輸入 vivado即可打開 vivado工具。

此工程可以在WINDOWS或者LINUX下使用。建議初學者WINDOWS下使用。

1.3.1 VIVADO 硬件工程構架

MIZ701N

wps35F0.tmp

MIZ702/MIZ702N

wps3620.tmp

1.3.2 時鍾設置

Step1: 雙擊ZYNQ CPU IP 進行如下步驟設置:MIZ702和MIZ702N的輸入時鍾是333.333333MHZ

wps3630.tmp

Step2:MIZ701N PS的輸入時鍾是50MHZ

wps3631.tmp

Step3:PS的PLL提供本系統的時鍾100MHZ

wps3632.tmp

Step4:MIZ702的開發板采用的是單片256MB的MT41K128M16JI-125

wps3633.tmp

Step5:MIZ701N和MIZ702N的內存型號一樣,都是單片512MB的MT41K256M16RE-125

wps3644.tmp

Step6:啟動1路HP接口,HP接口是ZYNQ個高速數據接口

wps3645.tmp

Step7:勾選PL到PS的中斷資源(關於中斷,在第二季的課程中有詳細講解,不熟悉的讀者可以到第二季課程中溫習一下)

wps3646.tmp

Step8:增加必要的外設,包括ENET0以太網接口、USB_0 USB接口、SD0 TF卡接口、SD1 EMMC接口、UART1串口。

wps3657.tmp

Step9:設置完成后單擊OK

Step10:雙擊VDMA IP 由於只使用了VDMA讀通道設置如下:

wps3658.tmp

Step11:雙擊PLL時鍾IP

MIZ701N PLL時鍾設置

wps3659.tmp

MIZ702/MIZ702N PLL時鍾設置

wps365A.tmp

Step13:修改VTC 顯示時序發生IP參數符合1024X600分辨率

wps366A.tmp

1.4 PS設置

1.4.1 PS SDK測試顯示器輸出

新建Display_VMDA_Test空的工程,為了測試在裸機下圖形系統顯示正確,編寫SDK測試代碼main.c函數以及其他必要函數。

/*

*南京米聯電子科技有限公司

*www.milinker.com

*www.osrc.cn

*test display

Copyright (c) 2009-2012 Xilinx, Inc.  All rights reserved.

*/

#include "xaxivdma.h"

#include "xaxivdma_i.h"

#include "sleep.h"

#define DDR_BASEADDR        0x00000000

#define VDMA_BASEADDR       XPAR_AXI_VDMA_0_BASEADDR

#define H_STRIDE            1024

#define H_ACTIVE            1024

#define V_ACTIVE            600

#define pi 3.14159265358

#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ)/64

#define VIDEO_LENGTH  (H_STRIDE*V_ACTIVE)

#define VIDEO_BASEADDR0 DDR_BASEADDR + 0x2000000

#define VIDEO_BASEADDR1 DDR_BASEADDR + 0x3000000

#define VIDEO_BASEADDR2 DDR_BASEADDR + 0x4000000

u32 *BufferPtr[3];

unsigned int srcBuffer = (XPAR_PS7_DDR_0_S_AXI_BASEADDR  + 0x1000000);

int run_triple_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize,

int vsize, int buf_base_addr, int number_frame_count,

int enable_frm_cnt_intr);

//函數聲明

void Xil_DCacheFlush(void);

// 所有數據格式 為 RGBA,低位的透明度暫不起作用

extern const unsigned char gImage_beauty[1729536];

extern const unsigned char gImage_mm[1228800];

extern const unsigned char gImage_miz702[600000];

extern const unsigned char gImage_miz702_rgba[600000];

void show_img(u32 x, u32 y, u32 disp_base_addr, const unsigned char * addr, u32 size_x, u32 size_y)

{

//計算圖片 左上角坐標

u32 i=0;

u32 j=0;

u32 r,g,b;

u32 start_addr=disp_base_addr;

start_addr = disp_base_addr + 4*x + y*4*H_STRIDE;

for(j=0;j<size_y;j++)

{

for(i=0;i<size_x;i++)

{

b = *(addr+(i+j*size_x)*4+1);

g = *(addr+(i+j*size_x)*4+2);

r = *(addr+(i+j*size_x)*4+3);

Xil_Out32((start_addr+(i+j*H_STRIDE)*4),((r<<16)|(g<<8)|(b<<0)|0x0));

}

}

Xil_DCacheFlush();

}

int main(void)

{

u32 i;

//Xil_DCacheFlush();

xil_printf("Starting the first VDMA \n\r");

//VDMA configurateAXI VDMA0

/*****************往DDR寫數據設置**********************/

//Xil_Out32((VDMA_BASEADDR + 0x030), 0x00000003);// enable circular mode

//Xil_Out32((VDMA_BASEADDR + 0x0AC), VIDEO_BASEADDR0); // start address

//Xil_Out32((VDMA_BASEADDR + 0x0B0), VIDEO_BASEADDR1); // start address

//Xil_Out32((VDMA_BASEADDR + 0x0B4), VIDEO_BASEADDR2); // start address

//Xil_Out32((VDMA_BASEADDR + 0x0A8), (H_STRIDE*4)); // h offset (640 * 4) bytes

//Xil_Out32((VDMA_BASEADDR + 0x0A4), (H_ACTIVE*4)); // h size (640 * 4) bytes

//Xil_Out32((VDMA_BASEADDR + 0x0A0), V_ACTIVE); // v size (480)

/*****************從DDR讀數據設置**********************/

Xil_Out32((VDMA_BASEADDR + 0x000), 0x00000003); // enable circular mode

Xil_Out32((VDMA_BASEADDR + 0x05c), VIDEO_BASEADDR0); // start address

Xil_Out32((VDMA_BASEADDR + 0x060), VIDEO_BASEADDR0); // start address

Xil_Out32((VDMA_BASEADDR + 0x064), VIDEO_BASEADDR0); // start address

Xil_Out32((VDMA_BASEADDR + 0x058), (H_STRIDE*4)); // h offset (640 * 4) bytes

Xil_Out32((VDMA_BASEADDR + 0x054), (H_ACTIVE*4)); // h size (640 * 4) bytes

Xil_Out32((VDMA_BASEADDR + 0x050), V_ACTIVE); // v size (480)

    for(i=0;i<614400;i++)

    {

Xil_Out32(VIDEO_BASEADDR0+i,0);

    }

while(1)

{

show_img(0,0,VIDEO_BASEADDR0,&gImage_beauty[0],563,600);

sleep(5);

show_img(0,0,VIDEO_BASEADDR0,&gImage_miz702_rgba[0],375,400);

sleep(5);

}

    return 0;

}

1.4.2測試效果 缺圖
1.4.3 新建FSBL工程

產生的fsbl.elf 后面將用於參數BOOT.BIN文件

wps366B.tmp

1.4.4產生設備樹

Step1:首先解壓 device-tree-xlnx-xilinx-v2015.4.tar.gz,然后打開 Xilinx Tools→Repositories將剛 才解壓的目錄包含進來。

wps367C.tmp

wps367D.tmp

Step2:打開 File→New→Board Support Package創建,其它彈出窗口按默認設置即可

wps367E.tmp

Step3:在該工程中,zynq-7000.dtsi文件是 Xilinx提供給所有 zynq-7000開發板使用的,只所有的 status都 設置為”disabled”,而 system.dts里根據板子上的具體實現,修改設備樹使其可以正常工作。pl.dtsi文件 是 FPGA里使用的 IP對應的設備樹。

1.5編譯 u-boot、kernel、設備樹和文件系統

1.5.1批處理文件

這里使用 xilinx在 github上提供的 u-boot和 kernel源碼,在 Wiki上提供的文件系統(當然,也可以直 接使用 buildroot自己匹配根文件系統,該方法簡單快捷,不用再去解決什么依賴問題,但好像國內很 少有人這么干,他們都把 busybox等模塊一個個搭建起來)。 1、配置 uboot和編譯 uboot自帶的工具,為編譯 kernel提供 mkimage工具的支持。注意,由於編譯新 版本的 uboot需要 openssl和 dtc的支持,這里呢,在系統里已經安裝好了 openssl,而 dtc則利用 kernel 里自帶的,所以這一步做完,我們將直接編譯內核,等編譯完內核后再來編譯 uboot。注意: cfg_bootloader.sh可以在任意目錄下使用,而 make tools只能在 bootloader目錄下使用,bootloader就是 我們存放 uboot源碼的地方。(注意:這部分僅在恢復配置文件至 Xilinx提供的配置時用,在自己修改完配置之后,除了需要恢復配置文件外,請謹慎使用這兩條命令) 。

Step1:運行setup_env.sh批處理文件(管理員模式下的密碼為root)

wps367F.tmp

Step2:運行cfg_bootloader.sh批處理文件

wps368F.tmp

Step2:運行make tools處理命令(執行的是清理工作,重置配置時候使用)

wps3690.tmp

Step3:配置內核(注意:這部分僅在恢復配置文件至 Xilinx提供的配置時用,在自己修改完配置之后,除了需要恢復配 置文件外,請謹慎使用這條命令)

wps3691.tmp

1.5.2 修改設備樹

Step1:由於各種開發板可以參考zedboard的配置設備參數,因此我們可以修改已經存在的相關文件,來滿足我們的自定義需求打開/mnt/workspace/linux/kernel/arch/arm/boot/dts/zynq-zed.dts

Step2:修改 bootargs信息 啟動參數 bootargs是傳遞給 kernel的參數。Console是一個輸出系統管理信息的文本輸出設備,這些信 息來自於內核,系統啟動和系統用戶,其中 console=ttyPS0,115200用來設置串口作為輸出終端設備,是 這些信息可以通過串口在遠程的終端上顯示。而 console=tty0則是設置顯示器作為輸出終端。

如果想屏幕永不休眠,則在啟動參數 bootargs中增加  consoleblank=0,網絡上大部分是講修改內核源碼, 但我覺得這種方法才是最方便,且符合一個內核適合多種產品的思想。 其它參數讀者應該也知道是什么意思,這里也就不多講了。

wps36A2.tmp

Step3:添加 vdma和 framebuffer設備樹節點,注意:這里是添加到根節點。筆者覺得,arm linux引進設備樹,比以前版本的做法好很多,只是驅動里需要設備樹提供哪些參數, 在 Linux文檔里沒有很好的說明,或者是驅動里所需要的參數改變了,而文檔又沒有及時更新,這部分 是 linux的不足之處。所以,開發 Linux過程中,最好還是以源碼為中心。設備樹這部分是參考之前在 SDK里產生的設備樹和內核里相關文檔,在閱讀 vdma等驅動源碼后,修改而來的,並不是說 SDK里 產生的設備樹直接搬來就可以正常使用。

wps36A3.tmp

Step4:修改 SD卡和 emmc設備樹節點

這部分直接將之前在 SDK里產生的設備樹復制過來就可以正常使用。總的來說,對於 PS的外設,其 硬件是固定的,驅動也基本不會有太大的變化,故基本上是可以直接搬來就可以用,但也有例外,如果 USB,SDK里並不知道你要當 host或者 otg來使用,所以需要做些小修改。而對於 PL中使用的 IP,其 硬件和驅動經常有變化,SDK里產生的設備樹不能直接拿來使用。

wps36A4.tmp

1.5.3 添加 framebuffer驅動

Step1:把vdmafb.c文件復制到 /mnt/workspace/linux/kernel/drivers/video/fbdev 目錄下,對於驅動這部分,主要還是要看源碼,注意, 該驅動僅支持 640x480分辨率,若需要支持其它分辨率,需要修改和調試相關源碼。

Step2:打開/mnt/workspace/linux/kernel/drivers/video/fbdev目錄下的 Makefile文件,當然也可以用其它 文本編輯器。

找到 CONFIG_FB_XILINX,在其下方添加 obj-$(CONFIG_FB_VDMA)+= vdmafb.o。讀者可以直接復制筆者提供的開發包中的修改好的文件。

wps36A5.tmp

Step3:打開/mnt/workspace/linux/kernel/drivers/video/fbdev目錄下的 Kconfig文件:

找到 FB_XILINX,在其下方添加以下信息。讀者可以直接復制筆者提供的開發包中的修改好的文件。

wps36B6.tmp

Step4:打開/mnt/workspace/linux/kernel/drivers目錄下的 Makefile文件,找到 obj-y += video/ 讀者可以直接復制筆者提供的開發包中的修改好的文件。

wps36B7.tmp

把它剪切並粘貼到

wps36B8.tmp

Step5:回到 kernel目錄下,執行 make menuconfig,配置 kernel。

wps36C8.tmp

按向下方向鍵找到 Device Drivers,按回車鍵進入

wps36C9.tmp

按向下方向鍵找到 Graphics support,按回車鍵進入

wps36CA.tmp

按向下方向鍵找到 Bootup logo,按空格鍵選擇

wps36CB.tmp

按向上方向鍵找到 Frame buffer Devices,按回車鍵選擇

wps36DC.tmp

至此已經完成 linux kernel的配置,按向左方向鍵至<Exit>,再按回車鍵返回上一級菜單

wps36DD.tmp

直到看到以下窗口,按<Yes>保存。

wps36DE.tmp

1.5.4執行mk_kernel.sh編譯內核

wps36EE.tmp

1.5.5執行mk_bootloader.sh編譯uboot

wps36EF.tmp

1.5.6制作UBOOT.BIN

Step1:把system_wrapper.bit 和 fsbl.elf復制到 output/target/目錄下。

Step2:執行mk_sd_image.sh打包從 SD啟動所需要的文件

wps36F0.tmp

Step3:至此系統部分已經完成,復制linux/image/sd_images文件下文件到TF卡測試移植好的LINUX系統。

wps36F1.tmp

1.6 EMMC 8GB內存測試(MIZ702不支持)

Step1:從系統的啟動信息可以看到,系統已經發現 mmc0(即 SD卡)和 mmc1(即 emmc),而且列出了 SD 卡為 7.41GB,而 emmc為 7.20GB

wps3702.tmp

Step2:給 eMMC分區 當然,如果只分為一個分區的話,其它也可以不分區。在命令行下運行 fdisk /dev/mmcblk1來對 emmc 進行分區。這里需要注意,確認有沒有 SD卡插入,也就是說確認當前 eMMC是/dev/mmcblk1還是 /dev/mmcblk0,還有對於有多個分區的,可能存在/dev/mmcblk0p1、/dev/mmcblk0p2等等。

wps3703.tmp

Step3:將分區格式化為 ext2格式 能格式化為什么格式,如 ext2、ext3、nfts、fat32,這些都跟系統的定制有關

wps3704.tmp

Step4:測試 emmc的性能

在 Linux下,既可以使用 dd命令來低格 U盤等,也可以用來復制文件(類似於 windows下的 ghost功 能),當然也可以用來測試硬盤等的性能,雖然沒有專業軟件的測試得准確,但用來對比性能已經足夠 了。對於/dev/zero和/dev/null兩個設備的說明,可以百度一下

Step4.1寫性能

下面使用 dd命令將從/dev/zero設備中產生一個 1GB的文件寫入到 emmc:

wps3715.tmp

Step4.2讀性能

下面使用 dd命令將 1GB的文件寫入到/dev/null設備中:

wps3716.tmp

Step4.3讀寫性能

下面使用 dd命令將 emmc中的一個 1GB的文件寫入到 emmc的另外一個文件

wps3717.tmp

1.7 測試 framebuffer

Step1:將虛擬機/mnt/workspace/linux/framebuffer目錄下的測試程序(源代碼也在該目錄里)復制到 SD 卡上,然后給開發板上電。在 Windows下打開串口終端putty

軟件。

Step2:切換到 sd卡目錄下(比如 mount /dev/mmcblk0p1 /mnt, cd /mnt),然后運行./framebuffer,在串口終端 會顯示 以下信息。

wps3718.tmp

Step3:在屏幕上會顯示以下信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM