0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux移植和Xilinx的Petalinux的快速移植開發(fā)案例

電子設(shè)計 ? 來源:網(wǎng)絡(luò)交換FPGA ? 作者:殷建飛 ? 2020-11-27 10:36 ? 次閱讀

作者:殷建飛

本文是昨天發(fā)的文章《龍芯杯CPU設(shè)計競賽與ZYNQ設(shè)計流程介紹》接續(xù)部分。重點介紹傳統(tǒng)方式的Linux移植和Xilinx的Petalinux的快速移植開發(fā)兩種。

部分硬件設(shè)計中需要CPU完成對電路寄存器的配置,為了完成Zedboard對FPGA上部分寄存器的配置功能,可以在PS單元(處理器系統(tǒng))上運行裸機程序(無操作系統(tǒng)支持)完成和PL單元(FPGA部分)的數(shù)據(jù)交互功能,此時PS單元更像單片機開發(fā);另一種方法是PS單元運行Linux操作系統(tǒng),通過驅(qū)動程序和應(yīng)用程序完成對硬件寄存器的讀寫操作,并且Linux有著完整的網(wǎng)絡(luò)協(xié)議棧支持,后續(xù)可拓展性更強,可以更好的發(fā)揮ZYNQ這種異構(gòu)架構(gòu)芯片的性能。主要分為兩部分,分別闡述Zedboard中FPGA和處理器互聯(lián)總線與硬件設(shè)計和Zedboard處理器系統(tǒng)上嵌入式Linux的移植與通過驅(qū)動和應(yīng)用程序簡單配置FPGA寄存器的實現(xiàn)。上次介紹了沒有操作系統(tǒng)下的驅(qū)動和應(yīng)用程序開發(fā),本文介紹帶操作系統(tǒng)的驅(qū)動和應(yīng)用程序開發(fā)。

1、傳統(tǒng)方式移植Linux

Zedboard上電后會首先啟動BootRom,bootrom中固化了最初啟動需要的初始代碼,并根據(jù)板卡上的跳線決定從flash或者sd卡或者jtag啟動。這里選擇從SD卡啟動,bootrom中的代碼會將SD卡中的啟動文件拷貝到RAM或者片上共享緩存中去,為下一步啟動做準備。

下一階段的啟動文件負責(zé)初始化FPGA的比特流文件和初始化ARM處理器的FSBL文件(VIVADO生成),在PL和PS單元完成最基本的初始化操作后,就需要啟動BootLoader來引導(dǎo)后面發(fā)linux內(nèi)核,XIlixn的解決方案中可以將二進制比特流文件和fsbl以及uboot打包成BOOT.bin文件,BOOT.bin中的uboot可以加載內(nèi)核到內(nèi)存,并從0x00080000位置啟動內(nèi)核。另外,內(nèi)核啟動還需要設(shè)備樹和根文件系統(tǒng)。

(1)交叉編譯鏈和開發(fā)環(huán)境搭建

為了得到能夠在嵌入式平臺上運行的代碼,需要在linux主機上交叉編譯需要運行的代碼,交叉編譯工具鏈就是提供交叉編譯的一套工具集。開發(fā)主機選擇Ubuntu1604LTS系統(tǒng),安裝VIVADO17.4版本,安裝完成后 VIVADO SDK

用時已經(jīng)自動安裝了交叉編譯鏈arm-linux-gnueabihf- ,使用命令
source/opt/Xilinx/SDK/2017.4/setting64.sh

添加引用1后即可使用交叉編譯鏈。Xilinx在較早的VIVADO SDK版本中提供了arm-xilinx-linux-gnueabi-編譯鏈,區(qū)別在于arm-linux-gnueabihf-使用硬件加速浮點數(shù)運算,而arm-xilinx-linux-gnueabi-使用軟件計算。通過查詢資料,發(fā)現(xiàn)17.4版本的SDK中包含arm-xilinx-linux-gnueabi-編譯鏈的引用,但是軟件安裝時沒有成功安裝,這應(yīng)該是17.4版本的一個BUG,我們在另一臺安裝15.4版本VIVADO SDK的Ubuntu主機下,找到/opt/Xilinx/SDK/2015/gnu/arm文件夾,將其拷貝到17.4版本對應(yīng)的目錄,發(fā)現(xiàn)可以成功引用,輸入(交叉編譯鏈)gcc-v查看:

gcc版本為4.9.2。需要注意的是,使用兩條編譯鏈中的任意一條都可以用于交叉編譯,但是兩者之前不兼容,因此使用其中一條交叉編譯鏈即可。17.4自帶的gcc編譯器版本更高,是6.2.1版本。

