diff --git a/ispprog.c b/ispprog.c index 948efb9..2b89cf2 100644 --- a/ispprog.c +++ b/ispprog.c @@ -25,9 +25,9 @@ #include "avrdevice.h" #include "display.h" #include "target.h" +#include "uart.h" #include -#define UART_CALC_BAUDRATE(baudRate) (((uint32_t)F_CPU) / (((uint32_t)baudRate)*16) -1) /* F_CPU /4 (1.8432MHz) */ #define SPI_MODE4 ((1<> 8); - ser_send(sizeof(page_buf) & 0xFF); + uart_send('Y'); + uart_send(sizeof(page_buf) >> 8); + uart_send(sizeof(page_buf) & 0xFF); break; } @@ -482,12 +454,11 @@ static void cmdloop(void) led_mode = LED_FAST; - size = ser_recv() << 8; - size |= ser_recv(); - type = ser_recv(); + size = uart_recv() << 8; + size |= uart_recv(); + type = uart_recv(); - for (i = 0; i < size; i++) - page_buf[i] = ser_recv(); + uart_recv_buf(page_buf, size); if (type == 'F') { for (i = 0; i < size; i += 2) { @@ -514,7 +485,7 @@ static void cmdloop(void) addr++; } } - ser_send('\r'); + uart_send('\r'); break; } @@ -525,20 +496,20 @@ static void cmdloop(void) led_mode = LED_SLOW; - size = ser_recv() << 8; - size |= ser_recv(); - type = ser_recv(); + size = uart_recv() << 8; + size |= uart_recv(); + type = uart_recv(); if (type == 'F') { for (i = 0; i < size; i += 2) { - ser_send(mem_read(CMD_READ_FLASH_LO, addr)); - ser_send(mem_read(CMD_READ_FLASH_HI, addr)); + uart_send(mem_read(CMD_READ_FLASH_LO, addr)); + uart_send(mem_read(CMD_READ_FLASH_HI, addr)); addr++; } } else if (type == 'E') { for (i = 0; i < size; i++) { - ser_send(mem_read(CMD_READ_EEPROM, addr)); + uart_send(mem_read(CMD_READ_EEPROM, addr)); addr++; } } @@ -547,45 +518,42 @@ static void cmdloop(void) /* Write fusebits */ case 'f': { - uint8_t val = ser_recv(); + uint8_t val = uart_recv(); spi_rxtx(CMD_WRITE_FUSE_1); spi_rxtx(CMD_WRITE_FUSE_2); spi_rxtx(0x00); spi_rxtx(val); _delay_ms(10); - ser_send('\r'); + uart_send('\r'); break; } /* Universial command */ case ':': { uint8_t val[3]; - val[0] = ser_recv(); - val[1] = ser_recv(); - val[2] = ser_recv(); + + uart_recv_buf(val, sizeof(val)); spi_rxtx(val[0]); spi_rxtx(val[1]); - ser_send(spi_rxtx(val[2])); + uart_send(spi_rxtx(val[2])); _delay_ms(10); - ser_send('\r'); + uart_send('\r'); break; } /* New universal command */ case '.': { uint8_t val[4]; - val[0] = ser_recv(); - val[1] = ser_recv(); - val[2] = ser_recv(); - val[3] = ser_recv(); + + uart_recv_buf(val, sizeof(val)); spi_rxtx(val[0]); spi_rxtx(val[1]); spi_rxtx(val[2]); - ser_send(spi_rxtx(val[3])); + uart_send(spi_rxtx(val[3])); /* most CMD_WRITE_* commands need delay */ if (val[0] == CMD_WRITE_LOCK_1) @@ -593,7 +561,7 @@ static void cmdloop(void) _delay_ms(10); } - ser_send('\r'); + uart_send('\r'); break; } @@ -602,7 +570,7 @@ static void cmdloop(void) break; default: - ser_send('?'); + uart_send('?'); break; } } @@ -843,27 +811,7 @@ int main(void) { GPIO_INIT(); -#if defined(OSCCAL_VALUE) - OSCCAL = OSCCAL_VALUE; -#endif /* defined(OSCCAL_VALUE) */ - -#if defined(__AVR_ATmega16__) - /* Set baud rate */ - UBRRH = (UART_CALC_BAUDRATE(BAUDRATE)>>8) & 0xFF; - UBRRL = (UART_CALC_BAUDRATE(BAUDRATE) & 0xFF); - - /* enable usart with 8n1 */ - UCSRB = (1<>8) & 0xFF; - UBRR0L = (UART_CALC_BAUDRATE(BAUDRATE) & 0xFF); - - /* enable usart with 8n1 */ - UCSR0B = (1< + +#include "target.h" +#include "uart.h" + +#define UART_CALC_BAUDRATE(baudRate) (((uint32_t)F_CPU) / (((uint32_t)baudRate)*16) -1) + +/* *********************************************************************** + * uart_send + * *********************************************************************** */ +void uart_send(uint8_t data) +{ +#if defined(__AVR_ATmega16__) + loop_until_bit_is_set(UCSRA, UDRE); + UDR = data; +#elif defined(__AVR_ATmega328P__) + loop_until_bit_is_set(UCSR0A, UDRE0); + UDR0 = data; +#endif +} /* uart_send */ + + +/* *********************************************************************** + * uart_recv + * *********************************************************************** */ +uint8_t uart_recv(void) +{ +#if defined(__AVR_ATmega16__) + loop_until_bit_is_set(UCSRA, RXC); + return UDR; +#elif defined(__AVR_ATmega328P__) + loop_until_bit_is_set(UCSR0A, RXC0); + return UDR0; +#endif +} /* uart_recv */ + + +/* *********************************************************************** + * uart_recv_buf + * *********************************************************************** */ +void uart_recv_buf(uint8_t * p_data, uint16_t data_length) +{ + while (data_length--) + { + *p_data++ = uart_recv(); + } +} /* uart_recv_buf */ + + +/* *********************************************************************** + * uart_init + * *********************************************************************** */ +void uart_init(void) +{ +#if defined(OSCCAL_VALUE) + OSCCAL = OSCCAL_VALUE; +#endif /* defined(OSCCAL_VALUE) */ + +#if defined(__AVR_ATmega16__) + /* Set baud rate */ + UBRRH = (UART_CALC_BAUDRATE(BAUDRATE)>>8) & 0xFF; + UBRRL = (UART_CALC_BAUDRATE(BAUDRATE) & 0xFF); + + /* enable usart with 8n1 */ + UCSRB = (1<>8) & 0xFF; + UBRR0L = (UART_CALC_BAUDRATE(BAUDRATE) & 0xFF); + + /* enable usart with 8n1 */ + UCSR0B = (1< + +/* *********************************************************************** */ + +void uart_send (uint8_t data); +uint8_t uart_recv (void); + +void uart_recv_buf (uint8_t * p_data, uint16_t data_length); + +void uart_init (void); + +/* *********************************************************************** */ + +#endif /* UART_H_ */