From 21e2632c66415c00cb2db58cab681d5a449d9f35 Mon Sep 17 00:00:00 2001 From: Hao Zhang Date: Wed, 16 Mar 2011 20:43:29 -0400 Subject: [PATCH] Added bin2ccs --- bin2ccs/README.txt | 13 ++++ bin2ccs/bin2ccs.bat | 1 + bin2ccs/bin2ccs.c | 147 ++++++++++++++++++++++++++++++++++++++++++++ bin2ccs/bin2ccs.exe | Bin 0 -> 32768 bytes 4 files changed, 161 insertions(+) create mode 100644 bin2ccs/README.txt create mode 100644 bin2ccs/bin2ccs.bat create mode 100644 bin2ccs/bin2ccs.c create mode 100644 bin2ccs/bin2ccs.exe diff --git a/bin2ccs/README.txt b/bin2ccs/README.txt new file mode 100644 index 0000000..89d7853 --- /dev/null +++ b/bin2ccs/README.txt @@ -0,0 +1,13 @@ +Utility to convert binary file to TI CCS Format file + +Usage: + +Under Windows Command Prompt, run bin2ccs.bat or the following command: +bin2ccs + +Note: The infile is the input binary image or data file, the outfile is the generated output file + in CCS data format that can be loaded into DSP memory using the CCS Memory Browser. + +Example: bin2ccs app.out app.dat + + diff --git a/bin2ccs/bin2ccs.bat b/bin2ccs/bin2ccs.bat new file mode 100644 index 0000000..f42a67c --- /dev/null +++ b/bin2ccs/bin2ccs.bat @@ -0,0 +1 @@ +bin2ccs app.out app.dat diff --git a/bin2ccs/bin2ccs.c b/bin2ccs/bin2ccs.c new file mode 100644 index 0000000..3b3a7c0 --- /dev/null +++ b/bin2ccs/bin2ccs.c @@ -0,0 +1,147 @@ +/* + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 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. + * + * Neither the name of Texas Instruments Incorporated 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. + * +*/ + +/********************************************************************************************** + * FILE PURPOSE: Convert a binary file to CCS format + ********************************************************************************************** + * FILE NAME: bin2ccs.c + * + * DESCRIPTION: The binary file is converted to an ascii file in CCS data format + * + **********************************************************************************************/ + +#include +#include + +char version[] = "1.0.0.0"; + +/********************************************************************************************** + * FUNCTION PURPOSE: Form a 32 bit value from an unsigned byte array + ********************************************************************************************** + * DESCRIPTION: The value is formed and padded if required + **********************************************************************************************/ +unsigned int formInt (unsigned char *c, unsigned int i, unsigned int len) +{ + unsigned int x = 0; + + if (i < len) + x = x | (c[i] << 24); + + if ((i+1) < len) + x = x | (c[i+1] << 16); + + if ((i+2) < len) + x = x | (c[i+2] << 8); + + if ((i+3) < len) + x = x | c[i+3]; + + return (x); + +} + +int main (int argc, char *argv[]) +{ + FILE *fil; + unsigned char *cdat; + unsigned int len; + unsigned int i; + + printf("Binary to CCS Format Converter Version %s\n", version); + + if (argc != 3) { + fprintf (stderr, "usage: %s infile outfile\n", argv[0]); + return (-1); + } + + fil = fopen (argv[1], "rb"); + if (fil == NULL) { + fprintf (stderr, "%s: Failed to open input file %s\n", argv[0], argv[1]); + return (-1); + } + + fseek (fil, 0, SEEK_END); + len = ftell (fil); + fclose (fil); + + cdat = malloc (len * sizeof (unsigned char)); + if (cdat == NULL) { + fprintf (stderr, "%s: Failed to malloc %d bytes\n", argv[0], len); + return (-1); + } + + fil = fopen (argv[1], "rb"); + if (fil == NULL) { + fprintf (stderr, "%s: Failed to open input file %s\n", argv[0], argv[1]); + return (-1); + } + + fread (cdat, sizeof(unsigned char), len, fil); + + fclose (fil); + + + fil = fopen (argv[2], "w"); + if (fil == NULL) { + fprintf (stderr, "%s: Error opening output file %s\n", argv[0], argv[1]); + free (cdat); + return (-1); + } + + /* The ccs header */ + fprintf (fil, "1651 1 80000000 1 %x\n", (len + 3) / 4); + + + /* The data */ + for (i = 0; i < len; i += 4) + fprintf (fil, "0x%08x\n", formInt(cdat, i, len)); + + + fclose (fil); + free (cdat); + + return (0); + +} + + + + + + + + + + diff --git a/bin2ccs/bin2ccs.exe b/bin2ccs/bin2ccs.exe new file mode 100644 index 0000000000000000000000000000000000000000..493588bd8131b5c69d40df7ae4959fb92640fdb4 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 -- 2.39.2