itop4412-u-boot移植(1)

参考:https://blog.csdn.net/hyyoxhk/article/details/81734733

https://blog.csdn.net/sinat_20006769/article/details/79046194

https://blog.csdn.net/weixin_40117614/article/details/83622503

https://www.jianshu.com/p/e3bf7bd56a2b

u-boot版本:u-boot-2017.11.tar.bz2.

make clean:清除生成目标信息 执行完后可以发现uboot.bin文件全都消失
make distclean:清除板子配置信息(默认可能不是4412)

1.拷贝板级文件

选择origen模板

修改/board/samsung/itop4412/itop4412.c

/*
 * Copyright (C) 2011 Samsung Electronics
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <asm/io.h>
#include <asm/gpio.h>
#include <asm/arch/cpu.h>
#include <asm/arch/mmc.h>
#include <asm/arch/periph.h>
#include <asm/arch/pinmux.h>
#include <usb.h>

DECLARE_GLOBAL_DATA_PTR;

u32 get_board_rev(void)
{
	return 0;
}

int exynos_init(void)
{
	return 0;
}

int board_usb_init(int index, enum usb_init_type init)
{
	return 0;
}

#ifdef CONFIG_BOARD_EARLY_INIT_F
int exynos_early_init_f(void)
{
	return 0;
}
#endif

修改Kconfig

if TARGET_ITOP4412

config SYS_BOARD
	default "itop4412"

config SYS_VENDOR
	default "samsung"

config SYS_CONFIG_NAME
	default "itop4412"

endif

修改MAINTAINERS

ITOP4412 BOARD
M:	Chander Kashyap <k.chander@samsung.com>
S:	Maintained
F:	board/samsung/itop4412/
F:	include/configs/itop4412.h
F:	configs/itop4412_defconfig
#
# Copyright (C) 2011 Samsung Electronics
#
# SPDX-License-Identifier:	GPL-2.0+
#

ifdef CONFIG_SPL_BUILD
# necessary to create built-in.o
obj- := __dummy__.o

hostprogs-y := tools/mkitop4412spl
always := $(hostprogs-y)

# omit -O2 option to suppress
#   warning: dereferencing type-punned pointer will break strict-aliasing rules
#
# TODO:
# Fix the root cause in tools/mkorigenspl.c and delete the following work-around
$(obj)/tools/mkitop4412spl: HOSTCFLAGS:=$(filter-out -O2,$(HOSTCFLAGS))
else
obj-y	+= itop4412.o
endif

修改/board/samsung/itop4412/tools/mkitop4412spl.c

/*
 * Copyright (C) 2011 Samsung Electronics
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>

#define BUFSIZE			(16*1024)
#define IMG_SIZE		(16*1024)
#define SPL_HEADER_SIZE		16
#define FILE_PERM		(S_IRUSR | S_IWUSR | S_IRGRP \
				| S_IWGRP | S_IROTH | S_IWOTH)
#define SPL_HEADER		"S5PC210 HEADER  "
/*
* Requirement:
* IROM code reads first 14K bytes from boot device.
* It then calculates the checksum of 14K-4 bytes and compare with data at
* 14K-4 offset.
*
* This function takes two filenames:
* IN  "u-boot-spl.bin" and
* OUT "$(BOARD)-spl.bin as filenames.
* It reads the "u-boot-spl.bin" in 16K buffer.
* It calculates checksum of 14K-4 Bytes and stores at 14K-4 offset in buffer.
* It writes the buffer to "$(BOARD)-spl.bin" file.
*/

