Z-turn Lite Linux 开发环境搭建

Z-turn Lite Linux 开发环境搭建

安装工具链

解压工具链

1
2
3
4
5
mkdir /opt/GNU_Xinlux_toolchain/
tar xjf Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux.tar.bz2 -C /opt/GNU_Xinlux_toolchain/
cd /opt/GNU_Xinlux_toolchain
mv CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux//* .
rm -rf CodeSourcery

把工具链所在的bin 文件夹的路径加入到PATH
在~/.zshrc 的末尾加入下面两句

1
2
export PATH=/opt/GNU_Xinlux_toolchain/bin:$PATH
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-

source ~/.zshrc 之后使用下面命令验证是否生效

1
arm-xilinx-linux-gnueabi-gcc -v

编译U-Boot

1
2
3
4
5
tar xjf u-boot-xlnx.tar.bz2
cd u-boot-xlnx
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make distclean
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make zynq_zturn_config
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make 

make distclean 清除多余的目标
make zynq_zturn_config 会根据 boards.cfg 文件中的对应板子的描述来配置U-Boot

1
Active  arm         armv7          zynq        xilinx          zynq                zynq_zturn                             -

编译过程中可能会出现的错误

以下错误都是因为我的Linux 版本太新导致的, 用官方推荐的老版本Ubuntu 应该是不会有问题的

  • sha1.c:64:19: error: unknown type name ‘sha1_context'

    这只是其中一个错误, 类似的错误还有很多, 根本原因是编译过程中使用了系统的头文件(如: /usr/include/sha1.h )而没有用U-Boot 自带的头文件

    • 解决办法: 在编译的时候使用 -isystem 参数指定某个路径为系统路径, 这样这个路径的优先级就会高于 /usr/include

      如此这般在编译 tools 目录的时候就可以优先使用U-Boot 的include 目录下的头文件

  • usr/bin/ld: errno: TLS definition in /usr/lib/libc.so.6 section .tbss mismatches non-TLS reference in img2srec.o

    出现这个错误的原因是, 在编译时使用了与系统 glibc 版本差异较大的 errno.h 头文件
    这个头文件在 U-Boot/include 目录下, 要解决这个问题, 就必须使用系统的errno.h 头文件来编译
    临时的解决办法是把 U-Boot/include/errno.h 改个名, 但是这样的话后面交叉编译的时候又会找不到这个头文件
    参考下面的解决办法

Z-turn Lite修改U-boot tools/Makefile 一劳永逸解决问题

只需要把 HOSTCPPFLAGS 改成如下样子, 增加前面两个配置即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
HOSTCPPFLAGS = -include /usr/include/errno.h \
		-isystem $(SRCTREE)/include \
		-include $(SRCTREE)/include/libfdt_env.h \
		-idirafter $(SRCTREE)/include \
		-idirafter $(OBJTREE)/include2 \
		-idirafter $(OBJTREE)/include \
		-I $(SRCTREE)/lib/libfdt \
		-I $(SRCTREE)/tools \
		-DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) \
		-DUSE_HOSTCC \
		-D__KERNEL_STRICT_NAMES \
		-D_GNU_SOURCE

其中 -include /usr/include/errno.h 告诉 gcc 优先使用 /usr/include/errno.h 头文件
-isystem $(SRCTREE)/include 告诉gcc 优先使用 $(SRCTREE)/include 的头文件

编译Kernel

1
2
3
4
5
6
tar xjf linux-xlnx.tar.bz2
cd linux-xlnx
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make distclean
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make zynq_zturn_defconfig
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make uImage -j12
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make dtbs

可能碰到的错误

  • /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc’; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here

    原因是gcc 版本太新了, 有两种办法

    • 修改源码

      Kernel/linux-xlnx/scripts/dtc/dtc-lexer.lex.c
      找到 YYLTYPE yylloc; 这一行, 在前面加上 extern

      1
      
      extern YYLTYPE yylloc;
      
    • 降低gcc 版本 ( 不推荐 )
  • arch linux /bin/sh: line 1: bc: command not found

    原因是系统没有装bc
    解决办法:

    1
    
    sudo pacman -S bc
    
  • arch linux “mkimage” command not found - U-Boot images will not be built

    1
    2
    
    sudo pacman -Sy 
    sudo pacman -S uboot-tools 
    

制作文件系统

制作 ramdisk

直接用MYIR 提供的 ramdisk 来改就可以了, 懒得自己再去做根文件系统了
新建一个tmp 文件夹, 所有操作在里面做

1
2
3
4
cd Filesystem
mkdir tmp
cd tmp
cp ../uramdisk.image.gz .
  • 解压ramdisk

    由于 uramdisk.image.gz 是由 mkimage 生成的, 带有64 字节的文件头, 所以要先去掉64 个字节的文件头才可以解压

    1
    2
    
    dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=1
    gunzip ramdisk.image.gz
    
  • 新建一个 rootfs 文件夹, 把 ramdisk.image 挂载到 rootfs

    1
    2
    3
    
    mkdir rootfs
    sudo mount -o loop,rw ramdisk.image rootfs
    ls rootfs
    
  • 进入rootfs 根据需要修改文件系统

    1
    
    cd rootfs
    
  • 在使用 sync 把修改同步到 ramdisk.image 后结束挂载

    1
    2
    
    sync
    sudo umount rootfs
    
  • 重新生成 uramdisk.image.gz

    1
    2
    
    gzip -9 ramdisk.image
    sudo mkimage -A arm -T ramdisk -C gzip -n Ramdisk -d ramdisk.image.gz uramdisk.image.gz
    
  • 删除临时文件

    1
    2
    
    rm ramdisk.image.gz
    rm -rf rootfs
    

修改根文件系统

解压根文件系统

1
2
3
cd Filesystem
mkdir rootfs
sudo tar xvf rootfs.tar -C ./rootfs/

修改好后重新打包

1
2
cd ./rootfs
tar cvf ../rootfs.tar ./*