ZYNQ Linux作業系統移植四個部分說明文檔

2020-12-15 電子發燒友

ZYNQ Linux作業系統移植四個部分說明文檔

Felven的博客 發表於 2020-12-14 14:59:02

一、組成
ZYNQ上面移植Linux作業系統包括四個部分,uboot,devicetree,kernel,ramdisk.

其中uboot類似於bios,負責對設備進行簡單的初始化,devicetree以樹的形式對zynq相連的硬體設備進行描述,kernel是加載的作業系統內核,ramdisk是作業系統啟動之後掛載的文件系統。

 

 

二、啟動過程
移植作業系統後zynq的啟動過程如下,首先加載bootrom(zynq中自帶,用戶無法修改),然後執行fsbl(這個根據硬體在sdk中創建),然後執行uboot,uboot會將kernel、devicetree和ramdisk載入ddr,跳轉到內核入口處執行,這樣linux就啟動了。

 

 

對bootrom、fsbl和uboot詳細描述如下。

 

 

三、uboot設置
uboot可以從xilinx 官方github上面下載,地址是:

通常uboot不需要升級,目前使用的版本為xilinx 2015年底發布的版本2015.4.不過針對不同的模塊uboot需要進行修改,主要修改下面幾個地方。

1、參考時鐘修改
地址位於arch/arm/cpu/armv7/zynq/clk.c

由於ZYNQ設計大多使用50M參考時鐘,需要更改參考時鐘

# define CONFIG_ZYNQ_PS_CLK_FREQ  33333333UL更改為

# define CONFIG_ZYNQ_PS_CLK_FREQ  50000000UL

2、串口配置修改
地址位於include/configs/zynq_zc70x.h

根據硬體串口情況進行配置

#define CONFIG_ZYNQ_SERIAL_UART1 使用串口1

#define CONFIG_ZYNQ_SERIAL_UART0 使用串口0

如果兩個串口都啟用,一起配置即可。

3、DDR配置修改
地址位於include/configs/zynq_zc70x.h

根據DDR實際大小地址修改配置參數

#define CONFIG_SYS_SDRAM_SIZE                  (1024 * 1024 * 1024) 1GB DDR

#define CONFIG_SYS_SDRAM_SIZE                  (512 * 1024 * 1024)  512MB DDR

4、PHY地址配置
地址位於include/configs/zynq_zc70x.h

根據硬體PHY地址進行配置,通常硬體會將PHY地址設置為0

#define CONFIG_ZYNQ_GEM_PHY_ADDR0   0

如果硬體啟用了兩個網卡,則需要設置兩個PHY的地址

#define CONFIG_ZYNQ_GEM0

#define CONFIG_ZYNQ_GEM_PHY_ADDR0   1

 
#define CONFIG_ZYNQ_GEM1

#define CONFIG_ZYNQ_GEM_PHY_ADDR1   18

5、啟動方式配置
地址位於include/configs/zynq_common.h

如果使用QSPI flash方式啟動,需要配置QSPI FLASH對應地址,如下。

"sf probe 0 0 0 && " /

                   "sf read 0x3000000 0x400000 ${kernel_size} && " /

                   "sf read 0x2A00000 0x900000 ${devicetree_size} && " /

                   "echo Copying ramdisk... && " /

                   "sf read 0x2000000 0x920000 ${ramdisk_size} && " /

                   "bootm 0x3000000 0x2000000 0x2A00000/0" /

6、IP位址配置
地址位於include/configs/zynq_common.h

#define CONFIG_IPADDR                  192.168.100.12 //uboot啟動時板子的IP位址

#define CONFIG_SERVERIP               192.168.100.6 //uboot啟動時能訪問的遠程伺服器地址,若採用TFTP加載,需要將本地電腦配置為該地址

7、啟動延遲設置
地址位於include/configs/zynq_common.h

#define CONFIG_BOOTDELAY          7 /* -1 to Disable autoboot */

Uboot默認延遲7s再從QSPI flash中加載作業系統,如果設置為-1表明禁止自動加載

8、初始化設置
地址位於net/eth.c  和 arch/arm/lib/board.c

Uboot中需要對5396進行初始化,同時使用GPIO對PHY或NOR FLASH等進行復位,可以在eth.c中增加代碼

void mygpio_init()

{    }

然後將Mygpio_init()加入到arch/arm/lib/board.c中

9、Uboot編譯
修改完成後,可以使用下列命令編譯產生uboot

進入u-boot文件夾

$ make distclean  //文件夾清理

$ make zynq_zc70x_config // 載入配置,通常使用zynq_zc70x.h文件

 

 

$ make

