From dbdf9982a9308013482e7cc958e0313b252cf237 Mon Sep 17 00:00:00 2001 From: anthony-a Date: Tue, 26 Jan 2010 02:37:51 +0000 Subject: [PATCH] change bank assignments. add missing header file. add ihx converter --- cpu/cc2430/converter/Makefile | 39 ++++++ cpu/cc2430/converter/converter | Bin 0 -> 7156 bytes cpu/cc2430/converter/converter.c | 228 +++++++++++++++++++++++++++++++ cpu/cc2430/converter/converter.h | 13 ++ cpu/cc2430/converter/converter.o | Bin 0 -> 4740 bytes cpu/cc2430/converter/ihex.c | 70 ++++++++++ cpu/cc2430/converter/ihex.h | 7 + cpu/cc2430/converter/ihex.o | Bin 0 -> 1604 bytes 8 files changed, 357 insertions(+) create mode 100644 cpu/cc2430/converter/Makefile create mode 100755 cpu/cc2430/converter/converter create mode 100644 cpu/cc2430/converter/converter.c create mode 100644 cpu/cc2430/converter/converter.h create mode 100644 cpu/cc2430/converter/converter.o create mode 100644 cpu/cc2430/converter/ihex.c create mode 100644 cpu/cc2430/converter/ihex.h create mode 100644 cpu/cc2430/converter/ihex.o diff --git a/cpu/cc2430/converter/Makefile b/cpu/cc2430/converter/Makefile new file mode 100644 index 000000000..7d58f8eeb --- /dev/null +++ b/cpu/cc2430/converter/Makefile @@ -0,0 +1,39 @@ +EXE_MAKE=$(notdir $(shell which "make.exe" 2>/dev/null)) +ifeq "$(EXE_MAKE)" "make.exe" +PLATFORM=windows +else +PLATFORM=linux +endif + +OBJECTS = ihex.o converter.o +SUBDIRS = + +CFLAGS = -Wall -D_REENTRANT -I. +LDFLAGS = -L. -D_REENTRANT -lpthread +ifeq "$(PLATFORM)" "linux" +SUFFIX= +else +SUFFIX=.exe +endif + +TARGET = converter$(SUFFIX) + +all: binary + +binary: $(TARGET) + strip $(TARGET) + +$(TARGET): $(OBJECTS) + gcc -o $(TARGET) $(OBJECTS) $(LDFLAGS) + +.c.o: + gcc -c -o $(<:.c=.o) -O2 -Wall $(CFLAGS) $< + +platform-test: + @echo $(PLATFORM) + +old-strip: + if [ -x $(TARGET).exe ]; then $(PLATFORM)strip $(TARGET).exe; else $(PLATFORM)strip $(TARGET); fi + +clean: + rm -f $(TARGET) $(OBJECTS) diff --git a/cpu/cc2430/converter/converter b/cpu/cc2430/converter/converter new file mode 100755 index 0000000000000000000000000000000000000000..9b47ea14a8e731ded251319838859d807a74274b GIT binary patch literal 7156 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 Yv1lOZ63g8Af@St^fc4 literal 0 HcmV?d00001 diff --git a/cpu/cc2430/converter/converter.c b/cpu/cc2430/converter/converter.c new file mode 100644 index 000000000..7ce442bae --- /dev/null +++ b/cpu/cc2430/converter/converter.c @@ -0,0 +1,228 @@ +#include +#include +#include +#include + +#include "converter.h" + +#include + +extern int cdi_programmer(conf_opts_t *conf, char *filename); + +void usage(char *prg_name) +{ + printf("\nUsage: %s -f ihex file\n", prg_name); + printf("General options:\n"); + printf(" -V/--version Get converter version\n"); +} + +conf_opts_t conf_opts; + +static int option_index = 0; + +int do_exit = 0; + +#define OPTIONS_STRING "Vhf:" +/* long option list */ +static struct option long_options[] = +{ + {"version", 0, NULL, 'V'}, + {"file", 1, NULL, 'f'}, + {"help", 0, NULL, 'h'}, + {0, 0, 0, 0} +}; + +int parse_opts(int count, char* param[]) +{ + int opt; + int error=0; + + conf_opts.target_type = UNDEFINED; + while ((opt = getopt_long(count, param, OPTIONS_STRING, + long_options, &option_index)) != -1) + { + switch(opt) + { + case 'V': + conf_opts.target_type = VERSION; + break; + + case 'h': + conf_opts.target_type = UNDEFINED; + break; + + case 'f': + strcpy(conf_opts.ihex_file, optarg); + conf_opts.target_type = CONVERT; + break; + } + } + + if (!error && (conf_opts.target_type == CONVERT) ) + { + printf("File: %s.\n", conf_opts.ihex_file); + } + + return error; +} + +int main(int argc, char *argv[]) +{ + int error = 0; + + conf_opts.target_type = 0; + + + if ( (argc < 1) || (error = parse_opts(argc, argv)) ) + { + usage(argv[0]); + if (error < 0) return error; + else return 0; + } + + if(conf_opts.target_type == CONVERT) + { /*Convert*/ + int pages; + int sdcc_file = 0; + + FILE *ihex = 0; + unsigned char check = 0; + unsigned long ext_addr=0; + unsigned short int addr=0; + unsigned char page_buffer[128*1024]; + unsigned char page_table[64]; + unsigned char buffer[256]; + int i; + int retval = 0; + + bzero(buffer, sizeof(buffer)); + + /*initialize page data*/ + memset(page_table, 0, 64); + memset(page_buffer, 0xFF, sizeof(page_buffer)); + pages = 0; + + ihex = fopen(conf_opts.ihex_file, "rb"); + if (ihex == 0) + { + printf("Can't open file.\n"); + return -1; + } + error = 0; + while((!error) && ((retval = fscanf(ihex, "%s", buffer)) == 1) ) + { + unsigned char data_len = 0; + + if (memcmp(&buffer[7], "00", 2) == 0) + { /*Data record*/ + i=0; + sscanf((char *)&buffer[1], "%2hhx", &data_len); + sscanf((char *)&(buffer[3]),"%4hx", &addr); + while(i= 0x0002) sdcc_file = 1; + + if (ext_addr) ext_addr--; + ext_addr *= 0x8000; + } + } + fclose(ihex); + if (retval == -1) + { + printf("Read error\n"); + } + if (sdcc_file == 0) + { + printf("Not a SDCC banked file.\n"); + return 0; + } + printf("Writing %d pages.\n", pages); + { /*cut off extension*/ + char *ptr = strrchr(conf_opts.ihex_file, '.'); + if (ptr != NULL) + { + *ptr = 0; + } + } + strcat(conf_opts.ihex_file, "_linear.hex"); + printf("Output file: %s.\n", conf_opts.ihex_file); + ihex = fopen(conf_opts.ihex_file, "wb"); + ext_addr=0; + addr = 0; + if (pages) + { + int j; + error = 0; + for (i=0; i<64; i++) + { + addr = (i & 0x1F) * 2048; + if ( ((i / 32) * 0x10000) != ext_addr) + { /*write out ext addr*/ + printf("Ext: %4.4X\n", ((i / 32) * 0x10000)); + ext_addr = (i / 32) * 0x10000; + fprintf(ihex, ":02000004%4.4X%2.2X\r\n", + (int)(ext_addr>>16), (int)(0xFA-(ext_addr>>16))); + } + + if (page_table[i] != 0) + { + printf("%4.4X", addr & 0xF800); + for (j=0; j<2048; j++) + { + addr =(i & 0x1F) * 2048 + j; + if ((j & 0x1F) == 0) + { + check = 0; + check -= 0x20; + check -= (uint8_t) (addr >> 8); + check -= (uint8_t) (addr); + fprintf(ihex, ":20%4.4X00", (int) addr); + } + fprintf(ihex, "%2.2X", page_buffer[ext_addr+addr]); + check -= page_buffer[ext_addr+addr]; + if ((j & 0x1F) == 0x1F) + { + fprintf(ihex, "%2.2X\r\n", check); + } + } + } + if ((i & 0x07) == 0x07) printf("\n"); + else printf(" "); + } + fprintf(ihex, ":00000001FF\r\n"); + printf("Write complete.\n"); + } + fclose(ihex); + } + else if(conf_opts.target_type == UNDEFINED) + { + usage(argv[0]); + } + else + { + printf("\nSensinode hex file converter "CONVERTER_VERSION "\n"); + } + return error; +} diff --git a/cpu/cc2430/converter/converter.h b/cpu/cc2430/converter/converter.h new file mode 100644 index 000000000..8457b1809 --- /dev/null +++ b/cpu/cc2430/converter/converter.h @@ -0,0 +1,13 @@ +#ifndef CONVERTER_H +#define CONVERTER_H + +#define CONVERTER_VERSION "v1.3" + +typedef struct { + int target_type; + char ihex_file[128]; +}conf_opts_t; + +enum target { UNDEFINED, VERSION, CONVERT }; + +#endif diff --git a/cpu/cc2430/converter/converter.o b/cpu/cc2430/converter/converter.o new file mode 100644 index 0000000000000000000000000000000000000000..fa67f8fe1494b7817cf9d26eb6722913e808ac15 GIT binary patch literal 4740 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 literal 0 HcmV?d00001 diff --git a/cpu/cc2430/converter/ihex.c b/cpu/cc2430/converter/ihex.c new file mode 100644 index 000000000..fbed240b2 --- /dev/null +++ b/cpu/cc2430/converter/ihex.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include + +#include + +int hexfile_parse(char *line, unsigned int *type, unsigned int *addr, unsigned char *buffer) +{ + unsigned int row_len = 0; + unsigned int row_index = 7; + unsigned int i; + int tmp; + + uint8_t cksum = 0; + int retval = 0; + + retval = sscanf(line, ":%2x%4x%2x", &row_len, addr, type); + + cksum += row_len; + cksum += *addr >> 8; + cksum += *addr & 0xFF; + cksum += *type; + + i = 0; + if (retval == 3) + { + while(i < row_len) + { + + if (sscanf(&line[row_index], "%2x", &tmp) == 1) + { + cksum += tmp; + buffer[i++] = (unsigned char) tmp; + row_index += 2; + } + else return -1; + } + if (sscanf(&line[row_index], "%2x", &tmp) == 1) + { + if ((cksum + (uint8_t) tmp) == 0) return row_len; + } + } + return -1; +} + +int hexfile_out(char *line, unsigned int type, unsigned int address, unsigned char *data, unsigned int bytes) +{ + uint8_t cksum = 0; + uint8_t i = 0; + char tmp[8]; + + sprintf(line, ":%2.2X%4.4X%2.2X", bytes, address, type); + cksum -= bytes; + cksum -= address >> 8; + cksum -= address & 0xFF; + cksum -= type; + + for (i=0; i|E<&t9Ru9^P5Z~MEm~AimVCH+@n>X*xn|ZsB>5VHK z#}OtRagjPBGnmO*#3h=x?^I;H>c7M6Qy+w2E#p@^Q~gd0!b zMt3bW1|6yItM50Ji&h~TpIhm^_aGW6T6y9x>h)@#JT;Ao4?`Q2U!$f~92BbG7d)8h zj3bjFnZ^-aDj6-gU6YlZ1c`*a0-3b zTiEaxXoXw$&X0q^pyn4Dko5UOVrbMK7Q>^KMjUfvUFT>u}9AA*5`@x+>H&A5i+vW=Dzrt9E` zPs{{;P_DvYI&yX2`PdqMQtWKZZxj_;4u#51@EZ2m?VSRdXC-XY%8o_KJ7x4_1P z#bcbI)9xnUtIUqL_wR(J0pO| z&+g;SJID1)FiaR