From ac4f0d410f58705cbce22c180df0e2653c32fedd Mon Sep 17 00:00:00 2001 From: logicog Date: Tue, 14 Oct 2025 19:17:12 +0200 Subject: [PATCH] Add CRC16 initial code --- Makefile | 5 +- crc16.asm | 121 ++++++++++++++++++++++++++++++++++++++++++++++++ rtlplayground.c | 72 ++++++++++++++++++++-------- 3 files changed, 177 insertions(+), 21 deletions(-) create mode 100644 crc16.asm diff --git a/Makefile b/Makefile index 613a0c3..4cea7b8 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,9 @@ clean: $(BUILDDIR)crtstart.rel: crtstart.asm $(ASM) $(AFLAGS) -o $@ $< +$(BUILDDIR)crc16.rel: crc16.asm + $(ASM) $(AFLAGS) -o $@ $< + $(BUILDDIR)%.rel: %.c $(CC) $(CC_FLAGS) -o $@ -c $< @@ -47,7 +50,7 @@ $(BUILDDIR)%.rel: $(BUILDDIR)%.asm ${ASM} ${AFLAGS} -o $@ $< # mv -f $(addprefix $(basename $^), .lst .rel .sym) . -$(BUILDDIR)rtlplayground.ihx: $(BUILDDIR)crtstart.rel $(OBJS) +$(BUILDDIR)rtlplayground.ihx: $(BUILDDIR)crtstart.rel $(OBJS) $(BUILDDIR)crc16.rel $(CC) $(CC_FLAGS) -Wl-bHOME=${BOOTLOADER_ADDRESS} -Wl-bBANK1=0x14000 -Wl-r -o $@ $^ $(BUILDDIR)rtlplayground.img: $(BUILDDIR)rtlplayground.ihx diff --git a/crc16.asm b/crc16.asm new file mode 100644 index 0000000..4f1be7a --- /dev/null +++ b/crc16.asm @@ -0,0 +1,121 @@ +; +; CRC16 calculation module +; + .globl _crc_value + .globl _crc16 + .equ BANK, 0x96 +; .equ DPS, 0x86 +; Variable in XMEM holding current CRC16 value, being updated + .area XSEG (XDATA) +_crc_value:: + .ds 2 + +;------------------------------------------------------- +; CRC16 subroutine +; - dptr points to byte to be CRCd in xmem +; - algorithm uses table lookup +;------------------------------------------------------- + .area HOME (CODE) + .area CSEG (CODE) +; .area BANK1 (CODE) +_crc16: + mov BANK, #1 + push dph + push dpl + movx a, @dptr +; inc DPS + mov b, a + mov dptr, #_crc_value + movx a, @dptr + + xrl a, b ; create index into tables + push a ; save index + mov dptr, #crc16_table_l ; low part of table address + movc a, @a+dptr ; get low byte + mov b, a + + mov dptr, #_crc_value + 1 + movx a, @dptr + + xrl a, b + mov dptr, #_crc_value + movx @dptr, a ; save result low part + mov dptr, #crc16_table_h ; high part of table address + pop a ; restore index + movc a, @a+dptr + mov dptr, #_crc_value+1 + movx @dptr, a ; save result high part + pop dpl + pop dph +; clr DPS + ret + + .area BANK1 (CODE) + +crc16_table_l: + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 + .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 + +crc16_table_h: + .byte #0x00, #0xc0, #0xc1, #0x01, #0xc3, #0x03, #0x02, #0xc2 + .byte #0xc6, #0x06, #0x07, #0xc7, #0x05, #0xc5, #0xc4, #0x04 + .byte #0xcc, #0x0c, #0x0d, #0xcd, #0x0f, #0xcf, #0xce, #0x0e + .byte #0x0a, #0xca, #0xcb, #0x0b, #0xc9, #0x09, #0x08, #0xc8 + .byte #0xd8, #0x18, #0x19, #0xd9, #0x1b, #0xdb, #0xda, #0x1a + .byte #0x1e, #0xde, #0xdf, #0x1f, #0xdd, #0x1d, #0x1c, #0xdc + .byte #0x14, #0xd4, #0xd5, #0x15, #0xd7, #0x17, #0x16, #0xd6 + .byte #0xd2, #0x12, #0x13, #0xd3, #0x11, #0xd1, #0xd0, #0x10 + .byte #0xf0, #0x30, #0x31, #0xf1, #0x33, #0xf3, #0xf2, #0x32 + .byte #0x36, #0xf6, #0xf7, #0x37, #0xf5, #0x35, #0x34, #0xf4 + .byte #0x3c, #0xfc, #0xfd, #0x3d, #0xff, #0x3f, #0x3e, #0xfe + .byte #0xfa, #0x3a, #0x3b, #0xfb, #0x39, #0xf9, #0xf8, #0x38 + .byte #0x28, #0xe8, #0xe9, #0x29, #0xeb, #0x2b, #0x2a, #0xea + .byte #0xee, #0x2e, #0x2f, #0xef, #0x2d, #0xed, #0xec, #0x2c + .byte #0xe4, #0x24, #0x25, #0xe5, #0x27, #0xe7, #0xe6, #0x26 + .byte #0x22, #0xe2, #0xe3, #0x23, #0xe1, #0x21, #0x20, #0xe0 + .byte #0xa0, #0x60, #0x61, #0xa1, #0x63, #0xa3, #0xa2, #0x62 + .byte #0x66, #0xa6, #0xa7, #0x67, #0xa5, #0x65, #0x64, #0xa4 + .byte #0x6c, #0xac, #0xad, #0x6d, #0xaf, #0x6f, #0x6e, #0xae + .byte #0xaa, #0x6a, #0x6b, #0xab, #0x69, #0xa9, #0xa8, #0x68 + .byte #0x78, #0xb8, #0xb9, #0x79, #0xbb, #0x7b, #0x7a, #0xba + .byte #0xbe, #0x7e, #0x7f, #0xbf, #0x7d, #0xbd, #0xbc, #0x7c + .byte #0xb4, #0x74, #0x75, #0xb5, #0x77, #0xb7, #0xb6, #0x76 + .byte #0x72, #0xb2, #0xb3, #0x73, #0xb1, #0x71, #0x70, #0xb0 + .byte #0x50, #0x90, #0x91, #0x51, #0x93, #0x53, #0x52, #0x92 + .byte #0x96, #0x56, #0x57, #0x97, #0x55, #0x95, #0x94, #0x54 + .byte #0x9c, #0x5c, #0x5d, #0x9d, #0x5f, #0x9f, #0x9e, #0x5e + .byte #0x5a, #0x9a, #0x9b, #0x5b, #0x99, #0x59, #0x58, #0x98 + .byte #0x88, #0x48, #0x49, #0x89, #0x4b, #0x8b, #0x8a, #0x4a + .byte #0x4e, #0x8e, #0x8f, #0x4f, #0x8d, #0x4d, #0x4c, #0x8c + .byte #0x44, #0x84, #0x85, #0x45, #0x87, #0x47, #0x46, #0x86 + .byte #0x82, #0x42, #0x43, #0x83, #0x41, #0x81, #0x80, #0x40 diff --git a/rtlplayground.c b/rtlplayground.c index 5ce107c..b3c77fd 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -16,6 +16,10 @@ #include "uip/uip.h" #include "uip/uip_arp.h" +extern __xdata uint16_t crc_value; +__xdata uint8_t crc_testbytes[10]; +void crc16(__xdata uint8_t *v) __naked; + // Upload Firmware to 1M #define FIRMWARE_UPLOAD_START 0x100000 @@ -1705,37 +1709,65 @@ void bootloader(void) flash_read_bulk(flash_buf); if (flash_buf[0] == 0x00 && flash_buf[1] == 0x40) { - print_string("Update in progress, moving firmware to start of FLASH!\n"); - __xdata uint32_t dest = 0x0; __xdata uint32_t source = FIRMWARE_UPLOAD_START; - // A 512kByte = 4MBit Flash has 128*8=1024 512k blocks, we copy only 120 - for (__xdata uint16_t i=0; i < 960; i++) { - print_string("Writing block: "); - print_short(dest); + __xdata uint16_t i = 0; + __xdata uint16_t j = 0; + __xdata uint8_t * __xdata bptr; + print_string("Identified update image. Checking integrity...\n"); + + crc_value = 0x0000; + for (i = 0; i < 1024; i++) { flash_region.addr = source; flash_region.len = 0x200; flash_read_bulk(flash_buf); - write_char('\n'); - if (!(i & 0x7)) { - flash_region.addr = dest; - flash_sector_erase(); - } - flash_region.addr = dest; - flash_region.len = 0x200; - flash_write_bytes(flash_buf); - dest += 0x200; + bptr = flash_buf; + for (j = 0; j < 0x200; j++) + crc16(bptr++); source += 0x200; + print_short(crc_value); write_char(' '); } - print_string("Deleting uploaded flash image\n"); + if (crc_value == 0xb001) { + print_string("Checksum OK\n"); + print_string("Update in progress, moving firmware to start of FLASH!\n"); + source = FIRMWARE_UPLOAD_START; + // A 512kByte = 4MBit Flash has 128*8=1024 512k blocks, we copy only 120 + for (i = 0; i < 960; i++) { + print_string("Writing block: "); + print_short(dest); + flash_region.addr = source; + flash_region.len = 0x200; + flash_read_bulk(flash_buf); + write_char('\n'); + if (!(i & 0x7)) { + flash_region.addr = dest; + flash_sector_erase(); + } + flash_region.addr = dest; + flash_region.len = 0x200; + flash_write_bytes(flash_buf); + dest += 0x200; + source += 0x200; + } + print_string("Deleting uploaded flash image\n"); + dest = FIRMWARE_UPLOAD_START; + for (register uint8_t i=0; i < 128; i++) { + flash_region.addr = dest; + flash_sector_erase(); + dest += 0x1000; + } + print_string("Resetting now"); + delay(200); + reset_chip(); + } + print_string("Checksum incorrect, please upload the image again\n"); + print_string("Erasing bad uploaded flash image\n"); dest = FIRMWARE_UPLOAD_START; - for (register uint8_t i=0; i < 120; i++) { - flash_region.addr = dest; + for (register uint8_t i=0; i < 128; i++) { + flash_region.addr = dest; flash_sector_erase(); dest += 0x1000; } - print_string("Resetting now"); - reset_chip(); } // Reset NIC