tiny4412 --uboot移植(1)

时间:2023-03-09 18:56:16
tiny4412 --uboot移植(1)

开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位

工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi

要移植的u-boot版本:u-boot-2016-11

Tiny4412开发板硬件版本为

  底板:  Tiny4412SDK 1312B

  核心板:Tiny4412 - 1306

 *****************************************************************************

参考:https://www.cnblogs.com/LoTGu/p/6078966.html

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

1.获取U-BOOT源码

  • 从FTP站点下载: ftp://ftp.denx.de/pub/u-boot
  • uboot-2016-09.tar.bz2

2.交叉编译工具链

3.解压裁剪

4.初步移植(拷贝模板)

  在u-boot/board/samsung目录下基于exynos4412的开发板有:origen、odroid、trats、trats2,但是只有origen支持spl配置,根据exynos4412芯片启动的特点,选择origen作为参考比较合适。

   cp -r origen/ tiny4412

  1)修改 ./board/samsung/tiny4412/tiny4412.c

     直接修改文件名即可;

  2)修改 ./board/samsung/tiny4412/Kconfig

root@ubuntu:/home/arm/u-boot-2016.11# git diff 6a31271 board/samsung/tiny4412/Kconfig
diff --git a/board/samsung/tiny4412/Kconfig b/board/samsung/tiny4412/Kcon
new file mode
index ..e7e759c
--- /dev/null
+++ b/board/samsung/tiny4412/Kconfig
@@ -, +, @@
+if TARGET_TINY4412
+
+config SYS_BOARD
+ default "tiny4412"
+
+config SYS_VENDOR
+ default "samsung"
+
+config SYS_CONFIG_NAME
+ default "tiny4412"
+
+config EXYNOS4412
+ bool
+
+endif

  3)修改 ./board/samsung/tiny4412/MAINTAINERS

diff --git a/board/samsung/tiny4412/MAINTAINERS b/board/samsung/tiny4412/
new file mode
index ..fdcd79e
--- /dev/null
+++ b/board/samsung/tiny4412/MAINTAINERS
@@ -, +, @@
+TINY4412 BOARD
+M: Chander <@qq.com>
+S: Maintained
+F: board/samsung/tiny4412/
+F: include/configs/tiny4412.h
+F: configs/tiny4412_defconfig

  4)修改 ./board/samsung/tiny4412/tools/mktiny4412spl.c

diff --git a/board/samsung/tiny4412/tools/mktiny4412spl.c b/board/samsung
new file mode
index ..c0d0453
--- /dev/null
+++ b/board/samsung/tiny4412/tools/mktiny4412spl.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 ((14*1024)-4)
+#define FILE_PERM (S_IRUSR | S_IWUSR | S_IRGRP \
+ | S_IWGRP | S_IROTH | S_IWOTH)
+/*
+* Requirement:
+* IROM code reads first 14K bytes from boot device.
+* It then calculates the checksum of 14K-4 bytes and compare with data a
+* 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 bu
+* It writes the buffer to "$(BOARD)-spl.bin" file.
+*/
+
+int main(int argc, char **argv)
+{
+ int i, len;
+ unsigned char buffer[BUFSIZE] = {};
+ int ifd, ofd;
+ unsigned int checksum = ;
+ unsigned int count = ;
+
+ if (argc != ) {
+ printf(" %d Wrong number of arguments\n", argc);
+ exit(EXIT_FAILURE);
+ }
+
+ ifd = open(argv[], O_RDONLY);
+ if (ifd < ) {
+ fprintf(stderr, "%s: Can't open %s: %s\n",
+ argv[], argv[], strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ ofd = open(argv[], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
+ if (ofd < ) {
+ fprintf(stderr, "%s: Can't open %s: %s\n",
+ argv[], argv[], strerror(errno));
+ if (ifd)
+ close(ifd);
+ exit(EXIT_FAILURE);
+ }
+
+ len = lseek(ifd, , SEEK_END);
+ lseek(ifd, , SEEK_SET);
+
+ if (read(ifd, buffer , count) != count) {
+ fprintf(stderr, "%s: Can't read %s: %s\n",
+ argv[], argv[], strerror(errno));
+
+ if (ifd)
+ close(ifd);
+ if (ofd)
+ close(ofd);
+
+ exit(EXIT_FAILURE);
+ }
+
+ for (i = ; i < IMG_SIZE ; 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[], argv[], strerror(errno));
+
+ if (ifd)
+ close(ifd);
+ if (ofd)
+ close(ofd);
+
+ exit(EXIT_FAILURE);
+ }
+
+ if (ifd)
+ close(ifd);
+ if (ofd)
+ close(ofd);
+
+ return EXIT_SUCCESS;
+}

  5)修改 ./board/samsung/tiny4412/Makefile

diff --git a/board/samsung/tiny4412/Makefile b/board/samsung/tiny4412/Mak
new file mode
index ..0beabeb
--- /dev/null
+++ b/board/samsung/tiny4412/Makefile
@@ -, +, @@
+#
+# Copyright (C) Samsung Electronics
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+ifdef CONFIG_SPL_BUILD
+# necessary to create built-in.o
+obj- := __dummy__.o
+
+hostprogs-y := tools/mktiny4412spl
+always := $(hostprogs-y)
+
+# omit -O2 option to suppress
+# warning: dereferencing type-punned pointer will break strict-aliasin
+#
+# TODO:
+# Fix the root cause in tools/mkorigenspl.c and delete the following wor
+$(obj)/tools/mktiny4412spl: HOSTCFLAGS:=$(filter-out -O2,$(HOSTCFLAGS))
+else
+obj-y += tiny4412.o
+endif
(END)

  6)添加include/configs/tiny4412.h

  cp   include/configs/origen.h   include/configs/tiny4412.h

