总结一下,编译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.
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的编译类似,稍有不同
make menuconfig //如果有配置好的.config这一步可以不用
make ARCH=arm -j4 uImage LOADADDR=0x00008000 //uImage貌似必须要指定入口地址,不知道.config能不能提前写好。编译好的uImage在arch/arm/boot/下,
make dtbs //这一步生成设备树文件,启动的时候要显式加载的,不像uboot,不是内含就是附加到uboot本身后面。
本来以为busybox搞起打包好就完事了,不过貌似要简单方便就直接用buildroot,连uboot,kernel,rootfs(除了busybox还有很多额外的软件包都可以一并编译打包了),打包的工作一起给你干了,确实是提高生产力的好工具,只要配置好了前面那些内核uboot的编译过程都省了,不过这得有个前提,这必须是你对整个过程都很了解的情况下,否则改哪儿影响哪儿你不清楚,那估计还不如单独编译省时间。
一般来说说,内核启动完毕以后,就要加载init了,目前应该有3种init
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