為了支持32 位工具,需要預(yù)先安裝 32 位支持工具包。使用sudo命令獲取root權(quán)限,apt-get install lib32z1 lib32ncurses5lib32bz2-1.0 lib32stdc++6安裝上述工具包。(PS,可以修改Ubuntu鏡像源為西電開源社區(qū)鏡像,實測速度在5MB左右)。安裝上述包后還需要安裝Openssl庫來實現(xiàn)網(wǎng)絡(luò)保密性,在編譯u-boot時會用到,使用命令apt-get install libssl-dev安裝。

為了提高工作效率,嵌入式開發(fā)通??梢栽赪indows下使用SourceInsight等內(nèi)核源碼閱讀工具來開發(fā)驅(qū)動和應(yīng)用程序,而交叉編譯環(huán)境則往往在linux主機上,因此我們可以使用ssh登陸linux服務(wù)器,完成命令控制和編譯文件,使用ftp文件傳輸服務(wù)在Windows和linux主機之間傳遞文件,編譯完成的驅(qū)動可以以NFS掛載的方式直接在嵌入式開發(fā)板運行。搭建工作環(huán)境不是本文的重點,因此不再這里詳細說明。

(2)U-boot編譯

Xilinx官方提供了u-boot的源碼,位于https://github.com/Xilinx/u-boot-xlnx/releases,我們按照自己需要的版本進行下載和使用。

將下載好的u-boot-xlnx-xilinx-v2017.1.zip文件上傳到Ubuntu服務(wù)器,使用命令unzip解壓縮后進入u-boot-xlnx-xilinx-v2017.1目錄,在 u-boot 的文件夾下有很多子文件夾構(gòu)成,其中每個文件夾都實現(xiàn)一個對應(yīng)的功能。

1) api:相關(guān)的api函數(shù),如輸出字符函數(shù)。

2) arch: 與特定的 CPU 構(gòu)架相關(guān)。在該目錄下,有u-boot 所支持的各種架構(gòu)的cpu,并且有一個單獨的子目錄對應(yīng)。典型的,arch 文件夾下名字為 arm 的子目錄就是 Zynq-7000 SOC所對應(yīng)使用的 CPU 構(gòu)架目錄。

3)board: 和一些已有開發(fā)板有關(guān)的文件。每一個開發(fā)板都有一個子目錄出現(xiàn)在當(dāng)前目錄下

4)common: 實現(xiàn)u-boot 命令行下所支持的命令。在該目錄下,每條命令對應(yīng)一個獨立的文件夾。

5)disk: 提供對磁盤的支持。

6)doc:文檔說明

7)drivers: 在該目錄下保存著 u-boot 所支持的設(shè)備驅(qū)勱程序。典型的如各種網(wǎng)卡、支持的CFI 癿 Flash 存儲器、串口和 USB 等。

8)fs:支持的文件系統(tǒng)

9)include:該目錄下保存著 u-boot 所使用的頭文件,對各種硬件平臺支持的匯編文件、系統(tǒng)的配置文件以及對文件系統(tǒng)支持的文件。該目錄下configs 目錄有開發(fā)板相關(guān)的配置頭文件,如 zynq_common.h 是與 zynq 開發(fā)板相關(guān)的配置文件。

10)lib: 該目錄下保存著體系結(jié)構(gòu)相關(guān)的庫文件。

11)net: 該目錄下保存著網(wǎng)絡(luò)協(xié)議相關(guān)的代碼。比如BOOTP 協(xié)議、 TFTP 協(xié)議、RARP 協(xié)議和 NFS 文件系統(tǒng)的實現(xiàn)

12)tools: 該目錄下保存著用于生成 u-boot 癿工具,包括 mkimage、 crc、 Makefile 和boards.cfg配置文件。

下面開始進行u-boot的編譯,編譯u-boot需要扁平化設(shè)備樹的支持,首先輸入命令apt-get installdevice-tree-compiler安裝設(shè)備樹編譯工具。安裝完成dtc工具后就可以進行u-boot的編譯了。

在configs文件下保存有各個開發(fā)板的默認配置,我們搜索zynq有關(guān)的配置文件,發(fā)現(xiàn)zynq_zed_defconfig文件,這個就是Zedboard默認的配置選項。而ax70**系列的則是黑金開發(fā)板的默認配置文件。

在編譯u-boot之前,需要先將配置選項寫入.config配置文件中,輸入命令make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_zed_defconfig進行配置。注意,你需要先source /opt/Xilinx/SDK/2017/setting64.sh添加相關(guān)引用才能使用,當(dāng)然也可以把上述命令寫入/etc/profile這樣就可以開機使用。

