summaryrefslogtreecommitdiff
path: root/sysutils
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2014-12-09 20:07:29 +0000
committerWarner Losh <imp@FreeBSD.org>2014-12-09 20:07:29 +0000
commit5546542d4df87426015b97334b247c61879e100c (patch)
treeeb29dd4a212587ae2a9e298eaa1d5fdca56784d0 /sysutils
parentdevel/rubygem-apipie-bindings: upgrade to 0.0.11 (diff)
FreeBSD customized Beagle Bone Black u-boot boot loader.
Notes
Notes: svn path=/head/; revision=374427
Diffstat (limited to 'sysutils')
-rw-r--r--sysutils/u-boot-beaglebone/Makefile40
-rw-r--r--sysutils/u-boot-beaglebone/distinfo2
-rw-r--r--sysutils/u-boot-beaglebone/files/patch-api_api.c79
-rw-r--r--sysutils/u-boot-beaglebone/files/patch-api_api__storage.c28
-rw-r--r--sysutils/u-boot-beaglebone/files/patch-common_cmd__elf.c10
-rw-r--r--sysutils/u-boot-beaglebone/files/patch-common_cmd__test.c19
-rw-r--r--sysutils/u-boot-beaglebone/files/patch-drivers_mmc_mmc.c80
-rw-r--r--sysutils/u-boot-beaglebone/files/patch-include_configs_am335x__evm.h85
-rw-r--r--sysutils/u-boot-beaglebone/pkg-descr23
9 files changed, 366 insertions, 0 deletions
diff --git a/sysutils/u-boot-beaglebone/Makefile b/sysutils/u-boot-beaglebone/Makefile
new file mode 100644
index 000000000000..18df93336829
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/Makefile
@@ -0,0 +1,40 @@
+# $FreeBSD$
+
+PORTNAME= u-boot
+PORTVERSION= 2014.10
+CATEGORIES= sysutils
+MASTER_SITES= ftp://ftp.denx.de/pub/u-boot/
+PKGNAMESUFFIX= -beaglebone
+
+MAINTAINER= ian@FreeBSD.org
+COMMENT= Cross-build U-Boot loader for BeagleBone and BeagleBone Black
+
+LICENSE= GPLv2
+
+BUILD_DEPENDS= arm-none-eabi-gcc:${PORTSDIR}/devel/arm-none-eabi-gcc
+
+NO_ARCH= yes
+
+WRKSRC= ${WRKDIR}/u-boot-${PORTVERSION}
+USES= gmake tar:bzip2
+SSP_UNSAFE= yes # cross-LD does not support -fstack-protector
+
+U_BOOT_DIR= share/u-boot/${PORTNAME}${PKGNAMESUFFIX}
+PLIST_DIRS= ${U_BOOT_DIR} share/u-boot
+PLIST_FILES= ${U_BOOT_DIR}/bb-uboot.img \
+ ${U_BOOT_DIR}/MLO \
+ ${U_BOOT_DIR}/README
+
+MAKE_ARGS+= ARCH=arm \
+ CROSS_COMPILE=arm-none-eabi-
+
+do-configure:
+ (cd ${WRKSRC}; ${GMAKE} am335x_evm_config)
+
+do-install:
+ ${MKDIR} ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}
+ ${CP} ${WRKSRC}/MLO ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}
+ ${CP} ${WRKSRC}/u-boot.img ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/bb-uboot.img
+ ${CP} ${.CURDIR}/pkg-descr ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/README
+
+.include <bsd.port.mk>
diff --git a/sysutils/u-boot-beaglebone/distinfo b/sysutils/u-boot-beaglebone/distinfo
new file mode 100644
index 000000000000..0fb71c9491f3
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/distinfo
@@ -0,0 +1,2 @@
+SHA256 (u-boot-2014.10.tar.bz2) = d3b132a7a9b3f3182b7aad71c2dfbd4fc15bea83e12c76134eb3ffefc07d1c71
+SIZE (u-boot-2014.10.tar.bz2) = 10217685
diff --git a/sysutils/u-boot-beaglebone/files/patch-api_api.c b/sysutils/u-boot-beaglebone/files/patch-api_api.c
new file mode 100644
index 000000000000..ef304124e3bc
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/files/patch-api_api.c
@@ -0,0 +1,79 @@
+--- api/api.c.orig 2014-10-14 08:47:15 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-beaglebone/files/patch-api_api__storage.c b/sysutils/u-boot-beaglebone/files/patch-api_api__storage.c
new file mode 100644
index 000000000000..0f546915a733
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/files/patch-api_api__storage.c
@@ -0,0 +1,28 @@
+--- api/api_storage.c.orig 2014-10-14 08:47:15 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-beaglebone/files/patch-common_cmd__elf.c b/sysutils/u-boot-beaglebone/files/patch-common_cmd__elf.c
new file mode 100644
index 000000000000..c1d74ccbc6c3
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/files/patch-common_cmd__elf.c
@@ -0,0 +1,10 @@
+--- common/cmd_elf.c.orig 2014-10-14 08:47:15 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-beaglebone/files/patch-common_cmd__test.c b/sysutils/u-boot-beaglebone/files/patch-common_cmd__test.c
new file mode 100644
index 000000000000..f806a467d1dd
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/files/patch-common_cmd__test.c
@@ -0,0 +1,19 @@
+--- common/cmd_test.c.orig 2014-10-14 08:47:15 UTC
++++ common/cmd_test.c
+@@ -65,9 +65,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-beaglebone/files/patch-drivers_mmc_mmc.c b/sysutils/u-boot-beaglebone/files/patch-drivers_mmc_mmc.c
new file mode 100644
index 000000000000..4b508840aa1d
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/files/patch-drivers_mmc_mmc.c
@@ -0,0 +1,80 @@
+--- drivers/mmc/mmc.c.orig 2014-10-14 08:47:15 UTC
++++ drivers/mmc/mmc.c
+@@ -20,6 +20,7 @@
+
+ static struct list_head mmc_devices;
+ static int cur_dev_num = -1;
++static int mmc_error_print_max = -1;
+
+ __weak int board_mmc_getwp(struct mmc *mmc)
+ {
+@@ -1270,9 +1271,14 @@ void mmc_destroy(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
+@@ -1297,7 +1303,7 @@ int mmc_start_init(struct mmc *mmc)
+ err = mmc->cfg->ops->init(mmc);
+
+ if (err)
+- return err;
++ goto done;
+
+ mmc_set_bus_width(mmc, 1);
+ mmc_set_clock(mmc, 1);
+@@ -1306,7 +1312,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;
+@@ -1323,15 +1329,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-beaglebone/files/patch-include_configs_am335x__evm.h b/sysutils/u-boot-beaglebone/files/patch-include_configs_am335x__evm.h
new file mode 100644
index 000000000000..deb61c3838f1
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/files/patch-include_configs_am335x__evm.h
@@ -0,0 +1,85 @@
+--- include/configs/am335x_evm.h.orig 2014-10-14 08:47:15 UTC
++++ include/configs/am335x_evm.h
+@@ -479,4 +479,82 @@
+ #endif
+ #endif /* NOR support */
+
++/*****************************************************************************
++ * FreeBSD customizations from here down.
++ ****************************************************************************/
++
++/* No watchdog. (Why?) */
++#undef CONFIG_HW_WATCHDOG
++#undef CONFIG_OMAP_WATCHDOG
++#undef CONFIG_SPL_WATCHDOG_SUPPORT
++
++/* Add the API and ELF features needed for ubldr. */
++#ifndef CONFIG_SPL_BUILD
++#define CONFIG_API
++#define CONFIG_CMD_ELF
++#define CONFIG_CMD_ENV_EXISTS
++#define CONFIG_EFI_PARTITION
++#define CONFIG_PREBOOT
++#define CONFIG_SYS_MMC_MAX_DEVICE 2
++#endif
++
++/* SPL loads bb-uboot.img. */
++#ifdef CONFIG_SPL_BUILD
++#undef CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME
++#define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME "bb-uboot.img"
++#endif
++
++/* Save the env to the fat partition. */
++#ifndef CONFIG_SPL_BUILD
++#undef CONFIG_ENV_IS_NOWHERE
++#undef CONFIG_ENV_IS_IN_NAND
++#define CONFIG_ENV_IS_IN_FAT
++#define CONFIG_FAT_WRITE
++#define FAT_ENV_INTERFACE "mmc"
++#define FAT_ENV_DEVICE_AND_PART "0"
++#define FAT_ENV_FILE "uboot.env"
++#endif
++
++/* Create a small(ish) boot environment for FreeBSD. */
++#ifndef CONFIG_SPL_BUILD
++#undef CONFIG_EXTRA_ENV_SETTINGS
++#define CONFIG_EXTRA_ENV_SETTINGS \
++ "bootfile=bbubldr\0" \
++ "fdt_file=undefined\0" \
++ "fatdev=mmc 0:1\0" \
++ "loadaddr=0x88000000\0" \
++ "loaderdev=disk\0" \
++ "uenv_file=bb-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=" \
++ "if test ${board_name} = A335BONE; then " \
++ "env set fdt_file bbone.dtb; " \
++ "elif test ${board_name} = A335BNLT; then " \
++ "env set fdt_file bboneblk.dtb; " \
++ "else " \
++ "echo WARNING: Could not determine device tree to use; " \
++ "fi; " \
++ "\0" \
++ "uenv_import=" \
++ "fatload ${fatdev} ${loadaddr} ${uenv_file} && " \
++ "env import -t ${loadaddr} ${filesize}; " \
++ "\0"
++
++#undef CONFIG_BOOTCOMMAND
++#define CONFIG_BOOTCOMMAND "run fatboot"
++#endif
++
+ #endif /* ! __CONFIG_AM335X_EVM_H */
diff --git a/sysutils/u-boot-beaglebone/pkg-descr b/sysutils/u-boot-beaglebone/pkg-descr
new file mode 100644
index 000000000000..0b4d0acc2152
--- /dev/null
+++ b/sysutils/u-boot-beaglebone/pkg-descr
@@ -0,0 +1,23 @@
+U-Boot loader for BeagleBone and BeagleBone Black.
+
+To install this bootloader, copy the files MLO and bb-uboot.img to the FAT
+partition on an SD card or the eMMC. Normally this is partition 1, but
+different partitions can be set with U-Boot environment variables.
+
+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 uboot.env on the FAT partition.
+ * The DTB file name is chosen based on the board model and passed to ubldr
+ using the fdtfile env variable. ubldr loads the DTB from /boot/dtb/ on
+ the FreeBSD partition.
+ * By default, it loads ELF ubldr from file bbubldr on the FAT partition
+ to address 0x88000000, and launches it.
+
+Note: prefixing the boot files with 'bb' allows building
+images with boot bits for more than one board.
+
+For information about running FreeBSD on BeagleBone or BeagleBone Black, see
+ https://wiki.freebsd.org/FreeBSD/arm/BeagleBone
+
+For general information about U-Boot see WWW: http://www.denx.de/wiki/U-Boot