fomu-flash: implement -k security register stuff
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
parent
ff1f8583af
commit
9b1b9b8a88
57
fomu-flash.c
57
fomu-flash.c
@ -71,6 +71,8 @@ enum op {
|
|||||||
OP_SPI_VERIFY,
|
OP_SPI_VERIFY,
|
||||||
OP_SPI_PEEK,
|
OP_SPI_PEEK,
|
||||||
OP_SPI_ID,
|
OP_SPI_ID,
|
||||||
|
OP_SPI_SECURITY_READ,
|
||||||
|
OP_SPI_SECURITY_WRITE,
|
||||||
OP_FPGA_BOOT,
|
OP_FPGA_BOOT,
|
||||||
OP_FPGA_RESET,
|
OP_FPGA_RESET,
|
||||||
OP_UNKNOWN,
|
OP_UNKNOWN,
|
||||||
@ -122,13 +124,14 @@ static int print_program_modes(FILE *stream) {
|
|||||||
fprintf(stream, " -w bin Write this binary into the SPI flash chip\n");
|
fprintf(stream, " -w bin Write this binary into the SPI flash chip\n");
|
||||||
fprintf(stream, " -v bin Verify the SPI flash contains this data\n");
|
fprintf(stream, " -v bin Verify the SPI flash contains this data\n");
|
||||||
fprintf(stream, " -s out Save the SPI flash contents to this file\n");
|
fprintf(stream, " -s out Save the SPI flash contents to this file\n");
|
||||||
|
fprintf(stream, " -k n[:f] Read security register [n], or update it with the contents of file [f]\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int print_help(FILE *stream, const char *progname) {
|
static int print_help(FILE *stream, const char *progname) {
|
||||||
fprintf(stream, "Fomu Raspberry Pi Flash Utilities\n");
|
fprintf(stream, "Fomu Raspberry Pi Flash Utilities\n");
|
||||||
fprintf(stream, "Usage:\n");
|
fprintf(stream, "Usage:\n");
|
||||||
fprintf(stream, "%15s (-[hri] | [-p offset] | [-f bin] | [-w bin] | [-v bin] | [-s out])\n", progname);
|
fprintf(stream, "%15s (-[hri] | [-p offset] | [-f bin] | [-w bin] | [-v bin] | [-s out] | [-k n[:f]])\n", progname);
|
||||||
fprintf(stream, " [-g pinspec] [-t spitype] [-r]\n");
|
fprintf(stream, " [-g pinspec] [-t spitype] [-r]\n");
|
||||||
fprintf(stream, "Program mode (pick one):\n");
|
fprintf(stream, "Program mode (pick one):\n");
|
||||||
print_program_modes(stream);
|
print_program_modes(stream);
|
||||||
@ -160,6 +163,8 @@ int main(int argc, char **argv) {
|
|||||||
struct ff_spi *spi;
|
struct ff_spi *spi;
|
||||||
struct ff_fpga *fpga;
|
struct ff_fpga *fpga;
|
||||||
int peek_offset = 0;
|
int peek_offset = 0;
|
||||||
|
uint8_t security_reg;
|
||||||
|
uint8_t security_val[256];
|
||||||
enum op op = OP_UNKNOWN;
|
enum op op = OP_UNKNOWN;
|
||||||
enum spi_type spi_type = ST_SINGLE;
|
enum spi_type spi_type = ST_SINGLE;
|
||||||
|
|
||||||
@ -186,7 +191,7 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "hip:rf:w:s:2:3:v:g:t:")) != -1) {
|
while ((opt = getopt(argc, argv, "hip:rf:w:s:2:3:v:g:t:k:")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
@ -195,6 +200,34 @@ int main(int argc, char **argv) {
|
|||||||
op = OP_FPGA_RESET;
|
op = OP_FPGA_RESET;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'k': {
|
||||||
|
if (op != OP_UNKNOWN)
|
||||||
|
return print_usage_error(stdout);
|
||||||
|
char *security_filename = strchr(optarg, ':');
|
||||||
|
|
||||||
|
security_reg = strtoul(optarg, NULL, 0);
|
||||||
|
if (security_filename) {
|
||||||
|
security_filename++;
|
||||||
|
op = OP_SPI_SECURITY_WRITE;
|
||||||
|
int fd;
|
||||||
|
fd = open(security_filename, O_RDONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
perror("couldn't open security file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
memset(security_val, 0, sizeof(security_val));
|
||||||
|
if (-1 == read(fd, security_val, sizeof(security_val))) {
|
||||||
|
perror("couldn't read from security file");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
op = OP_SPI_SECURITY_READ;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
if (op != OP_UNKNOWN)
|
if (op != OP_UNKNOWN)
|
||||||
return print_usage_error(stdout);
|
return print_usage_error(stdout);
|
||||||
@ -312,9 +345,23 @@ int main(int argc, char **argv) {
|
|||||||
if (id.device_id != id.signature)
|
if (id.device_id != id.signature)
|
||||||
printf("!! Electronic Signature: %02x\n", id.signature);
|
printf("!! Electronic Signature: %02x\n", id.signature);
|
||||||
printf("Serial number: %02x %02x %02x %02x\n", id.serial[0], id.serial[1], id.serial[2], id.serial[3]);
|
printf("Serial number: %02x %02x %02x %02x\n", id.serial[0], id.serial[1], id.serial[2], id.serial[3]);
|
||||||
printf("SR1: %02x\n", spiReadSr(spi, 1));
|
printf("Status 1: %02x\n", spiReadStatus(spi, 1));
|
||||||
printf("SR2: %02x\n", spiReadSr(spi, 2));
|
printf("Status 2: %02x\n", spiReadStatus(spi, 2));
|
||||||
printf("SR3: %02x\n", spiReadSr(spi, 3));
|
printf("Status 3: %02x\n", spiReadStatus(spi, 3));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OP_SPI_SECURITY_WRITE: {
|
||||||
|
printf("Updating security register %d.\n", security_reg);
|
||||||
|
spiWriteSecurity(spi, security_reg, security_val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OP_SPI_SECURITY_READ: {
|
||||||
|
uint8_t security[256];
|
||||||
|
printf("Security register %d contents:\n", security_reg);
|
||||||
|
spiReadSecurity(spi, security_reg, security);
|
||||||
|
print_hex(security, sizeof(security), 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user