iTop4412 uboot-2019.2移植之杨帆启航(一)

一、环境准备

1.1操作系统

本人使用Debian9 x64和VMwae作为开发环境,因为熟悉该环境,能同时运行32位和64位程序,能直接利用各种命令访问硬件。

1.2编译系统

我用的编译器为Linaro,建议JLINK用户使用arm-eabi版本,链接地址为(https://www.linaro.org/downloads/),

arm-compile.png

1.3 UBOOT

我采用最u-boot-2019.1版,对版本唯一要求就是要用现在的项目结构,不然以后还得熟悉重构后的项目结构。下载地址(http://ftp.denx.de/pub/u-boot/).

二、初次编译

2.1目的

检查环境正常,只有编译通过了,才能做其他事情。想尽一切办法,让程序编译通过。

2.2过程

  1. 修改顶层Makefile,添加编译器前缀,例如CROSS_COMPILE := arm-eabi-
  2. 执行make origen_defconfig
  3. 执行make menuconfig
  4. 执行make -j4
  5. 执行make clean
  6. 执行make distclean

2.3 问题

如果遇到问题,请认真阅读错误信息(看不懂找有道),基本上都是某些库没安装,安装上就好了。

三、拷贝模板

3.1 默认配置

在configs目录下有众多形如xxx_defconfig的文件,存放默认编译选项。make origen_defconfig就是将origen_defconfig写入到.config文件中。

我们需要创建自己的配置文件,取名itop4412_defconfig。复制origen_defconfig,并把内容中的ORIGEN替换为ITOP4412,注意大小写。

CONFIG_ARM=y
CONFIG_ARCH_EXYNOS=y
CONFIG_SYS_TEXT_BASE=0x43E00000
CONFIG_ARCH_EXYNOS4=y
CONFIG_TARGET_ITOP4412=y
CONFIG_SPL=y
CONFIG_IDENT_STRING=" for ITOP4412"
CONFIG_DISTRO_DEFAULTS=y
# CONFIG_USE_BOOTCOMMAND is not set
CONFIG_SYS_CONSOLE_IS_IN_ENV=y
CONFIG_SYS_CONSOLE_INFO_QUIET=y
# CONFIG_SPL_FRAMEWORK is not set
CONFIG_SYS_PROMPT="ITOP4412 # "
# CONFIG_CMD_XIMG is not set
CONFIG_CMD_THOR_DOWNLOAD=y
CONFIG_CMD_DFU=y
CONFIG_CMD_GPT=y
CONFIG_CMD_MMC=y
CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_NET is not set
CONFIG_CMD_CACHE=y
# CONFIG_CMD_MISC is not set
CONFIG_CMD_EXT4_WRITE=y
CONFIG_OF_CONTROL=y
CONFIG_DEFAULT_DEVICE_TREE="exynos4412-itop4412"
CONFIG_DFU_MMC=y
CONFIG_DM_MMC=y
CONFIG_MMC_DW=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_SDMA=y
CONFIG_MMC_SDHCI_S5P=y
CONFIG_USB=y
CONFIG_DM_USB=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_MANUFACTURER="Samsung"
CONFIG_USB_GADGET_VENDOR_NUM=0x04e8
CONFIG_USB_GADGET_PRODUCT_NUM=0x6601
CONFIG_USB_GADGET_DWC2_OTG=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_USB_FUNCTION_THOR=y
# CONFIG_REGEX is not set

执行make itop4412_defconfigmake -j4,看下缺什么。

3.2 板级文件

拷贝board/samsung/origen到board/samsung/itop4412。


文件结构.png

跟ORIGEN的结构差不了多少,只是进行了字符串替换,但tools目录下的文件,需要用我提供的。

3.3 文件关联

修改arch/arm/mach-exynos/Kconfig。


菜单添加.png

3.4 自定配置

执行make -j2,会报错误:include/config.h:5:10: fatal error: configs/itop4412.h: No such file or directory

我们需要添加文件include/configs/itop4412.h,内容来自include/configs/origen.h,并且还需要处理。

 #ifndef __CONFIG_ITOP4412_H
#define __CONFIG_ITOP4412_H

#include 

/* High Level Configuration Options */
#define CONFIG_EXYNOS4412                   1   /* 添加 which is a EXYNOS4412 SoC */
#define CONFIG_ITOP4412                     1   /* 添加 working with ITOP4412*/

#define CONFIG_SYS_DCACHE_OFF           1

/* ITOP4412 has 4 bank of DRAM */
#define CONFIG_SYS_SDRAM_BASE           0x40000000
#define PHYS_SDRAM_1                    CONFIG_SYS_SDRAM_BASE
#define SDRAM_BANK_SIZE                 (256 << 20)     /* 256 MB */

/* memtest works on */
#define CONFIG_SYS_MEMTEST_START        CONFIG_SYS_SDRAM_BASE
#define CONFIG_SYS_MEMTEST_END          (CONFIG_SYS_SDRAM_BASE + 0x6000000)
#define CONFIG_SYS_LOAD_ADDR            (CONFIG_SYS_SDRAM_BASE + 0x3E00000)

#define CONFIG_MACH_TYPE                MACH_TYPE_ITOP4412  /*机器ID,会报错*/

/* select serial console configuration */

/* Console configuration */
#define CONFIG_DEFAULT_CONSOLE          "console=ttySAC1,115200n8\0"

#define CONFIG_SYS_MEM_TOP_HIDE (1 << 20)       /* ram console */

#define CONFIG_SYS_MONITOR_BASE 0x00000000

/* Power Down Modes */
#define S5P_CHECK_SLEEP                 0x00000BAD
#define S5P_CHECK_SLEEP                 0x00000BAD
#define S5P_CHECK_DIDLE                 0xBAD00000
#define S5P_CHECK_LPA                   0xABAD0000

/* MMC SPL */
#define COPY_BL2_FNPTR_ADDR     0x02020030
#define CONFIG_SPL_TEXT_BASE    0x02023400  /*修改,不管你是什么版本的SPL1,SPL2都被SPL1加载至0x02023400*/

#define CONFIG_EXTRA_ENV_SETTINGS \
        "loadaddr=0x40007000\0" \
        "rdaddr=0x48000000\0" \
        "kerneladdr=0x40007000\0" \
        "ramdiskaddr=0x48000000\0" \
        "console=ttySAC2,115200n8\0" \
        "mmcdev=0\0" \
        "bootenv=uEnv.txt\0" \
        "loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \
        "importbootenv=echo Importing environment from mmc ...; " \
                "env import -t $loadaddr $filesize\0" \
        "loadbootscript=load mmc ${mmcdev} ${loadaddr} boot.scr\0" \
        "bootscript=echo Running bootscript from mmc${mmcdev} ...; " \
                "source ${loadaddr}\0"
#define CONFIG_BOOTCOMMAND \
        "if mmc rescan; then " \
                "echo SD/MMC found on device ${mmcdev};" \
                "if run loadbootenv; then " \
                        "echo Loaded environment from ${bootenv};" \
                        "run importbootenv;" \
                "fi;" \
                "if test -n $uenvcmd; then " \
                        "echo Running uenvcmd ...;" \
                        "run uenvcmd;" \
                "fi;" \
                "if run loadbootscript; then " \
                        "run bootscript; " \
                "fi; " \
        "fi;" \
        "load mmc ${mmcdev} ${loadaddr} uImage; bootm ${loadaddr} "
/* MIU (Memory Interleaving Unit) */
#define CONFIG_MIU_2BIT_21_7_INTERLEAVED

#define CONFIG_SYS_MMC_ENV_DEV          0
#define CONFIG_ENV_SIZE                     (16 << 10)  /* 16 KB */
#define RESERVE_BLOCK_SIZE                  (512)
#define BL1_SIZE                                (16 << 10) /*16 K reserved for BL1*/
#define CONFIG_ENV_OFFSET                   (RESERVE_BLOCK_SIZE + BL1_SIZE)

#define CONFIG_SPL_MAX_FOOTPRINT        (14 * 1024)

#define CONFIG_SYS_INIT_SP_ADDR         0x02040000

/* U-Boot copy size from boot Media to DRAM.*/
#define COPY_BL2_SIZE               0x80000
#define BL2_START_OFFSET            ((CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)/512)
#define BL2_SIZE_BLOC_COUNT         (COPY_BL2_SIZE/512)

#endif  /* __CONFIG_H */

大胆修改该配置,锻炼自己!日后遇到配置错误,皆可自行解决。现在会报错误:
MACH_TYPE_ITOP4412’ undeclared

3.5 机器类型

执行grep "MACH_TYPE_ORIGEN" . -nR,可找到arch/arm/include/asm/mach-types.h:3405:#define MACH_TYPE_ORIGEN 3455

因此在文件末尾添加#define MACH_TYPE_ITOP4412 5115

不知这个是做什么的,故依葫芦画瓢,但需要注意该值,他是个定时炸弹。

3.6 设备树

出现错误:No rule to make target 'arch/arm/dts/exynos4412-itop4412.dts', needed by 'arch/arm/dts/exynos4412-itop4412.dtb'

暂时不知设备树干嘛的,直接拷贝arch/arm/dts/exynos4412-odroid.dts,修改下里面内容。怎么改呢?字符串替换啊。

3.7 符号未定义

现在报错误:arch/arm/mach-exynos/lowlevel_init.c:217 undefined reference to `system_clock_init

先鼓起勇气看看Makefile吧!

# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) 2009 Samsung Electronics
# Minkyu Kang 

obj-y   += soc.o
obj-$(CONFIG_CPU_V7A) += clock.o pinmux.o power.o system.o
obj-$(CONFIG_ARM64)     += mmu-arm64.o

obj-$(CONFIG_EXYNOS5420)        += sec_boot.o

ifdef CONFIG_SPL_BUILD
obj-$(CONFIG_EXYNOS5)   += clock_init_exynos5.o
obj-$(CONFIG_EXYNOS5)   += dmc_common.o dmc_init_ddr3.o
obj-$(CONFIG_EXYNOS4210)+= dmc_init_exynos4.o clock_init_exynos4.o  #这部分很熟悉,谁让你改了宏呢
obj-$(CONFIG_EXYNOS4412)+= dmc_init_exynos4412.o clock_init_exynos4412.o
obj-y   += spl_boot.o tzpc.o
obj-y   += lowlevel_init.o
endif

原来是因为我们把宏CONFIG_EXYNOS4210改为了CONFIG_EXYNOS4412,依葫芦画瓢,创建新的环境变量,并且创建相应的原文件dmc_init_exynos4412.oc, clock_init_exynos4412.c

浏览上述两个源文件dmc_init_exynos4412.oc, clock_init_exynos4412.c,发现出现了头文件exynos4_setup.h。把它该为exynos4412_setup.h,并创建该头文件,记得进行字符串替换,怎么替换自行研究。

3.8 符号校验

继续执行make -j4,又报错误:

  CFG     u-boot.cfg
  CFGCHK  u-boot.cfg
Error: You must add new CONFIG options using Kconfig
The following new ad-hoc CONFIG options were detected:
CONFIG_EXYNOS4412
CONFIG_ITOP4412

经过百度,终于明白了,是校验不通过!因此我们需要去掉校验,CFG u-boot.cfg,这句话是个提示,去全局Makefile找找。

注释掉下面语句:

 909 cfg: u-boot.cfg
 910
 911 #quiet_cmd_cfgcheck = CFGCHK  $2
 912 #cmd_cfgcheck = $(srctree)/scripts/check-config.sh $2 \
 913 #        $(srctree)/scripts/config_whitelist.txt $(srctree)

现在全部错误已经解决,模板创建成功。

你可能感兴趣的:(iTop4412 uboot-2019.2移植之杨帆启航(一))