@@ -1,5 +1,5 @@
#
-# Makefile - Makefile of the ATUSB firmware
+# Makefile - Makefile of the ATUSB firmware
#
# Written 2010-2011, 2013 by Werner Almesberger
# Copyright 2010-2011, 2013 by Werner Almesberger
@@ -13,11 +13,16 @@
SHELL = /bin/bash
NAME = atusb
+DEBUG = false
CFLAGS = -g -mmcu=$(CHIP) -DBOOT_ADDR=$(BOOT_ADDR) \
-Wall -Wextra -Wshadow -Werror -Wno-unused-parameter \
-Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes
+ifeq ($(DEBUG),true)
+CFLAGS += -DDEBUG
+endif
+
ifeq ($(NAME),rzusb)
CHIP=at90usb1287
CFLAGS += -DRZUSB -DAT86RF230
@@ -46,6 +51,9 @@ OBJS = atusb.o board.o board_app.o sernum.o spi.o descr.o ep0.o \
BOOT_OBJS = boot.o board.o sernum.o spi.o flash.o dfu.o \
dfu_common.o usb.o boot-atu2.o
+ifeq ($(DEBUG),true)
+OBJS += uart.o
+endif
ifeq ($(NAME),rzusb)
OBJS += board_rzusb.o
@@ -24,6 +24,10 @@
#include "spi.h"
#include "atusb/ep0.h"
+#ifdef DEBUG
+#include "uart.h"
+#endif
+
int main(void)
{
@@ -35,6 +39,13 @@ int main(void)
/* now we should be at 8 MHz */
+#ifdef DEBUG
+ uart_init();
+ static FILE atben_stdout = FDEV_SETUP_STREAM(uart_write_char, NULL,
+ _FDEV_SETUP_WRITE);
+ stdout = &atben_stdout;
+#endif
+
usb_init();
ep0_init();
#ifdef ATUSB
@@ -45,8 +45,15 @@
#define HW_TYPE HW_TYPE_RZUSB
#endif
+#ifdef DEBUG
+#include "uart.h"
+#include <stdio.h>
+#define debug(FORMAT,args...) printf(FORMAT,##args)
+#define error(FORMAT,args...) printf(FORMAT,##args)
+#else
#define debug(...)
#define error(...)
+#endif
static const uint8_t id[] = { EP0ATUSB_MAJOR, EP0ATUSB_MINOR, HW_TYPE };
new file mode 100644
@@ -0,0 +1,64 @@
+/*
+ * fw/uart.h - Functions needed for debugging over uart
+ *
+ * Code adapted from http://www.roboternetz.de/wissen/index.php/UART_mit_avr-gcc
+ * and http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
+ *
+ * Published under the Creative Commons Share-Alike licence
+ * https://creativecommons.org/licenses/by-sa/2.0/de/
+ *
+ * S. Salewski 2007
+ *
+ * Adapted by
+ * Josef Filzmaier 2017
+ */
+
+#include <avr/io.h>
+#include "uart.h"
+
+#define USART_BAUD 38400UL
+#define F_CPU 8000000UL
+
+#define Wait_USART_Ready() while (!(UCSR1A & (1<<UDRE1)))
+#define UART_UBRR (F_CPU/(16L*USART_BAUD)-1)
+
+// initialize USART, 8N1 mode
+void
+uart_init(void)
+{
+/* TODO: Find a working configuration for uart for the atmega32u2 */
+#if CHIP == at90usb1287
+ CLKPR = (1 << CLKPCE);
+ CLKPR = 0; // clock prescaler == 0, so we have 16 MHz mpu frequency
+ UBRR1 = UART_UBRR;
+ UCSR1C = (1 << UCSZ10) | (1 << UCSZ11);
+ UCSR1B = (1 << TXEN1);
+ do
+ {
+ UDR1;
+ }
+ while (UCSR1A & (1 << RXC1));
+#endif
+
+}
+
+int uart_write_char(char c, FILE* stream)
+{
+ if (c == '\n'){
+ uart_new_line();
+ }
+ else {
+ Wait_USART_Ready();
+ UDR1 = c;
+ }
+ return 0;
+}
+
+void
+uart_new_line(void)
+{
+ Wait_USART_Ready();
+ UDR1 = '\r';
+ Wait_USART_Ready();
+ UDR1 = '\n';
+}
new file mode 100644
@@ -0,0 +1,25 @@
+/*
+ * fw/uart.h - Functions needed for debugging over uart
+ *
+ * Code adapted from http://www.roboternetz.de/wissen/index.php/UART_mit_avr-gcc
+ * and http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
+ *
+ * Published under the Creative Commons Share-Alike licence
+ * https://creativecommons.org/licenses/by-sa/2.0/de/
+ *
+ * S. Salewski 2007
+ *
+ * Adapted by
+ * Josef Filzmaier 2017
+ */
+
+#ifndef UART_H_
+#define UART_H_
+
+#include <stdio.h>
+
+void uart_init(void);
+int uart_write_char(char c, FILE* stream);
+void uart_new_line(void);
+
+#endif /* UART_H_ */
This flag can be used to enable debugging over uart. Currently only available for boards with the at90usb1287 chip. Signed-off-by: Josef Filzmaier <j.filzmaier@gmx.at> --- atusb/fw/Makefile | 10 ++++++++- atusb/fw/atusb.c | 11 ++++++++++ atusb/fw/ep0.c | 7 ++++++ atusb/fw/uart.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ atusb/fw/uart.h | 25 ++++++++++++++++++++++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 atusb/fw/uart.c create mode 100644 atusb/fw/uart.h