int fhex2mem(FAR FILE *instream, uint32_t baseaddr, uint32_t endpaddr, enum hex2bin_swap_e swap) { struct lib_stdinstream_s stdinstream; struct lib_memsostream_s memoutstream; /* Check memory addresses */ DEBUGASSERT(instream != NULL && endpaddr > baseaddr); /* Wrap the file descriptor as raw stream; wrap the memory as a memory * stream. */ lib_stdinstream(&stdinstream, instream); lib_memsostream(&memoutstream, (FAR char *)baseaddr, (int)(endpaddr - baseaddr)); /* And do the deed */ return hex2bin(&stdinstream.public, &memoutstream.public, (uint32_t)baseaddr, (uint32_t)endpaddr, (enum hex2bin_swap_e)swap); }
int hex2mem_main(int argc, char **argv) #endif { struct lib_stdinstream_s stdinstream; struct lib_memsostream_s memoutstream; FAR const char *hexfile; FAR char *endptr; FAR FILE *instream; unsigned long baseaddr; unsigned long endpaddr; unsigned long swap; int option; int ret; /* Parse the command line options */ baseaddr = CONFIG_SYSTEM_HEX2MEM_BASEADDR; endpaddr = CONFIG_SYSTEM_HEX2MEM_ENDPADDR; swap = CONFIG_SYSTEM_HEX2MEM_SWAP; while ((option = getopt(argc, argv, ":hs:e:w:")) != ERROR) { switch (option) { #ifdef CONFIG_SYSTEM_HEX2MEM_USAGE case 'h': show_usage(argv[0], EXIT_SUCCESS); break; #endif case 's': baseaddr = strtoul(optarg, &endptr, 16); if (endptr == optarg) { fprintf(stderr, "ERROR: Invalid argument to the -s option\n"); show_usage(argv[0], EXIT_FAILURE); } break; case 'e': endpaddr = strtoul(optarg, &endptr, 16); if (endptr == optarg) { fprintf(stderr, "ERROR: Invalid argument to the -e option\n"); show_usage(argv[0], EXIT_FAILURE); } break; case 'w': swap = strtoul(optarg, &endptr, 16); if (endptr == optarg || swap > (unsigned long)HEX2BIN_SWAP32) { fprintf(stderr, "ERROR: Invalid argument to the -w option\n"); show_usage(argv[0], EXIT_FAILURE); } break; case ':': fprintf(stderr, "ERROR: Missing required argument\n"); show_usage(argv[0], EXIT_FAILURE); break; default: case '?': fprintf(stderr, "ERROR: Unrecognized option\n"); show_usage(argv[0], EXIT_FAILURE); break; } } /* There should be two final parameters remaining on the command line */ if (optind >= argc) { printf("ERROR: Missing required <hexfile> argument\n"); show_usage(argv[0], EXIT_FAILURE); } hexfile = argv[optind]; optind++; if (optind < argc) { printf("ERROR: Garbage at end of command line\n"); show_usage(argv[0], EXIT_FAILURE); } /* Check memory addresses */ if (endpaddr <= baseaddr) { printf("ERROR: Memory end (+1) address must be AFTER memory base address\n"); show_usage(argv[0], EXIT_FAILURE); } /* Open the HEX file for reading */ instream = fopen(hexfile, "r"); if (instream == NULL) { int errcode = errno; DEBUGASSERT(errcode > 0); fprintf(stderr, "ERROR: Failed to open \"%s\" for reading: %d\n", hexfile, errcode); return -errcode; } /* Wrap the FILE stream as a standard stream; wrap the memory as a memory * stream. */ lib_stdinstream(&stdinstream, instream); lib_memsostream(&memoutstream, (FAR char *)baseaddr, (int)(endpaddr - baseaddr)); /* And do the deed */ ret = hex2bin(&stdinstream.public, &memoutstream.public, (uint32_t)baseaddr, (uint32_t)endpaddr, (enum hex2bin_swap_e)swap); if (ret < 0) { fprintf(stderr, "ERROR: Failed to convert \"%s\" to binary: %d\n", ret); } /* Clean up and return */ fclose(instream); return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }