Example #1
0
static COMMAND_HELPER(command_help_show_list, struct command *head, unsigned n,
	bool show_help, const char *cmd_match)
{
	for (struct command *c = head; NULL != c; c = c->next)
		CALL_COMMAND_HANDLER(command_help_show, c, n, show_help, cmd_match);
	return ERROR_OK;
}
Example #2
0
static COMMAND_HELPER(create_nand_device, const char *bank_name,
		struct nand_flash_controller *controller)
{
	struct nand_device *c;
	struct target *target;
	int retval;

	if (CMD_ARGC < 2)
	{
		return ERROR_COMMAND_SYNTAX_ERROR;
	}
	target = get_target(CMD_ARGV[1]);
	if (!target) {
		LOG_ERROR("invalid target %s", CMD_ARGV[1]);
		return ERROR_COMMAND_ARGUMENT_INVALID;
	}

	if (NULL != controller->commands)
	{
		retval = register_commands(CMD_CTX, NULL,
				controller->commands);
		if (ERROR_OK != retval)
			return retval;
	}
	c = malloc(sizeof(struct nand_device));
	if (c == NULL)
	{
		LOG_ERROR("End of memory");
		return ERROR_FAIL;
	}

	c->name = strdup(bank_name);
	c->target = target;
	c->controller = controller;
	c->controller_priv = NULL;
	c->manufacturer = NULL;
	c->device = NULL;
	c->bus_width = 0;
	c->address_cycles = 0;
	c->page_size = 0;
	c->use_raw = 0;
	c->next = NULL;

	retval = CALL_COMMAND_HANDLER(controller->nand_device_command, c);
	if (ERROR_OK != retval)
	{
		assert(controller->usage != NULL);
		LOG_ERROR("'%s' driver rejected nand flash. Usage: %s",
			controller->name,
			controller->usage);
		free(c);
		return retval;
	}

	nand_device_add(c);

	return ERROR_OK;
}
Example #3
0
static COMMAND_HELPER(command_help_find, struct command *head,
	struct command **out)
{
	if (0 == CMD_ARGC)
		return ERROR_COMMAND_SYNTAX_ERROR;
	*out = command_find(head, CMD_ARGV[0]);
	if (NULL == *out && strncmp(CMD_ARGV[0], "ocd_", 4) == 0)
		*out = command_find(head, CMD_ARGV[0] + 4);
	if (NULL == *out)
		return ERROR_COMMAND_SYNTAX_ERROR;
	if (--CMD_ARGC == 0)
		return ERROR_OK;
	CMD_ARGV++;
	return CALL_COMMAND_HANDLER(command_help_find, (*out)->children, out);
}
Example #4
0
COMMAND_HELPER(nand_fileio_parse_args, struct nand_fileio_state *state,
	struct nand_device **dev, enum fileio_access filemode,
	bool need_size, bool sw_ecc)
{
	nand_fileio_init(state);

	unsigned minargs = need_size ? 4 : 3;
	if (CMD_ARGC < minargs)
		return ERROR_COMMAND_SYNTAX_ERROR;

	struct nand_device *nand;
	int retval = CALL_COMMAND_HANDLER(nand_command_get_device, 0, &nand);
	if (ERROR_OK != retval)
		return retval;

	if (NULL == nand->device) {
		command_print(CMD_CTX, "#%s: not probed", CMD_ARGV[0]);
		return ERROR_OK;
	}

	COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], state->address);
	if (need_size) {
		COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], state->size);
		if (state->size % nand->page_size) {
			command_print(CMD_CTX, "only page-aligned sizes are supported");
			return ERROR_COMMAND_SYNTAX_ERROR;
		}
	}

	if (CMD_ARGC > minargs) {
		for (unsigned i = minargs; i < CMD_ARGC; i++) {
			if (!strcmp(CMD_ARGV[i], "oob_raw"))
				state->oob_format |= NAND_OOB_RAW;
			else if (!strcmp(CMD_ARGV[i], "oob_only"))
				state->oob_format |= NAND_OOB_RAW | NAND_OOB_ONLY;
			else if (sw_ecc && !strcmp(CMD_ARGV[i], "oob_softecc"))
				state->oob_format |= NAND_OOB_SW_ECC;
			else if (sw_ecc && !strcmp(CMD_ARGV[i], "oob_softecc_kw"))
				state->oob_format |= NAND_OOB_SW_ECC_KW;
			else {
				command_print(CMD_CTX, "unknown option: %s", CMD_ARGV[i]);
				return ERROR_COMMAND_SYNTAX_ERROR;
			}
		}
	}

	retval = nand_fileio_start(CMD_CTX, nand, CMD_ARGV[1], filemode, state);
	if (ERROR_OK != retval)
		return retval;

	if (!need_size) {
		int filesize;
		retval = fileio_size(&state->fileio, &filesize);
		if (retval != ERROR_OK)
			return retval;
		state->size = filesize;
	}

	*dev = nand;

	return ERROR_OK;
}