當(dāng)出現(xiàn)written to .configs時,表明配置選項寫入成功,接下來我們就可以進行編譯u-boot了。

使用命令make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-編譯u-boot,經(jīng)過一段時間的編譯后,在u-boot根目錄下會出現(xiàn)u-boot文件,我們將其下載到Windows下并重命名為u-boot.elf,等待下一步使用。


(3)生成BOOT.bin啟動文件

BOOT.bin需要VIVADO SDK生成fsbl,然后將u-boot和VIVADO生成的比特流打包。

啟動VIVADO SDK,選擇File ->New -> Application Project創(chuàng)建一個新的SDK工程,工程命名為fsbl,其余保持默認不變。


點擊next,選擇ZYNQ FSBL模板,點擊Finish完成工程的創(chuàng)建,SDK會自動創(chuàng)建一個名為fsbl的工程和fsbl_bsp板級支持包。選中fsbl工程,右鍵選項選擇Create Boot Image,在彈出的選項卡中可以發(fā)現(xiàn)SDK已經(jīng)問我們添加了剛才生成的fsbl和有VIVADO導(dǎo)入SDK中的比特流文件,我們只需要再添加編譯好的u-boot即可。

點擊右側(cè)的Add可以添加新的文件,Delete可以刪除選中的文件,Edit可以編輯文件的類型。我們選擇Add添加u-boot.elf文件。

在新的選項卡中填入uboot.elf的路徑,這里一定要注意類型為Datafile類型,否則無法正常啟動。

點擊OK確認后退回到上次層選項卡,選擇Create Image選項,在SDK目錄下就會生成對應(yīng)的BOOT.bin文件。

將BOOT.bin拷貝到Zedboard的SD卡,連接串口,開機觀察串口提示,發(fā)現(xiàn)u-boot已經(jīng)可以正常啟動了,并且此時FPGA也已經(jīng)按照VIVADO的網(wǎng)表文件初始化完成,但是u-boot提示無法讀取內(nèi)核鏡像,我們將在下一步中生成。

(4)內(nèi)核編譯

Xilinx官方提供了linux的源碼,供開發(fā)者下載和使用,我們打開Xilinx官網(wǎng)鏈接:https://github.com/Xilinx/linux-xlnx/releases;選擇17.4版本下載并解壓。

Linux解壓命令為 :

tar zxvf linux-xlnx-xilinx-v2017.4.tar.gz

解壓后進入該目錄,這里對關(guān)鍵目錄進行說明:

1)include/---- 內(nèi)核頭文件,需要提供給外部模塊使用

2) kernel/---- Linux 內(nèi)核癿核心代碼,包擴進程調(diào)度子系統(tǒng),以及進程調(diào)度相關(guān)的模塊。

3)arch/---- 體系結(jié)構(gòu)相關(guān)的代碼,例如 arm, x86 等等,我們使用的ARM A9處理器就在arch/arm/目錄下。

arch/mach包含了具體開發(fā)板有關(guān)的代碼

arch/boot/dts 包含了設(shè)備樹文件

arch/arm/configs目錄下包含了arm架構(gòu)處理器和開發(fā)板的一些內(nèi)核默認配置文件,Zedboard的默認配置文件也在此目錄下。

4)driver目錄則存放了可用的驅(qū)動程序,你可以將自己的驅(qū)動放入此目錄,在后面選擇編譯進內(nèi)核。

5)scripts目錄下包含了設(shè)備樹編譯器dtc和解釋內(nèi)核配置選項相關(guān)的文件和目錄。

其余目錄則不是本文介紹的重點,當(dāng)開發(fā)平臺啟動BootLoader后,需要讀取內(nèi)核鏡像,并依賴設(shè)備樹文件傳入的一些啟動參數(shù)才能啟動。當(dāng)然還需要文件系統(tǒng)的支持。Linux內(nèi)核有Imange、zImage和uImage等格式,Image就是正常編譯出的linux內(nèi)核,但是鑒于嵌入式資源有限,我們可以將內(nèi)核和一段自解壓程序進行壓縮,這樣啟動時BootLoader先調(diào)用zImage的解壓接口進行解壓縮,而后在調(diào)用內(nèi)核接口啟動內(nèi)核,相比于Image,zImage啟動更慢一些。uImage就是在頭部加入了一些u-boot相關(guān)代碼的壓縮Linux內(nèi)核鏡像,便于u-boot啟動內(nèi)核鏡像。因此,我們最終要生成的就是uImage內(nèi)核鏡像。

