一、環(huán)境準(zhǔn)備
1.1操作系統(tǒng)
本人使用Debian9 x64和VMwae作為開發(fā)環(huán)境盗痒,因?yàn)槭煜ぴ摥h(huán)境横漏,能同時(shí)運(yùn)行32位和64位程序谨设,能直接利用各種命令訪問硬件。
1.2編譯系統(tǒng)
我用的編譯器為Linaro缎浇,建議JLINK用戶使用arm-eabi版本扎拣,鏈接地址為(https://www.linaro.org/downloads/),
1.3 UBOOT
我采用最u-boot-2019.1版素跺,對(duì)版本唯一要求就是要用現(xiàn)在的項(xiàng)目結(jié)構(gòu)二蓝,不然以后還得熟悉重構(gòu)后的項(xiàng)目結(jié)構(gòu)。下載地址(http://ftp.denx.de/pub/u-boot/).
二指厌、初次編譯
2.1目的
檢查環(huán)境正常刊愚,只有編譯通過了,才能做其他事情踩验。想盡一切辦法鸥诽,讓程序編譯通過。
2.2過程
- 修改頂層Makefile箕憾,添加編譯器前綴牡借,例如
CROSS_COMPILE := arm-eabi-
。 - 執(zhí)行
make origen_defconfig
厕九。 - 執(zhí)行
make menuconfig
蓖捶。 - 執(zhí)行
make -j4
。 - 執(zhí)行
make clean
- 執(zhí)行
make distclean
2.3 問題
如果遇到問題扁远,請(qǐng)認(rèn)真閱讀錯(cuò)誤信息(看不懂找有道),基本上都是某些庫沒安裝刻像,安裝上就好了畅买。
三、拷貝模板
3.1 默認(rèn)配置
在configs目錄下有眾多形如xxx_defconfig的文件细睡,存放默認(rèn)編譯選項(xiàng)谷羞。make origen_defconfig
就是將origen_defconfig寫入到.config文件中。
我們需要?jiǎng)?chuàng)建自己的配置文件,取名itop4412_defconfig湃缎。復(fù)制origen_defconfig犀填,并把內(nèi)容中的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
執(zhí)行make itop4412_defconfig
與make -j4
九巡,看下缺什么。
3.2 板級(jí)文件
拷貝board/samsung/origen到board/samsung/itop4412蹂季。
跟ORIGEN的結(jié)構(gòu)差不了多少冕广,只是進(jìn)行了字符串替換,但tools目錄下的文件偿洁,需要用我提供的撒汉。
3.3 文件關(guān)聯(lián)
修改arch/arm/mach-exynos/Kconfig。
3.4 自定配置
執(zhí)行make -j2
涕滋,會(huì)報(bào)錯(cuò)誤:include/config.h:5:10: fatal error: configs/itop4412.h: No such file or directory睬辐。
我們需要添加文件include/configs/itop4412.h,內(nèi)容來自include/configs/origen.h宾肺,并且還需要處理溯饵。
#ifndef __CONFIG_ITOP4412_H
#define __CONFIG_ITOP4412_H
#include <configs/exynos4-common.h>
/* 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 /*機(jī)器ID,會(huì)報(bào)錯(cuò)*/
/* 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 */
大膽修改該配置,鍛煉自己黔酥!日后遇到配置錯(cuò)誤藻三,皆可自行解決。現(xiàn)在會(huì)報(bào)錯(cuò)誤:
MACH_TYPE_ITOP4412’ undeclared跪者。
3.5 機(jī)器類型
執(zhí)行grep "MACH_TYPE_ORIGEN" . -nR
棵帽,可找到arch/arm/include/asm/mach-types.h:3405:#define MACH_TYPE_ORIGEN 3455。
因此在文件末尾添加#define MACH_TYPE_ITOP4412 5115渣玲。
不知這個(gè)是做什么的逗概,故依葫蘆畫瓢,但需要注意該值忘衍,他是個(gè)定時(shí)炸彈逾苫。
3.6 設(shè)備樹
出現(xiàn)錯(cuò)誤:No rule to make target 'arch/arm/dts/exynos4412-itop4412.dts', needed by 'arch/arm/dts/exynos4412-itop4412.dtb'
暫時(shí)不知設(shè)備樹干嘛的,直接拷貝arch/arm/dts/exynos4412-odroid.dts枚钓,修改下里面內(nèi)容铅搓。怎么改呢?字符串替換啊搀捷。
3.7 符號(hào)未定義
現(xiàn)在報(bào)錯(cuò)誤: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 <mk7.kang@samsung.com>
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
原來是因?yàn)槲覀儼押闏ONFIG_EXYNOS4210改為了CONFIG_EXYNOS4412氢烘,依葫蘆畫瓢怀偷,創(chuàng)建新的環(huán)境變量,并且創(chuàng)建相應(yīng)的原文件dmc_init_exynos4412.oc, clock_init_exynos4412.c播玖。
瀏覽上述兩個(gè)源文件dmc_init_exynos4412.oc, clock_init_exynos4412.c椎工,發(fā)現(xiàn)出現(xiàn)了頭文件exynos4_setup.h。把它該為exynos4412_setup.h黎棠,并創(chuàng)建該頭文件晋渺,記得進(jìn)行字符串替換,怎么替換自行研究脓斩。
3.8 符號(hào)校驗(yàn)
繼續(xù)執(zhí)行make -j4
木西,又報(bào)錯(cuò)誤:
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
經(jīng)過百度,終于明白了随静,是校驗(yàn)不通過八千!因此我們需要去掉校驗(yàn),CFG u-boot.cfg
燎猛,這句話是個(gè)提示恋捆,去全局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)
現(xiàn)在全部錯(cuò)誤已經(jīng)解決重绷,模板創(chuàng)建成功沸停。