diff --git a/include/configs/tiny4412.h b/include/configs/tiny4412.h
new file mode
index ..fef910f
--- /dev/null
+++ b/include/configs/tiny4412.h
@@ -, +, @@
+/*
+ * Copyright (C) 2011 Samsung Electronics
+ *
+ * Configuration settings for the SAMSUNG ORIGEN (EXYNOS4210) board.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __CONFIG_TINY4412_H
+#define __CONFIG_TINY4412_H
+
+#include <configs/exynos4-common.h>
+
+/*TIZEN THOR downloader support*/
+#undef CONFIG_CMD_THOR_DOWNLOAD
+#undef CONFIG_USB_FUNCTION_THOR
+
+/* High Level Configuration Options */
+#define TINY4412 1
+
+#define CONFIG_SYS_DCACHE_OFF 1
+
+/* ORIGEN 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 + 0x600000
+#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x3E0000
+
+#define CONFIG_SYS_TEXT_BASE 0x43E00000
+
+#define CONFIG_MACH_TYPE MACH_TYPE_TINY4412
+
+/* select serial console configuration */
+#define CONFIG_SERIAL2
+#define CONFIG_BAUDRATE 115200
+
+/* 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_SPL_STACK 0x02060000
+
+
+#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_ENV_IS_IN_MMC
+#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 BL
+#define CONFIG_ENV_OFFSET (RESERVE_BLOCK_SIZE + BL1_SIZE)
+
+#define CONFIG_SPL_LDSCRIPT "board/samsung/common/exynos-uboot-spl.ld
+#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)/51
+#define BL2_SIZE_BLOC_COUNT (COPY_BL2_SIZE/512)
+
+#endif /* __CONFIG_H */

  7)修改 configs/tiny4412_defconfig

   cp  /configs/origin_defconfig  /configs/tiny4412_defconfig

diff --git a/configs/tiny4412_defconfig b/configs/tiny4412_defconfig
new file mode
index ..ccc9fab
--- /dev/null
+++ b/configs/tiny4412_defconfig
@@ -, +, @@
+CONFIG_ARM=y
+CONFIG_ARCH_EXYNOS=y
+CONFIG_ARCH_EXYNOS4=y
+CONFIG_TARGET_TINY4412=y
+CONFIG_IDENT_STRING=" for TINY4412"
+CONFIG_DEFAULT_DEVICE_TREE="exynos4412-tiny4412"
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_SPL=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_PROMPT="TINY4412 # "
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+CONFIG_CMD_MMC=y
+# CONFIG_CMD_DFU=y
+# CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_CMD_FPGA is not set
+# 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_OF_CONTROL=y
+#CONFIG_DFU_MMC=y
+#CONFIG_USB=y
+#CONFIG_DM_USB=y
+#CONFIG_USB_GADGET=y
+#CONFIG_USB_GADGET_DWC2_OTG=y
+#CONFIG_USB_GADGET_DOWNLOAD=y
+#CONFIG_G_DNL_MANUFACTURER="Samsung"
+#CONFIG_G_DNL_VENDOR_NUM=0x04e8
+#CONFIG_G_DNL_PRODUCT_NUM=0x6601

  8)修改arch/arm/mach-exynos/Makefile

diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefil
index 0cc6c32..5f8b6ba
--- a/arch/arm/mach-exynos/Makefile
+++ b/arch/arm/mach-exynos/Makefile
@@ -, +, @@ 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_exynos4.o clock_init_exynos4.o
+
obj-y += spl_boot.o tzpc.o
obj-y += lowlevel_init.o
endif

  9) 修改arch/arm/mach-exynos/Kconfig,在执行make menuconfig时会看到tiny4412 board选项

diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index ce2a16f..473fef0
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -, +, @@ config TARGET_TRATS2 config TARGET_ODROID
bool "Exynos4412 Odroid board"
+config TARGET_TINY4412
+ bool "Exynos4412 FriendlyARM Tiny4412 board"
+ select SUPPORT_SPL
+ select SPL
+ select EXYNOS4412
+ help
+ Support FriendlyARM Tiny4412 board based on Samsung exynos4412
+ CPU: S5PC220[Samsung SOC on SMP Platform Base on ARM CortexA9
+] endchoice
endif
@@ -, +, @@ source "board/samsung/smdkv310/Kconfig"
source "board/samsung/trats/Kconfig"
source "board/samsung/universal_c210/Kconfig"
source "board/samsung/origen/Kconfig"
+source "board/samsung/tiny4412/Kconfig"
source "board/samsung/trats2/Kconfig"
source "board/samsung/odroid/Kconfig"
source "board/samsung/arndale/Kconfig"

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

