diff options
author | imp <imp@FreeBSD.org> | 2014-12-10 04:09:01 +0800 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2014-12-10 04:09:01 +0800 |
commit | adcd3080b6a5d8550edd5123b843d6cb4c82d5f5 (patch) | |
tree | 25f7d5ae9e51113ccfe68c5f5a3b470fe4d1c65b /sysutils | |
parent | 1bb7622b7b08cc06da617fdcfe19c7b4c257fc48 (diff) | |
download | freebsd-ports-gnome-adcd3080b6a5d8550edd5123b843d6cb4c82d5f5.tar.gz freebsd-ports-gnome-adcd3080b6a5d8550edd5123b843d6cb4c82d5f5.tar.zst freebsd-ports-gnome-adcd3080b6a5d8550edd5123b843d6cb4c82d5f5.zip |
FreeBSD customized u-boot loader for wandboard
Submitted by: ian@
Diffstat (limited to 'sysutils')
12 files changed, 464 insertions, 0 deletions
diff --git a/sysutils/u-boot-wandboard/Makefile b/sysutils/u-boot-wandboard/Makefile new file mode 100644 index 000000000000..38e0382fc764 --- /dev/null +++ b/sysutils/u-boot-wandboard/Makefile @@ -0,0 +1,49 @@ +# $FreeBSD$ + +PORTNAME= u-boot +PORTVERSION= 2013.10 +CATEGORIES= sysutils +PKGNAMESUFFIX= -wandboard +DISTNAME= u-boot-${PORTVERSION}-technexion-edm + +MAINTAINER= ian@FreeBSD.org +COMMENT= Cross-build U-Boot loader for Wandboard (solo, dual, and quad) + +LICENSE= GPLv2 + +BUILD_DEPENDS= arm-none-eabi-gcc:${PORTSDIR}/devel/arm-none-eabi-gcc + +USE_GITHUB= yes +GH_ACCOUNT= TechNexion +GH_PROJECT= u-boot-edm +GH_COMMIT= 87f595d +GH_TAGNAME= ${GH_COMMIT} +NO_ARCH= yes + +WRKSRC= ${WRKDIR}/${GH_ACCOUNT}-${GH_PROJECT}-${GH_TAGNAME} +USES= gmake +SSP_UNSAFE= yes # cross-build static linking dies with -fstack-protector + +U_BOOT_DIR= share/u-boot/${PORTNAME}${PKGNAMESUFFIX} +PLIST_DIRS= ${U_BOOT_DIR} share/u-boot +PLIST_FILES= ${U_BOOT_DIR}/u-boot.imx \ + ${U_BOOT_DIR}/README + +MAKE_ARGS+= ARCH=arm \ + CROSS_COMPILE=arm-none-eabi- \ + HOSTCC=clang + +do-configure: + cd ${WRKSRC}; ${GMAKE} ${MAKE_ARGS} edm_cf_imx6_config + +# The build results in two output files: SPL, and u-boot.img. +# Combine them into a single u-boot.imx so that there is only one file to be +# copied onto the boot media starting at a 1K offset on the disk. +IMXFILE= ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/u-boot.imx +do-install: + ${MKDIR} ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + dd bs=1k oseek=0 conv=sync of=${IMXFILE} if=${WRKSRC}/SPL + dd bs=1k oseek=68 conv=sync of=${IMXFILE} if=${WRKSRC}/u-boot.img + ${CP} ${.CURDIR}/pkg-descr ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/README + +.include <bsd.port.mk> diff --git a/sysutils/u-boot-wandboard/distinfo b/sysutils/u-boot-wandboard/distinfo new file mode 100644 index 000000000000..f2299d01c907 --- /dev/null +++ b/sysutils/u-boot-wandboard/distinfo @@ -0,0 +1,2 @@ +SHA256 (u-boot-2013.10-technexion-edm.tar.gz) = 8e9fd96fcc3ea979a8ec65f982563c958fe27108af82ed17d3cc314476b96a2d +SIZE (u-boot-2013.10-technexion-edm.tar.gz) = 13136282 diff --git a/sysutils/u-boot-wandboard/files/patch-api_api.c b/sysutils/u-boot-wandboard/files/patch-api_api.c new file mode 100644 index 000000000000..4148bf90426c --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-api_api.c @@ -0,0 +1,79 @@ +--- api/api.c.orig 2014-08-14 14:51:09 UTC ++++ api/api.c +@@ -495,45 +495,47 @@ static int API_env_set(va_list ap) + */ + static int API_env_enum(va_list ap) + { +- int i, n; +- char *last, **next; ++ int i; ++ char *last, **next, *s; ++ ENTRY *match, search; ++ static char *buf; + + last = (char *)va_arg(ap, u_int32_t); + + if ((next = (char **)va_arg(ap, u_int32_t)) == NULL) + return API_EINVAL; + +- if (last == NULL) +- /* start over */ +- *next = ((char *)env_get_addr(0)); +- else { +- *next = last; +- +- for (i = 0; env_get_char(i) != '\0'; i = n + 1) { +- for (n = i; env_get_char(n) != '\0'; ++n) { +- if (n >= CONFIG_ENV_SIZE) { +- /* XXX shouldn't we set *next = NULL?? */ +- return 0; +- } +- } +- +- if (envmatch((uchar *)last, i) < 0) +- continue; +- +- /* try to get next name */ +- i = n + 1; +- if (env_get_char(i) == '\0') { +- /* no more left */ +- *next = NULL; +- return 0; +- } +- +- *next = ((char *)env_get_addr(i)); +- return 0; ++ /* ++ * This leverages realloc's behavior of growing but never shrinking the ++ * existing buffer. ++ */ ++ if (last == NULL) { ++ i = 0; ++ buf = realloc(buf, 512); /* Start with reasonable size buf. */ ++ } else { ++ buf = realloc(buf, strlen(last) + 1); ++ strcpy(buf, last); ++ if ((s = strchr(buf, '=')) != NULL) ++ *s = 0; ++ search.key = buf; ++ if ((i = hsearch_r(search, FIND, &match, &env_htab, 0)) == 0) { ++ i = API_EINVAL; ++ goto done; + } + } + ++ /* hmatch on empty string is effectively "get next entry after i". */ ++ if ((i = hmatch_r("", i, &match, &env_htab)) == 0) ++ goto done; ++ buf = realloc(buf, strlen(match->key) + strlen(match->data) + 2); ++ snprintf(buf, buflen, "%s=%s", match->key, match->data); ++ *next = buf; + return 0; ++done: ++ free(buf); ++ buf = NULL; ++ *next = NULL; ++ return i; + } + + /* diff --git a/sysutils/u-boot-wandboard/files/patch-api_api__storage.c b/sysutils/u-boot-wandboard/files/patch-api_api__storage.c new file mode 100644 index 000000000000..9e17873f4a4d --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-api_api__storage.c @@ -0,0 +1,28 @@ +--- api/api_storage.c.orig 2014-08-14 14:51:09 UTC ++++ api/api_storage.c +@@ -107,10 +107,13 @@ static int dev_stor_get(int type, int fi + + if (first) { + di->cookie = (void *)get_dev(specs[type].name, 0); +- if (di->cookie == NULL) ++ if (di->cookie == NULL) { + return 0; +- else ++ } else { + found = 1; ++ if (specs[type].max_dev > 1) ++ *more = 1; ++ } + + } else { + for (i = 0; i < specs[type].max_dev; i++) +@@ -146,7 +149,8 @@ static int dev_stor_get(int type, int fi + dd = (block_dev_desc_t *)di->cookie; + if (dd->type == DEV_TYPE_UNKNOWN) { + debugf("device instance exists, but is not active.."); +- found = 0; ++ di->di_stor.block_count = 0; ++ di->di_stor.block_size = 0; + } else { + di->di_stor.block_count = dd->lba; + di->di_stor.block_size = dd->blksz; diff --git a/sysutils/u-boot-wandboard/files/patch-board_technexion_edm__cf__imx6_edm__cf__imx6.c b/sysutils/u-boot-wandboard/files/patch-board_technexion_edm__cf__imx6_edm__cf__imx6.c new file mode 100644 index 000000000000..e1521d7c0eb7 --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-board_technexion_edm__cf__imx6_edm__cf__imx6.c @@ -0,0 +1,59 @@ +--- board/technexion/edm_cf_imx6/edm_cf_imx6.c.orig 2014-08-14 14:51:10 UTC ++++ board/technexion/edm_cf_imx6/edm_cf_imx6.c +@@ -63,10 +63,16 @@ enum boot_device get_boot_device(void); + + static inline void setup_boot_device(void) + { +- uint soc_sbmr = readl(SRC_BASE_ADDR + 0x4); +- uint bt_mem_ctl = (soc_sbmr & 0x000000FF) >> 4 ; +- uint bt_mem_type = (soc_sbmr & 0x00000008) >> 3; +- uint bt_mem_mmc = (soc_sbmr & 0x00001000) >> 12; ++ uint bt_mem_ctl, bt_mem_mmc, bt_mem_type, soc_sbmr; ++ ++ /* Use GPR9 if non-zero, else SBMR. */ ++ soc_sbmr = readl(SRC_BASE_ADDR + 0x40); ++ if (soc_sbmr == 0) ++ soc_sbmr = readl(SRC_BASE_ADDR + 0x4); ++ ++ bt_mem_ctl = (soc_sbmr & 0x000000FF) >> 4 ; ++ bt_mem_type = (soc_sbmr & 0x00000008) >> 3; ++ bt_mem_mmc = (soc_sbmr & 0x00001000) >> 12; + + switch (bt_mem_ctl) { + case 0x0: +@@ -623,6 +629,26 @@ static const struct boot_mode board_boot + + int board_late_init(void) + { ++ const char *imxname; ++ uint cpurev, imxtype; ++ ++ cpurev = get_cpu_rev(); ++ imxtype = (cpurev & 0xFF000) >> 12; ++ ++ switch (imxtype){ ++ case MXC_CPU_MX6SOLO: ++ imxname = "imx6sx"; ++ break; ++ case MXC_CPU_MX6Q: ++ imxname = "imx6q"; ++ break; ++ case MXC_CPU_MX6DL: ++ default: ++ imxname = "imx6dl"; ++ break; ++ } ++ setenv("imxname", imxname); ++ + #ifdef CONFIG_CMD_BMODE + add_board_boot_modes(board_boot_modes); + #endif +@@ -647,7 +673,7 @@ int board_init(void) + + int checkboard(void) + { +- puts("Board: edm_cf_imx6\n"); ++ puts("Board: Wandboard\n"); + + return 0; + } diff --git a/sysutils/u-boot-wandboard/files/patch-common_cmd__elf.c b/sysutils/u-boot-wandboard/files/patch-common_cmd__elf.c new file mode 100644 index 000000000000..4225e5f06374 --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-common_cmd__elf.c @@ -0,0 +1,10 @@ +--- common/cmd_elf.c.orig 2014-08-14 14:51:10 UTC ++++ common/cmd_elf.c +@@ -46,6 +46,7 @@ unsigned long do_bootelf_exec(ulong (*en + * pass address parameter as argv[0] (aka command name), + * and all remaining args + */ ++ cleanup_before_linux(); + ret = entry(argc, argv); + + if (dcache) diff --git a/sysutils/u-boot-wandboard/files/patch-common_cmd__nvedit.c b/sysutils/u-boot-wandboard/files/patch-common_cmd__nvedit.c new file mode 100644 index 000000000000..c726490c41fe --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-common_cmd__nvedit.c @@ -0,0 +1,46 @@ +--- common/cmd_nvedit.c.orig 2014-08-14 14:51:10 UTC ++++ common/cmd_nvedit.c +@@ -1061,6 +1061,23 @@ sep_err: + } + #endif + ++#if defined(CONFIG_CMD_ENV_EXISTS) ++static int do_env_exists(cmd_tbl_t *cmdtp, int flag, int argc, ++ char * const argv[]) ++{ ++ ENTRY e, *ep; ++ ++ if (argc < 2) ++ return CMD_RET_USAGE; ++ ++ e.key = argv[1]; ++ e.data = NULL; ++ hsearch_r(e, FIND, &ep, &env_htab, 0); ++ ++ return (ep == NULL) ? 1 : 0; ++} ++#endif ++ + /* + * New command line interface: "env" command with subcommands + */ +@@ -1096,6 +1113,9 @@ static cmd_tbl_t cmd_env_sub[] = { + U_BOOT_CMD_MKENT(save, 1, 0, do_env_save, "", ""), + #endif + U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 0, do_env_set, "", ""), ++#if defined(CONFIG_CMD_ENV_EXISTS) ++ U_BOOT_CMD_MKENT(exists, 2, 0, do_env_exists, "", ""), ++#endif + }; + + #if defined(CONFIG_NEEDS_MANUAL_RELOC) +@@ -1138,6 +1158,9 @@ static char env_help_text[] = + #if defined(CONFIG_CMD_EDITENV) + "env edit name - edit environment variable\n" + #endif ++#if defined(CONFIG_CMD_ENV_EXISTS) ++ "env exists name - tests for existence of variable\n" ++#endif + #if defined(CONFIG_CMD_EXPORTENV) + "env export [-t | -b | -c] [-s size] addr [var ...] - export environment\n" + #endif diff --git a/sysutils/u-boot-wandboard/files/patch-common_cmd__test.c b/sysutils/u-boot-wandboard/files/patch-common_cmd__test.c new file mode 100644 index 000000000000..dccdea4bc334 --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-common_cmd__test.c @@ -0,0 +1,19 @@ +--- common/cmd_test.c.orig 2014-08-14 14:51:10 UTC ++++ common/cmd_test.c +@@ -22,9 +22,14 @@ static int do_test(cmd_tbl_t *cmdtp, int + char * const *ap; + int left, adv, expr, last_expr, neg, last_cmp; + +- /* args? */ +- if (argc < 3) ++ /* ++ * If no args, that's bogus, return false. ++ * If op is -z and no other args, answer is Yes, string is empty. ++ */ ++ if (argc < 2) + return 1; ++ else if (argc == 2) ++ return !(strcmp(argv[1], "-z") == 0); + + #ifdef DEBUG + { diff --git a/sysutils/u-boot-wandboard/files/patch-config.mk b/sysutils/u-boot-wandboard/files/patch-config.mk new file mode 100644 index 000000000000..520927a7646d --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-config.mk @@ -0,0 +1,11 @@ +--- config.mk.orig 2014-08-14 14:51:10 UTC ++++ config.mk +@@ -92,7 +92,7 @@ HOSTCC = $(call os_x_before, 10, 5, "c + HOSTCFLAGS += $(call os_x_before, 10, 4, "-traditional-cpp") + HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress") + else +-HOSTCC = gcc ++HOSTCC ?= gcc + endif + + ifeq ($(HOSTOS),cygwin) diff --git a/sysutils/u-boot-wandboard/files/patch-drivers_mmc_mmc.c b/sysutils/u-boot-wandboard/files/patch-drivers_mmc_mmc.c new file mode 100644 index 000000000000..742a65dba667 --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-drivers_mmc_mmc.c @@ -0,0 +1,80 @@ +--- drivers/mmc/mmc.c.orig 2014-08-14 14:51:10 UTC ++++ drivers/mmc/mmc.c +@@ -24,6 +24,7 @@ + + static struct list_head mmc_devices; + static int cur_dev_num = -1; ++static int mmc_error_print_max = -1; + + int __weak board_mmc_getwp(struct mmc *mmc) + { +@@ -1175,9 +1176,14 @@ int mmc_register(struct mmc *mmc) + block_dev_desc_t *mmc_get_dev(int dev) + { + struct mmc *mmc = find_mmc_device(dev); +- if (!mmc || mmc_init(mmc)) ++ if (!mmc) + return NULL; + ++ /* If mmc_init fails, mmc->block_dev will be of type ++ * DEV_TYPE_UNKNOWN with blksz and lba set to zero. ++ */ ++ mmc_init(mmc); ++ + return &mmc->block_dev; + } + #endif +@@ -1200,7 +1206,7 @@ int mmc_start_init(struct mmc *mmc) + err = mmc->init(mmc); + + if (err) +- return err; ++ goto done; + + mmc_set_bus_width(mmc, 1); + mmc_set_clock(mmc, 1); +@@ -1209,7 +1215,7 @@ int mmc_start_init(struct mmc *mmc) + err = mmc_go_idle(mmc); + + if (err) +- return err; ++ goto done; + + /* The internal partition reset to user partition(0) at every CMD0*/ + mmc->part_num = 0; +@@ -1226,15 +1232,33 @@ int mmc_start_init(struct mmc *mmc) + + if (err && err != IN_PROGRESS) { + #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT) +- printf("Card did not respond to voltage select!\n"); ++ if (mmc_error_print_max < 4) { ++ mmc_error_print_max++; ++ printf("Card did not respond to voltage select!\n"); ++ ++ if (mmc_error_print_max == 4) { ++ printf("Discarding further error messages\n"); ++ } ++ } + #endif +- return UNUSABLE_ERR; ++// return UNUSABLE_ERR; ++ goto done; + } + } + + if (err == IN_PROGRESS) + mmc->init_in_progress = 1; + ++done: ++ if (err) { ++ mmc->has_init = 0; ++ mmc->block_dev.type = DEV_TYPE_UNKNOWN; ++ mmc->block_dev.blksz = 0; ++ mmc->block_dev.lba = 0; ++ } else { ++ mmc->has_init = 1; ++ } ++ + return err; + } + diff --git a/sysutils/u-boot-wandboard/files/patch-include_configs_edm__cf__imx6.h b/sysutils/u-boot-wandboard/files/patch-include_configs_edm__cf__imx6.h new file mode 100644 index 000000000000..0f1f4bcdc75f --- /dev/null +++ b/sysutils/u-boot-wandboard/files/patch-include_configs_edm__cf__imx6.h @@ -0,0 +1,57 @@ +--- include/configs/edm_cf_imx6.h.orig 2014-08-14 14:51:10 UTC ++++ include/configs/edm_cf_imx6.h +@@ -338,4 +338,54 @@ + #define CONFIG_CMD_CACHE + #endif + ++/***************************************************************************** ++ * FreeBSD customizations from here down. ++ ****************************************************************************/ ++ ++#define CONFIG_API ++#define CONFIG_CMD_ELF ++#define CONFIG_CMD_ENV_EXISTS ++#define CONFIG_EFI_PARTITION ++#define CONFIG_PREBOOT ++ ++#undef CONFIG_CMD_BMODE ++#define CONFIG_CMD_BMODE ++ ++#undef CONFIG_SYS_MMC_MAX_DEVICE ++#define CONFIG_SYS_MMC_MAX_DEVICE CONFIG_SYS_FSL_USDHC_NUM ++ ++#undef CONFIG_LOADADDR ++#define CONFIG_LOADADDR 0x11000000 ++ ++/* Create a small(ish) boot environment for FreeBSD. */ ++#undef CONFIG_EXTRA_ENV_SETTINGS ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ "boardname=wandboard\0" \ ++ "bootfile=ubldr\0" \ ++ "fatdev=mmc 0:1\0" \ ++ "loaderdev=disk\0" \ ++ "uenv_file=uEnv.txt\0" \ ++ \ ++ "fatboot=" \ ++ "env exists user_fatboot && run user_fatboot; " \ ++ "fatload ${fatdev} ${loadaddr} ${bootfile} && bootelf; " \ ++ "\0" \ ++ "netboot=" \ ++ "env exists user_netboot && run user_netboot; " \ ++ "dhcp ${loadaddr} ${bootfile} && bootelf; " \ ++ "\0" \ ++ "preboot=" \ ++ "env exists setfdt && run setfdt; " \ ++ "env exists uenv_import && run uenv_import; " \ ++ "env exists user_preboot && run user_preboot; " \ ++ "\0" \ ++ "setfdt=env set fdt_file ${imxname}-${boardname}.dtb\0" \ ++ "uenv_import=" \ ++ "fatload ${fatdev} ${loadaddr} ${uenv_file} && " \ ++ "env import -t ${loadaddr} ${filesize}; " \ ++ "\0" ++ ++#undef CONFIG_BOOTCOMMAND ++#define CONFIG_BOOTCOMMAND "run fatboot" ++ + #endif /* __CONFIG_H * */ diff --git a/sysutils/u-boot-wandboard/pkg-descr b/sysutils/u-boot-wandboard/pkg-descr new file mode 100644 index 000000000000..7c9d8c71b386 --- /dev/null +++ b/sysutils/u-boot-wandboard/pkg-descr @@ -0,0 +1,24 @@ +U-Boot loader for Wandboard Solo, Dual, and Quad. + +Install the u-boot.imx file onto the boot disk using: + + dd if=u-boot.imx of=/dev/whatever bs=1k oseek=1 conv=sync + +The U-Boot built by this port expects the first 1MB of the boot media to +be reserved for the U-Boot executable and saved environment. The u-boot.imx +file begins at an offset of 1K from the start of the boot disk. The U-Boot +environment area begins at an offset of 512K. + +This version is patched so that: + * ELF and API features are enabled to support ubldr. + * A single U-Boot image supports Solo, Dual[lite], and Quad processors. + * When the selected board has multiple SD or MMC devices available, the + mmc0 device in U-Boot (and thus the disk0 device in loader(8)) will be + whichever device U-Boot was loaded from by the ROM bootloader routines. + +The sources for this port were originally obtained from commit 87f595d1ee +at https://github.com/TechNexion/U-Boot-edm/ which appears to be a slightly +modified fork of the stock U-Boot 2013.10 release. As of this writing, +the changes in this fork have not been rolled back into upstream U-Boot. + +For general information about U-Boot see WWW: http://www.denx.de/wiki/U-Boot |