diff --git a/ispprog.c b/ispprog.c index 5b22f61..ed749da 100644 --- a/ispprog.c +++ b/ispprog.c @@ -2,6 +2,7 @@ #include #include #include +#include #define F_CPU 7372800 #define BAUDRATE 115200 @@ -13,6 +14,8 @@ #define LED_OFF 0x00 #define LED_ON 0x01 +#define LED_FAST 0x02 +#define LED_SLOW 0x03 struct { uint8_t id; // device id @@ -33,23 +36,33 @@ uint8_t lastcmd = 0, lastval = 0, pollcode = 0xFF; uint8_t page_buf[256]; +ISR(SIG_INPUT_CAPTURE1) +{ + // toggle LED + PORTB ^= (1<> 8); -// spi_rxtx(addr & 0xFF); spi_rxtx(lastaddr >> 8); spi_rxtx(lastaddr & 0xFF); spi_rxtx(0x00); @@ -244,26 +294,29 @@ int main(void) break; // Read Lock Bits - case 'r': // done + case 'r': ser_send(mem_read(0x58, 0x0000)); ser_send('\r'); break; // Read program memory - case 'R': // done + case 'R': + led_mode(LED_SLOW); ser_send(mem_read(0x28, addr)); ser_send(mem_read(0x20, addr)); addr++; break; // Read data memory - case 'd': // done + case 'd': + led_mode(LED_SLOW); ser_send(mem_read(0xA0, addr)); addr++; break; // Write data memory - case 'D': // done + case 'D': + led_mode(LED_FAST); mem_write(0xC0, addr, ser_recv()); poll(); @@ -272,7 +325,7 @@ int main(void) break; // Chip erase - case 'e': // done + case 'e': spi_rxtx(0xAC); spi_rxtx(0x80); spi_rxtx(0x00); @@ -283,16 +336,14 @@ int main(void) break; // Write lock bits + // TODO: not implemented case 'l': ser_recv(); - - // TODO: implement? - ser_send('\r'); break; // Read fuse bits - case 'F': // done + case 'F': spi_rxtx(0x50); spi_rxtx(0x00); spi_rxtx(0x00); @@ -300,7 +351,7 @@ int main(void) break; // Return High Fusebits - case 'N': // done + case 'N': spi_rxtx(0x58); spi_rxtx(0x08); spi_rxtx(0x00); @@ -308,7 +359,7 @@ int main(void) break; // Return extendet Fusebits - case 'Q': // done + case 'Q': spi_rxtx(0x50); spi_rxtx(0x08); spi_rxtx(0x00); @@ -316,17 +367,17 @@ int main(void) break; // Leave programming mode - case 'L': // done + case 'L': // Exit - case 'E': // done + case 'E': set_reset(1); led_mode(LED_OFF); ser_send('\r'); break; // Select device type - case 'T': { // done + case 'T': { uint8_t val, i = 0; val = ser_recv(); @@ -345,7 +396,7 @@ int main(void) } // Read signature bytes - case 's': { // done + case 's': { uint8_t i = 2; do { spi_rxtx(0x30); @@ -357,7 +408,7 @@ int main(void) } // Return supported device codes - case 't': { // done + case 't': { uint8_t val, i = 0; do { val = devices[i++].id; @@ -367,7 +418,7 @@ int main(void) } // Return software identifier - case 'S': // done + case 'S': ser_send('A'); ser_send('V'); ser_send('R'); @@ -378,46 +429,48 @@ int main(void) break; // Return software version - case 'V': // done + case 'V': ser_send('3'); ser_send('8'); break; // Return hardware version - case 'v': // done + case 'v': ser_send('1'); ser_send('2'); break; // Return programmer type - case 'p': // done + case 'p': ser_send('S'); break; // Set LED - case 'x': // done + case 'x': ser_recv(); led_mode(LED_ON); break; // Clear LED - case 'y': // done + case 'y': ser_recv(); led_mode(LED_OFF); break; // Report Block write Mode - case 'b': // done + case 'b': ser_send('Y'); ser_send(sizeof(page_buf) >> 8); ser_send(sizeof(page_buf) & 0xFF); break; // Block Write - case 'B': { // done + case 'B': { uint16_t size, i; uint8_t type; + led_mode(LED_FAST); + size = ser_recv() << 8; size |= ser_recv(); type = ser_recv(); @@ -432,6 +485,7 @@ int main(void) addr++; + // page write on page-boundry if ((addr & pagemask) == 0x00) { spi_rxtx(0x4C); spi_rxtx(lastaddr >> 8); @@ -444,12 +498,12 @@ int main(void) // last page if (size != sizeof(page_buf)) { - spi_rxtx(0x4C); - spi_rxtx(lastaddr >> 8); - spi_rxtx(lastaddr & 0xFF); - spi_rxtx(0x00); + spi_rxtx(0x4C); + spi_rxtx(lastaddr >> 8); + spi_rxtx(lastaddr & 0xFF); + spi_rxtx(0x00); - poll(); + poll(); } } else if (type == 'E') { @@ -464,10 +518,12 @@ int main(void) } // Block Read - case 'g': { // done + case 'g': { uint16_t size, i; uint8_t type; + led_mode(LED_SLOW); + size = ser_recv() << 8; size |= ser_recv(); type = ser_recv(); @@ -489,14 +545,14 @@ int main(void) } // Write fuse bits + // TODO: implement case 'f': ser_recv(); - // TODO: implement? ser_send('\r'); break; // Universial command - case ':': { // done + case ':': { uint8_t val[3]; val[0] = ser_recv(); val[1] = ser_recv(); @@ -505,13 +561,14 @@ int main(void) spi_rxtx(val[0]); spi_rxtx(val[1]); ser_send(spi_rxtx(val[2])); + _delay_ms(25); ser_send('\r'); break; } // New universal command - case '.': { // done + case '.': { uint8_t val[4]; val[0] = ser_recv(); val[1] = ser_recv(); @@ -522,11 +579,13 @@ int main(void) spi_rxtx(val[1]); spi_rxtx(val[2]); ser_send(spi_rxtx(val[3])); + _delay_ms(25); ser_send('\r'); break; } + // ESC case 0x1B: break; @@ -535,6 +594,5 @@ int main(void) break; } } - return 0; }