diff options
-rw-r--r-- | sysutils/Makefile | 1 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/Makefile | 58 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/distinfo | 3 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/files/patch-api_api.c | 95 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/files/patch-api_api__net.c | 11 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_elf.c | 29 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_test.c | 19 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/files/patch-include_configs_sunxi-common.h | 72 | ||||
-rw-r--r-- | sysutils/u-boot-olimex-a20-som-evb/pkg-descr | 19 |
9 files changed, 307 insertions, 0 deletions
diff --git a/sysutils/Makefile b/sysutils/Makefile index 8aa9e7d4d99a..1ace334f8cfd 100644 --- a/sysutils/Makefile +++ b/sysutils/Makefile @@ -1092,6 +1092,7 @@ SUBDIR += u-boot-cubieboard2 SUBDIR += u-boot-cubox-hummingboard SUBDIR += u-boot-duovero + SUBDIR += u-boot-olimex-a20-som-evb SUBDIR += u-boot-pandaboard SUBDIR += u-boot-pine64 SUBDIR += u-boot-rpi diff --git a/sysutils/u-boot-olimex-a20-som-evb/Makefile b/sysutils/u-boot-olimex-a20-som-evb/Makefile new file mode 100644 index 000000000000..dd233a9136d1 --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/Makefile @@ -0,0 +1,58 @@ +# $FreeBSD$ + +PORTNAME= u-boot +PORTVERSION= ${UBOOT_VERSION} +CATEGORIES= sysutils +MASTER_SITES= ftp://ftp.denx.de/pub/u-boot/ +PKGNAMESUFFIX?= -${MODEL} + +MAINTAINER= manu@FreeBSD.org +COMMENT= Cross-build U-Boot loader for olimex-a20-som-evb + +LICENSE= GPLv2 + +BUILD_DEPENDS= arm-none-eabi-gcc:devel/arm-none-eabi-gcc + +UBOOT_VERSION?= 2016.05 +BOARD_CONFIG?= A20-Olimex-SOM-EVB_defconfig +MODEL?= olimex-a20-som-evb + +NO_ARCH= yes + +WRKSRC= ${WRKDIR}/u-boot-${DISTVERSION} +USES= gmake tar:bzip2 +SSP_UNSAFE= yes # cross-LD does not support -fstack-protector + +U_BOOT_DIR= share/u-boot/${PORTNAME}${PKGNAMESUFFIX} +PLIST_FILES= ${U_BOOT_DIR}/u-boot.img \ + ${U_BOOT_DIR}/u-boot-sunxi-with-spl.bin \ + ${U_BOOT_DIR}/sunxi-spl.bin \ + ${U_BOOT_DIR}/README + +MAKE_ARGS+= ARCH=arm \ + CROSS_COMPILE=arm-none-eabi- + +.include <bsd.port.pre.mk> + +.if ${OSVERSION} < 1100000 +IGNORE= requires FreeBSD 11 or later +.endif + +post-patch: + @${REINPLACE_CMD} -e "s,%%MODEL%%,${MODEL}," \ + ${WRKSRC}/include/configs/sunxi-common.h + +do-configure: + (cd ${WRKSRC}; ${MAKE_CMD} ${BOARD_CONFIG}) + +do-install: + ${MKDIR} ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${INSTALL_DATA} ${WRKSRC}/u-boot.img ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${INSTALL_DATA} ${WRKSRC}/u-boot-sunxi-with-spl.bin \ + ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${INSTALL_DATA} ${WRKSRC}/spl/sunxi-spl.bin \ + ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${INSTALL_DATA} ${.CURDIR}/pkg-descr \ + ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/README + +.include <bsd.port.post.mk> diff --git a/sysutils/u-boot-olimex-a20-som-evb/distinfo b/sysutils/u-boot-olimex-a20-som-evb/distinfo new file mode 100644 index 000000000000..77d92eca7981 --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1466239765 +SHA256 (u-boot-2016.05.tar.bz2) = 87d02275615aaf0cd007b54cbe9fbadceef2bee7c79e6c323ea1ae8956dcb171 +SIZE (u-boot-2016.05.tar.bz2) = 11325053 diff --git a/sysutils/u-boot-olimex-a20-som-evb/files/patch-api_api.c b/sysutils/u-boot-olimex-a20-som-evb/files/patch-api_api.c new file mode 100644 index 000000000000..fa75b514c76f --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/files/patch-api_api.c @@ -0,0 +1,95 @@ +--- api/api.c.orig 2016-05-16 14:40:32 UTC ++++ api/api.c +@@ -290,6 +290,14 @@ static int API_dev_close(va_list ap) + if (!err) + di->state = DEV_STA_CLOSED; + ++ /* ++ * FreeBSD loader(8) just loaded code to some random location that may ++ * contain stale icache entries. Now that the device is closed it's ++ * about to run that code, so clean the caches. ++ */ ++ flush_dcache_all(); ++ invalidate_icache_all(); ++ + return err; + } + +@@ -495,45 +503,48 @@ static int API_env_set(va_list ap) + */ + static int API_env_enum(va_list ap) + { +- int i, n; +- char *last, **next; ++ int i, buflen; ++ 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; ++ buflen = strlen(match->key) + strlen(match->data) + 2; ++ buf = realloc(buf, buflen); ++ 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-olimex-a20-som-evb/files/patch-api_api__net.c b/sysutils/u-boot-olimex-a20-som-evb/files/patch-api_api__net.c new file mode 100644 index 000000000000..b2f7fd615f86 --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/files/patch-api_api__net.c @@ -0,0 +1,11 @@ +--- api/api_net.c.orig 2016-05-16 14:40:32 UTC ++++ api/api_net.c +@@ -25,7 +25,7 @@ DECLARE_GLOBAL_DATA_PTR; + + #define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0) + +-#ifdef CONFIG_CMD_NET ++#if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH) + + static int dev_valid_net(void *cookie) + { diff --git a/sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_elf.c b/sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_elf.c new file mode 100644 index 000000000000..da6f5fdc1053 --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_elf.c @@ -0,0 +1,29 @@ +--- cmd/elf.c.orig 2016-05-16 14:40:32 UTC ++++ cmd/elf.c +@@ -110,22 +110,12 @@ static unsigned long do_bootelf_exec(ulo + unsigned long ret; + + /* +- * QNX images require the data cache is disabled. +- * Data cache is already flushed, so just turn it off. +- */ +- int dcache = dcache_status(); +- if (dcache) +- dcache_disable(); +- +- /* +- * pass address parameter as argv[0] (aka command name), +- * and all remaining args ++ * FreeBSD wants the caches enabled while ubldr runs, and as of r276397 ++ * the kernel can tolerate being entered with internal (but not external ++ * PL310) caches enabled on armv6/7 systems. So don't disable caches ++ * here, just launch the program directly. + */ + ret = entry(argc, argv); +- +- if (dcache) +- dcache_enable(); +- + return ret; + } + diff --git a/sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_test.c b/sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_test.c new file mode 100644 index 000000000000..d7f8c8bc58d4 --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/files/patch-cmd_test.c @@ -0,0 +1,19 @@ +--- cmd/test.c.orig 2016-05-16 14:40:32 UTC ++++ cmd/test.c +@@ -56,9 +56,14 @@ static int do_test(cmd_tbl_t *cmdtp, int + char * const *ap; + int i, op, left, adv, expr, last_expr, last_unop, last_binop; + +- /* 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-olimex-a20-som-evb/files/patch-include_configs_sunxi-common.h b/sysutils/u-boot-olimex-a20-som-evb/files/patch-include_configs_sunxi-common.h new file mode 100644 index 000000000000..638f9258a44d --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/files/patch-include_configs_sunxi-common.h @@ -0,0 +1,72 @@ +--- include/configs/sunxi-common.h.orig 2016-05-16 14:40:32 UTC ++++ include/configs/sunxi-common.h +@@ -513,4 +513,69 @@ extern int soft_i2c_gpio_scl; + #define CONFIG_EXTRA_ENV_SETTINGS + #endif + ++/***************************************************************************** ++ * FreeBSD customizations from here down. ++ ****************************************************************************/ ++ ++/* Add the API and ELF features needed for ubldr. */ ++#ifndef CONFIG_SPL_BUILD ++#define CONFIG_API ++#define CONFIG_EFI_PARTITION ++#endif ++ ++/* Turn off dcache. */ ++#ifndef CONFIG_SPL_BUILD ++#define CONFIG_SYS_DCACHE_OFF ++#define CONFIG_CMD_CACHE ++#endif ++ ++/* Save the env to the fat partition. */ ++#ifndef CONFIG_SPL_BUILD ++#undef CONFIG_ENV_IS_NOWHERE ++#undef CONFIG_ENV_IS_IN_NAND ++#undef CONFIG_ENV_IS_IN_MMC ++#undef CONFIG_ENV_IS_IN_SPI_FLASH ++#define CONFIG_ENV_IS_IN_FAT ++#define CONFIG_FAT_WRITE ++#define CONFIG_SYS_MMC_MAX_DEVICE 4 ++#define FAT_ENV_INTERFACE "mmc" ++#define FAT_ENV_DEVICE_AND_PART "0:1" ++#define FAT_ENV_FILE "u-boot.env" ++#endif ++ ++/* Create a small(ish) boot environment for FreeBSD. */ ++#ifndef CONFIG_SPL_BUILD ++#undef CONFIG_EXTRA_ENV_SETTINGS ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ MEM_LAYOUT_ENV_SETTINGS \ ++ CONSOLE_STDOUT_SETTINGS \ ++ "stdin=serial,usbkbd\0" \ ++ "fdtfile=%%MODEL%%.dtb\0" \ ++ "console=ttyS0,115200\0" \ ++ "Fatboot=" \ ++ "env exists loaderdev || env set loaderdev ${fatdev}; " \ ++ "env exists UserFatboot && run UserFatboot; " \ ++ "echo Booting from: ${fatdev} ${bootfile}; " \ ++ "fatload ${fatdev} ${kernel_addr_r} ${bootfile} && bootelf || go ${kernel_addr_r}; " \ ++ "\0" \ ++ "Netboot=" \ ++ "env exists loaderdev || env set loaderdev net; " \ ++ "env exists UserNetboot && run UserNetboot; " \ ++ "dhcp ${kernel_addr_r} ${bootfile} && bootelf; " \ ++ "\0" \ ++ "preboot=usb start; " \ ++ "env exists bootfile || env set bootfile ubldr.bin; " \ ++ "env exists SetupFatdev && run SetupFatdev; " \ ++ "env exists UserPreboot && run UserPreboot; " \ ++ "\0" \ ++ "SetupFatdev=" \ ++ "env exists fatdev || env set fatdev 'mmc 0'; " \ ++ "\0" ++ ++#undef CONFIG_BOOTCOMMAND ++#define CONFIG_BOOTCOMMAND "run Fatboot" ++#undef CONFIG_PREBOOT ++#define CONFIG_PREBOOT "run preboot" ++#endif ++ + #endif /* _SUNXI_COMMON_CONFIG_H */ diff --git a/sysutils/u-boot-olimex-a20-som-evb/pkg-descr b/sysutils/u-boot-olimex-a20-som-evb/pkg-descr new file mode 100644 index 000000000000..bfcd0f27eb11 --- /dev/null +++ b/sysutils/u-boot-olimex-a20-som-evb/pkg-descr @@ -0,0 +1,19 @@ +U-Boot loader for Olimex A20 SOM EVB. + +To install this bootloader, follow the instructions in + http://linux-sunxi.org/Bootable_SD_card#Bootloader + +This version is patched so that: + * ELF and API features are enabled. + * The default environment is trimmed to just what's needed to boot. + * The saveenv command writes to the file u-boot.env on the FAT partition. + * The DTB file name is chosen based on the board model and passed to ubldr.bin + using the fdtfile env variable. ubldr.bin loads the DTB from /boot/dtb/ on + the FreeBSD partition. + * By default, it loads PIE ubldr.bin from file ubldr.bin on the FAT partition + to address 0x42000000, and launches it. + +For information about running FreeBSD on Cubieboard, see + https://wiki.freebsd.org/FreeBSD/arm/Allwinner + +For general information about U-Boot see WWW: http://www.denx.de/wiki/U-Boot |