本系列博客将基于MINI2440开发板移植最新uboot、最新linux kernel、最新busybox、最新Qt。本系列文章记录的过程尽量按照修改->出错->修改->正确的方式记录,带有讲解性质,可能会有点啰嗦,如果您有移植基础建议直接下载我提供的源码参考。
看明白本文需要有一点移植基础,了解Linux简单命令和一些工具的使用。我的每一篇移植过程我都尽量做到实验两遍,确保不会出错。
进入u-boot官网下载最新的u-boot,我下载时最新的版本是u-boot-2015.07-rc3.tar.bz2。
解压u-boot:tar jxvf u-boot-2015.07-rc3.tar.bz2
进入解压后的目录:cd u-boot-2015.07-rc3/
配置处理器架构:make menuconfig
Architecture select (Sandbox) --->
(X) ARM architecture
保存退出。
|
配置交叉编译工具:
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# vim Makefile
搜索 CROSS vim命令: /CROSS
可以看到如下内容:
239 # set default to nothing for native builds
240 ifeq ($(HOSTARCH),$(ARCH))
241 CROSS_COMPILE ?=
242 endif
243
|
复制241行到243行并添加编译工具链前缀,添加后的效果如下:
240 ifeq ($(HOSTARCH),$(ARCH))
241 CROSS_COMPILE ?=
242 endif
243
244 CROSS_COMPILE ?=arm-linux-
245
246 KCONFIG_CONFIG ?= .config
|
拷贝smdk2410开发板的默认配置文件:
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# cp configs/smdk2410_defconfig configs/smdk2440_defconfig
拷贝smdk2410开发板的配置头文件:
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# cp include/configs/smdk2410.h include/configs/smdk2440.h
建立smdk2440开发板的板级支持文件夹并拷贝相关内容:
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# mkdir ./board/samsung/smdk2440
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# cp ./board/samsung/smdk2410/* ./board/samsung/smdk2440/ -rf
配置smdk2440开发板的默认配置:
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# make smdk2440_defconfig
#
# configuration written to .config
#
|
root@ubuntu:/home/uboot/u-boot-2015.07-rc3#make 编译
编译成功。但是这并不是我需要的uboot,因为在编译的过程中看到:
LD board/samsung/common/built-in.o
CC board/samsung/smdk2410/smdk2410.o
AS board/samsung/smdk2410/lowlevel_init.o
LD board/samsung/smdk2410/built-in.o
CC common/main.o
|
明显在板级支持上使用的还是2410开发板的文件,所以在这里需要查看一下smdk2440_defconfig里面是什么:
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# vim configs/smdk2440_defconfig
CONFIG_ARM=y
CONFIG_TARGET_SMDK2410=y
# CONFIG_CMD_SETEXPR is not set
|
所以在这里需要把SMDK2410修改为SMDK2440,修改结果如下:
CONFIG_ARM=y
CONFIG_TARGET_SMDK2440=y
# CONFIG_CMD_SETEXPR is not set
|
保存退出,执行命令makedistclean清除工程
清除工程后重新配置uboot 命令:makesmdk2440_defconfig
make编译
编译出错,错误如下:
scripts/kconfig/conf --silentoldconfig Kconfig
CHK include/config.h
UPD include/config.h
GEN include/autoconf.mk
In file included from ./include/common.h:18:
include/config.h:5:22: error: configs/.h: No such file or directory
make[1]: *** [include/autoconf.mk] Error 1
make: *** No rule to make target `include/config/auto.conf', needed by `include/config/uboot.release'. Stop.
|
上述错误说include/config.h文件中找不到头文件configs/.h,打开include/config.h看一下:
vim include/config.h
/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/
#include <config_defaults.h>
#include <config_uncmd_spl.h>
#include <configs/.h>
#include <asm/config.h>
#include <config_fallbacks.h>
|
提示说这个文件include/config.h是自动生成的。
遇到这种不明所以的情况,我们回到smdk2410的开发板查看使用2410是什么情况。
make distclean
make smdk2410_defconfig
make
vim include/config.h 可以看到:
/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/samsung/smdk2410
#include <config_defaults.h>
#include <config_uncmd_spl.h>
#include <configs/smdk2410.h>
#include <asm/config.h>
#include <config_fallbacks.h>
|
很明显在配置smdk2440的时候出了问题,导致生成的include/config.h文件不正确。这个时候应该分析uboot的Makefile结构,但是我们这里使用比较粗暴的方法,直接检索uboot的配置中有smdk2410的地方都增加smdk2440的支持。
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# make distclean && clear
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# grep "smdk2410" * -nR
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# grep "smdk2440" * -nR
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# grep "smdk2410" * -nR
arch/arm/Kconfig:85: bool "Support smdk2410"
arch/arm/Kconfig:946:source "board/samsung/smdk2410/Kconfig"
arch/arm/include/asm/mach-types.h:1648:# define machine_is_smdk2410() (machine_arch_type == MACH_TYPE_SMDK2410)
arch/arm/include/asm/mach-types.h:1650:# define machine_is_smdk2410() (0)
board/samsung/smdk2410/Kconfig:4: default "smdk2410"
board/samsung/smdk2410/Kconfig:13: default "smdk2410"
board/samsung/smdk2410/MAINTAINERS:4:F: board/samsung/smdk2410/
board/samsung/smdk2410/MAINTAINERS:5:F: include/configs/smdk2410.h
board/samsung/smdk2410/MAINTAINERS:6:F: configs/smdk2410_defconfig
board/samsung/smdk2410/Makefile:8:obj-y := smdk2410.o
board/samsung/smdk2440/Kconfig:4: default "smdk2410"
board/samsung/smdk2440/Kconfig:13: default "smdk2410"
board/samsung/smdk2440/MAINTAINERS:4:F: board/samsung/smdk2410/
board/samsung/smdk2440/MAINTAINERS:5:F: include/configs/smdk2410.h
board/samsung/smdk2440/MAINTAINERS:6:F: configs/smdk2410_defconfig
board/samsung/smdk2440/Makefile:8:obj-y := smdk2410.o
root@ubuntu:/home/uboot/u-boot-2015.07-rc3#
|
根据查找的结果标记出关于配置相关的文件位置(查找结果中红色标记的位置)。
vim打开arch/arm/Kconfig的85行看到:
84 config TARGET_SMDK2410
85 bool "Support smdk2410"
86 select CPU_ARM920T
|
增加对smdk2440的支持:
修改结果如下:
84 config TARGET_SMDK2410
85 bool "Support smdk2410"
86 select CPU_ARM920T
87
88 config TARGET_SMDK2440
89 bool "Support smdk2440"
90 select CPU_ARM920T
|
打开arch/arm/Kconfig的946行看到:
vim arch/arm/Kconfig +946
949 source "board/pxa255_idp/Kconfig"
950 source "board/samsung/smdk2410/Kconfig"
951 source "board/sandisk/sansa_fuze_plus/Kconfig"
|
添加对smdk2440的配置,配置结果如下:
949 source "board/pxa255_idp/Kconfig"
950 source "board/samsung/smdk2410/Kconfig"
951 source "board/samsung/smdk2440/Kconfig"
952 source "board/sandisk/sansa_fuze_plus/Kconfig"
|
打开board/samsung/smdk2440/Kconfig是这样的:
vim board/samsung/smdk2440/Kconfig:
if TARGET_SMDK2410
config SYS_BOARD
default "smdk2410"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s3c24x0"
config SYS_CONFIG_NAME
default "smdk2410"
endif
|
把上面board/samsung/smdk2440/Kconfig中所有的2410修改成2440,其他不变。
修改结果如下:
if TARGET_SMDK2440
config SYS_BOARD
default "smdk2440"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s3c24x0"
config SYS_CONFIG_NAME
default "smdk2440"
endif
|
打开board/samsung/smdk2440/Makefile并修改其中的2410为2440,修改后的结果如下:
#
# (C) Copyright 2000-2006
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# SPDX-License-Identifier: GPL-2.0+
#
obj-y := smdk2440.o
obj-y += lowlevel_init.o
|
修改board/samsung/smdk2440/Makefile后相应地需要把board/samsung/smdk2440/目录下的smdk2410.c改名为smdk2440.c,命令如下:
mv board/samsung/smdk2440/smdk2410.c board/samsung/smdk2440/smdk2440.c
|
修改完上面的3个文件后感觉是修改完了,编译一下试试:
make distclean
make smdk2440_defconfig
make
编译成功,并且编译过程中有:
LD board/samsung/common/built-in.o
CC board/samsung/smdk2440/smdk2440.o
AS board/samsung/smdk2440/lowlevel_init.o
LD board/samsung/smdk2440/built-in.o
CC common/main.o
CC common/exports.o
|
基本确定现在针对smdk2440的uboot框架已经修改成功。
接下来使用sourceInsight建立uboot工程,方便查看修改代码。
我的sourceInsight是安装在Ubuntu中的,这样直接在Ubuntu中修改以后就直接可以编译了。当然也可以在windows中修改相关文件后再传入虚拟机编译。在建立uboot的sourceInsight工程的时候建议针对性的添加smdk2440的板级文件(board目录下)、arm9内核(arch/arm目录下)文件,以及include/configs下的smdk2440.h文件。这样在使用sourceInsight的过程中会方便很多。
保存现有阶段成果,方便以后修改。
root@ubuntu:/home/uboot/u-boot-2015.07-rc3# cd ..
root@ubuntu:/home/uboot# tar zcvf u-boot-2015.07rc3-smdk2440.tar.gz u-boot-2015.07-rc3
|
下一小节修改uboot支持SDRAM和SPL启动。
完全按本系列教程修改好的u-boot源码提供给大家下载,你在以后的移植过程中可以参考着移植。注意这个u-boot只能以nor启动(原因在后面的文章会讲到),功能已完善。
u-boot-2015.07-rc3 : http://download.csdn.net/detail/doccode/8954291