diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-06-15 12:07:27 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-06-15 12:07:27 -0600 |
commit | 2fba86a7717ecd534d94189fdf8734bf8d3ec91f (patch) | |
tree | ac8b2b6b18816b4d4e04c41dc43b3379ea860e46 /apps/system/hex2bin/hex2bin_main.c | |
parent | 4d332f0bcc2f1feeec8b3344e694e66095b61080 (diff) | |
download | nuttx-2fba86a7717ecd534d94189fdf8734bf8d3ec91f.tar.gz nuttx-2fba86a7717ecd534d94189fdf8734bf8d3ec91f.tar.bz2 nuttx-2fba86a7717ecd534d94189fdf8734bf8d3ec91f.zip |
Add conversion of Intel HEX to binary
Diffstat (limited to 'apps/system/hex2bin/hex2bin_main.c')
-rw-r--r-- | apps/system/hex2bin/hex2bin_main.c | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/apps/system/hex2bin/hex2bin_main.c b/apps/system/hex2bin/hex2bin_main.c new file mode 100644 index 000000000..660cd5723 --- /dev/null +++ b/apps/system/hex2bin/hex2bin_main.c @@ -0,0 +1,266 @@ +/**************************************************************************** + * apps/system/hex2bin_main.c + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> + +#include <nuttx/streams.h> +#include <apps/hex2bin.h> + +#ifdef CONFIG_SYSTEM_HEX2BIN_BUILTIN + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: show_usage + ****************************************************************************/ + +void show_usage(FAR const char *progname, int exitcode) +{ + fprintf(stderr, "Usage:\n"); + fprintf(stderr, "\t%s [OPTIONS] <hexfile> <binfile>\n"); + fprintf(stderr, "\t%s -h\n"); + fprintf(stderr, "Where:\n"); + fprintf(stderr, "\t<hexfile>:\n"); + fprintf(stderr, "\t\tThe file containing the Intel HEX data to be converted.\n"); + fprintf(stderr, "\t<binfile>:\n"); + fprintf(stderr, "\t\tThe output file to be created contained the converted\n"); + fprintf(stderr, "\t\tbinary data.\n"); + fprintf(stderr, "\t-h:\n"); + fprintf(stderr, "\t\tPrints this message and exits\n"); + fprintf(stderr, "And [OPTIONS] include:\n"); + fprintf(stderr, "\t-s <start address>\n"); + fprintf(stderr, "\t\tSets the start address of the binary output. This value\n"); + fprintf(stderr, "\t\tis used to (1) calculate offsets into the output stream,\n"); + fprintf(stderr, "\t\tand (2) for error checking. Default: 0x%08x\n", + CONFIG_SYSTEM_HEX2BIN_BASEADDR); + fprintf(stderr, "\t-e <end address>\n"); + fprintf(stderr, "\t\tSets the maximum address (plus 1) of the binary output.\n"); + fprintf(stderr, "\t\tThis value is used to only for error checking. Default:\n"); + fprintf(stderr, "\t\t0x%08x\n", CONFIG_SYSTEM_HEX2BIN_ENDPADDR); + fprintf(stderr, "\t\tno error checking\n"); + fprintf(stderr, "\t-w <swap code>\n"); + fprintf(stderr, "\t\t(0) No swap, (1) swap bytes in 16-bit values, or (3) swap\n"); + fprintf(stderr, "\t\tbytes in 32-bit values. Default: %d\n", + CONFIG_SYSTEM_HEX2BIN_SWAP); + exit(exitcode); +} + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: + ****************************************************************************/ + +/**************************************************************************** + * Name: hex2bin_main + * + * Description: + * Main entry point when hex2bin is built as an NSH built-in task. + * + * Input Parameters: + * Standard task inputs + * + * Returned Value + * EXIT_SUCESS on success; EXIT_FAILURE on failure + * + ****************************************************************************/ + +int hex2bin_main(int argc, char **argv) +{ + struct lib_stdinstream_s stdinstream; + struct lib_stdsostream_s stdoutstream; + FAR const char *hexfile; + FAR const char *binfile; + FAR char *endptr; + FAR FILE *instream; + FAR FILE *outstream; + unsigned long baseaddr; + unsigned long endpaddr; + unsigned long swap; + int option; + int ret; + + /* Parse the command line options */ + + baseaddr = CONFIG_SYSTEM_HEX2BIN_BASEADDR; + endpaddr = CONFIG_SYSTEM_HEX2BIN_ENDPADDR; + swap = CONFIG_SYSTEM_HEX2BIN_SWAP; + + while ((option = getopt(argc, argv, ":hs:e:w:")) != ERROR) + { + switch (option) + { + case 'h': + show_usage(argv[0], EXIT_SUCCESS); + break; + + 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> and <binfile> arguments\n"); + show_usage(argv[0], EXIT_FAILURE); + } + + hexfile = argv[optind]; + optind++; + + if (optind >= argc) + { + printf("ERROR: Missing required <binfile> argument\n"); + show_usage(argv[0], EXIT_FAILURE); + } + + binfile = argv[optind]; + optind++; + + if (optind < argc) + { + printf("ERROR: Garbage at end of command line\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; + } + + /* Open the BIN file for reading */ + + outstream = fopen(binfile, "wb"); + if (outstream == NULL) + { + int errcode = errno; + DEBUGASSERT(errcode > 0); + + fprintf(stderr, "ERROR: Failed to open \"%s\" for writing: %d\n", + binfile, errcode); + fclose(instream); + return -errcode; + } + + /* Wrap the FILE streams as standard streams */ + + lib_stdinstream(&stdinstream, instream); + lib_stdsostream(&stdoutstream, outstream); + + /* And do the deed */ + + ret = hex2bin(&stdinstream.public, &stdoutstream.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); + fclose(outstream); + return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS; +} + +#endif /* CONFIG_SYSTEM_HEX2BIN_BUILTIN */ |