上面說過在arch/arm中存放了我們需要的arm A9處理器的代碼和文件,進入arch/arm/configs,搜索zynq相關(guān)的配置,發(fā)現(xiàn)xilinxz_zynq_defconfig配置文件,這就是Zedboard可用的默認配置文件。和u-boot類似,我們也需要先寫入默認配置到.config文件才能編譯內(nèi)核。

使用命令make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilixn_zynq_defconfig進行內(nèi)核配置文件的寫入。寫入完成后提示written to .config??捎檬褂胢ake menuconfig配置內(nèi)核選項:

這里保持默認,無需修改,如果需要將自己的驅(qū)動編譯進內(nèi)核,可以在這里選中,但是這樣不利于調(diào)試驅(qū)動。

使用命令make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 編譯內(nèi)核,內(nèi)核編譯需要較長的時間。如果配置過程中需要重新修改或者發(fā)生錯誤,可以使用make distclean命令使內(nèi)核恢復(fù)最初的狀態(tài),然后重新編譯。

我們使用make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImageLOADADDR=0x00008000重新生成內(nèi)核,指定內(nèi)核鏡像為uImage,內(nèi)核入口地址為0x00008000。由于內(nèi)核已經(jīng)編譯過一次,這次可以很快生成。

生成的內(nèi)核位于arch/arm/boot目錄下??截恥Image到Zedboard的SD卡準備啟動時使用。

(5)生成設(shè)備樹文件

設(shè)備樹是一種設(shè)備節(jié)點的描述,它告訴內(nèi)核板卡上有哪些外設(shè)以及外設(shè)占用的資源,比如寄存器映射空間和中斷號等信息。另外設(shè)備樹還可以修改內(nèi)核啟動參數(shù),如串口選擇、波特率設(shè)置和根文件系統(tǒng)的選擇。

通過VIVADO SDK可以生成設(shè)備樹描述文件,這樣便于我們開發(fā),而不需要完全手動創(chuàng)建。VIVIADO安裝時并沒有安裝設(shè)備樹生成器,所以需要我們手動安裝。我們首先下載xilinx提供的device tree generator,并安裝到SDK。訪問https://github.com/Xilinx/device-tree-xlnx/releases獲取對應(yīng)版本的設(shè)備樹生成器。下載并放到VIVADO安裝目錄下的SDK/2017.4/data/embeddedsw/devicetree/bsp/目錄下,重命名為device-tree-xlnx_v2017_4(我的VIVADO版本為17.4)。打開SDK,在SDK中操作點擊菜單: Xilinx Tools -> Repositories,然后在LocalRepositories中添加我們剛才下載的SDK/2017.4/data/embeddedsw/devicetree/bsp/device-tree-xlnx_v2017_4路徑并點擊OK。

添加成功后如上圖。點擊菜單File -> New -> Board Support Package。彈出選項卡New Board Support Packet Project,選擇device_tree,如果你上一步配置不成功,則不會出現(xiàn)device_tree選項,此時需要檢查上一個步驟的問題。添加成功后點擊Finish選項,VIVADO SDK會自動生成設(shè)備樹描述文件dts。

稍后,VIVADO彈出BoardSupport Packet Setting選項卡,在bootargs中填入console=ttyPS0,115200 root=/dev/ram rw initrd=0x800000,8Mearlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0?!癰ootargs”參數(shù)用于指定啟動時傳遞給內(nèi)核的參數(shù)?!癱onsole device”參數(shù)用于指定所使用的串口輸出設(shè)備。

在SDK目錄下的device_tree目錄下可以看到很多dts文件,system-top.dts就是我們需要編譯的設(shè)備樹描述文件。它引用了zynq-7000.dtsi等對于zynq芯片通用的部分文件。將SDK目錄下的整個device_tree目錄上傳到Ubuntu服務(wù)器,使用dtc編譯器編譯。編譯命令如下:

./scripts/dtc/dtc-I dts -O dtb -o device.dtb ./device_tree/system-top.dts

6)文件系統(tǒng)

根文件系統(tǒng)使用uramdisk.image.gz根文件系統(tǒng),ramdisk.image.gz根文件系統(tǒng)其格式與uboot不同,啟動時uboot會提示ramdisk格式錯誤,若要讓uboot能夠識別ramdisk.image.gz根文件系統(tǒng),需要利用mkimage給ramdisk.image.gz添加一些頭部信息,生成uramdisk.image.gz??梢灾苯邮褂镁W(wǎng)絡(luò)上的uramdisk.image.gz來作為根文件系統(tǒng),一般來講,根文件系統(tǒng)不需要做出修改。

