From 12b5aeceebf14aae2c92f8953ca6a9b264643fa1 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Tue, 31 May 2016 18:15:37 -0500 Subject: [PATCH] Sadly I keep stepping on the UART's dick --- avr/Makefile | 2 +- avr/main.c | 289 ++++++++++++++----------------------- include/tabby/avr/buffer.h | 2 - include/tabby/avr/uart.h | 2 +- include/tabby/link.h | 2 +- src/link.c | 6 +- src/printer.c | 2 +- 7 files changed, 114 insertions(+), 191 deletions(-) diff --git a/avr/Makefile b/avr/Makefile index 12f8fed..655dc93 100644 --- a/avr/Makefile +++ b/avr/Makefile @@ -12,7 +12,7 @@ OBJCOPY = $(CROSS)objcopy OBJCOPY_FLAGS = -S AVRDUDE = avrdude -AVRDUDE_DEVICE = /dev/cu.usbmodem1411 +AVRDUDE_DEVICE = /dev/ttyACM0 AVRDUDE_FLAGS = -c arduino -p atmega328p -b 115200 -D -P $(AVRDUDE_DEVICE) HEADERS_LOCAL = diff --git a/avr/main.c b/avr/main.c index e4caa63..01fedfe 100644 --- a/avr/main.c +++ b/avr/main.c @@ -6,123 +6,140 @@ #include #include +#include #include -#include -static const uint16_t timer_counter_intervals[4] = { - 1953, 977, 61, 31 +static volatile tabby_printer_packet_header header = { + .type = 0, + .compression = 0, + .size = 0 }; -static volatile uint8_t bits = 0; -static volatile uint8_t value_in = 0x00; /* Data coming in from Game Boy */ -static volatile uint8_t value_out = 0x00; /* Data going out to Game Boy */ +static volatile uint8_t body[648]; -static volatile tabby_avr_buffer buffer = { - .len = 0, - .cur = 0, - .read = 0 -}; +static volatile uint16_t sum = 0; -static tabby_clock_source source = TABBY_CLOCK_SOURCE_INTERNAL; -static tabby_clock_speed speed = TABBY_CLOCK_SPEED_8192HZ; +static volatile uint16_t i = 0, + b = 0; -/* - * Internal clock source interrupt vector - */ -ISR(TIMER0_COMPB_vect) { - value_in >>= 1; +static inline uint16_t checksum() { + uint16_t ret = header.data[2] + + header.data[3] + + header.data[4] + + header.data[5]; - if (PORTB & (1 << PORTB2)) { - value_in |= 0x80; + size_t i; + + for (i=0; i>= 8; + sum |= value << 8; + + b++; + + SPDR = 0; + } else if (b == header.size + 1) { + sum >>= 8; + sum |= value << 8; + + b++; + + SPDR = 0x81; + } else if (b == header.size + 2) { + b++; + + SPDR = 0; + } else if (b == header.size + 3) { + i = 0; + + SPDR = 0; + } + } } -} -static void setup_clock_internal(tabby_clock_speed speed) { - /* - * Configure MISO as output - */ - DDRB |= (1 << DDB4); - - /* - * Configure MOSI as input - */ - DDRB &= ~(1 << DDB3); - - /* - * Configure SCK pin as output - */ - DDRB |= (1 << DDB5); - - /* - * Enable timer interrupt vector - */ - TIMSK0 = (1 << TOIE1); - - /* - * Reset timer counter to zero - */ - TCNT1 = 0; - - /* - * Set timer interval - */ - OCR1A = timer_counter_intervals[speed]; - - /* - * Set timer clock divider to 1/1 - */ - TCCR1B = (1 << CS10); + uart_putchar(value, NULL); } static void setup_clock_external() { - /* - * Disable internal timer interrupts - */ - TCCR1B = 0; - OCR1A = 0; - TIMSK0 = 0; - /* * Configure MISO as output */ DDRB |= (1 << DDB4); - /* * Configure SS as input */ @@ -145,10 +162,6 @@ static void setup_clock_external() { } int main() { - tabby_command state = TABBY_COMMAND_NONE; - - int received = 0; - /* * Best turn on the serial UART! */ @@ -167,93 +180,7 @@ int main() { sei(); while (1) { - uint8_t c = uart_getchar(NULL); - - switch (state) { - case TABBY_COMMAND_NONE: { - state = c; - - continue; - } - - case TABBY_COMMAND_SEND: { - received++; - - if (received == 1 || received == 2) { - buffer.len <<= 8; - buffer.len |= c; - } else { - buffer.data[buffer.read++] = c; - - if (buffer.read == buffer.len) { - state = TABBY_COMMAND_NONE; - received = 0; - - continue; - } - } - - break; - } - - case TABBY_COMMAND_CLOCK_SOURCE: { - switch (c) { - case TABBY_CLOCK_SOURCE_INTERNAL: { - source = c; - - setup_clock_internal(speed); - - goto reset; - } - - case TABBY_CLOCK_SOURCE_EXTERNAL: { - source = c; - - setup_clock_external(); - - goto reset; - } - - default: { - goto reset; - } - } - } - - case TABBY_COMMAND_CLOCK_SPEED: { - switch (c) { - case TABBY_CLOCK_SPEED_8192HZ: - case TABBY_CLOCK_SPEED_16384HZ: - case TABBY_CLOCK_SPEED_262144HZ: - case TABBY_CLOCK_SPEED_524288HZ: { - speed = c; - - if (source == TABBY_CLOCK_SOURCE_INTERNAL) { - setup_clock_internal(speed); - } - - goto reset; - } - - default: - goto reset; - } - } - - default: { - goto reset; - } - } - - continue; - -reset: - state = TABBY_COMMAND_NONE; - received = 0; - - buffer.len = 0; - buffer.cur = 0; - buffer.read = 0; + sleep_mode(); } return 0; diff --git a/include/tabby/avr/buffer.h b/include/tabby/avr/buffer.h index 0247a43..f442fa4 100644 --- a/include/tabby/avr/buffer.h +++ b/include/tabby/avr/buffer.h @@ -1,8 +1,6 @@ #ifndef _TABBY_AVR_BUFFER_H #define _TABBY_AVR_BUFFER_H -#include - #define TABBY_AVR_BUFFER_SIZE 1024 typedef struct _tabby_avr_buffer { diff --git a/include/tabby/avr/uart.h b/include/tabby/avr/uart.h index 55c34a1..5bf5f07 100644 --- a/include/tabby/avr/uart.h +++ b/include/tabby/avr/uart.h @@ -1,7 +1,7 @@ #ifndef _TABBY_AVR_UART_H #define _TABBY_AVR_UART_H -#define TABBY_AVR_UART_BAUD 57600 +#define TABBY_AVR_UART_BAUD 115200 void uart_init(); diff --git a/include/tabby/link.h b/include/tabby/link.h index 046deac..ce024c9 100644 --- a/include/tabby/link.h +++ b/include/tabby/link.h @@ -11,7 +11,7 @@ #include -#define TABBY_LINK_BAUD B57600 +#define TABBY_LINK_BAUD B115200 int tabby_link_open(const char *dev); diff --git a/src/link.c b/src/link.c index 69ec0af..439d63a 100644 --- a/src/link.c +++ b/src/link.c @@ -1,3 +1,5 @@ +#include + #include #include @@ -9,10 +11,6 @@ int tabby_link_open(const char *dev) { goto error_open; } - if (fcntl(fd, F_SETFL) < 0) { - goto error_io; - } - attr.c_cflag = CS8 | CREAD; attr.c_ispeed = TABBY_LINK_BAUD; attr.c_ospeed = TABBY_LINK_BAUD; diff --git a/src/printer.c b/src/printer.c index 4c3c152..1ea1c03 100644 --- a/src/printer.c +++ b/src/printer.c @@ -30,7 +30,7 @@ int tabby_printer_packet_recv(int fd, tabby_printer_packet_header *header, f = 0; uint8_t value, - last; + last = 0; int started = 0;