您当前的位置:首页 > 计算机 > 系统应用 > Linux

zynq 矿渣7010 编译内核中遇到的一些记录(jtag加载linux全步骤)

时间:07-21来源:作者:点击数:
  1. 手工dtc 编译设备树的时候dtc -I dts -O dtb -o zynq-zed.dtb ./zynq-zed.dts
    会报语法错误/linux/arch/arm/boot/dts/zynq-zed.dts:7.1-9 syntax error
    FATAL ERROR: Unable to parse input tree
    百度一查,有人遇到过,居然是要把include前面的#改成下面这种形式,我也是醉了。
    /include/ “zynq-7000.dtsi”
  2. 但是,在内核根目录用make ARCH=arm dtbs 这样的,不修改也可以编译通过。

总结一下,编译u-boot简单步骤:

//提前在系统的.bashrc加入环境变量,后面少敲点。
source /opt/Xilinx/Vivado/2018.2/settings64.sh
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
提前vi configs/zynq_ebaz4205_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- zynq_ebaz4205_defconfig  //生成.config,也可以生成后再make menuconfig再进去细调
make CROSS_COMPILE=arm-linux-gnueabihf- -j4  //多开几个线程速度快
//最后,这个编译完fdt设备树会包到u-boot里的。
cp u-boot u-boot.elf //vivado这一套矫情,必须要这样才认

编译内核简单步骤

make menuconfig   //配置内核
make ARCH=arm -j4 uImage LOADADDR=0x00008000   //指定uImage,用于uboot引导,同时必须要指定LOADADDR
make ARCH=arm dtbs //编译设备树,生成dtb

直接jtag启动Linux,加载fpga bit流,加载u-boot,加载内核uImage,加载RAMIMG根的方法,不用再sd卡拔来拔去的拷贝文件,或者flash烧了一遍又一遍的测试了,我其实开始也是受够了。。。

开发板/矿渣连接好JTAG,UART,UART用minicom提前连上(默认无法输入需要在配置里面把默认的硬件流控关一下)。
如果是在win上远程访问Linux,起xsct需要xserver的,提前export一下DISPLAY
export DISPLAY= XXX.XXX.XXX.XXX:0
xsct
//起xsct server
connect
//连上去
ta 2
选择target ,也可以target然后列出来目标选数字
source ~/ebaz4205/ebaz4205.sdk/system_wrapper_hw_platform_0/ps7_init.tcl
// 加载tcl函数脚本,一定要加载你vivado导出来的那个.sdk对应目录下的文件,因为这个里面对应了你vivado里面配置好的硬件配置信息,包括各种地址信息。
ps7_init
ps7_post_config
// 这个就起到了fsbl的作用,初始化了CPU,DDR,所以不用fsbl也能jtag引导
fpga ~/ebaz4205/ebaz4205.sdk/system_wrapper_hw_platform_0/system_wrapper.bit
//烧写PL部分的bit流
dow ~/u-boot-xlnx/u-boot.elf
//下载u-boot
con
//这时候去minicom上看就有uboot的启动输出信息了。速度按d让他停在u-boot的shell下面
stop
//让CPU停住,别让uboot动了,因为我们下一步要下载内核和设备树以及ramimg了。
dow -data ~/linux/arch/arm/boot/uImage 0x8000000
dow -data ~/linux/arch/arm/boot/dts/zynq-ebaz4205.dtb 0x9000000
con
//下载地址就自己看着办了,我看uboot下完他提示在0x4000000,我离远一点,dtb也随便,这个没研究过,貌似有文章说运行的时候内核或者u-boot会把自己弄到内存地址最高处。

bootm 0x8000000 - 0x9000000
//最后一步就是在uboot启动系统了 bootm 3个参数,内核存放的地址 RAMIMG存放的地址,由于我是测试看这个方法行不行,没有RAMIMG,用-代替,最后一个是fdt设备树的位置。

有了这个方法,终于不用一遍又一遍的拔插SD卡了或者一遍又一遍烧FALSH。反正调试的时候都要改。

矿渣EBAZ4205 编译内核的时候得在ethernet 驱动里面选上cadence 那个MACB那个玩意儿,否则内核没法驱动那个IC+ 的IP101 PHY.

u-boot 以及arm kernel的编译笔记