另一種廣泛應(yīng)用的根文件系統(tǒng)是LINARO_FS,Linaro文件系統(tǒng)也可從網(wǎng)絡(luò)上獲取,因為我們的設(shè)備樹中指定了從uramdisk.image.gz文件系統(tǒng)啟動,因此這里不再介紹從Linaro文件系統(tǒng)啟動。

現(xiàn)在,我們已經(jīng)得到BOOT.bin文件,設(shè)備樹device_tree.dtb文件和根文件系統(tǒng)uramdisk.image.gz根文件系統(tǒng)。將這三個文件放入Zedboard的SD卡,上電啟動就可以使用Linux操作系統(tǒng)了。

7)驅(qū)動程序和應(yīng)用程序測試

Linux驅(qū)動程序有靜態(tài)編譯進內(nèi)核和動態(tài)模塊加載兩種,這里選擇動態(tài)模塊加載的方式,便于進行調(diào)試。在前面的硬件設(shè)計中,我們將AXI-Lite Slave的四個寄存器掛載到基地址為0x43c00000的位置,而Zedboard板卡上的8位LED燈連接到了寄存器0的低8位,因此我們寫寄存器0的低八位就能很容易的通過LED的狀態(tài)來判斷寫入是否成功。

驅(qū)動程序的入口和出口分別是init和exit,需要使用宏進行修飾如下:

// 注冊初始化Linux驅(qū)動的函數(shù)
module_init( leds_drv_init);
// 注冊卸載Linux驅(qū)動的函數(shù)
module_exit( leds_drv_exit);

linux操作系統(tǒng)中無法直接讀寫物理地址,因此入口函數(shù)中,我們需要映射物理地址,使用ioremup函數(shù)映射物理地址。注意這里物理地址和硬件設(shè)計中保持一致。

leds= ioremap(0x43c00000, sizeof(LEDS_T))

Led燈只是一個簡單的字符設(shè)備,但是這里我們使用該設(shè)備來注冊設(shè)備驅(qū)動。

ret= misc_register(&misc);

雜項設(shè)備也是在嵌入式系統(tǒng)中用得比較多的一種設(shè)備驅(qū)動。在 Linux 內(nèi)核的include/linux目錄下有Miscdevice.h文件,要把自己定義的misc device從設(shè)備定義在這里。其實是因為這些字符設(shè)備不符合預(yù)先確定的字符設(shè)備范疇,所有這些設(shè)備采用主編號10,一起歸于misc device,其實misc_register就是用主標號10調(diào)用register_chrdev()的。也就是說,misc設(shè)備其實也就是特殊的字符設(shè)備,可自動生成設(shè)備節(jié)點。LDD3中l(wèi)ed設(shè)備也是用misc_register函數(shù)注冊為雜設(shè)備,這說明led設(shè)備是作為雜項設(shè)備出現(xiàn)在內(nèi)核中的,在內(nèi)核中,misc雜項設(shè)備驅(qū)動接口是對一些字符設(shè)備的簡單封裝,他們共享一個主設(shè)備號,有不同的次設(shè)備號,共享一個open調(diào)用,其他的操作函數(shù)在打開后運用linux驅(qū)動程序的方法重載進行裝載。

驅(qū)動代碼:

#define DEVICE_NAME "leds"
#define LEDS_BASE_ADDR (0x43c00000)
typedef struct{
volatile unsigned int ADDR0;
volatile unsigned int ADDR1;
volatile unsigned int ADDR2;
volatile unsigned int ADDR3;
}LEDS_ADDR;

LEDS_ADDR* leds;

static int leds_drv_open(struct inode *Inode, struct file *File)
{
leds->ADDR0 = 0xffffffff;
leds->ADDR1 = 0xffffffff;
leds->ADDR2 = 0xffffffff;
leds->ADDR3 = 0xffffffff;
return 0;
}

static ssize_t leds_drv_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
return 0;
}
static ssize_t leds_drv_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
unsigned int ret = 0;
unsigned int tmp_val;
u32 pos = *offset;
ret = copy_from_user(&tmp_val, buf, count);
leds->ADDR0 = tmp_val;
//默認寫入寄存器0
return ret;
}
// 描述與設(shè)備文件觸發(fā)的事件對應(yīng)的回調(diào)函數(shù)指針
static struct file_operations dev_fops =
{
.owner = THIS_MODULE,
.open = leds_drv_open,
.read = leds_drv_read,
.write = leds_drv_write,
};
// 描述設(shè)備文件的信息
static struct miscdevice misc =
{
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops
};
// 初始化Linux驅(qū)動
static int __init leds_drv_init(void)
{
int ret;
leds = ioremap(LEDS_BASE_ADDR, sizeof(LEDS_T));
// 建立設(shè)備文件
ret = misc_register(&misc);
// 輸出日志信息
if(ret)
{
printk("leds_drv_init faiitrt!/n");
}
else
{
printk("leds_drv_init success!/n");
}
return ret;
}

