diff --git a/main.c b/main.c index abb4561..80f02b0 100644 --- a/main.c +++ b/main.c @@ -78,140 +78,49 @@ static int uart_putchar(char c, FILE *stream) static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); -static uint8_t i2c_cmd; -static uint8_t i2c_dev; -static uint16_t i2c_address; -static uint8_t i2c_buf[64]; -static volatile uint8_t i2c_complete; - -void i2c_transfer(uint8_t cmd) +static uint8_t i2c_master_tx(uint8_t val) { - i2c_complete = 0; - i2c_cmd = cmd; - TWCR |= (1< send SLA+W */ - case 0x08: - bcnt = 0; - TWDR = (i2c_dev << 1); - TWCR &= ~(1< send SLA+R */ - case 0x10: - bcnt = 0; - TWDR = (i2c_dev << 1) | 0x01; - TWCR &= ~(1< send command */ - case 0x18: - bcnt++; - TWDR = i2c_cmd; - TWCR |= (1< ? */ - case 0x28: - switch (i2c_cmd) { - case CMD_GET_INFO: - case CMD_GET_SIGNATURE: - case CMD_READ_FLASH: - case CMD_READ_EEPROM: - TWCR |= (1<> 8); - - } else if (bcnt == 2) { - TWDR = (i2c_address & 0xFF); - - } else if (bcnt == 3) { - TWDR = (WRITE_COOKIE >> 8); - - } else if (bcnt == 4) { - TWDR = (WRITE_COOKIE & 0xFF); - - } else if (bcnt >= 5 && bcnt < (64 +5)) { - TWDR = i2c_buf[bcnt -5]; - - } else { - i2c_complete = 1; - TWCR |= (1< send ACK (send more data) */ - case 0x40: - TWCR |= (1<> 8); + i2c_master_tx(address & 0xFF); + address += sizeof(page_buf); - size -= sizeof(i2c_buf); - } + i2c_master_tx(WRITE_COOKIE >> 8); + i2c_master_tx(WRITE_COOKIE & 0xFF); - } else if (val == 'E') { + tmp = page_buf; + for (cnt = 0; cnt < sizeof(page_buf); cnt++) + i2c_master_tx(*tmp++); - } + i2c_stop(); } else if (dev == DEVCODE_M644) { if (val == 'F') { @@ -399,22 +317,24 @@ void cmd_loop(void) val = recvchar(); if (dev == DEVCODE_M8) { - if (val == 'F') { - while (size > 0) { - uint8_t i = 0; - i2c_address = address; - i2c_transfer(CMD_READ_FLASH); + i2c_start_address(i2c_dev); + if (val == 'F') + i2c_master_tx(CMD_READ_FLASH); + else + i2c_master_tx(CMD_READ_EEPROM); - address += sizeof(i2c_buf); - while (size-- && i < sizeof(i2c_buf)) - sendchar(i2c_buf[i++]); - } - - } else if (val == 'E') { - sendchar(0xff); + i2c_master_tx(address >> 8); + i2c_master_tx(address & 0xFF); + i2c_start_address(i2c_dev | 0x01); + while (size--) { + i2c_master_rx(&val, size > 0); + sendchar(val); + address++; } + i2c_stop(); + } else if (dev == DEVCODE_M644) { if (val == 'F') { address = readFlashPage(address, size); @@ -437,14 +357,27 @@ void cmd_loop(void) // Enter programming mode } else if (val == 'P') { - /* boot loader */ - i2c_transfer(CMD_BOOT_LOADER); + i2c_start_address(i2c_dev); + i2c_master_tx(CMD_BOOT_LOADER); + i2c_stop(); + + _delay_ms(10); + + i2c_start_address(i2c_dev); + i2c_master_tx(CMD_GET_SIGNATURE); + i2c_start_address(i2c_dev | 0x01); + i2c_master_rx(&val, 1); + i2c_master_rx(&val, 1); + i2c_master_rx(&val, 0); + i2c_stop(); + sendchar('\r'); // Leave programming mode } else if (val == 'L') { - /* boot application */ - i2c_transfer(CMD_BOOT_APPLICATION); + i2c_start_address(i2c_dev); + i2c_master_tx(CMD_BOOT_APPLICATION); + i2c_stop(); sendchar('\r'); // return programmer type @@ -478,7 +411,7 @@ void cmd_loop(void) sendchar('T'); // Return Software Version - } else if (val == 'V') { + } else if (val == 'V' || val == 'v') { sendchar('0'); sendchar('8'); @@ -502,9 +435,23 @@ void cmd_loop(void) // set i2c target } else if (val >= '1' && val <= '4') { - i2c_dev = val - '1' + 0x21; + i2c_dev = (val - '1' + 0x21) << 1; sendchar(val); + // test props + } else if (val == 'l') { + i2c_start_address(i2c_dev); + i2c_master_tx(CMD_SET_PWM); + i2c_master_tx(0x00); + i2c_stop(); + + // test props + } else if (val == 'k') { + i2c_start_address(i2c_dev); + i2c_master_tx(CMD_SET_PWM); + i2c_master_tx(0x0f); + i2c_stop(); + /* ESC */ } else if (val != 0x1b) { sendchar('?'); @@ -541,38 +488,22 @@ int main(void) /* enable TWI interface */ TWBR = ((F_CPU/TWI_CLK)-16)/2; - TWCR = (1< 0) { if (UCSR0A & (1<