編譯完成後文件夾下會出現u-boot文件,將其修改為u-boot.elf

 

 

3、將dtsi,dts文件拷入linux系統下,使用dts工具製作devicetree.dtb文件

 

 

4、如果需要修改devicetree文件,可以通過dtc工具轉換為可讀文件dts

 

 

生成的1.dts可打開,裡面能看到zynq端的外設信息和啟用情況。通常需要修改網卡配置,如下,下例中phy地址為0

ethernet@e000b000 {

                            compatible = "xlnx,ps7-ethernet-1.00.a";

                            reg = ;

                            status = "okay";

                            interrupt-parent = ;

                            interrupts = ;

                            clocks = ;

                            clock-names = "ref_clk", "aper_clk";

                            #address-cells = ;

                            #size-cells = ;

                            enet-reset = ;

                            local-mac-address = [00 0a 35 00 00 00];

                            phy-mode = "rgmii";

                            phy-handle = ;

                            xlnx,eth-mode = ;

                            xlnx,has-mdio = ;

                            xlnx,ptp-enet-clock = ;

 

                            mdio {

                                     #address-cells = ;

                                     #size-cells = ;

 

                                     phy@0 {

                                               compatible = "marvell,88e1111";

                                               device_type = "ethernet-phy";

                                               reg = ;

                                               linux,phandle = ;

                                               phandle = ;

                                     };

                            };

                   };

當對dts修改完成後,再次使用dtc工具編譯產生devicetree.dtb即可

五、文件系統設置
文件系統一般隨zynq開發板發布,可以從prebuit中找到文件系統的tar文件

 

 

在文件系統中,如果需要添加用戶自定義的shell腳本或可執行程序,可以放在/usr/bin目錄下。如果要設置系統自啟動項,可以在/etc/rc5.d中增加shell腳本。

 

 

1、文件系統製作
當修改完rootfs後,可以通過下面命令製作uramdisk文件系統

$sh -c 'cd rootfs/ && find . | cpio -H newc -o' | gzip -9 > new_initramfs.cpio.gz

 $mkimage -A arm -T ramdisk -C gzip -d new_initramfs.cpio.gz uramdisk.image.gz

執行完畢將會得到uramdisk.image.gz

六、內核配置
內核可以從xilinx官方git下載,地址:

目前linux內核中已經集成了常見的驅動,驅動源碼位於drivers文件夾下。針對內核的修改位於 arch/arm/configs/xilinx_zynq_defconfig文件中,該文件中定義了內核所包含的驅動程序。

1、調試輸出列印
在xilinx_zynq_defconfig中,需要根據硬體設計正確配置串口列印。

CONFIG_DEBUG_LL=y

CONFIG_DEBUG_ZYNQ_UART0=y //使用串口0列印輸出

CONFIG_EARLY_PRINTK=y

2、內核編譯
修改完xilinx_zynq_defconfig後,可以使用下面命令編譯內核

$sudo //編譯內核需要運行在root權限下

$make distclean //清理文件

$make ARCH=arm xilinx_zynq_defconfig //讀取內核配置信息,即xilinx_zynq_defconfig中的內容

$make ARCH=arm menuconfig //進入內核菜單進行可視化配置,如果xilinx_zynq_defconfig中對內核配置準確時,該步驟可以省略

$make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage -j4 //編譯產生uImage

產生的文件位於arch/arm/boot文件夾內

 

 

七、常見驅動
1、I2C驅動
目前板子上都會用到I2C,首先需要知道I2C從設備的地址,如2/4/8這些.在devicetree中進行設置

 

 

編譯內核的時候加入該驅動,同時修改makefile和kconfig文件

 

 

這樣在編譯內核的時候就能看到將驅動編進內核的選項了。

 

 

 

 

2、ADC驅動
ADC為ZYNQ用來監測電壓或電流的通道,目前ZYNQ中集成了16個通道,首先需要在devicetree中設置啟用的通道,圖中啟用的是0,1,8三個通道

 

 

 

 

 

 

 

 

3、NOR FLASH驅動
NOR FLAHS驅動主要實現文件系統的掛載,這裡不需要設置devicetree,只需要在內核中添加掛載文件系統的代碼

 

 

上圖中將NOR FALSH分為2個區,大小分別為32MB和64MB,需要注意的是NOR FLASH的起始地址和容量大小設置

#defineWINDOW_ADDR 0x80000000 //和vivado裡面的emc起始地址一致

#defineWINDOW_SIZE 0x8000000 //nor flash大小

在makefile中將該驅動編譯進內核即可

 

 

4、外部中斷驅動
當zynq接收來自外部的GPIO中斷時,需要使用UIO機制及時響應中斷,首先在devicetree中模擬出四個GPIO設備

 

 

