diff options
Diffstat (limited to 'src/avr')
-rw-r--r-- | src/avr/Kconfig | 8 | ||||
-rw-r--r-- | src/avr/Makefile | 1 | ||||
-rw-r--r-- | src/avr/gpio.c | 21 | ||||
-rw-r--r-- | src/avr/usbserial.c | 65 |
4 files changed, 93 insertions, 2 deletions
diff --git a/src/avr/Kconfig b/src/avr/Kconfig index e0964676..5056e86a 100644 --- a/src/avr/Kconfig +++ b/src/avr/Kconfig @@ -12,6 +12,8 @@ choice bool "atmega168" config MACH_atmega644p bool "atmega644p" + config MACH_at90usb1286 + bool "at90usb1286" config MACH_atmega1280 bool "atmega1280" config MACH_atmega2560 @@ -22,6 +24,7 @@ config MCU string default "atmega168" if MACH_atmega168 default "atmega644p" if MACH_atmega644p + default "at90usb1286" if MACH_at90usb1286 default "atmega1280" if MACH_atmega1280 default "atmega2560" if MACH_atmega2560 @@ -49,7 +52,12 @@ config AVR_STACK_SIZE config AVR_WATCHDOG bool "Support for automated reset on watchdog timeout" default y +config AVR_USBSERIAL + bool + depends on MACH_at90usb1286 + default y config AVR_SERIAL + depends on !AVR_USBSERIAL bool default y config SERIAL_BAUD diff --git a/src/avr/Makefile b/src/avr/Makefile index 758443da..c5e5dba1 100644 --- a/src/avr/Makefile +++ b/src/avr/Makefile @@ -9,6 +9,7 @@ LDFLAGS-y += -Wl,--relax # Add avr source files src-y += avr/main.c avr/timer.c avr/gpio.c avr/alloc.c src-$(CONFIG_AVR_WATCHDOG) += avr/watchdog.c +src-$(CONFIG_AVR_USBSERIAL) += avr/usbserial.c ../lib/pjrc_usb_serial/usb_serial.c src-$(CONFIG_AVR_SERIAL) += avr/serial.c # Build the additional hex output file diff --git a/src/avr/gpio.c b/src/avr/gpio.c index d2cdfbd8..20598dc4 100644 --- a/src/avr/gpio.c +++ b/src/avr/gpio.c @@ -29,7 +29,10 @@ static volatile uint8_t * const digital_regs[] PROGMEM = { #endif &PINB, &PINC, &PIND, #ifdef PINE - &PINE, &PINF, &PING, &PINH, NULL, &PINJ, &PINK, &PINL + &PINE, &PINF, +#endif +#ifdef PING + &PING, &PINH, NULL, &PINJ, &PINK, &PINL #endif }; @@ -64,6 +67,17 @@ static const struct gpio_pwm_info pwm_regs[] PROGMEM = { // { &OCR1B, &TCCR1A, &TCCR1B, 1<<COM1B1, GPIO('D', 4), 0 }, { &OCR2A, &TCCR2A, &TCCR2B, 1<<COM2A1, GPIO('D', 7), GP_8BIT|GP_AFMT }, { &OCR2B, &TCCR2A, &TCCR2B, 1<<COM2B1, GPIO('D', 6), GP_8BIT|GP_AFMT }, +#elif CONFIG_MACH_at90usb1286 + { &OCR0A, &TCCR0A, &TCCR0B, 1<<COM0A1, GPIO('B', 7), GP_8BIT }, + { &OCR0B, &TCCR0A, &TCCR0B, 1<<COM0B1, GPIO('D', 0), GP_8BIT }, +// { &OCR1A, &TCCR1A, &TCCR1B, 1<<COM1A1, GPIO('B', 5), 0 }, +// { &OCR1B, &TCCR1A, &TCCR1B, 1<<COM1B1, GPIO('B', 6), 0 }, +// { &OCR1C, &TCCR1A, &TCCR1B, 1<<COM1C1, GPIO('B', 7), 0 }, + { &OCR2A, &TCCR2A, &TCCR2B, 1<<COM2A1, GPIO('B', 4), GP_8BIT|GP_AFMT }, + { &OCR2B, &TCCR2A, &TCCR2B, 1<<COM2B1, GPIO('D', 1), GP_8BIT|GP_AFMT }, + { &OCR3A, &TCCR3A, &TCCR3B, 1<<COM3A1, GPIO('C', 6), 0 }, + { &OCR3B, &TCCR3A, &TCCR3B, 1<<COM3B1, GPIO('C', 5), 0 }, + { &OCR3C, &TCCR3A, &TCCR3B, 1<<COM3C1, GPIO('C', 4), 0 }, #elif CONFIG_MACH_atmega1280 || CONFIG_MACH_atmega2560 { &OCR0A, &TCCR0A, &TCCR0B, 1<<COM0A1, GPIO('B', 7), GP_8BIT }, { &OCR0B, &TCCR0A, &TCCR0B, 1<<COM0B1, GPIO('G', 5), GP_8BIT }, @@ -95,6 +109,9 @@ static const struct gpio_adc_info adc_pins[] PROGMEM = { #elif CONFIG_MACH_atmega644p { GPIO('A', 0) }, { GPIO('A', 1) }, { GPIO('A', 2) }, { GPIO('A', 3) }, { GPIO('A', 4) }, { GPIO('A', 5) }, { GPIO('A', 6) }, { GPIO('A', 7) }, +#elif CONFIG_MACH_at90usb1286 + { GPIO('F', 0) }, { GPIO('F', 1) }, { GPIO('F', 2) }, { GPIO('F', 3) }, + { GPIO('F', 4) }, { GPIO('F', 5) }, { GPIO('F', 6) }, { GPIO('F', 7) }, #elif CONFIG_MACH_atmega1280 || CONFIG_MACH_atmega2560 { GPIO('F', 0) }, { GPIO('F', 1) }, { GPIO('F', 2) }, { GPIO('F', 3) }, { GPIO('F', 4) }, { GPIO('F', 5) }, { GPIO('F', 6) }, { GPIO('F', 7) }, @@ -107,7 +124,7 @@ static const struct gpio_adc_info adc_pins[] PROGMEM = { static const uint8_t SS = GPIO('B', 2), SCK = GPIO('B', 5), MOSI = GPIO('B', 3); #elif CONFIG_MACH_atmega644p static const uint8_t SS = GPIO('B', 4), SCK = GPIO('B', 7), MOSI = GPIO('B', 5); -#elif CONFIG_MACH_atmega1280 || CONFIG_MACH_atmega2560 +#elif CONFIG_MACH_at90usb1286 || CONFIG_MACH_atmega1280 || CONFIG_MACH_atmega2560 static const uint8_t SS = GPIO('B', 0), SCK = GPIO('B', 1), MOSI = GPIO('B', 2); #endif diff --git a/src/avr/usbserial.c b/src/avr/usbserial.c new file mode 100644 index 00000000..4cf1bd0f --- /dev/null +++ b/src/avr/usbserial.c @@ -0,0 +1,65 @@ +// Wrappers for AVR usb serial. +// +// Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net> +// +// This file may be distributed under the terms of the GNU GPLv3 license. + +#include <avr/interrupt.h> // USART0_RX_vect +#include <string.h> // memmove +#include "../lib/pjrc_usb_serial/usb_serial.h" +#include "sched.h" // DECL_INIT + +#define USBSERIAL_BUFFER_SIZE 64 +static char receive_buf[USBSERIAL_BUFFER_SIZE]; +static uint8_t receive_pos; +static char transmit_buf[USBSERIAL_BUFFER_SIZE]; + +static void +usbserial_init(void) +{ + usb_init(); +} +DECL_INIT(usbserial_init); + +// Return a buffer (and length) containing any incoming messages +char * +console_get_input(uint8_t *plen) +{ + for (;;) { + if (receive_pos >= sizeof(receive_buf)) + break; + int16_t ret = usb_serial_getchar(); + if (ret == -1) + break; + receive_buf[receive_pos++] = ret; + } + *plen = receive_pos; + return receive_buf; +} + +// Remove from the receive buffer the given number of bytes +void +console_pop_input(uint8_t len) +{ + uint8_t needcopy = receive_pos - len; + if (needcopy) + memmove(receive_buf, &receive_buf[len], needcopy); + receive_pos = needcopy; +} + +// Return an output buffer that the caller may fill with transmit messages +char * +console_get_output(uint8_t len) +{ + if (len > sizeof(transmit_buf)) + return NULL; + return transmit_buf; +} + +// Accept the given number of bytes added to the transmit buffer +void +console_push_output(uint8_t len) +{ + usb_serial_write((void*)transmit_buf, len); + usb_serial_flush_output(); +} |