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閱讀更多精彩內容

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

相關焦點

  • MicroBlaze處理器的PetaLinux作業系統移植
    其核心是在FPGA上實現的嵌入式微處理器核,而如何針對特定的微處理器選擇合適的嵌入式作業系統是SOPC開發的難點之一。本文針對Xilinx公司的MicroBlaze軟核,介紹了PetaLinux嵌入式作業系統及其移植方法,研究了PetaLinux的相關配置和啟動方案。
  • Linux作業系統你真的了解嗎?
    Linux是一個開源的,由C語言編寫的作業系統。作業系統的心臟,我們稱為kernel內核。很多人可能知道Linux官方提供了一系列教程來指導你,一步一步的自己搭建作業系統內核,這不是一件難的事情但是把它完成可以提升你的自信程度,以及各種各種。
  • linux作業系統pwd的基本語法
    linux作業系統專題文章:linux作業系統詳解(linux不再難懂)『pwd'代表的是『Print Working Directory linux作業系統文章專題:linux作業系統詳解
  • linux作業系統常用命令及常用問題
    一、linux作業系統常用命令本文引用地址:http://www.eepw.com.cn/article/268125.htmlinux作業系統文章專題:
  • 華為18級工程師嘔心瀝血撰寫3000頁Linux學習筆記教程
    無論你是否相信,Linux已經成為這個世界上增長最迅速的作業系統。在伺服器領域,IBM、HP、Novell、Oracle等廠商對Linux 提供了全方位的支持。2011年排名前500的超級計算機中,92.4%(462臺)都採用了Linux作業系統。在桌面領域,Ubuntu、openSUSE等發行版本繼續高歌猛進。
  • Unix和Linux作業系統有什麼區別?
    這個小型機有1個房間那麼大。他不僅在這臺機器上開發出了作業系統內核,還將自己的遊戲重寫了一遍。現在很多年輕人都玩遊戲,但是,有多少人像他那麼執著呢?為了玩個遊戲,自己開發個系統。至於丹尼斯裡奇則是因為發明了C語言編程工具,終結了彙編編程的時代。於是在1973年,Unix系統用C語言進行重寫。是的Unix系統可移植性大大提高。
  • 雲伺服器怎麼選作業系統
    雲伺服器怎麼選作業系統?雲伺服器選作業系統,一般根據站長擅長方向來選,比如熟悉PHP語言的,優先使用Linux作業系統,熟悉ASP語言的,優先使用Windows作業系統。雲伺服器作業系統,默認提供Linux作業系統和Windows作業系統,可以根據站長擅長技術,以及需求來選擇。
  • Alibaba Cloud Linux等保2.0三級版鏡像作業系統詳解
    Alibaba Cloud Linux是阿里雲推出的Linux發行版,Alibaba Cloud Linux 2等保2.0三級版鏡像是根據《GB/T22239-2019信息安全技術網絡安全等級保護基本要求》進行等保加固的鏡像,Linux百科網(linuxbaike.com)來詳細說下
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    到作業系統系統調用層的封裝。再到tty子系統的核心。再到一系列線路規程。再到最底層的硬體操作。對Linux中的tty子系統進行簡要的說明。從理論到實踐。以便讀者能對OS原理有更深入的了解和更具體的掌握。在具體分析之前。我們必須對串口。驅動。和Linux作業系統有一定的了解。這一階段我們有三個問題需要解決:1.什麼是Linux作業系統。
  • 在 Linux 中複製文檔 | Linux 中國
    在辦公室裡複印文檔過去需要專門的員工與機器。如今,複製是電腦用戶無需多加思考的任務。在電腦裡複製數據是如此微不足道的事,以致於你還沒有意識到複製就發生了,例如當拖動文檔到外部硬碟的時候。數字實體複製起來十分簡單已是一個不爭的事實,以致於大部分現代電腦用戶從未考慮過其它的複製他們工作的方式。無論如何,在 Linux 中複製文檔仍有幾種不同的方式。
  • 華為Magicbook 筆記本為什麼會採用Deepin(深度)作業系統?
    簡單好用是Deepin(深度)作業系統是普通用戶的第一印象,是因為Deepin(深度)在可用性方面也經過精心設計,在性能、功能方面進行了優化。更加符合中國人的使用習慣,而不是普通的linux系統那樣。此外,部分國產廠商也在不斷推出適配Linux系統的版本,比如WPS、搜狗輸入法、有道、福昕等等。4、兼容安卓應用:這也是深度軟體生態的一員,目前應用商店裡不少都是移植的APP的安卓版本,相信你能在這其中看到很多熟悉的身影。
  • Linux中fdisk硬碟分區方法
    一、fdisk 的介紹本文引用地址:http://www.eepw.com.cn/article/150723.htm  fdsik 能劃分磁碟成為若干個區,同時也能為每個分區指定分區的文件系統,比如linux 、fat32、 linux
  • 「linux專欄」嘔心瀝血兩天,就為linux中安裝拼音輸入法
    說句實話,在純linux的作業系統中,是真的與虛擬機中不同的,就拿輸入法來說,就真真地把小編折騰了兩天之久。但終究是功夫不負有心人,總算是解決了這個問題。今天呢,小編就跟大家一起分享一下經驗。之前呢,小編也百度過,都說直接下載linux版本的搜狗輸入法之後,直接點擊sougoupinyin.deb的安裝文件就能直接安裝。但是,事實卻很扎心,小編的REHL8作業系統系統並不支持這樣的操作,點擊之後反而是打開了安裝包,並沒有進入安裝程序。
  • 完善軟體生態,國產Linux作業系統任道重遠
    一直以來,linux作業系統都想要打敗微軟的windows,雖然在伺服器領域出類拔萃,但在桌面領域一直不是windows的對手,其實並不是linux在操作上難用,也不是界面難看,而最重要的一個問題就是生態。
  • iOS基於unix,安卓基於linux,而國產系統基於linux就被吐槽?
    眾所周知,目前最強大的幾個作業系統分別是電腦端的windows、手機端的iOS、安卓。其中像windows壟斷了電腦中90%多的份額,而安卓則壟斷了智慧型手機中80%多的份額。當然對於國產作業系統,也有人吐槽。說怎麼能稱之為國產作業系統呢,明明就是linux套了個馬甲而來,卻說是國產作業系統了。但其實這個吐槽真是不對的,如果這麼說,那iOS系統也是unix了,而安卓也是linux了,因為這兩者都是基於這兩個內核而來的,不也是套了個馬甲麼?
  • 除了Windows、Linux和MacOS三大作業系統 還有哪些替代選擇
    忘了Windows,沒有Linux,沒有macOS:除了三大作業系統之外,真的有值得使用的桌面作業系統嗎?就讓我們一起來思考這個問題吧,雖然這裡沒有絕對明確的答案-畢竟每個人的用例都不同–但我們發現了十個不同的作業系統,它們超出了通常的範圍。
  • Linux到底怎麼個讀法?有什麼歷史淵源?
    Linux到底怎麼個讀法?有什麼歷史淵源? Linux英 ['lnks] 美 ['lnks]1、linux發音五花八門版本頗多,見到和聽到的不下10種。3、有人綜合網上和linux自己的讀音,概括出幾個自認為最合適也最通用的讀法:/li'n^ks/(「裡那克斯」)或/'li:nэks/(「裡訥克斯」)或/li'nju:ks/(「裡紐克斯」)。4、這幾個應該是誰都聽得懂的。至於哪個比較正宗,當然是linux的原音。但事實上使用linux哪種讀法的人似乎都不在少數。
  • 到底是學STM32還是學嵌入式linux?
    因為這個觀點把STM32和linux拿來對比了,然而這2個東西根本沒有可比性。 你對比這2個就好像對比自行車和小汽車,你說自行車的優勢是便宜,好修理,不堵車,不用交停車費,不耗油等等,你可以說出來自行車相對小汽車的很多優勢,然而該買小汽車的你給他個自行車行嗎?
  • unix是什麼作業系統_unix作業系統怎麼安裝
    unix是什麼作業系統   UNIX系統是一個分時作業系統。   Unix除了作為網絡作業系統之外,還可以作為單機作業系統使用。Unix作為一種開發平臺和臺式作業系統獲得了廣泛使用,目前主要用於工程應用和科學計算等領域。