From 35d47901d6cbb8f5493bb66ae76d1c698fc2cdb9 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Fri, 3 Jun 2016 23:01:49 -0500 Subject: [PATCH] Gonna bit bang this without interrupts yo --- avr/send.c | 186 ++++++++++++++++------------------------------------- 1 file changed, 57 insertions(+), 129 deletions(-) diff --git a/avr/send.c b/avr/send.c index 2573e63..0af97cf 100644 --- a/avr/send.c +++ b/avr/send.c @@ -6,34 +6,18 @@ #include #include -#define TIMER1_INTERVAL 1953 - -enum { - TABBY_SEND_READING = 0, - TABBY_SEND_BUFFERED = (1 << 0), - TABBY_SEND_COMPLETE = (1 << 1) -}; - -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 tabby_printer_packet header = { +static tabby_printer_packet header = { .type = 0, .compression = 0, .size = 0 }; -static volatile uint8_t body[TABBY_PRINTER_MAX_PACKET_SIZE]; +static uint8_t body[TABBY_PRINTER_MAX_PACKET_SIZE]; -static volatile uint16_t sum = 0x0000; +static uint16_t sum = 0x0000; -static volatile uint8_t device = 0x00, - status = 0x00, - flags = TABBY_SEND_READING; - -static volatile uint16_t i = 0, - b = 0; +static uint8_t device = 0x00, + status = 0x00; /* * So like, we're abusing pins here. So badly, it's beyond. So here's what's @@ -45,111 +29,70 @@ static volatile uint16_t i = 0, * The SI and SO pins over a link cable are crossed over, so SI on one end * always connects to SO on the other, and vice-versa. */ -static void spi_start() { +static void spi_init() { /* - * Configure MISO as output...Oddly + * Configure MISO as output...Oddly, alongside SCK as an output */ - DDRB |= (1 << DDB4); + DDRB |= ((1 << DDB5) | (1 << DDB4)); /* * Configure MOSI as input...Also oddly */ DDRB &= ~(1 << DDB3); - /* - * Configure SCK pin as output - */ - DDRB |= (1 << DDB5); - /* * Set output pins clear by default */ - PORTB &= ~((1 << PORTB5) | (1 << PORTB4)); - - /* - * Set timer clock divider to 1/1 - */ - TCCR1B = (1 << CS10); - - /* - * Set timer interval - */ - OCR1A = TIMER1_INTERVAL; - - /* - * Reset timer counter to zero - */ - TCNT1 = 0; - - /* - * Enable timer interrupt vector for match on OCR1A - */ - TIMSK1 = (1 << OCIE1A); + PORTB &= ~(1 << PORTB4); } -static void spi_end() { - PORTB &= ~((1 << PORTB5) | (1 << PORTB4)); - DDRB &= ~((1 << DDB5) | (1 << DDB4) | (1 << DDB3)); - TIMSK1 &= ~ (1 << OCIE1A); - TCNT1 = 0; - OCR1A = TIMER1_INTERVAL; - TCCR1B = (1 << CS10); -} +static uint8_t spi_send_byte(uint8_t value) { + uint8_t ret = 0, + i = 0; -ISR(TIMER1_COMPA_vect) { - value_in >>= 1; - - PORTB |= (1 << PORTB5); - - if (PINB & (1 << PINB3)) { - value_in |= 0x80; - } - - if (value_out & 0x80) { - PORTB |= (1 << PORTB4); - } else { - PORTB &= ~(1 << PORTB4); - } - - value_out <<= 1; - - if (--bits == 0) { - if (i < sizeof(header)) { - value_out = header.data[i++]; - } else if (b < header.size) { - value_out = body[b++]; - } else if (b == header.size) { - value_out = sum & 0x00ff; - b++; - } else if (b == header.size + 1) { - value_out = (sum & 0xff00) >> 8; - b++; - } else if (b == header.size + 2) { - device = value_in; - value_out = 0x00; - b++; - } else if (b == header.size + 3) { - status = value_in; - value_out = 0x00; - - i = 0; - b = 0; - flags &= ~TABBY_SEND_BUFFERED; - flags |= TABBY_SEND_COMPLETE; - - spi_end(); + for (i=0; i<8; i++) { + if (value & 0x80) { + PORTB |= (1 << PORTB4); + } else { + PORTB &= ~(1 << PORTB4); } - bits = 8; + value <<= 1; + + PORTB |= (1 << PORTB5); + + _delay_us(60); + + ret <<= 1; + + PORTB &= ~(1 << PORTB5); + + if (PINB & (1 << PINB3)) { + ret |= 1; + } + + _delay_us(60); } - /* - * Chill out for 60µsec, then ride out the rest of the time until the next - * interrupt with a high as fuck SCK - */ - _delay_us(60); + return ret; +} - PORTB &= ~(1 << PORTB5); +static void spi_send_packet() { + int i; + + for (i=0; i> 8); + + status = spi_send_byte(0); + status = spi_send_byte(0); } static uint16_t checksum() { @@ -169,32 +112,16 @@ static uint16_t checksum() { int main() { uint16_t sum = 0, + i = 0, + b = 0, c; uart_init(); + spi_init(); sei(); while (1) { - uart_putchar('O', NULL); - - c = uart_getchar(NULL); - - if (c == 'K') { - break; - } - } - - while (1) { - if (flags & TABBY_SEND_COMPLETE) { - uart_putchar(device, NULL); - uart_putchar(status, NULL); - - flags = TABBY_SEND_READING; - } - - while (flags != TABBY_SEND_READING); - c = uart_getchar(NULL); switch (i) { @@ -266,7 +193,7 @@ int main() { default: { if (b < header.size) { - body[b++]; + body[b++] = c; } else if (b == header.size) { sum = c; b++; @@ -277,9 +204,10 @@ int main() { b = 0; if (sum == checksum()) { - flags |= TABBY_SEND_BUFFERED; + spi_send_packet(); - spi_start(); + uart_putchar(device, NULL); + uart_putchar(status, NULL); } } }