Holy shit, it fucking works

This commit is contained in:
XANTRONIX Development 2016-06-04 19:11:06 -05:00
parent 904bf866a6
commit 6fa31cccd8
2 changed files with 42 additions and 22 deletions

View file

@ -15,7 +15,7 @@ OBJCOPY = $(CROSS)objcopy
OBJCOPY_FLAGS = -S
AVRDUDE = avrdude
AVRDUDE_DEVICE = /dev/ttyACM0
AVRDUDE_DEVICE = /dev/cu.usbmodem1411
AVRDUDE_FLAGS = -c arduino -p atmega328p -b 115200 -D -P $(AVRDUDE_DEVICE)
HEADERS_LOCAL =

View file

@ -23,7 +23,7 @@ static uint8_t device = 0x00,
* So like, we're abusing pins here. So badly, it's beyond. So here's what's
* going down: We want to retain the same physical I/O connections between
* both the sending and receiving flavors of the whole Game Boy Printer
* endeavor, and that means that we must absolutely bit bang MOSI and MISO
* endeavor, and that mean/s that we must absolutely bit bang MOSI and MISO
* opposite from their ordinary roles. The reason being: There is no notion
* of MISO or MOSI from the Game Boy's (nor its peripherals') point of view.
* The SI and SO pins over a link cable are crossed over, so SI on one end
@ -31,27 +31,37 @@ static uint8_t device = 0x00,
*/
static void spi_init() {
/*
* Configure MISO as output...Oddly, alongside SCK as an output
* Set SC to output
*/
DDRB |= ((1 << DDB5) | (1 << DDB4));
DDRB |= (1 << DDB5);
/*
* Configure MOSI as input...Also oddly
* Configure SO as output
*/
DDRB |= (1 << DDB4);
/*
* Configure SI as input with pullup
*/
DDRB &= ~(1 << DDB3);
PORTB |= (1 << DDB3);
/*
* Set output pins clear by default
* Set SO clear
*/
PORTB &= ~((1 << PORTB5) | (1 << PORTB4));
PORTB &= ~(1 << PORTB4);
/*
* Set SC high
*/
PORTB |= (1 << PORTB5);
}
static uint8_t spi_send_byte(uint8_t value) {
uint8_t ret = 0,
i = 0;
uint8_t i, ret = 0;
for (i=0; i<8; i++) {
PORTB |= (1 << PORTB5);
PORTB &= ~(1 << PORTB5);
if (value & 0x80) {
PORTB |= (1 << PORTB4);
@ -59,21 +69,22 @@ static uint8_t spi_send_byte(uint8_t value) {
PORTB &= ~(1 << PORTB4);
}
_delay_us(140);
value <<= 1;
ret <<= 1;
_delay_us(60);
PORTB |= (1 << PORTB5);
if (PINB & (1 << PINB3)) {
ret |= 1;
}
PORTB &= ~(1 << PORTB5);
_delay_us(140);
value <<= 1;
_delay_us(60);
}
_delay_us(270);
return ret;
}
@ -91,10 +102,10 @@ static void spi_send_packet() {
(void)spi_send_byte( sum & 0x00ff);
(void)spi_send_byte((sum & 0xff00) >> 8);
_delay_us(1200);
device = spi_send_byte(0);
status = spi_send_byte(0);
_delay_us(270);
}
static uint16_t checksum() {
@ -113,8 +124,7 @@ static uint16_t checksum() {
}
int main() {
uint16_t sum = 0,
i = 0,
uint16_t i = 0,
b = 0,
c;
@ -123,6 +133,16 @@ int main() {
sei();
while (1) {
uart_putchar('O', NULL);
c = uart_getchar(NULL);
if (c == 'K') {
break;
}
}
while (1) {
c = uart_getchar(NULL);