diff --git a/arch/arm/mach-exynos/exynos4_setup.h b/arch/arm/mach-exynos/
index 9f29d94..838e02c
--- a/arch/arm/mach-exynos/exynos4_setup.h
+++ b/arch/arm/mach-exynos/exynos4_setup.h
@@ -, +, @@ struct mem_timings {
#define APB_SFR_ARBRITATION_CONF_VAL 0x00000001
#endif +#ifdef TINY4412
+/* Interleave: 2Bit, Interleave_bit1: 0x15, Interleave_bit0: 0x7 */
+#define APB_SFR_INTERLEAVE_CONF_VAL 0x20001507
+#define APB_SFR_ARBRITATION_CONF_VAL 0x00000001
+#endif
+
#define INTERLEAVE_ADDR_MAP_START_ADDR 0x40000000
#define INTERLEAVE_ADDR_MAP_END_ADDR 0xbfffffff
#define INTERLEAVE_ADDR_MAP_EN 0x00000001

  11)修改arch/arm/include/asm/mach-types.h,增加tiny4412的machine ID

diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mac
index d51be0b..297f1c3
--- a/arch/arm/include/asm/mach-types.h
+++ b/arch/arm/include/asm/mach-types.h
@@ -, +, @@ extern unsigned int __machine_arch_type;
#define MACH_TYPE_COLIBRI_T30 4493
#define MACH_TYPE_APALIS_T30 4513
#define MACH_TYPE_OMAPL138_LCDK 2495
+#define MACH_TYPE_TINY4412 4608 #ifdef CONFIG_ARCH_EBSA110
# ifdef machine_arch_type

  12) 修改arch/arm/dts/Makefile,用于编译tiny4412设备树

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 836a8c4..771e713
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -, +, @@ dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \
exynos4210-universal_c210.dtb \
exynos4210-trats.dtb \
exynos4412-trats2.dtb \
+ exynos4412-tiny4412.dtb \
exynos4412-odroid.dtb dtb-$(CONFIG_TARGET_HIKEY) += hi6220-hikey.dtb

  13) 添加arch/arm/dts/exynos4412-tiny4412.dts,使用uart0作为终端

diff --git a/arch/arm/dts/exynos4412-tiny4412.dts b/arch/arm/dts/exynos44
new file mode
index ..
--- /dev/null
+++ b/arch/arm/dts/exynos4412-tiny4412.dts
@@ -, +, @@
+/*
+ * 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 = "Tiny4412 based on Exynos4412";
+ compatible = "samsung,tiny4412", "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@13800000";
+ console = "/serial@13810000";
+ mmc2 = "/sdhci@12530000";
+ mmc4 = "/dwmmc@12550000";
+ };
+
+ i2c@ {
+ samsung,i2c-sda-delay = <>;
+ samsung,i2c-slave-addr = <0x10>;
+ samsung,i2c-max-bus-freq = <>;
+ status = "okay";
+
+ };
+
+ serial@ {
+ status = "okay";
+ };
+
+ sdhci@ {
+ status = "disabled";
+ };
+
+ sdhci@ {
+ status = "disabled";
+ };
+
+ sdhci@ {
+ samsung,bus-width = <>;
+ samsung,timing = < >;
+ cd-gpios = <&gpk2 >;
+ };
+
+ sdhci@ {
+ status = "disabled";
+ };
+
+ dwmmc@ {
+ samsung,bus-width = <>;
+ samsung,timing = < >;
+ samsung,removable = <>;
+ fifoth_val = <0x203f0040>;
+ bus_hz = <>;
+ div = <0x3>;
+ index = <>;
+ };
+
+ ehci@ {
+ compatible = "samsung,exynos-ehci";
+ reg = <0x12580000 0x100>;
+ #address-cells = <>;
+ #size-cells = <>;
+ phy {
+ compatible = "samsung,exynos-usb-phy";
+ reg = <0x125B0000 0x100>;
+ };
+ };
+
+ emmc-reset {
+ compatible = "samsung,emmc-reset";
+ reset-gpio = <&gpk1 >;
+ };
+};

添加完相关代码目录后,执行如下命令进行编译uboot:

$ make distclean

$ make tiny4412_defconfig

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

可以顺利编译出u-boot-spl.bin 和u-boot.bin文件,此时这个u-boot-spl.bin 和u-boot.bin文件还不能直接用在tiny4412 SDK开发板上,需进一步修改代码。

问题:

编译时提示 Your dtc is too old, please upgrade to dtc 1.4 or newer

./scripts/dtc-version.sh: line 17: dtc: command not found
./scripts/dtc-version.sh: line 18: dtc: command not found
* Your dtc is too old, please upgrade to dtc 1.4 or newer

解决:

apt-get install device-tree-compiler