Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 21 Feb 2015 21:44:37 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r379555 - in head/sysutils/u-boot-duovero: . files
Message-ID:  <201502212144.t1LLib2u090653@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian (src committer)
Date: Sat Feb 21 21:44:36 2015
New Revision: 379555
URL: https://svnweb.freebsd.org/changeset/ports/379555
QAT: https://qat.redports.org/buildarchive/r379555/

Log:
  Add a U-Boot port for the Duovero system.
  
  PR:		196488
  Submitted by:	Scott Ellis
  Approved by:	bapt

Added:
  head/sysutils/u-boot-duovero/
  head/sysutils/u-boot-duovero/Makefile   (contents, props changed)
  head/sysutils/u-boot-duovero/distinfo   (contents, props changed)
  head/sysutils/u-boot-duovero/files/
  head/sysutils/u-boot-duovero/files/patch-api_api.c   (contents, props changed)
  head/sysutils/u-boot-duovero/files/patch-api_api__storage.c   (contents, props changed)
  head/sysutils/u-boot-duovero/files/patch-common_cmd__elf.c   (contents, props changed)
  head/sysutils/u-boot-duovero/files/patch-common_cmd__test.c   (contents, props changed)
  head/sysutils/u-boot-duovero/files/patch-drivers_mmc_mmc.c   (contents, props changed)
  head/sysutils/u-boot-duovero/files/patch-include_configs_duovero.h   (contents, props changed)
  head/sysutils/u-boot-duovero/pkg-descr   (contents, props changed)

Added: head/sysutils/u-boot-duovero/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/Makefile	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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>

Added: head/sysutils/u-boot-duovero/distinfo
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/distinfo	Sat Feb 21 21:44:36 2015	(r379555)
@@ -0,0 +1,2 @@
+SHA256 (u-boot-2014.10.tar.bz2) = d3b132a7a9b3f3182b7aad71c2dfbd4fc15bea83e12c76134eb3ffefc07d1c71
+SIZE (u-boot-2014.10.tar.bz2) = 10217685

Added: head/sysutils/u-boot-duovero/files/patch-api_api.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/files/patch-api_api.c	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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;
+ }
+ 
+ /*

Added: head/sysutils/u-boot-duovero/files/patch-api_api__storage.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/files/patch-api_api__storage.c	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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;

Added: head/sysutils/u-boot-duovero/files/patch-common_cmd__elf.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/files/patch-common_cmd__elf.c	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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;
+ }
+ 

Added: head/sysutils/u-boot-duovero/files/patch-common_cmd__test.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/files/patch-common_cmd__test.c	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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
+ 	{

Added: head/sysutils/u-boot-duovero/files/patch-drivers_mmc_mmc.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/files/patch-drivers_mmc_mmc.c	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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;
+ }
+ 

Added: head/sysutils/u-boot-duovero/files/patch-include_configs_duovero.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/files/patch-include_configs_duovero.h	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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 */

Added: head/sysutils/u-boot-duovero/pkg-descr
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/u-boot-duovero/pkg-descr	Sat Feb 21 21:44:36 2015	(r379555)
@@ -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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502212144.t1LLib2u090653>