一、搭建硬件環境
vivado版本2017.4,芯片為7010,不過不管什么版本和芯片大致步驟是一樣的
本文工程文件:https://gitee.com/long_fly/AXIDMA_linux
硬件平臺PL的搭建同ZYNQ基礎系列(六) DMA基本用法,在這個工程的基礎上添加SD卡(根據自己的開發板硬件選擇相應的引腳)
然后直接生成bit文件,然后記得要導出硬件(包含bit文件)進SDK
二、生成設備樹
1.解壓設備樹工具文件夾到一個地方
在https://github.com/Xilinx/device-tree-xlnx下載
2.菜單欄 –> Xilinx –> Repositories
添加剛剛解壓的位置
3.菜單欄 –> File –> New –> Board Support Package
創建BSP,可以發現多了一欄device_tree,直接點確定到下一步
4.設置環境變量
內容為:console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootfstype=ext4 earlyprintk rootwait
5.最后可以在工程文件夾中找到生成的設備樹文件
待用
三、生成FSBL引導文件
1.在SDK中新建一個APP,選擇FSBL模板工程,然后完成創建
添加#define FSBL_DEBUG_INFO后,保存文件,會生成FSBL.elf文件,文件待用
四、編譯u-boot
0.具體的相關環境(不裝會報錯)和SDK環境安裝(不裝沒法編譯,建議去官網下載)
參考ZYNQ跑系統 系列(一) 傳統方式移植linux,不再贅述;u-boot和kernel直接在https://github.com/Xilinx下載;還有注意以下路徑是我自己的,要根據實際修改相應路徑
1.linux超級用戶模式,定位settings64.sh文件(在SDK安裝文件夾里)
source /opt/Xilinx/SDK/2017.1/settings64.sh
2.進入u-boot目錄(自己解壓的路徑)
cd /home/hlf/mnt/u-boot-xlnx-master
3.打開GUI配置u-boot
make menuconfig,load預配置的文件,絕對路徑為/home/hlf/mnt/u-boot-xlnx-master/configs/zynq_ax7010_defconfig
,觀察了一下沒什么需要修改的,直接保存并退出
4.讀配置文件(zynq_ax7010_defconfig)
make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_ax7010_defconfig
5.編譯
make CROSS_COMPILE=arm-xilinx-linux-gnueabi-
6.查看 u-boot 文件的不同段的內存分配情況 (可以不看)
arm-xilinx-linux-gnueabi-objdump -h u-boot
7.修改后綴為u-boot.elf,待用
五、編譯kernel
1.進入kernel目錄(自己解壓的路徑)并和之前一樣定位文件
cd /home/hlf/mnt/linux-xlnx-master
source /opt/Xilinx/SDK/2017.1/settings64.sh
2.打開GUI配置kernel
make ARCH=arm menuconfig,load預配置的文件,絕對路徑為/home/hlf/mnt/linux-xlnx-master/arch/arm/configs/xilinx_zynq_defconfig,這里不通過GUI方式更改配置,關閉
3.開啟DMA的相關功能
也可以不通過GUI的方式配置kernel,這里我們直接命令行(要在超級用戶模式下,不然沒有權限修改):
gedit /home/hlf/mnt/linux-xlnx-master/arch/arm/configs/xilinx_zynq_defconfig
打開文件,確保以下選項開啟(=y)
CONFIG_CMA=y
CONFIG_DMA_CMA=y
CONFIG_XILINX_DMA_ENGINES=y
CONFIG_PL330_DMA=y
CONFIG_XILINX_DMA=y
CONFIG_XILINX_AXIDMA=y
CONFIG_XILINX_AXIVDMA=y
CONFIG_DMA_SHARED_BUFFER=y
4.讀配置
make ARCH=arm xilinx_zynq_defconfig
5.編譯內核
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage LOADADDR=0x00008000
6.編譯完成后,命令行會提示生成的uImage的位置
uImage拷貝出來待用
7.生成devicetree.dtb
將設備樹文件夾拷貝到虛擬機的相應路徑下
在pl.dtsi中添加:
axidma_chrdev: axidma_chrdev@0 {
compatible = "xlnx,axidma-chrdev";
dmas = ;
dma-names = "tx_channel", "rx_channel";
};
保存后,生成devicetree.dtb:
./scripts/dtc/dtc -I dts -O dtb -o /home/hlf/mnt/device_tree_bsp_0/devicetree.dtb /home/hlf/mnt/device_tree_bsp_0/system-top.dts
六、準備運行linux
1.生成BOOT.bin
之前產生了FSBL.elf、u-boot.elf和bit文件,直接通過SDK生成BOOT.bin
2.拷貝文件至SD卡
將之前產生的BOOT.bin、devicetree.dtb和uImage拷貝到SD卡
3.插上串口開機運行
確??梢赃\行系統
七、編譯例程
0.下載例程
例程下載地址:https://github.com/bperez77/xilinx_axidma或者https://gitee.com/long_fly/AXIDMA_linux
1.拷貝例程文件夾到kernel文件夾里
我將文件夾命名為了extra,直接將例程文件夾的內容放到里面,如果沒有權限的話,直接命令行chmod 777 文件夾名獲取相應權限就可以了
2.cd到extra文件夾里
3.編譯
使用交叉編譯鏈,定位到kernel(已經編譯好的)的路徑,編譯driver:
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm KBUILD_DIR=/home/hlf/mnt/linux-xlnx-master/ driver
使用交叉編譯鏈,編譯examples:
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm examples
編譯完成后,生成文件將出現在outputs文件夾里
4.將這些文件拷貝到SD卡中,開機
5.掛載SD卡
cd ..到達系統目錄
mount /dev/mmcblk0p1 /mnt掛載SD卡
cd /mnt進入SD目錄
insmod axidma.ko載入剛剛生成的模塊
打印信息提示通道的ID沖突
6.修改設備樹中通道的ID號
然后按照之前的步驟重新生成devicetree.dtb,將新設備樹文件拷貝到SD卡中,然后開機,掛載SD卡,加載模塊
這次沒有打印信息提示ID沖突
7.查看是否成功
cd /dev到達dev目錄
ls查看內容
會發現多了一個axidma,然后運行dmesg,可以看到如下信息:
8.運行例程里的APP1
發現CMA內存不夠,導致接收緩存空間申請不了這么大,在設備樹文件夾中修改.dts后綴的文件,添加cma空間的申請
然后重新生成devicetree.dtb文件,拷貝到SD卡中,開機,掛載SD卡,加載模塊,運行APP
可以測試收發通道的數據速率
9.運行例程里的APP2
在SD卡中新建兩個文本,在其中一個文本文件中寫入內容,另一個為空
運行應用程序,將文件1的內容通過DMA環路寫入文件2,因為文件太小了,所以顯示的是0.00Mb
運行結束后打開文件2,會發現和文件1里的內容完全一致
編輯:hfy
-
Linux
+關注
關注
87文章
11025瀏覽量
207145 -
Zynq
+關注
關注
9文章
600瀏覽量
46813 -
AXI
+關注
關注
1文章
126瀏覽量
16350
發布評論請先 登錄
相關推薦
評論