diff --git a/Hello_World/build_image b/Hello_World/build_image index f85ce6e1d04055fb1f656c343544aa36e97765f8..7119c5c52a39b2591257db6794536bfd069e1aa2 100755 --- a/Hello_World/build_image +++ b/Hello_World/build_image @@ -2,4 +2,4 @@ make clean make make build/max32665.bin cp build/max32665.bin card10.bin -python ../bootloader/crc16.py card10.bin +python ../bootloader/crc_patch.py card10.bin diff --git a/bootloader/Makefile b/bootloader/Makefile index abc96c8cf7151c6897432ef6519a16948e825274..7cc0db7b7bbd58b933e9b0b7d18b2803895b09fa 100644 --- a/bootloader/Makefile +++ b/bootloader/Makefile @@ -68,6 +68,7 @@ CMSIS_ROOT=$(LIBS_DIR)/CMSIS SRCS = main.c SRCS += mscmem.c SRCS += bootloader-usb.c +SRCS += crc16-ccitt.c SRCS += ../lib/card10/mx25lba.c # Where to find source files for this test diff --git a/bootloader/crc16-ccitt.c b/bootloader/crc16-ccitt.c new file mode 100644 index 0000000000000000000000000000000000000000..5fe83e73ba0a8ff260b8254cceaf557af88f1a60 --- /dev/null +++ b/bootloader/crc16-ccitt.c @@ -0,0 +1,74 @@ +/* + * Copyright 2001-2010 Georges Menie (www.menie.org) + * All rights reserved. + * 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 the University of California, Berkeley 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 REGENTS 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 REGENTS AND 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. + */ + +#include "crc16-ccitt.h" + +/* CRC16 implementation acording to CCITT standards */ + +static const unsigned short crc16tab[256]= { + 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, + 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, + 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, + 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de, + 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485, + 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d, + 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4, + 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc, + 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823, + 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b, + 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12, + 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a, + 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41, + 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49, + 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70, + 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78, + 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f, + 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067, + 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e, + 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256, + 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d, + 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405, + 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c, + 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634, + 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab, + 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3, + 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a, + 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92, + 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9, + 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1, + 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8, + 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 +}; + +unsigned short crc16_ccitt(uint16_t oldcrc, const void *buf, int len) +{ + register int counter; + register unsigned short crc = oldcrc; + for( counter = 0; counter < len; counter++) + crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *(char *)buf++)&0x00FF]; + return crc; +} diff --git a/bootloader/crc16-ccitt.h b/bootloader/crc16-ccitt.h new file mode 100644 index 0000000000000000000000000000000000000000..d41ddaf92e710419f1b74ba6a49c25aa02945e07 --- /dev/null +++ b/bootloader/crc16-ccitt.h @@ -0,0 +1,35 @@ +/* + * Copyright 2001-2010 Georges Menie (www.menie.org) + * All rights reserved. + * 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 the University of California, Berkeley 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 REGENTS 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 REGENTS AND 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. + */ + +#ifndef _CRC16_H_ +#define _CRC16_H_ + + +#include <stdint.h> +unsigned short crc16_ccitt(uint16_t oldcrc, const void *buf, int len); + +#endif /* _CRC16_H_ */ diff --git a/bootloader/crc16.py b/bootloader/crc16.py deleted file mode 100644 index dc536f0c0a53605c27e456bd29844626c9692c1a..0000000000000000000000000000000000000000 --- a/bootloader/crc16.py +++ /dev/null @@ -1,27 +0,0 @@ -import sys - - -def crc16_update(crc, a): - crc ^= a - for i in xrange(8): - if crc & 1: - crc = (crc >> 1) ^ 0x8408 - else: - crc = (crc >> 1) - return crc - -crc = 0 - -data = open(sys.argv[1]).read() - -for b in data: - crc = crc16_update(crc, ord(b)) - - -padded = data + chr(crc & 0xFF) + chr(crc >> 8) - -crc = 0 -for b in padded: - crc = crc16_update(crc, ord(b)) - -open(sys.argv[1], 'w').write(padded) diff --git a/bootloader/crc_patch.py b/bootloader/crc_patch.py new file mode 100644 index 0000000000000000000000000000000000000000..d2dc3699aa4d1e6fa5c213f032153fd0464f637a --- /dev/null +++ b/bootloader/crc_patch.py @@ -0,0 +1,49 @@ +import sys +import crc16 + +#def crc16_update(crc, a): +""" + for j in xrange(8): + if (a ^ crc) & 1: + crc = crc >> 1 + crc = crc ^ 0x8408 + else: + crc = crc >> 1; + + a = a >> 1 + + return crc +""" + +""" + crc ^= a + for i in xrange(8): + if crc & 1: + crc = (crc >> 1) ^ 0x8408 + else: + crc = (crc >> 1) + return crc +""" +crc = 0 + +data = open(sys.argv[1]).read() + +#for b in data: +# crc = crc16_update(crc, ord(b)) + +crc = crc16.crc16xmodem(data) + +print crc + +#padded = data + chr(crc & 0xFF) + chr(crc >> 8) +padded = data + chr(crc >> 8) + chr(crc & 0xFF) + +crc = 0 +#for b in padded: +# crc = crc16_update(crc, ord(b)) + +crc = crc16.crc16xmodem(padded) + +print crc + +open(sys.argv[1], 'w').write(padded) diff --git a/bootloader/main.c b/bootloader/main.c index ae105486e357023f5bed1246f48c117f61454c69..3ef22f0c9b40784dbf1909b63e883cd710bb3d12 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -57,6 +57,8 @@ #include "board.h" #include "led.h" #include "ff.h" +#include "crc16-ccitt.h" + #define GPIO_PORT_IN PORT_1 #define GPIO_PIN_IN PIN_6 @@ -70,26 +72,6 @@ extern void run_usbmsc(void); DIR dir; /* Directory object */ FATFS FatFs; -static void crc_sw(uint32_t *crcval, uint8_t *data, uint8_t len, uint32_t polynomial) -{ - int i, j; - uint32_t temp; - - for(i = 0; i < len; ++i) { - temp = (data[i] & 0xFF); - for(j = 0; j < 8; ++j) { - if((temp ^ *crcval) & 1) { - *crcval >>= 1; - *crcval ^= polynomial; - } else { - *crcval >>= 1; - } - temp >>= 1; - } - } -} - - bool mount(void) { FRESULT res; @@ -122,7 +104,7 @@ bool check_integrity(void) return false; } - uint32_t crcval = 0; + uint16_t crcval = 0; do { res = f_read(&file, data, sizeof(data), &readbytes); if(res != FR_OK) { @@ -130,7 +112,7 @@ bool check_integrity(void) crcval = 1; // Make sure to fail the test break; } - crc_sw(&crcval, data, readbytes, TPU_CRC_CCITT); + crcval = crc16_ccitt(crcval, data, readbytes); } while (readbytes == sizeof(data)); f_close(&file); @@ -139,7 +121,6 @@ bool check_integrity(void) return true; } else { printf("CRC check failed. Final CRC: %d\n", crcval); - return true; return false; } }