移植前的准备
获取并解压源码
SAMSUNG公司于2017年初停止了对S3C2410系列CPU的官方u-boot支持(可在最新版u-boot源码中打开doc/README.scrapyard,搜索关键字S3C2440查看相关说明)。从/zixunimg/eeworldimg/ftp.denx.de/pub/u-boot/下载支持S3C2410处理器的最后一版官方u-boot源码u-boot-2016.11.tar.bz2,放到宿主机的/opt/u-boot/下。
解压源代码并进入根目录:
tar jxvf u-boot-2016.11.tar.bz2
cd u-boot-2016.11/
指定交叉编译器
gedit Makefile
找到:
# set default to nothing for native builds
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
在下方新插入一行:
CROSS_COMPILE ?=arm-linux-
创建板卡支持文件
(1)创建板卡支持文件夹
拷贝官方smdk2410文件夹进行修改:
cp -rf board/samsung/smdk2410/ board/samsung/tq2440
(2)修改板卡硬件初始化文件
gedit board/samsung/tq2440/lowlevel_init.S
修改s3c2410.S为tq2440.S,修改SMDK2410为TQ2440。
(3)修改板卡高级初始化文件
重命名该文件夹下的smdk2410.c为tq2440.c:
mv board/samsung/tq2440/smdk2410.c board/samsung/tq2440/tq2440.c
编辑该文件:
gedit board/samsung/tq2440/tq2440.c
替换所有SMDK2410为TQ2440,并添加编译选项。
gedit board/samsung/tq2440/Makefile
修改smdk2410.o为tq2440.o
(4)修改板卡配置文件
编辑该文件:
gedit board/samsung/tq2440/Kconfig
内容为:
if TARGET_TQ2440
config SYS_BOARD
default "tq2440"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s3c24x0"
config SYS_CONFIG_NAME
default "tq2440"
endif
(5)添加板卡支持文件信息
gedit arch/arm/Kconfig
找到
config TARGET_SMDK2410
bool "Support smdk2410"
select CPU_ARM920T
在下方插入:
config TARGET_TQ2440
bool "Support tq2440"
select CPU_ARM920T
找到:
source "board/samsung/smdk2410/Kconfig"
在下方插入:
source "board/samsung/tq2440/Kconfig"
(6)修改板卡支持维护信息
gedit board/samsung/tq2440/MAINTAINERS
修改内容为:
TQ2440 BOARD
M: Lion <41979748@qq.com>
S: Maintained
F: board/samsung/tq2440/
F: include/configs/tq2440.h
F: configs/tq2440_defconfig
(7)添加板卡识别信息
gedit arch/arm/include/asm/mach-types.h
找到:
#define MACH_TYPE_SMDK2410 193
在下方插入:
#define MACH_TYPE_TQ2440 168
找到:
#ifdef CONFIG_ARCH_SMDK2410
# ifdef machine_arch_type
# undef machine_arch_type
# define machine_arch_type __machine_arch_type
# else
# define machine_arch_type MACH_TYPE_SMDK2410
# endif
# define machine_is_smdk2410() (machine_arch_type == MACH_TYPE_SMDK2410)
#else
# define machine_is_smdk2410() (0)
#endif
在下面插入一段:
#ifdef CONFIG_ARCH_TQ2440
# ifdef machine_arch_type
# undef machine_arch_type
# define machine_arch_type __machine_arch_type
# else
# define machine_arch_type MACH_TYPE_TQ2440
# endif
# define machine_is_tq2440() (machine_arch_type == MACH_TYPE_TQ2440)
#else
# define machine_is_tq2440() (0)
#endif
创建板卡配置头文件
cp include/configs/smdk2410.h include/configs/tq2440.h
编辑该文件:
gedit include/configs/tq2440.h
替换S3C2410为S3C2440,替换SMDK2410为TQ2440
创建NAND Flash驱动文件
cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c
编辑该文件:
gedit drivers/mtd/nand/s3c2440_nand.c
添加编译选项:
gedit drivers/mtd/nand/Makefile
找到:
obj-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
在下方插入一行:
obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o
创建默认编译配置文件
创建tq2440开发板默认配置文件:
cp configs/smdk2410_defconfig configs/tq2440_defconfig
编辑该文件:
gedit configs/tq2440_defconfig
修改开发板目标:
替换CONFIG_TARGET_SMDK2410=y为CONFIG_TARGET_TQ2440=y;
修改命令行前缀:
替换CONFIG_SYS_PROMPT="SMDK2410 # "为CONFIG_SYS_PROMPT="TQ2440 # ";
测试编译环境
(1)清理环境并重新编译
make distclean
make tq2440_defconfig
make
编译失败,并提示” Not enough room for program headers, try linking with -N”错误:
错误信息:
arm-linux-ld.bfd: u-boot: Not enough room for program headers, try linking with -N
arm-linux-ld.bfd: final link failed: Bad value
Makefile:1209: recipe for target 'u-boot' failed
make: *** [u-boot] Error 1
(2)根据网上资料,修改顶层配置文件:
gedit Makefile
找到:
LDFLAGS_u-boot += $(LDFLAGS_FINAL)
在下面插入:
# Avoid 'Not enough room for program headers' error on binutils 2.28 onwards
LDFLAGS_u-boot += $(call ld-option, --no-dynamic-linker)
(3)重新编译
make
在根目录下生成了u-boot.bin文件,但提示“Error: You must add new CONFIG options using Kconfig”错误
错误信息:
Error: You must add new CONFIG options using Kconfig
The following new ad-hoc CONFIG options were detected:
CONFIG_NAND_S3C2440
CONFIG_SYS_S3C2440_NAND_HWECC
CONFIG_TQ2440
Please add these via Kconfig instead. Find a suitable Kconfig
file and add a 'config' or 'menuconfig' option.
Makefile:827: recipe for target 'all' failed
make: *** [all] Error 1
这一个错误产生的原因是修改了配置头文件中的默认宏定义而导致配置检查无法通过,如果根据消息提示手工在whitelist.txt文件中添加相应宏,由于不知道whitelist.txt文件中的排序规则,仍旧可能报错。
(4)解决白名单校验不通过问题
根据网上资料来看,目前切实有效的解决办法是关闭该校验功能。
gedit Makefile
找到:
$(srctree)/scripts/check-config.sh u-boot.cfg
$(srctree)/scripts/config_whitelist.txt ${srctree} 1>&2
在开头位置使用#屏蔽这两行:
# $(srctree)/scripts/check-config.sh u-boot.cfg
# $(srctree)/scripts/config_whitelist.txt ${srctree} 1>&2
创建自动编译批处理脚本
(1)编写自动编译脚本
gedit auto_build.sh
添加如下内容:
#!/bin/bash
echo "Clean Configuration File..."
make distclean
echo "Clean Obj..."
make clean
echo "Load Configuration File..."
make tq2440_defconfig
echo "make..."
make CROSS_COMPILE=arm-linux-
echo "Copy bins to TFTP Folder...."
cp /opt/u-boot/u-boot-2016.11/u-boot.bin /opt/TFTP/u-boot.bin
cp /opt/u-boot/u-boot-2016.11/spl/u-boot-spl.bin /opt/TFTP/u-boot-spl.bin
(2)为自动编译脚本文件添加执行权限
sudo chmod +X auto_build.sh
(3)修改自动编译脚本文件所有者
sudo chown -R tq2440:root /opt/u-boot/u-boot-2016.11/auto_build.sh
(4)执行自动编译脚本
bash ./auto_build.sh
编译成功:
小结
至此,我们完成了u-boot-2016.11移植到TQ2440开发板的前期准备工作。
修改芯片初始化代码
修改屏蔽中断代码
gedit arch/arm/cpu/arm920t/start.S
找到:
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
在下面为S3C2440芯片添加:
# if defined(CONFIG_S3C2440)
ldr r1, =0x7ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
修改时钟初始化代码
(1)修改芯片时钟初始化代码
gedit arch/arm/cpu/arm920t/start.S
找到:
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
替换为:
#if defined(CONFIG_S3C2440)
#define CLK_CTL_BASE 0x4C000000
#define MDIV_405 0x7f<<12
#define PSDIV_405 0x21
/* FCLK:HCLK:PCLK = 1:4:8 */
/* default FCLK is 405 MHz ! */
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
/* set asynchronous bus mod */
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
/* MPLL is 405 MHz ! */
mov r1, #CLK_CTL_BASE
mov r2, #MDIV_405
add r2, r2, #PSDIV_405
str r2, [r1, #0x04]
#else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif /* CON
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』