blob: 99ca9b31a05882beaa8cd8304d8d2edd7be648c7 [file] [log] [blame]
/*
* Command for accessing SPI inerface.
*
* Copyright (C) 2014 Chromium OS Authors
*/
#include "common.h"
#include "drivers/flash/flash.h"
static int do_spi_read(int argc, char * const argv[], int read_flag)
{
unsigned offset, length;
const char *buffer;
void *mem_addr = 0;
if (!read_flag && (argc != 2))
return CMD_RET_USAGE;
if (read_flag) {
if (argc != 3)
return CMD_RET_USAGE;
mem_addr = (void *) strtoul(argv[2], 0, 16);
}
offset = strtoul(argv[0], 0, 16);
length = strtoul(argv[1], 0, 16);
buffer = flash_read(offset, length);
if (!buffer) {
printf("read failed!\n");
return -1;
}
if (read_flag)
memcpy(mem_addr, buffer, length);
else
print_buffer((unsigned long) mem_addr,
buffer, 1, length, 16);
return 0;
}
static int do_spi_write(int argc, char * const argv[], int read_flag)
{
unsigned offset, length;
const void *mem_addr = 0;
if (argc != 3)
return CMD_RET_USAGE;
mem_addr = (const void *) strtoul(argv[2], 0, 16);
offset = strtoul(argv[0], 0, 16);
length = strtoul(argv[1], 0, 16);
return length != flash_write(offset, length, mem_addr);
}
static int do_spi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
struct {
const char *name;
int param;
int (*function)(int argc, char *const argv[], int flag);
} subcommands[] = {
{"read", 1, do_spi_read},
{"dump", 0, do_spi_read},
{"write", 0, do_spi_write}
};
int i;
if (argc < 2)
return CMD_RET_USAGE;
for (i = 0; i < ARRAY_SIZE(subcommands); i++)
if (!strcmp(subcommands[i].name, argv[1]))
return subcommands[i].function(argc -2,
argv + 2,
subcommands[i].param);
return CMD_RET_USAGE;
}
U_BOOT_CMD(
spi, 5, 1,
"SPI flash sub-system",
"dump offset len - dump on the console `len' bytes starting\n"
" at `offset'\n"
"spi read offset len addr - read 'len' bytes starting at 'offset'\n"
" into RAM starting at 'addr'\n"
"spi write offset len addr - write 'len' bytes starting at 'offset'\n"
" from RAM starting at 'addr'\n"
);