예제 #1
0
static void pbl_parser(char *name)
{
	FILE *fd = NULL;
	char *line = NULL;
	char *token, *saveptr1, *saveptr2;
	size_t len = 0;

	fname = name;
	fd = fopen(name, "r");
	if (fd == NULL) {
		printf("Error:%s - Can't open\n", fname);
		exit(EXIT_FAILURE);
	}

	while ((getline(&line, &len, fd)) > 0) {
		lineno++;
		token = strtok_r(line, "\r\n", &saveptr1);
		/* drop all lines with zero tokens (= empty lines) */
		if (token == NULL)
			continue;
		for (line = token;; line = NULL) {
			token = strtok_r(line, " \t", &saveptr2);
			if (token == NULL)
				break;
			/* Drop all text starting with '#' as comments */
			if (token[0] == '#')
				break;
			check_get_hexval(token);
		}
	}
	if (line)
		free(line);
	fclose(fd);
}
예제 #2
0
/*
 * this function sets the kwbimage header by-
 * 	1. Abstracting input command line arguments data
 *	2. parses the kwbimage configuration file and update extebded header data
 *	3. calculates header, extended header and image checksums
 */
static void kwdimage_set_ext_header (struct kwb_header *kwbhdr, char* name) {
	bhr_t *mhdr = &kwbhdr->kwb_hdr;
	extbhr_t *exthdr = &kwbhdr->kwb_exthdr;
	FILE *fd = NULL;
	int j;
	char *line = NULL;
	char * token, *saveptr1, *saveptr2;
	size_t len = 0;
	enum kwbimage_cmd cmd;

	fname = name;
	/* set dram register offset */
	exthdr->dramregsoffs = (intptr_t)&exthdr->rcfg - (intptr_t)mhdr;

	if ((fd = fopen (name, "r")) == 0) {
		printf ("Error:%s - Can't open\n", fname);
		exit (EXIT_FAILURE);
	}

	/* Simple kwimage.cfg file parser */
	lineno=0;
	while ((getline (&line, &len, fd)) > 0) {
		lineno++;
		token = strtok_r (line, "\r\n", &saveptr1);
		/* drop all lines with zero tokens (= empty lines) */
		if (token == NULL)
			continue;

		for (j = 0, cmd = CMD_INVALID, line = token; ; line = NULL) {
			token = strtok_r (line, " \t", &saveptr2);
			if (token == NULL)
			break;
			/* Drop all text starting with '#' as comments */
			if (token[0] == '#')
				break;

			/* Process rest as valid config command line */
			switch (j) {
			case CFG_COMMAND:
				cmd = get_table_entry_id (kwbimage_cmds,
						"Kwbimage command", token);

				if (cmd == CMD_INVALID)
					goto INVL_CMD;
				break;

			case CFG_DATA0:
				kwbimage_check_cfgdata (token, cmd, kwbhdr);
				break;

			case CFG_DATA1:
				if (cmd != CMD_DATA)
					goto INVL_CMD;


				if (datacmd_cnt > KWBIMAGE_MAX_CONFIG ) {
					printf ("Error:%s[%d] - Found more "
						"than max(%zd) allowed "
						"data configurations\n",
						fname, lineno,
						KWBIMAGE_MAX_CONFIG);
				exit (EXIT_FAILURE);
				} else{
					exthdr->rcfg[datacmd_cnt].rdata =
						check_get_hexval (token);
					datacmd_cnt++;
				}
				break;

			default:
				goto INVL_CMD;
			}
			j++;
		}
	}
	if (line)
		free (line);

	fclose (fd);
	return;

/*
 * Invalid Command error reporring
 *
 * command CMD_DATA needs three strings on a line
 * whereas other commands need only two.
 *
 * if more than two/three (as per command type) are observed,
 * then error will be reported
 */
INVL_CMD:
	printf ("Error:%s[%d] - Invalid command\n", fname, lineno);
	exit (EXIT_FAILURE);
}
예제 #3
0
static void kwbimage_check_cfgdata (char *token, enum kwbimage_cmd cmdsw,
					struct kwb_header *kwbhdr)
{
	bhr_t *mhdr = &kwbhdr->kwb_hdr;
	extbhr_t *exthdr = &kwbhdr->kwb_exthdr;
	int i;

	switch (cmdsw) {
	case CMD_BOOT_FROM:
		i = get_table_entry_id (kwbimage_bootops,
				"Kwbimage boot option", token);

		if (i < 0)
			goto INVL_DATA;

		mhdr->blockid = i;
		printf ("Preparing kirkwood boot image to boot "
			"from %s\n", token);
		break;
	case CMD_NAND_ECC_MODE:
		i = get_table_entry_id (kwbimage_eccmodes,
			"NAND ecc mode", token);

		if (i < 0)
			goto INVL_DATA;

		mhdr->nandeccmode = i;
		printf ("Nand ECC mode = %s\n", token);
		break;
	case CMD_NAND_PAGE_SIZE:
		mhdr->nandpagesize =
			(uint16_t) check_get_hexval (token);
		printf ("Nand page size = 0x%x\n", mhdr->nandpagesize);
		break;
	case CMD_SATA_PIO_MODE:
		mhdr->satapiomode =
			(uint8_t) check_get_hexval (token);
		printf ("Sata PIO mode = 0x%x\n",
				mhdr->satapiomode);
		break;
	case CMD_DDR_INIT_DELAY:
		mhdr->ddrinitdelay =
			(uint16_t) check_get_hexval (token);
		printf ("DDR init delay = %d msec\n", mhdr->ddrinitdelay);
		break;
	case CMD_DATA:
		exthdr->rcfg[datacmd_cnt].raddr =
			check_get_hexval (token);

		break;
	case CMD_INVALID:
		goto INVL_DATA;
	default:
		goto INVL_DATA;
	}
	return;

INVL_DATA:
	printf ("Error:%s[%d] - Invalid data\n", fname, lineno);
	exit (EXIT_FAILURE);
}