21_搭建设备树编译环境以及镜像烧写

介绍在Ubuntu12.04、WSL-Ubuntu18.04中搭建设备树编译环境,以及镜像烧写

Posted by Jerry Chen on August 15, 2019

Ubuntu12.04下搭建

提前准备好如下工具和文件:

工具 描述 使用方法
device-tree-compiler 设备树编译器(32bit) sudo apt-get install device-tree-compiler
mkfs_2tools.tgz 2个打包工具,mkimage、make_ext4fs 下载 安装
itop4412_kernel_4_14_2_bsp-20190225.tar.gz 设备树源码包,在4412设备树相关视频下找到。  
gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz gcc交叉编译工具,包含在上面设备树源码包压缩文件中。 安装方法见下面

操作方法如下:

  1. 确保mkimage工具存在 安装mkimage

  2. 安装装设备树编译器:

    1
    
    sudo apt-get install device-tree-compiler
    
  3. 解压源码包:

    1
    
    tar -vxf itop4412_kernel_4_14_2_bsp-20190225.tar.gz
    
  4. 进入源码包解压后的目录,移动gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz文件

    1
    
    mv gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz /usr/local/arm/
    
  5. 进入/usr/local/arm/目录,对交叉gcc编译器进行解压

    1
    
    tar -vxf gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz
    
  6. 添加环境变量并更新

    vim ~/.bashrc中添加当前用户环境变量,然后source ~/.bashrc更新:

    1
    
    export PATH=$PATH:/usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin
    

    或者更改全局环境变量vim /etc/profile,然后source /etc/profile更新;

  7. 进入源码包解压后的目录,修改编译器

    修改uboot源码包中编译器:vim u-boot-2017.11/u-boot-2017.11/Makefile

    修改kernel源码包中编译器:vim linux-4.14.2_iTop-4412_scp/Makefile

    均修改编译器配置如下:

    1
    
    CROSS_COMPILE := arm-fsl-linux-gnueabi-
    
  8. 上述完成后,执行源码包目录中编译全部的脚本

    1
    
    ./build_all.sh
    

    没报错就成功了。

脚本内容:

build_all.sh 是uboot、kernel和设备树一起编译的脚本;

u-boot-2017.11/u-boot/build.sh 是单独编译uboot的脚本;

linux-4.14.2_iTop-4412_scp/build_kernel.sh 是单独编译内核的脚本;其中编译配置是其下的linux-4.14.2_iTop-4412_scp/arch/arm/configs/iTop-4412_scp_defconfig文件,脚本执行中该文件会覆盖.config文件。

镜像生成地址:

uboot镜像:u-boot-2017.11/u-boot/u-boot-iTOP-4412.bin

内核镜像:linux-4.14.2_iTop-4412_scp/arch/arm/boot/uImage

设备树镜像:linux-4.14.2_iTop-4412_scp/arch/arm/boot/dts/exynos4412-itop-elite.dtb

WSL-Ubuntu18.04下搭建

提前准备好如下工具和文件:

工具 描述 使用方法
device-tree-compiler 设备树编译器(64bit) sudo apt-get install device-tree-compiler
mkimage 打包工具(64bit) sudo apt-get install u-boot-tools
itop4412_kernel_4_14_2_bsp-20190225.tar.gz 设备树源码包,在4412设备树相关视频下找到。  
gcc-arm-linux-gnueabihf gcc交叉编译工具 sudo apt-get install gcc-arm-linux-gnueabihf

操作方法如下:

  1. 安装mkimage工具

    1
    
    sudo apt-get install u-boot-tools
    
  2. 安装装设备树编译器:

    1
    
    sudo apt-get install device-tree-compiler
    
  3. 解压源码包:

    1
    
    tar -vxf itop4412_kernel_4_14_2_bsp-20190225.tar.gz
    
  4. 进入源码包解压后的目录,删除gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz文件

    1
    
    rm gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz
    
  5. 安装交叉gcc编译器

    1
    
    sudo apt-get install gcc-arm-linux-gnueabihf
    
  6. 进入源码包解压后的目录,修改编译器

    修改uboot源码包中编译器:vim u-boot-2017.11/u-boot-2017.11/Makefile

    修改kernel源码包中编译器:vim linux-4.14.2_iTop-4412_scp/Makefile

    均修改编译器配置如下:

    1
    
    CROSS_COMPILE := arm-linux-gnueabihf-
    
  7. 上述完成后,执行源码包目录中编译全部的脚本

    1
    
    ./build_all.sh
    

    没报错就成功了。