// 卸載Linux驅(qū)動
static void __exit leds_drv_exit(void)
{
iounmap(leds);
// 刪除設(shè)備文件
misc_deregister(&misc);
// 輸出日志信息
printk("leds_drv_exit success!/n");
}
// 注冊初始化Linux驅(qū)動的函數(shù)
module_init( leds_drv_init);
// 注冊卸載Linux驅(qū)動的函數(shù)
module_exit( leds_drv_exit);

MODULE_LICENSE("Dual BSD/GPL");

應(yīng)用程序調(diào)用驅(qū)動程序接口,從控制臺讀取一個數(shù)字,寫入到寄存器0,寄存器0的低八位就可以在led燈上顯示出來。

應(yīng)用程序源碼:

#include
#include
#include
#include
#include
#include

int main(int argc, char** argv)
{
int fd;
fd = open("/dev/leds", O_RDWR);
if(fd < 0)
{
printf("fd = %d open fialed!/n", fd);
}

//unsigned int leds = 0;
int leds = 0;
char ch[4];

printf("input your strings:/n");
int i = 0;
while( 1 )
{
ch[i] = getchar();
if (ch[i] == '/n')
break;
else
i++;
}
if (i == 3)
{
leds = (ch[0]-48)*100 + (ch[1]-48)*10 + ch[2]-48;
}
if (i == 2)
{
leds = (ch[0]-48)*10 + ch[1]-48;
}
if (i == 1)
{
leds = ch[0]-48;
}

printf("leds = %d,i = %d/n",leds,i);

write(fd, &leds, 8);

printf("end/n");
close(fd);
return 0;
}

將驅(qū)動和應(yīng)用程序上傳到Ubuntu,使用arm-linux-gnueabihf-交叉編譯鏈編譯。驅(qū)動程序需要編寫makefile,Makefile中需要指定一個已編譯的內(nèi)核源碼樹。編譯完成后再Zedboard板測試如下:

1> 掛載Ubuntu的NFS服務(wù),(需要Ubuntu開啟NFS服務(wù)并指定路徑)首先查詢Ubuntu IP地址為192.168.1.103,在Zedboard控制臺輸入:

mount-t nfs -o nolock 192.168.1.103:/home/zed/work /mnt

將Ubuntu上的work目錄掛載到Zedboard板

掛載成功后使用ssh登陸Ubuntu并轉(zhuǎn)到Ubuntu的驅(qū)動目錄,執(zhí)行make,得到驅(qū)動.ko文件。


Make命令執(zhí)行成功,目錄下生成最終使用的ko文件部分中間文件。使用 arm-linux-gnueabihf-gcc -o ledstest.o ledstest.c 生成測試程序。

回到串口工具連接Zedboard板卡,使用insmod掛載驅(qū)動,并執(zhí)行測試程序。

掛載成功后,運行APP成功,APP從控制臺讀入一個字符串65,將其ASCII碼轉(zhuǎn)換為數(shù)值寫入寄存器0,Zedboard板卡上led如圖:

2、Petalinux快速開發(fā)

Petalinux是xilinx為zynq7000系列移植linux程序設(shè)計的一套開發(fā)程序。它可以加快嵌入式開發(fā)人員的工作速度。

安裝petalinux首先需要安裝需要的庫,本次實驗在Ubuntu1604LTS上安裝petalinux17.4.注意,petalinux版本和VIVADO版本需要對應(yīng)。

Petalinux無法以root用戶安裝,因此如果想安裝petalinux到非用戶目錄下有兩種辦法:將opt目錄下的文件夾所有屬性改為當(dāng)前用戶或者安裝到當(dāng)前用戶目錄下再以root權(quán)限復(fù)制整個文件夾到opt目錄。這里選用第一種方法,首先創(chuàng)建安裝目錄:

運行petalinux的安裝文件,并指定目錄為/opt/pkg/petalinux,檢查依賴環(huán)境無誤后就會進行安裝,安裝前需要根據(jù)提示同意用戶協(xié)議。

