diff loadtools/flconf.c @ 506:0dd2c87c1b63

fc-loadtool flash support overhaul
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 28 May 2019 05:12:47 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loadtools/flconf.c	Tue May 28 05:12:47 2019 +0000
@@ -0,0 +1,131 @@
+/*
+ * This module handles flash configuration for fc-loadtool
+ */
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include "flash.h"
+
+/* the following variables describe our selected flash config */
+
+int flash_global_config;
+struct flash_bank_info flash_bank_info[2];
+
+/* global configurations selected via hw parameter files */
+
+static struct global_cfg_kw {
+	char *kw;
+	int code;
+} global_cfg_keywords[] = {
+	{"single-4M", FLASH_GLOBAL_CFG_SINGLE_4M},
+	{"single-8M", FLASH_GLOBAL_CFG_SINGLE_8M},
+	{"dual-8M", FLASH_GLOBAL_CFG_DUAL_8M},
+	/* backward compatibility with old hw param files */
+	{"cfi-4M", FLASH_GLOBAL_CFG_SINGLE_4M},
+	{"cfi-8M", FLASH_GLOBAL_CFG_SINGLE_8M},
+	{"k5a32xx_t", FLASH_GLOBAL_CFG_SINGLE_4M},
+	{"pl129n", FLASH_GLOBAL_CFG_DUAL_8M},
+	{"28f640w30b", FLASH_GLOBAL_CFG_SINGLE_8M},
+	{0, 0}		/* array terminator */
+};
+
+/* called from hwparam.c config file parser */
+void
+set_flash_config(arg, filename_for_errs, lineno_for_errs)
+	char *arg;
+	char *filename_for_errs;
+	int lineno_for_errs;
+{
+	char *cp, *np, *ep;
+	struct global_cfg_kw *tp;
+	int bank, nbanks;
+	struct flash_bank_info *bi;
+	uint32_t align_size;
+
+	if (flash_global_config) {
+		fprintf(stderr, "%s line %d: duplicate flash setting\n",
+			filename_for_errs, lineno_for_errs);
+		exit(1);
+	}
+	for (cp = arg; isspace(*cp); cp++)
+		;
+	if (!*cp || *cp == '#') {
+too_few_arg:	fprintf(stderr,
+			"%s line %d: flash setting: too few arguments\n",
+			filename_for_errs, lineno_for_errs);
+		exit(1);
+	}
+	for (np = cp; *cp && !isspace(*cp); cp++)
+		;
+	if (*cp)
+		*cp++ = '\0';
+	for (tp = global_cfg_keywords; tp->kw; tp++)
+		if (!strcmp(tp->kw, np))
+			break;
+	if (!tp->kw) {
+		fprintf(stderr,
+			"%s line %d: unknown flash config \"%s\"\n",
+			filename_for_errs, lineno_for_errs, np);
+		exit(1);
+	}
+	flash_global_config = tp->code;
+
+	/* now initialize flash_bank_info (base addresses) */
+	switch (flash_global_config) {
+	case FLASH_GLOBAL_CFG_SINGLE_4M:
+		nbanks = 1;
+		align_size = 0x400000;
+		break;
+	case FLASH_GLOBAL_CFG_SINGLE_8M:
+		nbanks = 1;
+		align_size = 0x800000;
+		break;
+	case FLASH_GLOBAL_CFG_DUAL_8M:
+		nbanks = 2;
+		align_size = 0x800000;
+		break;
+	default:
+		fprintf(stderr,
+			"BUG in set_flash_config(): invalid global config\n");
+		abort();
+	}
+	for (bank = 0; bank < nbanks; bank++) {
+		while (isspace(*cp))
+			cp++;
+		if (!*cp || *cp == '#')
+			goto too_few_arg;
+		for (np = cp; *cp && !isspace(*cp); cp++)
+			;
+		if (*cp)
+			*cp++ = '\0';
+		bi = flash_bank_info + bank;
+		bi->base_addr = strtoul(np, &ep, 16);
+		if (*ep) {
+			fprintf(stderr,
+"%s line %d: syntax error (base addr expected after flash config name)\n",
+				filename_for_errs, lineno_for_errs);
+			exit(1);
+		}
+		/* check alignment */
+		if (bi->base_addr & (align_size - 1)) {
+			fprintf(stderr,
+"%s line %d: flash bank %d base addr is not aligned to the bank size (0x%lx)\n",
+				filename_for_errs, lineno_for_errs, bank,
+				(u_long) align_size);
+			exit(1);
+		}
+	}
+	while (isspace(*cp))
+		cp++;
+	if (*cp && *cp != '#') {
+		fprintf(stderr,
+			"%s line %d: flash setting: too many arguments\n",
+			filename_for_errs, lineno_for_errs);
+		exit(1);
+	}
+}