uboot编译涉及到的就2个地方:

  1. xxx_xxx_defconfigu-boot 有板级预配置文件在源码目录的configs 目录下,默认有很多,如果新板子要编译,可以拷贝一个,名字规则如zynq_zed_defconfig 这样的最后面一定要是xxx_xxx_defconfig,否则make生成配置的时候报错,名字改成这种格式就对了,至少最后下划线要defconfig结尾。在xxx_xxx_defconfig里面也需要指定新的设备树名称。
  2. dts设备树,这个不同的板子肯定是不同的,同样可以拷贝一个近似的,相同MCU的板子配置修改,路径在源码目录的 arch/arm/dts下面,修改后还需要在这个目录的Makefile里添加上,否则编译的时候不会编译,编译uboot找不到新添加的就会报错。
    实际编译步骤就2步
 make CROSS_COMPILE=arm-linux-gnueabihf- zynq_zed_defconfig //生成实际的配置文件.config
 make CROSS_COMPILE=arm-linux-gnueabihf- -j4   //编译,
 cp u-boot u-boot.elf   //vivado这一套就这么矫情,非要拷贝一下,不然不认

arm kernel的编译类似,稍有不同

  1. 设备树是一样的,在uboot怎么配的原样拷贝过来就行,路径/arch/arm/boot/dts/下,注意还要添加到Makefile就行。
  2. 预配置文件在arch/arm/configs下,不过这个是一个完全体,不用make就可以直接用,直接拷贝一个到源码根目录下为.config文件,然后一make oldconfig就行,确实的选项也可能让你选择,其实还不如make menuconfig 配一下。
    实际编译步骤:
 make menuconfig  //如果有配置好的.config这一步可以不用
make ARCH=arm -j4 uImage LOADADDR=0x00008000 //uImage貌似必须要指定入口地址,不知道.config能不能提前写好。编译好的uImage在arch/arm/boot/下,
make dtbs  //这一步生成设备树文件,启动的时候要显式加载的,不像uboot,不是内含就是附加到uboot本身后面。

busybox

本来以为busybox搞起打包好就完事了,不过貌似要简单方便就直接用buildroot,连uboot,kernel,rootfs(除了busybox还有很多额外的软件包都可以一并编译打包了),打包的工作一起给你干了,确实是提高生产力的好工具,只要配置好了前面那些内核uboot的编译过程都省了,不过这得有个前提,这必须是你对整个过程都很了解的情况下,否则改哪儿影响哪儿你不清楚,那估计还不如单独编译省时间。

一般来说说,内核启动完毕以后,就要加载init了,目前应该有3种init

  • busybox
  • systemV
  • systemd

busybox其实就是一个命令代替了通用系统上的各种命令。适合嵌入式系统,小巧。

systemV,和systemd主要还是用在通用操作系统上,嵌入式系统里面比较少见。

当然,有能力也可以自己写init,反正内核启动完了,后面用户态的事情你喜欢怎么搞就怎么搞。

busybox和内核,uboot一样都是三步走:

make menuconfig 
make CROSS_COMPILE=arm-linux-gnueabihf- 
make install 

make install安装的二进制及目录结构在当前目录的_install目录,可以基于这个添加必要的系统目录来手工生成rootfs

rootfs 支持好几种方式来启动:cramfs ,jffs2,yafffs2 initrd,ext,initrd 这些方式有的是放在flash,有的直接使用分区(ext),情况不一样各不相同,这个也看uboot是怎么传的内核参数了。

uboot 的mkimge工具生成rootfs image支持好几种方式,可以为kernel,rootfs,devicetree,单独生成镜像文件,也可以用新的打包格式,通过扁平镜像树文件的描述,来生成单个镜像文件(包含内核,设备树和rootfs)

简单的测试就initrd完事,initrd先把文件系统打成cpio包,然后gzip压缩,然后再用mkimage命令制作。

find . | cpio --quiet -H newc -o | gzip -9 -n > ../rootfs.gz
mkimage -n 'uboot RAM rootfs' -A arm -O linux -T ramdisk -C gzip -d rootfs.gz rootfs.uboot
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
上一篇:WINE使用小结 下一篇:linux 设备树
推荐内容
相关内容
栏目更新
栏目热门