int main(int argc, char **argv)
{
	int i, len;
	unsigned char buffer[BUFSIZE] = {0};
	int ifd, ofd;
	unsigned int checksum = 0, count;

	if (argc != 3) {
		printf(" %d Wrong number of arguments\n", argc);
		exit(EXIT_FAILURE);
	}

	ifd = open(argv[1], O_RDONLY);
	if (ifd < 0) {
		fprintf(stderr, "%s: Can't open %s: %s\n",
			argv[0], argv[1], strerror(errno));
		exit(EXIT_FAILURE);
	}

	ofd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
	if (ofd < 0) {
		fprintf(stderr, "%s: Can't open %s: %s\n",
			argv[0], argv[2], strerror(errno));
		if (ifd)
			close(ifd);
		exit(EXIT_FAILURE);
	}

	len = lseek(ifd, 0, SEEK_END);
	lseek(ifd, 0, SEEK_SET);

	memcpy(&buffer[0], SPL_HEADER, SPL_HEADER_SIZE);

	count = (len < (IMG_SIZE - SPL_HEADER_SIZE))
		? len : (IMG_SIZE - SPL_HEADER_SIZE);

	if (read(ifd, buffer + SPL_HEADER_SIZE, count) != count) {
		fprintf(stderr, "%s: Can't read %s: %s\n",
			argv[0], argv[1], strerror(errno));

		if (ifd)
			close(ifd);
		if (ofd)
			close(ofd);

		exit(EXIT_FAILURE);
	}

#if 0
	for (i = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++)
		checksum += buffer[i+16];

	*(unsigned long *)buffer ^= 0x1f;
	*(unsigned long *)(buffer+4) ^= checksum;

	for (i = 1; i < SPL_HEADER_SIZE; i++)
		buffer[i] ^= buffer[i-1];
#endif

	for (i = 0; i < IMG_SIZE - 4; i++)
		checksum += (unsigned char)buffer[i];

	*(unsigned int *)&buffer[i] = checksum;
	
	if (write(ofd, buffer, BUFSIZE) != BUFSIZE) {
		fprintf(stderr, "%s: Can't write %s: %s\n",
			argv[0], argv[2], strerror(errno));

		if (ifd)
			close(ifd);
		if (ofd)
			close(ofd);

		exit(EXIT_FAILURE);
	}

	if (ifd)
		close(ifd);
	if (ofd)
		close(ofd);

	return EXIT_SUCCESS;
}

增加/configs/itop4412_defconfig

CONFIG_ARM=y
CONFIG_ARCH_EXYNOS=y
CONFIG_ARCH_EXYNOS4=y
CONFIG_TARGET_ITOP4412=y
CONFIG_IDENT_STRING=" for ITOP4412"
CONFIG_DEFAULT_DEVICE_TREE="exynos4412-itop4412"
CONFIG_SYS_CONSOLE_IS_IN_ENV=y
CONFIG_SYS_CONSOLE_INFO_QUIET=y
CONFIG_SPL=y
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="ITOP4412 # "
CONFIG_CMD_BOOTZ=y
# CONFIG_CMD_XIMG is not set
CONFIG_CMD_THOR_DOWNLOAD=y
CONFIG_CMD_DFU=y
# CONFIG_CMD_FPGA is not set
CONFIG_CMD_GPT=y
CONFIG_CMD_MMC=y
CONFIG_CMD_PART=y
CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_NET is not set
CONFIG_CMD_DHCP=y
# CONFIG_CMD_NFS is not set
CONFIG_CMD_MII=y
CONFIG_CMD_CACHE=y
# CONFIG_CMD_MISC is not set
CONFIG_CMD_EXT2=y
CONFIG_CMD_EXT4=y
CONFIG_CMD_EXT4_WRITE=y
CONFIG_CMD_FAT=y
CONFIG_CMD_FS_GENERIC=y
CONFIG_ISO_PARTITION=y
CONFIG_OF_CONTROL=y
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

增加/include/configs/itop4412.h

/*
 * Copyright (C) 2011 Samsung Electronics
 *
 * Configuration settings for the SAMSUNG ITOP4412 (EXYNOS4412) board.
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#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_NR_DRAM_BANKS		4
#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_SYS_TEXT_BASE		0x43E00000

#define CONFIG_MACH_TYPE		MACH_TYPE_ITOP4412

/* select serial console configuration */
#define CONFIG_SERIAL2

/* 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_DIDLE			0xBAD00000
#define S5P_CHECK_LPA			0xABAD0000

#define CONFIG_SUPPORT_RAW_INITRD

/* MMC SPL */
#define COPY_BL2_FNPTR_ADDR	0x02020030
#define CONFIG_SPL_TEXT_BASE	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} "

#define CONFIG_CLK_1000_400_200

/* MIU (Memory Interleaving Unit) */
#define CONFIG_MIU_2BIT_21_7_INTERLEAVED

