From 3f22930b1fced27081d110ebf0d7f825ed4e07ae Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Tue, 19 Feb 2013 13:22:35 +0100 Subject: [PATCH] tools: add byteswap --- .gitignore | 1 + tools/Makefile | 4 ++-- tools/byteswap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 tools/byteswap.c diff --git a/.gitignore b/.gitignore index 378e5117..04f48b42 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ build/* tools/bin2hex tools/flterm tools/mkmmimg +tools/byteswap diff --git a/tools/Makefile b/tools/Makefile index 134be463..582ed48c 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,5 +1,5 @@ -TARGETS=mkmmimg flterm -CC=clang +TARGETS=mkmmimg flterm byteswap +CC=gcc all: $(TARGETS) diff --git a/tools/byteswap.c b/tools/byteswap.c new file mode 100644 index 00000000..8d12b632 --- /dev/null +++ b/tools/byteswap.c @@ -0,0 +1,60 @@ +/* + * Milkymist SoC + * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + FILE *fdi, *fdo; + unsigned short wi; + unsigned short wo; + int i; + + if(argc != 3) { + fprintf(stderr, "Usage: byteswap \n"); + return 1; + } + fdi = fopen(argv[1], "rb"); + if(!fdi) { + perror("Unable to open input file"); + return 1; + } + fdo = fopen(argv[2], "w"); + if(!fdo) { + perror("Unable to open output file"); + fclose(fdi); + return 1; + } + while(1) { + if(fread(&wi, 2, 1, fdi) <= 0) break; + wo = 0; + for(i=0;i<16;i++) + if(wi & (1 << i)) + wo |= (0x8000 >> i); + /* comment out the next line on big endian machines! */ + wo = ((wo & 0x00ff) << 8) | ((wo & 0xff00) >> 8); + fwrite(&wo, 2, 1, fdo); + } + fclose(fdi); + if(fclose(fdo) != 0) { + perror("Unable to close output file"); + return 1; + } + return 0; +} -- 2.30.2