1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-24 00:45:52 +00:00

Add a U-Boot port for the Duovero system.

PR:		196488
Submitted by:	Scott Ellis
Approved by:	bapt
This commit is contained in:
Ian Lepore 2015-02-21 21:44:36 +00:00
parent 04bee987e3
commit 978f2daf5f
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=379555
9 changed files with 375 additions and 0 deletions

View File

@ -0,0 +1,39 @@
# $FreeBSD$
PORTNAME= u-boot
PORTVERSION= 2014.10
CATEGORIES= sysutils
MASTER_SITES= ftp://ftp.denx.de/pub/u-boot/
PKGNAMESUFFIX= -duovero
MAINTAINER= ian@FreeBSD.org
COMMENT= Cross-build U-Boot loader for Duovero
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_FILES= ${U_BOOT_DIR}/u-boot.img \
${U_BOOT_DIR}/MLO \
${U_BOOT_DIR}/README
MAKE_ARGS+= ARCH=arm \
CROSS_COMPILE=arm-none-eabi-
do-configure:
(cd ${WRKSRC}; ${GMAKE} duovero_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}/u-boot.img
${CP} ${.CURDIR}/pkg-descr ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/README
.include <bsd.port.mk>

View File

@ -0,0 +1,2 @@
SHA256 (u-boot-2014.10.tar.bz2) = d3b132a7a9b3f3182b7aad71c2dfbd4fc15bea83e12c76134eb3ffefc07d1c71
SIZE (u-boot-2014.10.tar.bz2) = 10217685

View File

@ -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;
}
/*

View File

@ -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;

View File

@ -0,0 +1,29 @@
--- common/cmd_elf.c.orig 2014-10-14 08:47:15 UTC
+++ common/cmd_elf.c
@@ -35,22 +35,12 @@ unsigned long do_bootelf_exec(ulong (*en
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;
}

View File

@ -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
{

View File

@ -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;
}

View File

@ -0,0 +1,78 @@
--- include/configs/duovero.h.orig 2014-10-14 08:47:15 UTC
+++ include/configs/duovero.h
@@ -59,4 +59,75 @@
#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+/*****************************************************************************
+ * FreeBSD customizations from here down.
+ ****************************************************************************/
+
+#define CONFIG_SYS_DCACHE_OFF
+
+/* 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_SYS_MMC_MAX_DEVICE 2
+#ifndef CONFIG_SYS_DCACHE_OFF
+#define CONFIG_CMD_CACHE
+#endif
+#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
+#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 "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 \
+ "loadaddr=88000000\0" \
+ "Fatboot=" \
+ "env exists loaderdev || env set loaderdev ${fatdev}; " \
+ "env exists UserFatboot && run UserFatboot; " \
+ "echo Booting from: ${fatdev} ${bootfile}; " \
+ "fatload ${fatdev} ${loadaddr} ${bootfile} && bootelf; " \
+ "\0" \
+ "Netboot=" \
+ "env exists loaderdev || env set loaderdev net; " \
+ "env exists UserNetboot && run UserNetboot; " \
+ "dhcp ${loadaddr} ${bootfile} && bootelf; " \
+ "\0" \
+ "Preboot=" \
+ "env exists bootfile || bootfile=ubldr; " \
+ "env exists uenv_file || uenv_file=uEnv.txt; " \
+ "env exists SetupFdtfile && run SetupFdtfile; " \
+ "env exists SetupFatdev && run SetupFatdev; " \
+ "env exists SetupUenv && run SetupUenv; " \
+ "env exists UserPreboot && run UserPreboot; " \
+ "\0" \
+ "SetupFdtfile=" \
+ "env exists fdt_file || env set fdt_file omap4-duovero-parlor.dtb; " \
+ "\0" \
+ "SetupFatdev=" \
+ "env exists fatdev || fatdev='mmc 0'; " \
+ "\0" \
+ "SetupUenv=" \
+ "fatload ${fatdev} ${loadaddr} ${uenv_file} && " \
+ "env import -t ${loadaddr} ${filesize}; " \
+ "\0"
+
+#undef CONFIG_BOOTCOMMAND
+#define CONFIG_BOOTCOMMAND "run Fatboot"
+#undef CONFIG_PREBOOT
+#define CONFIG_PREBOOT "run Preboot"
+#endif
+
#endif /* __CONFIG_DUOVERO_H */

View File

@ -0,0 +1,21 @@
U-Boot loader for Gumstix Duovero.
To install this bootloader, copy the files MLO and u-boot.img to the FAT
partition on an SD card. 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 passed to ubldr using the fdtfile env variable.
The default is omap4-duovero-parlor.dtb for a Parlor expansion board.
ubldr loads the DTB from /boot/dtb/ on the FreeBSD partition.
(Not tested)
* By default, it loads ELF ubldr from file ubldr on the FAT partition
to address 0x88000000, and launches it.
For information about running FreeBSD on Duovero, see
https://wiki.freebsd.org/FreeBSD/arm/Duovero
For general information about U-Boot see WWW: http://www.denx.de/wiki/U-Boot