单片机 > 单片机程序设计 > 详情

移植u-boot-2016.11到TQ2440开发板全过程记录

发布时间:2021-10-22 发布时间:
|
  • 移植前的准备

  1. 获取并解压源码

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/

  1. 指定交叉编译器

gedit Makefile

找到:

# set default to nothing for native builds

ifeq ($(HOSTARCH),$(ARCH))

CROSS_COMPILE ?=

endif

在下方新插入一行:

CROSS_COMPILE ?=arm-linux-

  1. 创建板卡支持文件

(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

  1. 创建板卡配置头文件

cp include/configs/smdk2410.h include/configs/tq2440.h

编辑该文件:

gedit include/configs/tq2440.h

替换S3C2410为S3C2440,替换SMDK2410为TQ2440

  1. 创建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

  1. 创建默认编译配置文件

创建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. 测试编译环境

(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. 创建自动编译批处理脚本

(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

编译成功:

  1. 小结

至此,我们完成了u-boot-2016.11移植到TQ2440开发板的前期准备工作。

  • 修改芯片初始化代码

  1. 修改屏蔽中断代码

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. 修改时钟初始化代码

(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

[1] [2] [3] [4] [5] [6] [7] [8]
移植u-boot-201611TQ2440开发板

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八