summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBirte Kristina Friesel <derf@finalrewind.org>2024-01-26 20:38:50 +0100
committerBirte Kristina Friesel <derf@finalrewind.org>2024-01-26 20:38:50 +0100
commit218166456b68ca2266c8e7c77c1085ad4fc16e86 (patch)
treed83ca341c6706dcbac806c960d8f8baaadfc0421
parentfc4a1906ff3fa4ce355c3a058b15ed243d8ce7a8 (diff)
ATMega2560: Add stdin and stdout on UART1, UART2, UART3
-rw-r--r--include/arch/atmega2560/driver/stdin1.h30
-rw-r--r--include/arch/atmega2560/driver/stdin2.h30
-rw-r--r--include/arch/atmega2560/driver/stdin3.h30
-rw-r--r--include/arch/atmega2560/driver/stdout1.h24
-rw-r--r--include/arch/atmega2560/driver/stdout2.h24
-rw-r--r--include/arch/atmega2560/driver/stdout3.h24
-rw-r--r--src/arch/atmega2560/Kconfig79
-rw-r--r--src/arch/atmega2560/Makefile.inc24
-rw-r--r--src/arch/atmega2560/driver/stdin1.cc35
-rw-r--r--src/arch/atmega2560/driver/stdin2.cc35
-rw-r--r--src/arch/atmega2560/driver/stdin3.cc35
-rw-r--r--src/arch/atmega2560/driver/stdout1.cc39
-rw-r--r--src/arch/atmega2560/driver/stdout2.cc39
-rw-r--r--src/arch/atmega2560/driver/stdout3.cc39
-rw-r--r--src/driver/Kconfig12
15 files changed, 496 insertions, 3 deletions
diff --git a/include/arch/atmega2560/driver/stdin1.h b/include/arch/atmega2560/driver/stdin1.h
new file mode 100644
index 0000000..c32d1f8
--- /dev/null
+++ b/include/arch/atmega2560/driver/stdin1.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef STANDARDINPUT1_H
+#define STANDARDINPUT1_H
+
+class StandardInput1 {
+ private:
+ StandardInput1(const StandardInput1 &copy);
+ static unsigned char const bufsize = 16;
+ char buffer[bufsize];
+ unsigned char write_pos, read_pos;
+
+ public:
+ StandardInput1() : write_pos(0), read_pos(0) {}
+ void setup();
+ bool hasKey();
+ char getKey();
+
+ inline void addKey(char key) {
+ buffer[write_pos] = key;
+ write_pos = (write_pos + 1) % bufsize;
+ }
+};
+
+extern StandardInput1 kin1;
+
+#endif
diff --git a/include/arch/atmega2560/driver/stdin2.h b/include/arch/atmega2560/driver/stdin2.h
new file mode 100644
index 0000000..3d4c1b4
--- /dev/null
+++ b/include/arch/atmega2560/driver/stdin2.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef STANDARDINPUT2_H
+#define STANDARDINPUT2_H
+
+class StandardInput2 {
+ private:
+ StandardInput2(const StandardInput2 &copy);
+ static unsigned char const bufsize = 16;
+ char buffer[bufsize];
+ unsigned char write_pos, read_pos;
+
+ public:
+ StandardInput2() : write_pos(0), read_pos(0) {}
+ void setup();
+ bool hasKey();
+ char getKey();
+
+ inline void addKey(char key) {
+ buffer[write_pos] = key;
+ write_pos = (write_pos + 1) % bufsize;
+ }
+};
+
+extern StandardInput2 kin2;
+
+#endif
diff --git a/include/arch/atmega2560/driver/stdin3.h b/include/arch/atmega2560/driver/stdin3.h
new file mode 100644
index 0000000..ec80f43
--- /dev/null
+++ b/include/arch/atmega2560/driver/stdin3.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef STANDARDINPUT3_H
+#define STANDARDINPUT3_H
+
+class StandardInput3 {
+ private:
+ StandardInput3(const StandardInput3 &copy);
+ static unsigned char const bufsize = 16;
+ char buffer[bufsize];
+ unsigned char write_pos, read_pos;
+
+ public:
+ StandardInput3() : write_pos(0), read_pos(0) {}
+ void setup();
+ bool hasKey();
+ char getKey();
+
+ inline void addKey(char key) {
+ buffer[write_pos] = key;
+ write_pos = (write_pos + 1) % bufsize;
+ }
+};
+
+extern StandardInput3 kin3;
+
+#endif
diff --git a/include/arch/atmega2560/driver/stdout1.h b/include/arch/atmega2560/driver/stdout1.h
new file mode 100644
index 0000000..5ca03bb
--- /dev/null
+++ b/include/arch/atmega2560/driver/stdout1.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2021 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef STANDARDOUTPUT1_H
+#define STANDARDOUTPUT1_H
+
+#include "object/outputstream.h"
+
+class StandardOutput1 : public OutputStream {
+ private:
+ StandardOutput1(const StandardOutput1 &copy);
+
+ public:
+ StandardOutput1 () {}
+ void setup();
+
+ virtual void put(char c) override;
+};
+
+extern StandardOutput1 kout1;
+
+#endif
diff --git a/include/arch/atmega2560/driver/stdout2.h b/include/arch/atmega2560/driver/stdout2.h
new file mode 100644
index 0000000..6930ee5
--- /dev/null
+++ b/include/arch/atmega2560/driver/stdout2.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2021 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef STANDARDOUTPUT2_H
+#define STANDARDOUTPUT2_H
+
+#include "object/outputstream.h"
+
+class StandardOutput2 : public OutputStream {
+ private:
+ StandardOutput2(const StandardOutput2 &copy);
+
+ public:
+ StandardOutput2 () {}
+ void setup();
+
+ virtual void put(char c) override;
+};
+
+extern StandardOutput2 kout2;
+
+#endif
diff --git a/include/arch/atmega2560/driver/stdout3.h b/include/arch/atmega2560/driver/stdout3.h
new file mode 100644
index 0000000..290bded
--- /dev/null
+++ b/include/arch/atmega2560/driver/stdout3.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2021 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef STANDARDOUTPUT3_H
+#define STANDARDOUTPUT3_H
+
+#include "object/outputstream.h"
+
+class StandardOutput3 : public OutputStream {
+ private:
+ StandardOutput3(const StandardOutput3 &copy);
+
+ public:
+ StandardOutput3 () {}
+ void setup();
+
+ virtual void put(char c) override;
+};
+
+extern StandardOutput3 kout3;
+
+#endif
diff --git a/src/arch/atmega2560/Kconfig b/src/arch/atmega2560/Kconfig
index 31ad215..d93a808 100644
--- a/src/arch/atmega2560/Kconfig
+++ b/src/arch/atmega2560/Kconfig
@@ -2,8 +2,22 @@
#
# SPDX-License-Identifier: CC0-1.0
-config arch_atmega2560_driver_dmx
-bool "DMX"
+config arch_atmega2560_driver_dmx1
+bool "DMX1 Output on PD3 (D18)"
+help
+ TX: PD3 (UART1) (D18)
+select meta_driver_dmx
+
+config arch_atmega2560_driver_dmx2
+bool "DMX2 Output on PH1 (D16)"
+help
+ TX: PH1 (UART2) (D16)
+select meta_driver_dmx
+
+config arch_atmega2560_driver_dmx3
+bool "DMX3 Output on PJ1 (D14)"
+help
+ TX: PJ1 (UART3) (D14)
select meta_driver_dmx
config arch_atmega2560_driver_i2c
@@ -11,10 +25,69 @@ bool "I2C"
select meta_driver_hardware_i2c
select meta_driver_i2c
+config arch_atmega2560_driver_stdout1
+bool "UART1 Output on PD3 (D18)"
+help
+ TX: PD3 (UART1) (D18)
+select meta_driver_stdout1
+
+config arch_atmega2560_uart1_baud
+int "UART1 Baud Rate"
+range 9600 249600
+default 57600
+depends on arch_atmega2560_driver_stdout1
+
+config arch_atmega2560_driver_stdout2
+bool "UART2 Output on PH1 (D16)"
+help
+ TX: PH1 (UART2) (D16)
+select meta_driver_stdout2
+
+config arch_atmega2560_uart2_baud
+int "UART2 Baud Rate"
+range 9600 249600
+default 57600
+depends on arch_atmega2560_driver_stdout2
+
+config arch_atmega2560_driver_stdout3
+bool "UART3 Output on PJ1 (D14)"
+help
+ TX: PJ1 (UART3) (D14)
+select meta_driver_stdout3
+
+config arch_atmega2560_uart3_baud
+int "UART3 Baud Rate"
+range 9600 249600
+default 57600
+depends on arch_atmega2560_driver_stdout3
+
config arch_atmega2560_driver_stdin
-bool "UART Input"
+bool "UART0 Input on PE0 (RX)"
+help
+ RX: PE0 (UART0) (RX)
select meta_driver_stdin
+config arch_atmega2560_driver_stdin1
+bool "UART1 Input on PD2 (D19)"
+help
+ RX: PD2 (UART1) (D19)
+depends on arch_atmega2560_driver_stdout1
+select meta_driver_stdin1
+
+config arch_atmega2560_driver_stdin2
+bool "UART2 Input on PH0 (D17)"
+help
+ RX: PH0 (UART2) (D17)
+depends on arch_atmega2560_driver_stdout2
+select meta_driver_stdin2
+
+config arch_atmega2560_driver_stdin3
+bool "UART3 Input on PE0 (RX)"
+help
+ RX: PE0 (UART0) (RX)
+depends on arch_atmega2560_driver_stdout3
+select meta_driver_stdin3
+
config arch_atmega2560_driver_timer
bool "Timer with Interrupts"
select meta_driver_timer
diff --git a/src/arch/atmega2560/Makefile.inc b/src/arch/atmega2560/Makefile.inc
index d7a6b05..39821da 100644
--- a/src/arch/atmega2560/Makefile.inc
+++ b/src/arch/atmega2560/Makefile.inc
@@ -91,10 +91,34 @@ ifdef CONFIG_arch_atmega2560_driver_spi
CXX_TARGETS += src/arch/atmega2560/driver/spi.cc
endif
+ifdef CONFIG_arch_atmega2560_driver_stdout1
+ CXX_TARGETS += src/arch/atmega2560/driver/stdout1.cc
+endif
+
+ifdef CONFIG_arch_atmega2560_driver_stdout2
+ CXX_TARGETS += src/arch/atmega2560/driver/stdout2.cc
+endif
+
+ifdef CONFIG_arch_atmega2560_driver_stdout3
+ CXX_TARGETS += src/arch/atmega2560/driver/stdout3.cc
+endif
+
ifdef CONFIG_arch_atmega2560_driver_stdin
CXX_TARGETS += src/arch/atmega2560/driver/stdin.cc
endif
+ifdef CONFIG_arch_atmega2560_driver_stdin1
+ CXX_TARGETS += src/arch/atmega2560/driver/stdin1.cc
+endif
+
+ifdef CONFIG_arch_atmega2560_driver_stdin2
+ CXX_TARGETS += src/arch/atmega2560/driver/stdin2.cc
+endif
+
+ifdef CONFIG_arch_atmega2560_driver_stdin3
+ CXX_TARGETS += src/arch/atmega2560/driver/stdin3.cc
+endif
+
ifdef CONFIG_arch_atmega2560_driver_timer
CXX_TARGETS += src/arch/atmega2560/driver/timer.cc
endif
diff --git a/src/arch/atmega2560/driver/stdin1.cc b/src/arch/atmega2560/driver/stdin1.cc
new file mode 100644
index 0000000..85b825b
--- /dev/null
+++ b/src/arch/atmega2560/driver/stdin1.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "driver/stdin1.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+void StandardInput1::setup()
+{
+ UCSR1B |= _BV(RXCIE1);
+}
+
+bool StandardInput1::hasKey()
+{
+ if (write_pos != read_pos) {
+ return true;
+ }
+ return false;
+}
+
+char StandardInput1::getKey()
+{
+ char ret = buffer[read_pos++];
+ read_pos %= bufsize;
+ return ret;
+}
+
+StandardInput1 kin1;
+
+ISR(USART1_RX_vect)
+{
+ kin1.addKey(UDR1);
+}
diff --git a/src/arch/atmega2560/driver/stdin2.cc b/src/arch/atmega2560/driver/stdin2.cc
new file mode 100644
index 0000000..f807e26
--- /dev/null
+++ b/src/arch/atmega2560/driver/stdin2.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "driver/stdin2.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+void StandardInput2::setup()
+{
+ UCSR2B |= _BV(RXCIE2);
+}
+
+bool StandardInput2::hasKey()
+{
+ if (write_pos != read_pos) {
+ return true;
+ }
+ return false;
+}
+
+char StandardInput2::getKey()
+{
+ char ret = buffer[read_pos++];
+ read_pos %= bufsize;
+ return ret;
+}
+
+StandardInput2 kin2;
+
+ISR(USART2_RX_vect)
+{
+ kin2.addKey(UDR2);
+}
diff --git a/src/arch/atmega2560/driver/stdin3.cc b/src/arch/atmega2560/driver/stdin3.cc
new file mode 100644
index 0000000..7b32fe6
--- /dev/null
+++ b/src/arch/atmega2560/driver/stdin3.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "driver/stdin3.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+void StandardInput3::setup()
+{
+ UCSR3B |= _BV(RXCIE3);
+}
+
+bool StandardInput3::hasKey()
+{
+ if (write_pos != read_pos) {
+ return true;
+ }
+ return false;
+}
+
+char StandardInput3::getKey()
+{
+ char ret = buffer[read_pos++];
+ read_pos %= bufsize;
+ return ret;
+}
+
+StandardInput3 kin3;
+
+ISR(USART3_RX_vect)
+{
+ kin3.addKey(UDR3);
+}
diff --git a/src/arch/atmega2560/driver/stdout1.cc b/src/arch/atmega2560/driver/stdout1.cc
new file mode 100644
index 0000000..e686237
--- /dev/null
+++ b/src/arch/atmega2560/driver/stdout1.cc
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2024 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "driver/stdout1.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+#undef BAUD
+#define BAUD CONFIG_arch_atmega2560_uart1_baud
+
+#include <util/setbaud.h>
+
+void StandardOutput1::setup()
+{
+ UBRR1H = UBRRH_VALUE;
+ UBRR1L = UBRRL_VALUE;
+
+#if USE_2X
+ UCSR1A |= _BV(U2X1);
+#else
+ UCSR1A &= ~_BV(U2X1);
+#endif
+
+ UCSR1B |= _BV(RXEN1) | _BV(TXEN1);
+ UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
+}
+
+void StandardOutput1::put(char c)
+{
+ while (!(UCSR1A & _BV(UDRE1)));
+ UDR1 = c;
+ if (c == '\n') {
+ put('\r');
+ }
+}
+
+StandardOutput1 kout1;
diff --git a/src/arch/atmega2560/driver/stdout2.cc b/src/arch/atmega2560/driver/stdout2.cc
new file mode 100644
index 0000000..254226e
--- /dev/null
+++ b/src/arch/atmega2560/driver/stdout2.cc
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2024 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "driver/stdout2.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+#undef BAUD
+#define BAUD CONFIG_arch_atmega2560_uart2_baud
+
+#include <util/setbaud.h>
+
+void StandardOutput2::setup()
+{
+ UBRR2H = UBRRH_VALUE;
+ UBRR2L = UBRRL_VALUE;
+
+#if USE_2X
+ UCSR2A |= _BV(U2X2);
+#else
+ UCSR2A &= ~_BV(U2X2);
+#endif
+
+ UCSR2B |= _BV(RXEN2) | _BV(TXEN2);
+ UCSR2C = _BV(UCSZ21) | _BV(UCSZ20);
+}
+
+void StandardOutput2::put(char c)
+{
+ while (!(UCSR2A & _BV(UDRE2)));
+ UDR2 = c;
+ if (c == '\n') {
+ put('\r');
+ }
+}
+
+StandardOutput2 kout2;
diff --git a/src/arch/atmega2560/driver/stdout3.cc b/src/arch/atmega2560/driver/stdout3.cc
new file mode 100644
index 0000000..451a043
--- /dev/null
+++ b/src/arch/atmega2560/driver/stdout3.cc
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2024 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "driver/stdout3.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+#undef BAUD
+#define BAUD CONFIG_arch_atmega2560_uart3_baud
+
+#include <util/setbaud.h>
+
+void StandardOutput3::setup()
+{
+ UBRR3H = UBRRH_VALUE;
+ UBRR3L = UBRRL_VALUE;
+
+#if USE_2X
+ UCSR3A |= _BV(U2X3);
+#else
+ UCSR3A &= ~_BV(U2X3);
+#endif
+
+ UCSR3B |= _BV(RXEN3) | _BV(TXEN3);
+ UCSR3C = _BV(UCSZ31) | _BV(UCSZ30);
+}
+
+void StandardOutput3::put(char c)
+{
+ while (!(UCSR3A & _BV(UDRE3)));
+ UDR3 = c;
+ if (c == '\n') {
+ put('\r');
+ }
+}
+
+StandardOutput3 kout3;
diff --git a/src/driver/Kconfig b/src/driver/Kconfig
index eff39d0..2d9f16b 100644
--- a/src/driver/Kconfig
+++ b/src/driver/Kconfig
@@ -18,6 +18,18 @@ config meta_driver_spi
bool
config meta_driver_stdin
bool
+config meta_driver_stdin1
+bool
+config meta_driver_stdin2
+bool
+config meta_driver_stdin3
+bool
+config meta_driver_stdout1
+bool
+config meta_driver_stdout2
+bool
+config meta_driver_stdout3
+bool
config meta_driver_timer
bool
config meta_driver_uptime