安裝完成后就可以使用petalinux定制linux操作系統(tǒng)。Petalinux可以識別VIVADO工程,并根據(jù)VIVADO工程來智能設(shè)置外設(shè)信息。VIVADO工程目錄下的.sdk目錄就包含了petalinux所需的硬件信息。Ubuntu新建文件夾作為petalinux的工程目錄,并將.sdk拷貝到petalinux工程目錄的上一級目錄下,即和petalinux工程目錄為同級目錄。定位petalinux

source/opt/pkg/petalinux/settings.sh

檢查安裝環(huán)境和庫依賴,無問題后可以建立工程。使用命令:

petalinux-create--type project --template zynq –name leds

建立名為leds的工程,cd到leds目錄下,讀取硬件信息:

petalinux-config--get-hw-description ./led.sdk

在彈出的窗口中可以配置petalinux工程,默認源碼從GitHub下載,也可以從本地讀取,這里保持默認。在 Advanced bootable images storage Settings選項中配置啟動方式,默認從SD卡啟動,這里依舊保持默認。

將配置保存,退出,petalinux會下載源碼并配置工程。

成功后使用如下命令配置linux內(nèi)核:

petalinux-config-c kernel

配置成功后保存并退出

編譯完成后使用petalinux-config-c rootfs配置根文件系統(tǒng),同樣保存后退出。使用命令petalinux-build編譯整個系統(tǒng)工程。經(jīng)過一段漫長的等待,編譯完成。

運行下面命令生成BOOT文件:


將工程目錄 images -> linux目錄中的BOOT.bin和image.ub復(fù)制到SD卡,啟動Zedboard,完成Linux操作系統(tǒng)的移植。

注意使用petalinux移植linux使用的是arm-linux-gnueabihf-交叉編譯鏈,因此后續(xù)驅(qū)動開發(fā)時也需要指定交叉編譯鏈為arm-linux-gnueabihf-,后續(xù)驅(qū)動的開發(fā)與傳統(tǒng)方式移植linux部分一致,因此不再闡述。

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11212

    瀏覽量

    208721
  • Xilinx
    +關(guān)注

    關(guān)注

    71

    文章

    2155

    瀏覽量

    120853
  • 驅(qū)動開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    130

    瀏覽量

    12059