#define CONFIG_SYS_MMC_ENV_DEV		0
#define CONFIG_ENV_SIZE			(8 << 10)	/* 16 KB */
#define RESERVE_BLOCK_SIZE		(512)
#define BL1_SIZE			(8 << 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 */

修改

config TARGET_ITOP4412
	bool "Exynos4412 itop4412 board"
	select SUPPORT_SPL


source "board/samsung/itop4412/Kconfig"

修改/arch/arm/mach-exynos/exynos4_setup.h

#ifndef _ITOP4412_SETUP_H
#define _ITOP4412_SETUP_H

#ifdef CONFIG_ITOP4412

#ifdef CONFIG_ITOP4412

修改arch/arm/dts/Makefile

dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \
	exynos4210-smdkv310.dtb \
	exynos4210-universal_c210.dtb \
	exynos4210-trats.dtb \
	exynos4412-trats2.dtb \
	exynos4412-itop4412.dtb \
	exynos4412-odroid.dtb

修改arch/arm/include/asm/mach-types.h

在最后添加

#define MACH_TYPE_ITOP4412      5115

编译

make distclean
make itop4412_defconfig
make all

make[1]: *** No rule to make target `arch/arm/dts/exynos4412-itop4412.dts', needed by `arch/arm/dts/exynos4412-itop4412.dtb'.  Stop.
make: *** [dts/dt.dtb] Error 2

缺少设备树文件,添加/arch/arm/dts/exynos4412-itop4412.dtb

/*
 * Odroid-U3/X2 board device tree source
 *
 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

/dts-v1/;
#include "exynos4412.dtsi"

/ {
	model = "itop-4412 based on Exynos4412";
	compatible = "samsung,itop-4412", "samsung,exynos4412";

	aliases {
		i2c0 = "/i2c@13860000";
		i2c1 = "/i2c@13870000";
		i2c2 = "/i2c@13880000";
		i2c3 = "/i2c@13890000";
		i2c4 = "/i2c@138a0000";
		i2c5 = "/i2c@138b0000";
		i2c6 = "/i2c@138c0000";
		i2c7 = "/i2c@138d0000";
		serial0 = "/serial@13820000";
		console = "/serial@13820000";
		mmc2 = "sdhci@12530000";
		mmc4 = "dwmmc@12550000";
	};

	fimd@11c00000 {
		compatible = "samsung,exynos-fimd";
		reg = <0x11c00000 0xa4>;

		samsung,vl-freq = <60>;
		samsung,vl-col = <480>;
		samsung,vl-row = <272>;
		samsung,vl-width = <480>;
		samsung,vl-height = <272>;

		samsung,vl-clkp = <0>;
		samsung,vl-oep = <0>;
		samsung,vl-hsp = <1>;
		samsung,vl-vsp = <0>;
		samsung,vl-dp = <1>;
		samsung,vl-bpix = <4>;

		samsung,vl-hspw = <32>;
		samsung,vl-hbpd = <80>;
		samsung,vl-hfpd = <48>;
		samsung,vl-vspw = <2>;
		samsung,vl-vbpd = <1>;
		samsung,vl-vfpd = <13>;
		samsung,vl-cmd-allow-len = <0xf>;

		samsung,winid = <0>;
		samsung,power-on-delay = <30>;
		samsung,interface-mode = <1>;
		samsung,mipi-enabled = <0>;
		//samsung,dp-enabled;
		//samsung,dual-lcd-enabled;

		samsung,logo-on = <1>;
		samsung,resolution = <0>;
		samsung,rgb-mode = <1>;
		samsung,pwm-out-gpio  = <&gpd0 1 1>;
		samsung,bl-en-gpio = <&gpd0 0 1>;
	};

	mipidsi@11c80000 {
		compatible = "samsung,exynos-mipi-dsi";
		reg = <0x11c80000 0x5c>;

		samsung,dsim-config-e-interface = <1>;
		samsung,dsim-config-e-virtual-ch = <0>;
		samsung,dsim-config-e-pixel-format = <7>;
		samsung,dsim-config-e-burst-mode = <1>;
		samsung,dsim-config-e-no-data-lane = <3>;
		samsung,dsim-config-e-byte-clk = <0>;
		samsung,dsim-config-hfp = <1>;

		samsung,dsim-config-p = <3>;
		samsung,dsim-config-m = <120>;
		samsung,dsim-config-s = <1>;

		samsung,dsim-config-pll-stable-time = <500>;
		samsung,dsim-config-esc-clk = <20000000>;
		samsung,dsim-config-stop-holding-cnt = <0x7ff>;
		samsung,dsim-config-bta-timeout = <0xff>;
		samsung,dsim-config-rx-timeout = <0xffff>;

		samsung,dsim-device-id = <0xffffffff>;
		samsung,dsim-device-bus-id = <0>;

		samsung,dsim-device-reverse-panel = <1>;
	};

	i2c@13860000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-slave-addr = <0x10>;
		samsung,i2c-max-bus-freq = <100000>;
		status = "okay";

		max77686_pmic@09 {
			compatible = "maxim,max77686_pmic";
			interrupts = <7 0>;
			reg = <0x09 0 0>;
			#clock-cells = <1>;
		};
	};

	serial@13820000 {
		status = "okay";
	};

	sdhci@12510000 {
		status = "disabled";
	};

	sdhci@12520000 {
		status = "disabled";
	};

	sdhci@12530000 {
		samsung,bus-width = <4>;
		/*samsung,timing = <1 2 3>;*/
		/*cd-gpios = <&gpk2 2 0>;*/
		status = "okay";
	};

	sdhci@12540000 {
		status = "disabled";
	};

	dwmmc@12550000 {
		samsung,bus-width = <4>;
		samsung,timing = <2 1 0>;
		samsung,removable = <0>;
		fifoth_val = <0x203f0040>;
		bus_hz = <400000000>;
		div = <0x3>;
		index = <4>;
	};

	ehci@12580000 {
		compatible = "samsung,exynos-ehci";
		reg = <0x12580000 0x100>;
		#address-cells = <1>;
		#size-cells = <1>;
		phy {
			compatible = "samsung,exynos-usb-phy";
			reg = <0x125B0000 0x100>;
		};
	};

	emmc-reset {
		compatible = "samsung,emmc-reset";
		reset-gpio = <&gpk1 2 0>;
	};
};

