一、环境准备
1.1操作系统
本人使用Debian9 x64和VMwae作为开发环境,因为熟悉该环境,能同时运行32位和64位程序,能直接利用各种命令访问硬件。
1.2编译系统
我用的编译器为Linaro,建议JLINK用户使用arm-eabi版本,链接地址为(https://www.linaro.org/downloads/),
1.3 UBOOT
我采用最u-boot-2019.1版,对版本唯一要求就是要用现在的项目结构,不然以后还得熟悉重构后的项目结构。下载地址(http://ftp.denx.de/pub/u-boot/).
二、初次编译
2.1目的
检查环境正常,只有编译通过了,才能做其他事情。想尽一切办法,让程序编译通过。
2.2过程
- 修改顶层Makefile,添加编译器前缀,例如
CROSS_COMPILE := arm-eabi-
。 - 执行
make origen_defconfig
。 - 执行
make menuconfig
。 - 执行
make -j4
。 - 执行
make clean
- 执行
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_defconfig
与make -j4
,看下缺什么。
3.2 板级文件
拷贝board/samsung/origen到board/samsung/itop4412。
跟ORIGEN的结构差不了多少,只是进行了字符串替换,但tools目录下的文件,需要用我提供的。
3.3 文件关联
修改arch/arm/mach-exynos/Kconfig。
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)
现在全部错误已经解决,模板创建成功。