收藏 人收藏

    評論

    相關(guān)推薦

    【北京迅為】i.mx8mm嵌入式linux開發(fā)指南第四篇 嵌入式Linux系統(tǒng)移植篇第六十九章uboot移植

    【北京迅為】i.mx8mm嵌入式linux開發(fā)指南第四篇 嵌入式Linux系統(tǒng)移植篇第六十九章uboot移植
    的頭像 發(fā)表于 10-22 14:46 ?452次閱讀
    【北京迅為】i.mx8mm嵌入式<b class='flag-5'>linux</b><b class='flag-5'>開發(fā)</b>指南第四篇 嵌入式<b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>移植</b>篇第六十九章uboot<b class='flag-5'>移植</b>

    Linux上的編解碼器移植TMS320DM365預(yù)覽版

    電子發(fā)燒友網(wǎng)站提供《Linux上的編解碼器移植TMS320DM365預(yù)覽版.pdf》資料免費下載
    發(fā)表于 10-14 10:53 ?0次下載
    <b class='flag-5'>Linux</b>上的編解碼器<b class='flag-5'>移植</b>TMS320DM365預(yù)覽版

    基于機智云移植STM32L496G代碼移植

    前言最近我拿到了STM32L496AGMCU,發(fā)現(xiàn)其擴展版可以連接ESP-01S。我想嘗試將開發(fā)板連接到我們的機智云上,并根據(jù)機智云提供的文檔進行程序移植。STM32CubeMX移植機智云自動生成
    的頭像 發(fā)表于 09-20 08:05 ?280次閱讀
    基于機智云<b class='flag-5'>移植</b>STM32L496G代碼<b class='flag-5'>移植</b>

    【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列

    對比、外設(shè)及性能對比以及從 STM32F10x 移植到 GD32F30x 的移植步驟,旨在讓開發(fā)者能夠快速從STM32F10x 移植到 GD
    的頭像 發(fā)表于 09-07 09:57 ?461次閱讀
    【GD32 MCU <b class='flag-5'>移植</b>教程】9、從 STM32F10x 系列<b class='flag-5'>移植</b>到 GD32F30x 系列

    手把手帶你移植HAL庫函數(shù)

    在嵌入式系統(tǒng)開發(fā)中,硬件抽象層(HAL,HardwareAbstractionLayer)庫的使用可以極大地簡化開發(fā)過程,提高代碼的可移植性和維護性。本文將詳細介紹如何快速搞懂HAL庫
    的頭像 發(fā)表于 05-18 08:04 ?1587次閱讀
    手把手帶你<b class='flag-5'>移植</b>HAL庫函數(shù)

    Linux平臺移植音頻芯片實戰(zhàn)記錄

    本文詳細記錄在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程,其他平臺操作方法類似,希望為大家提供幫助。
    的頭像 發(fā)表于 05-17 14:28 ?1013次閱讀
    <b class='flag-5'>Linux</b>平臺<b class='flag-5'>移植</b>音頻芯片實戰(zhàn)記錄

    鴻蒙開發(fā)實戰(zhàn):基于【Markwon】移植開發(fā)

    本項目是基于開源項目**Markwon**進行適用harmonyos的移植開發(fā)的。
    的頭像 發(fā)表于 03-25 16:27 ?767次閱讀
    鴻蒙<b class='flag-5'>開發(fā)</b>實戰(zhàn):基于【Markwon】<b class='flag-5'>移植</b>和<b class='flag-5'>開發(fā)</b>

    鴻蒙ArkUI【開發(fā)移植Carbon】

    本項目是基于開源項目[Carbon]?進行harmonyos化的移植開發(fā)的。
    的頭像 發(fā)表于 03-25 15:41 ?482次閱讀
    鴻蒙ArkUI【<b class='flag-5'>開發(fā)</b><b class='flag-5'>移植</b>Carbon】

    3562-物聯(lián)網(wǎng)模塊開發(fā)案

    3562-物聯(lián)網(wǎng)模塊開發(fā)案例 本文檔主要介紹基于 TL3562-EVM 評估板的物聯(lián)網(wǎng)模塊開發(fā)案例,適用開發(fā)環(huán)境: Windows 開發(fā)環(huán)境:Windows 7 64bit、Wind
    的頭像 發(fā)表于 03-05 10:59 ?1163次閱讀
    3562-物聯(lián)網(wǎng)模塊<b class='flag-5'>開發(fā)案</b>例

    【鴻蒙】標準系統(tǒng)移植指南

    標準系統(tǒng)移植指南 本文描述了移植一塊開發(fā)板的通用步驟,和具體芯片相關(guān)的詳細移植過程無法在此一一列舉。后續(xù)社區(qū)還會陸續(xù)發(fā)布開發(fā)
    的頭像 發(fā)表于 02-27 14:36 ?802次閱讀
    【鴻蒙】標準系統(tǒng)<b class='flag-5'>移植</b>指南

    ELF 1技術(shù)貼|如何將Python3.6.9移植開發(fā)板上

    在ELF1開發(fā)板的Linux4.1.15eMMC鏡像中,默認預(yù)裝了Python2.7。為了適應(yīng)更多應(yīng)用場景,有些小伙伴可能需要移植其他版本的Python,下面將以Python3.6.9為例詳細介紹
    的頭像 發(fā)表于 02-22 14:06 ?390次閱讀
    ELF 1技術(shù)貼|如何將Python3.6.9<b class='flag-5'>移植</b>到<b class='flag-5'>開發(fā)</b>板上

    TLT507-Linux-RT應(yīng)用開發(fā)案

    TLT507-Linux-RT應(yīng)用開發(fā)案
    的頭像 發(fā)表于 01-26 09:46 ?641次閱讀
    TLT507-<b class='flag-5'>Linux</b>-RT應(yīng)用<b class='flag-5'>開發(fā)案</b>例

    rk3399移植Linux內(nèi)核

    RK3399是一款由中國廠商瑞芯微推出的高性能處理器芯片,被廣泛用于嵌入式系統(tǒng)開發(fā)。在進行應(yīng)用程序開發(fā)之前,我們需要將Linux內(nèi)核移植到RK3399上,以支持硬件的驅(qū)動和功能。本文將
    的頭像 發(fā)表于 01-08 09:56 ?1005次閱讀

    gdb本地調(diào)試版本移植至ARM-Linux系統(tǒng)

    移植ncurses庫本文使用的ncurses版本為ncurses-5.9.tar.gz下載地址:https://ftp.gnu.org/gnu/ncurses
    的頭像 發(fā)表于 12-12 14:42 ?565次閱讀
    gdb本地調(diào)試版本<b class='flag-5'>移植</b>至ARM-<b class='flag-5'>Linux</b>系統(tǒng)

    zedboard petalinux構(gòu)建工程錯誤是什么原因造成的?

    記錄:/home/ylh/xilinx/petalinux/hdmi_zed/building/tmp/work/plnx_zynq7-xlinx-linux-gnueabi/device-tree
    發(fā)表于 11-28 07:33