summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBirte Kristina Friesel <derf@finalrewind.org>2024-01-26 23:21:42 +0100
committerBirte Kristina Friesel <derf@finalrewind.org>2024-01-26 23:21:42 +0100
commit021e08eba3272e3e3f30b6175464e48792dff1d1 (patch)
tree83866ba4bf3dcaeb6bbe5191813a4bb105c0620a
parent218166456b68ca2266c8e7c77c1085ad4fc16e86 (diff)
atmega2560: provide one DMX driver per extra UART
-rw-r--r--include/arch/atmega2560/driver/dmx1.h (renamed from include/arch/atmega2560/driver/dmx.h)8
-rw-r--r--include/arch/atmega2560/driver/dmx2.h21
-rw-r--r--include/arch/atmega2560/driver/dmx3.h21
-rw-r--r--src/arch/atmega2560/Kconfig3
-rw-r--r--src/arch/atmega2560/Makefile.inc12
-rw-r--r--src/arch/atmega2560/driver/dmx1.cc53
-rw-r--r--src/arch/atmega2560/driver/dmx2.cc53
-rw-r--r--src/arch/atmega2560/driver/dmx3.cc (renamed from src/arch/atmega2560/driver/dmx.cc)8
-rw-r--r--src/driver/Kconfig6
9 files changed, 175 insertions, 10 deletions
diff --git a/include/arch/atmega2560/driver/dmx.h b/include/arch/atmega2560/driver/dmx1.h
index 444cb26..2f738b8 100644
--- a/include/arch/atmega2560/driver/dmx.h
+++ b/include/arch/atmega2560/driver/dmx1.h
@@ -4,18 +4,18 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
-class DMX {
+class DMX1 {
private:
- DMX(const DMX &copy);
+ DMX1(const DMX1 &copy);
public:
static unsigned char const num_frames = 32;
unsigned char frames[num_frames];
- DMX() {}
+ DMX1() {}
void setup();
void write();
};
-extern DMX dmx;
+extern DMX1 dmx1;
diff --git a/include/arch/atmega2560/driver/dmx2.h b/include/arch/atmega2560/driver/dmx2.h
new file mode 100644
index 0000000..1c8cd67
--- /dev/null
+++ b/include/arch/atmega2560/driver/dmx2.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2022 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+class DMX2 {
+ private:
+ DMX2(const DMX2 &copy);
+
+ public:
+ static unsigned char const num_frames = 32;
+ unsigned char frames[num_frames];
+
+ DMX2() {}
+
+ void setup();
+ void write();
+};
+
+extern DMX2 dmx2;
diff --git a/include/arch/atmega2560/driver/dmx3.h b/include/arch/atmega2560/driver/dmx3.h
new file mode 100644
index 0000000..c8541bf
--- /dev/null
+++ b/include/arch/atmega2560/driver/dmx3.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2022 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+class DMX3 {
+ private:
+ DMX3(const DMX3 &copy);
+
+ public:
+ static unsigned char const num_frames = 32;
+ unsigned char frames[num_frames];
+
+ DMX3() {}
+
+ void setup();
+ void write();
+};
+
+extern DMX3 dmx3;
diff --git a/src/arch/atmega2560/Kconfig b/src/arch/atmega2560/Kconfig
index d93a808..a2814b0 100644
--- a/src/arch/atmega2560/Kconfig
+++ b/src/arch/atmega2560/Kconfig
@@ -7,18 +7,21 @@ bool "DMX1 Output on PD3 (D18)"
help
TX: PD3 (UART1) (D18)
select meta_driver_dmx
+select meta_driver_dmx1
config arch_atmega2560_driver_dmx2
bool "DMX2 Output on PH1 (D16)"
help
TX: PH1 (UART2) (D16)
select meta_driver_dmx
+select meta_driver_dmx2
config arch_atmega2560_driver_dmx3
bool "DMX3 Output on PJ1 (D14)"
help
TX: PJ1 (UART3) (D14)
select meta_driver_dmx
+select meta_driver_dmx3
config arch_atmega2560_driver_i2c
bool "I2C"
diff --git a/src/arch/atmega2560/Makefile.inc b/src/arch/atmega2560/Makefile.inc
index 39821da..6d82a1c 100644
--- a/src/arch/atmega2560/Makefile.inc
+++ b/src/arch/atmega2560/Makefile.inc
@@ -83,8 +83,16 @@ ifdef CONFIG_arch_atmega2560_driver_adc
CXX_TARGETS += src/arch/atmega2560/driver/adc.cc
endif
-ifdef CONFIG_arch_atmega2560_driver_dmx
- CXX_TARGETS += src/arch/atmega2560/driver/dmx.cc
+ifdef CONFIG_arch_atmega2560_driver_dmx1
+ CXX_TARGETS += src/arch/atmega2560/driver/dmx1.cc
+endif
+
+ifdef CONFIG_arch_atmega2560_driver_dmx2
+ CXX_TARGETS += src/arch/atmega2560/driver/dmx2.cc
+endif
+
+ifdef CONFIG_arch_atmega2560_driver_dmx3
+ CXX_TARGETS += src/arch/atmega2560/driver/dmx3.cc
endif
ifdef CONFIG_arch_atmega2560_driver_spi
diff --git a/src/arch/atmega2560/driver/dmx1.cc b/src/arch/atmega2560/driver/dmx1.cc
new file mode 100644
index 0000000..1724591
--- /dev/null
+++ b/src/arch/atmega2560/driver/dmx1.cc
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2022 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include <avr/io.h>
+#include "arch.h"
+#include "driver/dmx1.h"
+#include "driver/gpio.h"
+
+#undef BAUD
+#define BAUD 250000UL
+#include <util/setbaud.h>
+
+void DMX1::setup()
+{
+ UBRR1H = UBRRH_VALUE;
+ UBRR1L = UBRRL_VALUE;
+
+#if USE_2X
+ UCSR1A |= _BV(U2X1);
+#else
+ UCSR1A &= ~_BV(U2X1);
+#endif
+
+ UCSR1B = _BV(TXEN1);
+ UCSR1C = _BV(USBS1) | _BV(UCSZ11) | _BV(UCSZ10); // MSB first, 8 data bits, 2 stop bits, no parity
+}
+
+void DMX1::write()
+{
+ // Disable UART for reset and mark signals
+ UCSR1B &= ~_BV(TXEN1);
+ gpio.output(GPIO::pd3, 0);
+ arch.delay_us(88); // break / reset
+ gpio.output(GPIO::pd3, 1);
+ arch.delay_us(8); // mark
+ UCSR1B |= _BV(TXEN1); // causes line to go high
+ for (uint8_t i = 0; i < 32; i++) {
+ while (!(UCSR1A & _BV(UDRE1)));
+ UDR1 = frames[i];
+ }
+ for (uint8_t i = 0; i < 258 - num_frames; i++) {
+ while (!(UCSR1A & _BV(UDRE1)));
+ UDR1 = 0;
+ }
+ for (uint8_t i = 0; i < 255; i++) {
+ while (!(UCSR1A & _BV(UDRE1)));
+ UDR1 = 0;
+ }
+}
+
+DMX1 dmx1;
diff --git a/src/arch/atmega2560/driver/dmx2.cc b/src/arch/atmega2560/driver/dmx2.cc
new file mode 100644
index 0000000..9b5d35f
--- /dev/null
+++ b/src/arch/atmega2560/driver/dmx2.cc
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2022 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include <avr/io.h>
+#include "arch.h"
+#include "driver/dmx2.h"
+#include "driver/gpio.h"
+
+#undef BAUD
+#define BAUD 250000UL
+#include <util/setbaud.h>
+
+void DMX2::setup()
+{
+ UBRR2H = UBRRH_VALUE;
+ UBRR2L = UBRRL_VALUE;
+
+#if USE_2X
+ UCSR2A |= _BV(U2X2);
+#else
+ UCSR2A &= ~_BV(U2X2);
+#endif
+
+ UCSR2B = _BV(TXEN2);
+ UCSR2C = _BV(USBS2) | _BV(UCSZ21) | _BV(UCSZ20); // MSB first, 8 data bits, 2 stop bits, no parity
+}
+
+void DMX2::write()
+{
+ // Disable UART for reset and mark signals
+ UCSR2B &= ~_BV(TXEN2);
+ gpio.output(GPIO::ph1, 0);
+ arch.delay_us(88); // break / reset
+ gpio.output(GPIO::ph1, 1);
+ arch.delay_us(8); // mark
+ UCSR2B |= _BV(TXEN2); // causes line to go high
+ for (uint8_t i = 0; i < 32; i++) {
+ while (!(UCSR2A & _BV(UDRE2)));
+ UDR2 = frames[i];
+ }
+ for (uint8_t i = 0; i < 258 - num_frames; i++) {
+ while (!(UCSR2A & _BV(UDRE2)));
+ UDR2 = 0;
+ }
+ for (uint8_t i = 0; i < 255; i++) {
+ while (!(UCSR2A & _BV(UDRE2)));
+ UDR2 = 0;
+ }
+}
+
+DMX2 dmx2;
diff --git a/src/arch/atmega2560/driver/dmx.cc b/src/arch/atmega2560/driver/dmx3.cc
index 894ef99..0f6db4e 100644
--- a/src/arch/atmega2560/driver/dmx.cc
+++ b/src/arch/atmega2560/driver/dmx3.cc
@@ -5,14 +5,14 @@
*/
#include <avr/io.h>
#include "arch.h"
-#include "driver/dmx.h"
+#include "driver/dmx3.h"
#include "driver/gpio.h"
#undef BAUD
#define BAUD 250000UL
#include <util/setbaud.h>
-void DMX::setup()
+void DMX3::setup()
{
UBRR3H = UBRRH_VALUE;
UBRR3L = UBRRL_VALUE;
@@ -27,7 +27,7 @@ void DMX::setup()
UCSR3C = _BV(USBS3) | _BV(UCSZ31) | _BV(UCSZ30); // MSB first, 8 data bits, 2 stop bits, no parity
}
-void DMX::write()
+void DMX3::write()
{
// Disable UART for reset and mark signals
UCSR3B &= ~_BV(TXEN3);
@@ -50,4 +50,4 @@ void DMX::write()
}
}
-DMX dmx;
+DMX3 dmx3;
diff --git a/src/driver/Kconfig b/src/driver/Kconfig
index 2d9f16b..b71b963 100644
--- a/src/driver/Kconfig
+++ b/src/driver/Kconfig
@@ -8,6 +8,12 @@ config meta_driver_counter
bool
config meta_driver_dmx
bool
+config meta_driver_dmx1
+bool
+config meta_driver_dmx2
+bool
+config meta_driver_dmx3
+bool
config meta_driver_hardware_i2c
bool
config meta_driver_i2c