fomu-flash: add -i option to print id codes
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
		
							
								
								
									
										75
									
								
								fomu-flash.c
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								fomu-flash.c
									
									
									
									
									
								
							| @@ -70,6 +70,7 @@ enum op { | |||||||
| 	OP_SPI_WRITE, | 	OP_SPI_WRITE, | ||||||
| 	OP_SPI_VERIFY, | 	OP_SPI_VERIFY, | ||||||
| 	OP_SPI_PEEK, | 	OP_SPI_PEEK, | ||||||
|  | 	OP_SPI_ID, | ||||||
| 	OP_FPGA_BOOT, | 	OP_FPGA_BOOT, | ||||||
| 	OP_FPGA_RESET, | 	OP_FPGA_RESET, | ||||||
| 	OP_UNKNOWN, | 	OP_UNKNOWN, | ||||||
| @@ -93,7 +94,7 @@ static int pinspec_to_pinname(char code) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| int print_pinspec(FILE *stream) { | static int print_pinspec(FILE *stream) { | ||||||
| 	fprintf(stream, "Pinspec:\n"); | 	fprintf(stream, "Pinspec:\n"); | ||||||
| 	fprintf(stream, " Name   Description    Default\n"); | 	fprintf(stream, " Name   Description    Default\n"); | ||||||
| 	fprintf(stream, "   0    SPI D0         %d\n", S_D0); | 	fprintf(stream, "   0    SPI D0         %d\n", S_D0); | ||||||
| @@ -112,21 +113,30 @@ int print_pinspec(FILE *stream) { | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| int print_help(FILE *stream, const char *progname) { | static int print_program_modes(FILE *stream) { | ||||||
| 	fprintf(stream, "Fomu Raspberry Pi Flash Utilities\n"); |  | ||||||
| 	fprintf(stream, "Usage:\n"); |  | ||||||
| 	fprintf(stream, "    %s [-h] [-r] [-p offset] [-f bin] [-w bin] [-v bin] [-s out] [-g pinspec]\n", progname); |  | ||||||
| 	fprintf(stream, "Flags:\n"); |  | ||||||
| 	fprintf(stream, "    -h        This help page\n"); | 	fprintf(stream, "    -h        This help page\n"); | ||||||
| 	fprintf(stream, "    -r        Reset the FPGA and have it boot from SPI\n"); | 	fprintf(stream, "    -r        Reset the FPGA and have it boot from SPI\n"); | ||||||
|  | 	fprintf(stream, "    -i        Print out the SPI ID code\n"); | ||||||
| 	fprintf(stream, "    -p offset Peek at 256 bytes of SPI flash at the specified offset\n"); | 	fprintf(stream, "    -p offset Peek at 256 bytes of SPI flash at the specified offset\n"); | ||||||
| 	fprintf(stream, "    -f bin    Load this binary directly into the FPGA\n"); | 	fprintf(stream, "    -f bin    Load this binary directly into the FPGA\n"); | ||||||
| 	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"); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int print_help(FILE *stream, const char *progname) { | ||||||
|  | 	fprintf(stream, "Fomu Raspberry Pi Flash Utilities\n"); | ||||||
|  | 	fprintf(stream, "Usage:\n"); | ||||||
|  | 	fprintf(stream, "%15s (-[hri] | [-p offset] | [-f bin] | [-w bin] | [-v bin] | [-s out])\n", progname); | ||||||
|  | 	fprintf(stream, "                [-g pinspec] [-t spitype] [-r]\n"); | ||||||
|  | 	fprintf(stream, "Program mode (pick one):\n"); | ||||||
|  | 	print_program_modes(stream); | ||||||
|  | 	fprintf(stream, "Configuration options:\n"); | ||||||
| 	fprintf(stream, "    -g ps     Set the pin assignment with the given pinspec\n"); | 	fprintf(stream, "    -g ps     Set the pin assignment with the given pinspec\n"); | ||||||
| 	fprintf(stream, "    -t type   Set the number of bits to use for SPI (1, 2, 4, or Q)\n"); | 	fprintf(stream, "    -t type   Set the number of bits to use for SPI (1, 2, 4, or Q)\n"); | ||||||
| 	fprintf(stream, "You can remap various pins with -g.  The format is [name]:[number].\n"); | 	fprintf(stream, "You can remap various pins with -g.  The format is [name]:[number].\n"); | ||||||
|  | 	fprintf(stream, "\n"); | ||||||
| 	fprintf(stream, "The width of SPI can be set with 't [width]'.  Valid widths are:\n"); | 	fprintf(stream, "The width of SPI can be set with 't [width]'.  Valid widths are:\n"); | ||||||
| 	fprintf(stream, "    1 - standard 1-bit spi\n"); | 	fprintf(stream, "    1 - standard 1-bit spi\n"); | ||||||
| 	fprintf(stream, "    2 - standard 2-bit spi\n"); | 	fprintf(stream, "    2 - standard 2-bit spi\n"); | ||||||
| @@ -137,6 +147,12 @@ int print_help(FILE *stream, const char *progname) { | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int print_usage_error(FILE *stream) { | ||||||
|  | 	fprintf(stream, "Error: You must only specify one program mode:\n"); | ||||||
|  | 	print_program_modes(stream); | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||||
| 	int opt; | 	int opt; | ||||||
| 	int fd; | 	int fd; | ||||||
| @@ -170,14 +186,24 @@ int main(int argc, char **argv) { | |||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	while ((opt = getopt(argc, argv, "hp:rf:w:s:2:3:v:g:t:")) != -1) { | 	while ((opt = getopt(argc, argv, "hip:rf:w:s:2:3:v:g:t:")) != -1) { | ||||||
| 		switch (opt) { | 		switch (opt) { | ||||||
|  |  | ||||||
| 		case 'r': | 		case 'r': | ||||||
|  | 			if (op != OP_UNKNOWN) | ||||||
|  | 				return print_usage_error(stdout); | ||||||
| 			op = OP_FPGA_RESET; | 			op = OP_FPGA_RESET; | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
|  | 		case 'i': | ||||||
|  | 			if (op != OP_UNKNOWN) | ||||||
|  | 				return print_usage_error(stdout); | ||||||
|  | 			op = OP_SPI_ID; | ||||||
|  | 			break; | ||||||
|  |  | ||||||
| 		case 'p': | 		case 'p': | ||||||
|  | 			if (op != OP_UNKNOWN) | ||||||
|  | 				return print_usage_error(stdout); | ||||||
| 			op = OP_SPI_PEEK; | 			op = OP_SPI_PEEK; | ||||||
| 			peek_offset = strtoul(optarg, NULL, 0); | 			peek_offset = strtoul(optarg, NULL, 0); | ||||||
| 			break; | 			break; | ||||||
| @@ -221,6 +247,8 @@ int main(int argc, char **argv) { | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case 'f': | 		case 'f': | ||||||
|  | 			if (op != OP_UNKNOWN) | ||||||
|  | 				return print_usage_error(stdout); | ||||||
| 			op = OP_FPGA_BOOT; | 			op = OP_FPGA_BOOT; | ||||||
| 			if (op_filename) | 			if (op_filename) | ||||||
| 				free(op_filename); | 				free(op_filename); | ||||||
| @@ -228,6 +256,8 @@ int main(int argc, char **argv) { | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case 'w': | 		case 'w': | ||||||
|  | 			if (op != OP_UNKNOWN) | ||||||
|  | 				return print_usage_error(stdout); | ||||||
| 			op = OP_SPI_WRITE; | 			op = OP_SPI_WRITE; | ||||||
| 			if (op_filename) | 			if (op_filename) | ||||||
| 				free(op_filename); | 				free(op_filename); | ||||||
| @@ -235,6 +265,8 @@ int main(int argc, char **argv) { | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case 'v': | 		case 'v': | ||||||
|  | 			if (op != OP_UNKNOWN) | ||||||
|  | 				return print_usage_error(stdout); | ||||||
| 			op = OP_SPI_VERIFY; | 			op = OP_SPI_VERIFY; | ||||||
| 			if (op_filename) | 			if (op_filename) | ||||||
| 				free(op_filename); | 				free(op_filename); | ||||||
| @@ -242,6 +274,8 @@ int main(int argc, char **argv) { | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case 's': | 		case 's': | ||||||
|  | 			if (op != OP_UNKNOWN) | ||||||
|  | 				return print_usage_error(stdout); | ||||||
| 			op = OP_SPI_READ; | 			op = OP_SPI_READ; | ||||||
| 			if (op_filename) | 			if (op_filename) | ||||||
| 				free(op_filename); | 				free(op_filename); | ||||||
| @@ -262,10 +296,26 @@ int main(int argc, char **argv) { | |||||||
| 	spiInit(spi); | 	spiInit(spi); | ||||||
| 	fpgaInit(fpga); | 	fpgaInit(fpga); | ||||||
|  |  | ||||||
| 	switch (op) { |  | ||||||
| 	case OP_SPI_READ: { |  | ||||||
| 	spiSetType(spi, spi_type); | 	spiSetType(spi, spi_type); | ||||||
| 	fpgaReset(fpga); | 	fpgaReset(fpga); | ||||||
|  |  | ||||||
|  | 	switch (op) { | ||||||
|  | 	case OP_SPI_ID: { | ||||||
|  | 		struct spi_id id = spiId(spi); | ||||||
|  | 		printf("Device ID: %02x\n", id.device_id); | ||||||
|  | 		if (id.device_id != id.signature) | ||||||
|  | 			printf("!! Electronic Signature: %02x\n", id.signature); | ||||||
|  | 		printf("Manufacturer ID: %02x\n", id.manufacturer_id); | ||||||
|  | 		if (id.manufacturer_id != id._manufacturer_id) | ||||||
|  | 			printf("!! JEDEC Manufacturer ID: %02x\n", | ||||||
|  | 			id._manufacturer_id); | ||||||
|  | 		printf("Memory type: %02x\n", id.memory_type); | ||||||
|  | 		printf("Memory size: %02x\n", id.memory_size); | ||||||
|  | 		printf("Serial number: %02x %02x %02x %02x\n", id.serial[0], id.serial[1], id.serial[2], id.serial[3]); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	case OP_SPI_READ: { | ||||||
| 		fd = open(op_filename, O_WRONLY | O_CREAT | O_TRUNC, 0777); | 		fd = open(op_filename, O_WRONLY | O_CREAT | O_TRUNC, 0777); | ||||||
| 		if (fd == -1) { | 		if (fd == -1) { | ||||||
| 			perror("unable to open output file"); | 			perror("unable to open output file"); | ||||||
| @@ -283,8 +333,6 @@ int main(int argc, char **argv) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	case OP_SPI_WRITE: { | 	case OP_SPI_WRITE: { | ||||||
| 		spiSetType(spi, spi_type); |  | ||||||
| 		fpgaReset(fpga); |  | ||||||
| 		fd = open(op_filename, O_RDONLY); | 		fd = open(op_filename, O_RDONLY); | ||||||
| 		if (fd == -1) { | 		if (fd == -1) { | ||||||
| 			perror("unable to open input file"); | 			perror("unable to open input file"); | ||||||
| @@ -312,9 +360,6 @@ int main(int argc, char **argv) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	case OP_SPI_VERIFY: { | 	case OP_SPI_VERIFY: { | ||||||
|  |  | ||||||
| 		spiSetType(spi, spi_type); |  | ||||||
| 		fpgaReset(fpga); |  | ||||||
| 		fd = open(op_filename, O_RDONLY); | 		fd = open(op_filename, O_RDONLY); | ||||||
| 		if (fd == -1) { | 		if (fd == -1) { | ||||||
| 			perror("unable to open input file"); | 			perror("unable to open input file"); | ||||||
| @@ -351,8 +396,6 @@ offset, file_src[offset], spi_src[offset]); | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	case OP_SPI_PEEK: { | 	case OP_SPI_PEEK: { | ||||||
| 		fpgaReset(fpga); |  | ||||||
| 		spiSetType(spi, spi_type); |  | ||||||
| 		uint8_t page[256]; | 		uint8_t page[256]; | ||||||
| 		spiRead(spi, peek_offset, page, sizeof(page)); | 		spiRead(spi, peek_offset, page, sizeof(page)); | ||||||
| 		print_hex_offset(stdout, page, sizeof(page), 0, 0); | 		print_hex_offset(stdout, page, sizeof(page), 0, 0); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user