注意上面的中斷號0x1e-0x21要與硬體實際相連的中斷管腳一致。

同時在devicetree中啟用UIO機制

 

 

當作業系統啟動完成後就能看到四個外部GPIO設備產生的中斷了

 

 

八、啟動文件製作
如下圖所示,在SDK中創建boot.bin需要包含下面五個文件

Fsbl.elf

Zynq_top.bin

u-boot.elf

uImage

devicetree.dtb

uramdisk.image.gz

製作過程中需要正確配置uimage,devicetree.dtb,uramdisk.image.gz的地址,讓其與u-boot中從QSPI flash加載地址匹配

 

 

 

 

 

 

製作完成後將boot.bin通過下載電纜燒入QSPI FLASH中即可。
編輯:hfy

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • 「正點原子FPGA連載」第十八章Linux內核移植
    需要說明的是當我們使用Petalinux工具的時候是不需要移植內核的,因為Petalinux工具可以根據硬體描述文件hdf使能相應配置。本章講解內核移植(更準確的說是內核適配)是為了了解一般情況下(不使用Petalinux)的內核移植過程。通過本章的學習,我們將掌握如何將半導體廠商提供的Linux BSP包移植到我們自己的平臺上。
  • 「正點原子FPGA連載」第二十章另一種方式編譯ZYNQ鏡像
    generate_target命令去產生目標,也就是我們的設備樹文件,」 -dir /home/zynq/linux/dts」指定路徑。將前面生成的設備樹文件(筆者這裡生成的設備樹文件在/home/zynq/linux/dts目錄下)pcw.dtsi、pl.dtsi、system-top.dts以及zynq-7000.dtsi四個文件拷貝到U-Boot源碼目錄下的arch/arm/dts目錄下,拷貝過去之後進入到arch/arm/dts目錄下查看,如下所示:
  • 「正點原子FPGA連載」第十四章U-Boot移植
    我們一般做產品的時候就會參考原廠的開發板做硬體,然後在原廠提供的BSP包上做修改,將uboot或者linux kernel移植到我們的硬體上。這個就是uboot移植的一般流程:① 在uboot中找到參考的開發平臺,一般是原廠的開發板。② 參考原廠開發板移植uboot到我們所使用的開發板上。
  • ARM在嵌入式linux內核裁剪與移植的應用
    微處理器能完成取指令、執行指令,以及與外界存儲器和邏輯部件交換信息等操作,是微型計算機的運算控制部分。它可與存儲器和外圍電路晶片組成微型計算機。但這些專用作業系統都是商業化產品,其高昂的價格使許多低端產品的小公司望而卻步;而且,原始碼封閉性也大大限制了開發者的積極性。而Linux的開放性,使得許多人都認為Linux非常適合多數Intemet設備。Linux作業系統可以支持不同的設備和不同的配置。
  • linux作業系統交叉編譯環境的建立步驟
    基於linux作業系統的應用開發環境一般是由目標系統硬體(開發板)和宿主PC機所構成。目標硬體開發板用於運行作業系統和系統應用軟體,而目標板所用到的作業系統的內核編譯、應用程式的開發和調試則需要通過宿主PC機來完成(所以稱為交叉編譯)。
  • 關於ZYNQ HLS圖像處理加速總結的分享
    硬體工程概述 demo工程是在xilinx公司實習的同學給的,現在在github上也有zynq_example? 工程裡已經有了xdma的通路和一個hls矩陣運算的例子,但hls矩陣運算例子裡沒用axi-stream總線。圖像數據要通過axi-stream總線在各IP之間進行傳輸,而且這裡需要vdma進行數據搬運,相對於xdma的配置更為複雜。
  • 淺談zynq啟動,BootROM和FSBL等的執行過程
    BootROM會根據啟動模式配置MIO,還會根據讀取的boot鏡像頭信息的「寄存器初始化參數」部分配置時間優化寄存器 4.跳轉到SFBL中執行,BootROM關閉 其它說明:   •  如果已經為加密模式,經過非POR復位後,讀取BootROM頭信息檢測到一個非加密的boot,系統將會被鎖定   •  如果檢測到BootROM中有錯誤,系統也會被鎖定   •  如果為加密模式則需要等待PL上電才能繼續加載,因為解密驗證模塊(AES and HMAC
  • 嵌入式Linux學習方法 適合初學者設計學習計劃
    (2) 《嵌入式linux應用開發完全手冊》 這本書主要看介紹s3c2410接口模塊的部分,實驗裸機的時候需要硬體的知識。  3.所用時間:大約兩個月。剛開始安裝linux還是在虛擬機上安裝比較好,安裝開發板推薦的Fedora9,按照開發板配套的說明一步一步的安裝,然後在上面練習各種命令。這一階段主要要看《鳥哥的linux私房菜基礎學習篇》,這個書有電子版,也不用全看,主要是看前面對Linux基礎知識的描述,以及基本的命令。命令只是了解,那麼多記也記不下來,以後用時的再查閱。
  • 基於linux的十大作業系統排名
    基於linux的十大作業系統排名 Win7系統之家 發表於 2020-07-10 16:23:27   基於linux內核開源的特性,並隨著linux的不斷發展,各種基於
  • μClinux、μC/OS-II、eCos、FreeRTOS和djyos作業系統的特點及不足
    基於STM平臺且滿足實時控制要求作業系統,有以下5種可供移植選擇。分別為μClinux、μC/OS-II、eCos、FreeRTOS和都江堰作業系統(djyos)。本文引用地址:http://www.eepw.com.cn/article/201809/391845.htm  下面分別介紹這五種嵌入式作業系統的特點及不足。
  • freertos與linux區別
    freertos與linux區別   freeRTOS是一個實時作業系統,主要實現了任務調度、內存管理、IPC、中斷管理這幾個模塊,它要求快速的處理任務,gui、驅動框架、shell 這些都不是它的核心功能,而且大部分情況下都不會做,因為一旦freertos 運行起來之後,是不會有人工介入的,可以 google 一下什麼是實時作業系統。
  • PowerPC平臺Linux的移植(一)
    本文所寫的內容,基本上都是用於XUP大學計劃開發板的,但是其中很多步驟都是通用的,你完全可以在Xilinx ML-403開發板或者其他相應板子上參考這些步驟,它們之間最大的區別就是創建SystemACE時的命令行不同,在相應的部分會具體講解。
  • 「正點原子FPGA連載」第二十四章Linux設備樹(二)
    do_bootm_linux函數的執行流程,也就是說do_bootm_linux函數會通過一系列複雜的調用,最終通過fdt_chosen函數在內核設備樹chosen節點中添加bootargs屬性。那麼具體如何進行設備樹解析的這裡就不給大家進行一一分析了,如果大家有時間可以自個去研究研究!
  • 什麼Linux,Linux內核及Linux作業系統,整體架構介紹
    而且很多開源項目也移植到Linux之上,這樣Linux逐漸豐滿起來。慢慢的,很多公司在Linux內核的基礎上增加了開發工具和應用軟體,將Linux內核和這些用戶態的軟體打包成為一個作業系統安裝鏡像,這個系統稱為Linux作業系統,或者稱為Linux發行版。
  • 學習linux作業系統新手常犯的錯誤及要了解的知識點
    學習linux作業系統新手常犯的幾個錯誤  本文引用地址:http://www.eepw.com.cn/article/268126.htmlinux作業系統文章專題:linux作業系統詳解(linux不再難懂)
  • Linux由內核、shell、文件系統和應用程式四部分組成,帶你...
    Linux由內核、shell、文件系統和應用程式四部分組成,帶你走進嵌入式Linux系統的內部 Linux系統一般有4個主要部分: 內核、shell、文件系統和應用程式。設備驅動程序 設備驅動程序是 Linux 內核的主要部分。和作業系統的其它部分類似,設備驅動程序運行在高特權級的處理器環境中,從而可以直接對硬體進行操作,但正因為如此,任何一個設備驅動程序的錯誤都可能導致作業系統的崩潰。設備驅動程序實際控制作業系統和硬體設備之間的交互。
  • sqlite的移植
    要將或者SQLite-3.3.12移植到ARM2410開發板上,除了要有底層作業系統的支持外,還必須要有相應的交叉編譯工具鏈。由於ARM2410開發板採用的是ARM-Linux作為底層作業系統,因此需要首先安裝ARM-Linux工具鏈。
  • U-Boot在基於BF561的嵌入式Linux系統上的移植
    4 U-BOOT的移植4.1 U-Boot方法與要點 移植U-Boot簡便的方法是從U-Boot支持的開發板中選擇一個與其目標板接近的開發板進行修改。需修改的是與硬體相關的部分,涉及到兩個層面:針對CPU的移植,由於U-Boot_1.1.3支持BF561,故只需做第二層面的移植:針對目標板硬體的移植。
  • CentOS linux作業系統命令之mktemp命
    CentOS7.3學習筆記總結(七十七)-CentOS linux作業系統命令之mktemp命令在linux作業系統中mktemp命令用於創建一個臨時文件或者目錄(create a temporary file or directory)。