编译

make distclean
make itop4412_defconfig
make all

arch/arm/mach-exynos/built-in.o: In function `do_lowlevel_init':
/home/topeet/android4.0/uboot201711/arch/arm/mach-exynos/lowlevel_init.c:217: undefined reference to `system_clock_init'
/home/topeet/android4.0/uboot201711/arch/arm/mach-exynos/lowlevel_init.c:225: undefined reference to `mem_ctrl_init'
make[1]: *** [spl/u-boot-spl] Error 1
make: *** [spl/u-boot-spl] Error 2

查看/arch/arm/mach-exynos/Makefile,由于itop4412.h中把CONFIG_EXYNOS4210修改成了CONFIG_EXYNOS4412。下面的Makefile没有编译dmc_init_exynos4.c clock_init_exynos4.c

obj-y	+= soc.o
obj-$(CONFIG_CPU_V7) += 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  /*可以看到没有4412的宏*/
obj-y	+= spl_boot.o tzpc.o
obj-y	+= lowlevel_init.o
endif

于是添加

obj-$(CONFIG_EXYNOS4412)+= dmc_init_exynos4412.o clock_init_exynos4412.o

拷贝dmc_init_exynos4.c clock_init_exynos4.c,重命名为dmc_init_exynos4412.c clock_init_exynos4412.c

作出修改/arch/arm/mach-exynos/dmc_init_exynos4412.c

+# include "itop4412_setup.h"
-# include "exynos4_setup.h"

+#ifdef CONFIG_ITOP4412
-#ifdef CONFIG_ORIGEN

修改/arch/arm/mach-exynos/clock_init_exynos4412.c

+# include "itop4412_setup.h"
-# include "exynos4_setup.h"

编译

make distclean
make itop4412_defconfig
make all

Error: You must add new CONFIG options using Kconfig
The following new ad-hoc CONFIG options were detected:
CONFIG_EXYNOS4412
CONFIG_ITOP4412

校验不通过,将校验注释掉

#quiet_cmd_cfgcheck = CFGCHK  $2
#cmd_cfgcheck = $(srctree)/scripts/check-config.sh $2 \
#               $(srctree)/scripts/config_whitelist.txt $(srctree)

编译完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值