aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/e300/rev_c/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/e300/rev_c/debug.c')
-rw-r--r--firmware/e300/rev_c/debug.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/firmware/e300/rev_c/debug.c b/firmware/e300/rev_c/debug.c
new file mode 100644
index 000000000..ff7d09445
--- /dev/null
+++ b/firmware/e300/rev_c/debug.c
@@ -0,0 +1,297 @@
+/*
+ * debug.c
+ */
+
+#include "config.h"
+#include "debug.h"
+
+#include <util/delay.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+#include "io.h"
+#include "power.h"
+#include "global.h"
+
+#define DEBUG_BLINK_DELAY 250 // ms
+
+#ifdef ATTINY88_DIP
+
+#define SERIAL_DEBUG_INDEX 6
+#define SERIAL_DEBUG_PORT PORTD
+static io_pin_t SERIAL_DEBUG = IO_PD(SERIAL_DEBUG_INDEX);
+
+#else
+/*
+#ifdef I2C_REWORK
+//static io_pin_t SERIAL_DEBUG = IO_PC(1); // EN1
+#else
+//static io_pin_t SERIAL_DEBUG = EN4;
+#endif // I2C_REWORK
+*/
+// No good: PWR_EN4 trace still connected to LTC3675
+//#define SERIAL_DEBUG_INDEX 1
+//#define SERIAL_DEBUG_PORT PORTA
+//static io_pin_t SERIAL_DEBUG = IO_PA(SERIAL_DEBUG_INDEX);
+
+// AVR_MISO
+#define SERIAL_DEBUG_INDEX 4
+#define SERIAL_DEBUG_PORT PORTB
+static io_pin_t SERIAL_DEBUG = IO_PB(SERIAL_DEBUG_INDEX);
+
+#endif // ATTINY88_DIP
+/*
+#ifdef DEBUG
+
+#else
+
+#endif // DEBUG
+*/
+#ifdef DEBUG
+
+#ifdef ATTINY88_DIP
+static io_pin_t DEBUG_1 = IO_PB(6);
+static io_pin_t DEBUG_2 = IO_PB(7);
+#endif // ATTINY88_DIP
+
+void debug_init()
+{
+ io_output_pin(DEBUG_1);
+ io_output_pin(DEBUG_2);
+
+ io_enable_pin(DEBUG_1, true);
+ io_enable_pin(DEBUG_2, true);
+#ifdef ENABLE_SERIAL
+ io_set_pin(SERIAL_DEBUG);
+ io_output_pin(SERIAL_DEBUG);
+#endif // ENABLE_SERIAL
+}
+
+#else
+
+void debug_init()
+{
+#ifdef ENABLE_SERIAL
+ io_set_pin(SERIAL_DEBUG);
+ io_output_pin(SERIAL_DEBUG);
+#endif // ENABLE_SERIAL
+}
+
+#endif // DEBUG
+
+#if defined(DEBUG) && !defined(DEBUG_VOID)
+
+void debug_set(io_pin_t pin, bool enable)
+{
+ io_enable_pin(pin, !enable);
+}
+
+void debug_blink(uint8_t count)
+{
+ io_enable_pin(DEBUG_1, false);
+ io_enable_pin(DEBUG_2, true);
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+
+ for (; count > 0; count--) {
+ io_enable_pin(DEBUG_2, false);
+ _delay_ms(DEBUG_BLINK_DELAY);
+ io_enable_pin(DEBUG_2, true);
+ _delay_ms(DEBUG_BLINK_DELAY);
+ }
+
+ io_enable_pin(DEBUG_1, true);
+ io_enable_pin(DEBUG_2, true);
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+}
+
+void debug_blink_rev(uint8_t count)
+{
+ io_enable_pin(DEBUG_2, false);
+ io_enable_pin(DEBUG_1, true);
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+
+ for (; count > 0; count--) {
+ io_enable_pin(DEBUG_1, false);
+ _delay_ms(DEBUG_BLINK_DELAY);
+ io_enable_pin(DEBUG_1, true);
+ _delay_ms(DEBUG_BLINK_DELAY);
+ }
+
+ io_enable_pin(DEBUG_2, true);
+ io_enable_pin(DEBUG_1, true);
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+}
+
+void debug_blink2(uint8_t count)
+{
+ io_enable_pin(DEBUG_1, true);
+ io_enable_pin(DEBUG_2, true);
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+
+ bool b = false;
+ for (; count > 0; count--) {
+ io_enable_pin(DEBUG_1, b);
+ io_enable_pin(DEBUG_2, b);
+ _delay_ms(DEBUG_BLINK_DELAY);
+ b = !b;
+ }
+
+ io_enable_pin(DEBUG_1, true);
+ io_enable_pin(DEBUG_2, true);
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+}
+
+void debug_wait(void)
+{
+ io_enable_pin(DEBUG_1, true);
+ io_enable_pin(DEBUG_2, true);
+
+ bool b = false;
+ while (true)
+ {
+ io_enable_pin(DEBUG_1, b);
+ io_enable_pin(DEBUG_2, !b);
+
+ _delay_ms(DEBUG_BLINK_DELAY);
+
+ b = !b;
+ }
+
+ io_enable_pin(DEBUG_1, true);
+ io_enable_pin(DEBUG_2, true);
+}
+
+#else
+
+#ifndef DEBUG_VOID
+
+void debug_blink_rev(uint8_t count)
+{
+ charge_set_led(true);
+ _delay_ms(DEBUG_BLINK_DELAY * 4);
+
+ for (; count > 0; count--) {
+ charge_set_led(false);
+ _delay_ms(DEBUG_BLINK_DELAY);
+ charge_set_led(true);
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+ }
+
+ _delay_ms(DEBUG_BLINK_DELAY * 2);
+ charge_set_led(false);
+ _delay_ms(DEBUG_BLINK_DELAY * 4);
+}
+#endif // DEBUG_VOID
+
+#endif // DEBUG
+
+#ifdef ENABLE_SERIAL
+
+static void _serial_tx(uint8_t* buffer)
+{
+ //uint8_t time_fix = 0;
+ // 3333/2 - 10
+ // 650
+ // [-2 for DEV] -20 works (perhaps different USB-Serial converter)
+ // [-20 for PRD] Which board?
+ // +20 Board #5 (-0: 3.592, -10: 3.280)
+ const uint16_t delay = 650+20;
+ uint16_t countdown;
+
+ for (uint8_t j = 0; j < 10; ++j)
+ {
+ if (buffer[j])
+ SERIAL_DEBUG_PORT |= _BV(SERIAL_DEBUG_INDEX);
+ else
+ SERIAL_DEBUG_PORT &= ~_BV(SERIAL_DEBUG_INDEX);
+
+ countdown = delay;
+ while (--countdown)
+ __asm("nop");
+ }
+}
+
+static void _serial_tx_char(char c)
+{
+ uint8_t buffer[10];
+ uint8_t i = 0;
+
+ buffer[i++] = 0; // START
+ for (int idx = 0; idx < 8; ++idx)
+ buffer[i++] = (((uint8_t)(c) & ((uint8_t)1<<((idx)))) ? 0x01 : 0x00); // Endianness: 7-
+ buffer[i++] = 1; // STOP
+
+ _serial_tx(buffer);
+}
+
+void debug_log_ex_P(const char* message, bool new_line)
+{
+ char c = pgm_read_byte(message);
+ if (c == '\0')
+ return;
+
+ pmc_mask_irqs(true);
+
+ do
+ {
+ _serial_tx_char(c);
+ c = pgm_read_byte(++message);
+ } while (c != '\0');
+
+ if (new_line)
+ _serial_tx_char('\n');
+
+ io_set_pin(SERIAL_DEBUG);
+
+ pmc_mask_irqs(false);
+}
+
+void _debug_log_ex(const char* message, bool new_line)
+{
+ if (message[0] == '\0')
+ return;
+
+ pmc_mask_irqs(true);
+
+ do
+ {
+ _serial_tx_char(*message);
+ } while (*(++message) != '\0');
+
+ if (new_line)
+ _serial_tx_char('\n');
+
+ io_set_pin(SERIAL_DEBUG);
+
+ pmc_mask_irqs(false);
+}
+
+void debug_log_byte_ex(uint8_t n, bool new_line)
+{
+ char ch[4];
+ ch[0] = '0' + (n / 100);
+ ch[1] = '0' + ((n % 100) / 10);
+ ch[2] = '0' + (n % 10);
+ ch[3] = '\0';
+ _debug_log_ex(ch, new_line);
+}
+
+void debug_log_hex_ex(uint8_t n, bool new_line)
+{
+ char ch[4];
+ ch[0] = 'x';
+ uint8_t _n = n >> 4;
+ if (_n < 10)
+ ch[1] = '0' + _n;
+ else
+ ch[1] = 'A' + (_n - 10);
+ n &= 0x0F;
+ if (n < 10)
+ ch[2] = '0' + n;
+ else
+ ch[2] = 'A' + (n - 10);
+ ch[3] = '\0';
+ _debug_log_ex(ch, new_line);
+}
+
+#endif // ENABLE_SERIAL