diff --git a/avr/usbload/crc.c b/avr/usbload/crc.c index 9d58925..f7f0d7c 100644 --- a/avr/usbload/crc.c +++ b/avr/usbload/crc.c @@ -3,6 +3,8 @@ #include "crc.h" #include "uart.h" +#include "config.h" +#include "sram.h" extern FILE uart_stdout; @@ -37,3 +39,36 @@ uint16_t do_crc_update(uint16_t crc, uint8_t * data, uint16_t size) crc = crc_xmodem_update(crc, data[i]); return crc; } + + +void crc_check_memory(uint32_t top_addr,uint8_t *buffer) +{ + uint16_t crc = 0; + uint32_t addr; + uint8_t req_bank = 0; + for (addr = 0x000000; addr < top_addr; addr += BUFFER_SIZE) { + sram_read_buffer(addr, buffer, BUFFER_SIZE); + crc = do_crc_update(crc, buffer, BUFFER_SIZE); + if (addr && addr % 32768 == 0) { + printf("crc_check_memory: req_bank: 0x%02x Addr: 0x%08lx CRC: 0x%04x\n", + req_bank, addr, crc); + req_bank++; + crc = 0; + } + } +} + +uint16_t crc_check_memory_range(uint32_t start_addr, uint32_t size,uint8_t *buffer) +{ + uint16_t crc = 0; + uint32_t addr; + uint8_t req_bank = 0; + for (addr = start_addr; addr < start_addr + size; addr += BUFFER_SIZE) { + sram_read_buffer(addr, buffer, BUFFER_SIZE); + crc = do_crc_update(crc, buffer, BUFFER_SIZE); + } +#if DEBUG_USB + printf("crc_check_memory_range: Addr: 0x%08lx CRC: 0x%04x\n", addr, crc); +#endif + return crc; +} \ No newline at end of file diff --git a/avr/usbload/crc.h b/avr/usbload/crc.h index 8a181dd..9139c20 100644 --- a/avr/usbload/crc.h +++ b/avr/usbload/crc.h @@ -5,3 +5,5 @@ uint16_t crc_xmodem_update (uint16_t crc, uint8_t data); uint16_t do_crc(uint8_t * data,uint16_t size); uint16_t do_crc_update(uint16_t crc,uint8_t * data,uint16_t size); +void crc_check_memory(uint32_t top_addr,uint8_t *buffer); +uint16_t crc_check_memory_range(uint32_t start_addr, uint32_t size,uint8_t *buffer); \ No newline at end of file diff --git a/avr/usbload/main.c b/avr/usbload/main.c index 9209135..6834d87 100644 --- a/avr/usbload/main.c +++ b/avr/usbload/main.c @@ -30,40 +30,8 @@ uint16_t sync_errors = 0; uint8_t tx_buffer[32]; uint8_t data_buffer[4]; uint32_t addr; +uint16_t crc = 0; -void crc_check_memory(uint32_t top_addr) -{ - uint16_t crc = 0; - uint32_t addr; - req_bank = 0; - for (addr = 0x000000; addr < top_addr; addr += BUFFER_SIZE) { - sram_read_buffer(addr, read_buffer, BUFFER_SIZE); - crc = do_crc_update(crc, read_buffer, BUFFER_SIZE); - if (addr && addr % 32768 == 0) { - printf("crc_check_memory: req_bank: 0x%x Addr: 0x%lx CRC: %x\n", - req_bank, addr, crc); - req_bank++; - crc = 0; - } - } -} - - -void crc_check_memory_range(uint32_t start_addr, uint32_t size) -{ - uint16_t crc = 0; - uint32_t addr; - req_bank = 0; - for (addr = start_addr; addr < start_addr + size; addr += BUFFER_SIZE) { - sram_read_buffer(addr, read_buffer, BUFFER_SIZE); - crc = do_crc_update(crc, read_buffer, BUFFER_SIZE); - } - tx_buffer[0] = crc & 0xff; - tx_buffer[1] = (crc >> 8) & 0xff; -#if DEBUG_USB - printf("crc_check_memory_range: Addr: 0x%lx CRC: %x\n", addr, crc); -#endif -} usbMsgLen_t usbFunctionSetup(uchar data[8]) @@ -95,7 +63,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) ret_len = 0; } rx_remaining = rq->wLength.word; - ret_len = 0xff; + ret_len = USB_MAX_TRANS; if (req_addr && req_addr % req_bank_size == 0) { #if DEBUG_USB printf("USB_UPLOAD_ADDR: req_bank: 0x%x Addr: 0x%08lx \n", @@ -103,7 +71,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) req_bank, req_addr); req_bank++; } - ret_len = 0xff; + ret_len = USB_MAX_TRANS; } else if (rq->bRequest == USB_DOWNLOAD_INIT) { #if DEBUG_USB printf("USB_DOWNLOAD_INIT\n"); @@ -118,7 +86,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) printf("USB_CRC: Addr 0x%lx \n", req_addr); #endif cli(); - crc_check_memory(req_addr); + crc_check_memory(req_addr,read_buffer); sei(); } else if (rq->bRequest == USB_CRC_ADDR) { req_addr = rq->wValue.word; @@ -135,7 +103,10 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) printf("USB_CRC_ADDR: Addr: 0x%lx Size: %li\n", req_addr, req_size); #endif cli(); - crc_check_memory_range(req_addr,req_size); + crc = crc_check_memory_range(req_addr,req_size,read_buffer); + tx_buffer[0] = crc & 0xff; + tx_buffer[1] = (crc >> 8) & 0xff; + sei(); ret_len = 2; }