soc
:s3c2440
board
:jz2440
uboot
:u-boot-2016.11
toolchain
:gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi
在学习了韦东山老师的JZ2400
之前相关的教程,以及uboot
移植的视频之后,打算自己尝试移植一下最新版本的uboot
,但是发现,s3c2440的支持在uboot-2017.1
的版本时就已经被移除了,所以选择了一个最新支持s3c2440
的版本u-boot-2016.11
,这个版本有对于smdk2410
的板级支持,所以可以参考2410进行移植,可以减少一部分工作量。
虚拟机的ubuntu
环境搭建,可以参考这篇文章,后面进行源码配置和编译的时候可以会提示缺少一些工具,所以在Ubuntu16.04 64bit
系统下安装以下这些包,应该是不会出现什么问题;
apt-get update
apt-get install build-essential -y
apt-get install libncurses5-dev -y
apt-get install bison -y
apt-get install flex -y
apt-get install autoconf -y
在浏览器上通过搜索引擎下载文件,也可以通过wget
下载,可能链接会更新失效,那时候,还得重新一下;
wget http://ftp.denx.de/pub/u-boot/u-boot-2016.11.tar.bz2
tar -xvf u-boot-2016.11.tar.bz2
cd u-boot-2016.11
至此,我们已经进入到u-boot
源码路径下了。在这里,我们可以通过make menuconfig
通过图形界面的方式对u-boot
进行配置;如下所示
当然,有一部分板级的配置已经保存到configs
路径下,可以找到smdk2410_defconfig
,可以执行make smdk2410_defconfig
将这个文件里的配置写入到.config
中;
总体的编译指令如下两条,但是这时候编译会出现报错;
make smdk2410_defconfig
make
# output make error information
lib/asm-offsets.c:1:0: error: bad value (armv4t) for -march= switch
/*
^
Kbuild:43: recipe for target 'lib/asm-offsets.s' failed
make[1]: *** [lib/asm-offsets.s] Error 1
Makefile:1285: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2
无法编译通过,因为当前系统默认的gcc
编译器无法支持armv4t
这个架构,所以下面还得设置一下工具链;
这里,我比较推荐Linaro
上的工具链,找到一个比较新的版本,然后直接配置,本文直接下载gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz
;
sudo wget https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabi/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz
sudo cp gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz /opt
sudo tar -xvf gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz
完成上述指令后,/opt/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/
路径就是我们的工具链的根路径;
但是这里不打算通过设置环境变量,而是编写一个编译脚本,在脚本里对环境变量进行临时设置;
vi mk.sh
内容如下:
#!/bin/bash
TOOLCHAIN=/opt/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/bin
export ARCH=arm
export PATH=$TOOLCHAIN:$PATH
export CROSS_COMPILE=arm-linux-gnueabi-
make smdk2410_defconfig
make -j4
按下Esc
键,然后输入:wq
进行保存;
chmod 777 mk.sh
为脚本赋予可执行权限;
./mk.sh #进行编译
这时候会发现一个报错如下所示:
arm-linux-gnueabi-ld.bfd: u-boot: Not enough room for program headers, try linking with -N
arm-linux-gnueabi-ld.bfd: final link failed: Bad value
Makefile:1208: recipe for target 'u-boot' failedl
大概是 ld
的bug,需要修改Makefile,具体可以参考这个解决方案,或者降低工具链的版本,可以使用版本6.2-2016.11,经过测试可行。