脚本内容:

build_all.sh 是uboot、kernel和设备树一起编译的脚本;

u-boot-2017.11/u-boot/build.sh 是单独编译uboot的脚本;

linux-4.14.2_iTop-4412_scp/build_kernel.sh 是单独编译内核的脚本;其中编译配置是其下的linux-4.14.2_iTop-4412_scp/arch/arm/configs/iTop-4412_scp_defconfig文件,脚本执行中该文件会覆盖.config文件。

镜像生成地址:

uboot镜像:u-boot-2017.11/u-boot/u-boot-iTOP-4412.bin

内核镜像:linux-4.14.2_iTop-4412_scp/arch/arm/boot/uImage

设备树镜像:linux-4.14.2_iTop-4412_scp/arch/arm/boot/dts/exynos4412-itop-elite.dtb

镜像烧写

首先,烧写需要更新uboot为支持设备树的uboot,也就是我们上面生成的u-boot-iTOP-4412.bin。

按照之前的烧写方法更新uboot 这里

1
2
fastboot.exe flash bootloader u-boot-iTOP-4412.bin
fastboot reboot

然后重启回车进入新的uboot,转cmd烧写使用命令:fastboot 0

如果原来的 adb 驱动失效了,就检查一下驱动安装,完成后选择性执行下面的指令进行烧写:

1
2
3
4
5
fastboot.exe flash bootloader u-boot-iTOP-4412.bin
fastboot.exe flash kernel uImage
fastboot.exe flash dtb exynos4412-itop-elite.dtb
fastboot.exe flash system system.img
fastboot reboot

注意第一次操作时会有一些坑:

坑1:开发板启动后提示“Waiting for root device /dev/mmcblk0p2…”

说明配置文件(kernel)arch/arm/configs/iTop-4412_scp_defconfig中root指定有误。

CONFIG_CMDLINE="root=/dev/mmcblk0p2 console=ttySAC2,115200 init=/linuxrc rootwait"

改为:CONFIG_CMDLINE="root=/dev/mmcblk1p2 console=ttySAC2,115200 init=/linuxrc rootwait"

坑2:启动后文件系统不可写。

添加rw权限,继续将内核配置上面改为:CONFIG_CMDLINE="root=/dev/mmcblk1p2 rw console=ttySAC2,115200 init=/linuxrc rootwait"

坑3:启动后控制台一直打印tty2、3、4的错误。

将文件系统文件/etc/init.d/rcSln...tty2、3、4这样的命令屏蔽。创建最小系统

坑4:fastboot烧写中出现“FAILED (status malformed (0 bytes))”提示

实际不影响烧写。

坑5:有usb hub驱动但是没有设备信息,需要手动添加;所以暂时无法用U盘和网口

具体是不存在usb3503A设备信息,但驱动存在并且默认被编译。DM9621A网卡的兼容驱动dm9601默认编译。

添加以下信息到设备树linux-4.14.2_iTop-4412_scp/arch/arm/boot/dts/exynos4412-itop-elite.dts中根节点中,添加重烧后会发现网卡灯亮起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
usbphy:usbphy@125B0000{
	#address-cells=<1>;
	#size-cells=<1>;
	compatible="samsung,exynos4x12-usb2phy";
	reg=<0x125B0000 0x100>;
	ranges;

	clocks=<&clock 2>,<&clock 305>;
	clock-names="xusbxti","otg";

	usbphy-sys{
		reg=<0x10020704 0x8 0x1001021c 0x4>;
	};
};
ehci@12580000{
	status="okay";
	usbphy=<&usbphy>;
};
usb3503@08{
	compatible="smsc,usb3503";
	reg=<0x08 0x4>;
	connect-gpios=<&gpm3 3 1>;
	intn-gpios=<&gpx2 3 1>;
	reset-gpios=<&gpm2 4 1>;
	initial-mode=<1>;
};