From 281b7faf534499175f6b16c5a3b4ad838695dc4b Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Sat, 23 Jun 2018 01:18:57 +0900
Subject: [PATCH 01/13] add helix serial debug code
---
.../helix/rev2/keymaps/five_rows/config.h | 8 +++
keyboards/helix/serial.c | 67 ++++++++++++++++++-
keyboards/helix/serial.h | 6 ++
3 files changed, 79 insertions(+), 2 deletions(-)
diff --git a/keyboards/helix/rev2/keymaps/five_rows/config.h b/keyboards/helix/rev2/keymaps/five_rows/config.h
index 10d9fc1c4b..4d70cbce23 100644
--- a/keyboards/helix/rev2/keymaps/five_rows/config.h
+++ b/keyboards/helix/rev2/keymaps/five_rows/config.h
@@ -119,4 +119,12 @@ along with this program. If not, see .
#define USB_MAX_POWER_CONSUMPTION 100
#endif
+#define SERIAL_DEBUG_MODE_WATCH_OUTMODE 0
+#define SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE 1
+#define SERIAL_DEBUG_MODE_WATCH_SYNC 2
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_OUTMODE
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
+#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
+
#endif /* CONFIG_USER_H */
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 51ab67fb3d..7b4b8ceeb8 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -28,17 +28,31 @@ inline static
void serial_delay(void) {
_delay_us(SERIAL_DELAY);
}
-void serial_delay_short(void) {
- _delay_us(SERIAL_DELAY-1);
+
+inline static
+void serial_delay_half(void) {
+ _delay_us(SERIAL_DELAY/2);
}
+
+inline static
+void serial_delay_quart(void) {
+ _delay_us(SERIAL_DELAY/4);
+}
+
inline static
void serial_output(void) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_OUTMODE
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
}
// make the serial pin an input with pull-up resistor
inline static
void serial_input(void) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_OUTMODE
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
}
@@ -58,12 +72,23 @@ void serial_high(void) {
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
}
+#ifdef SERIAL_DEBUG_MODE
+inline static
+void serial_debug_init(void) {
+ SERIAL_DBGPIN_DDR |= SERIAL_DBGPIN_MASK;
+}
+#else
+#define serial_debug_init()
+#endif
+
void serial_master_init(void) {
+ serial_debug_init();
serial_output();
serial_high();
}
void serial_slave_init(void) {
+ serial_debug_init();
serial_input();
#ifndef USE_SERIAL_PD2
@@ -82,23 +107,42 @@ void serial_slave_init(void) {
// Used by the master to synchronize timing with the slave.
static
void sync_recv(void) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
serial_input();
// This shouldn't hang if the slave disconnects because the
// serial line will float to high if the slave does disconnect.
while (!serial_read_pin());
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+ _delay_us(3);
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
//serial_delay();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
+ _delay_us(SERIAL_DELAY-8);
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#else
_delay_us(SERIAL_DELAY-5);
+#endif
}
// Used by the slave to send a synchronization signal to the master.
static
void sync_send(void) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
serial_output();
serial_low();
serial_delay();
serial_high();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
}
// Reads a byte from the serial line
@@ -108,8 +152,15 @@ uint8_t serial_read_byte(void) {
serial_input();
for ( uint8_t i = 0; i < 8; ++i) {
byte = (byte << 1) | serial_read_pin();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ _delay_us(1);
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+ serial_delay();
+#else
serial_delay();
_delay_us(1);
+#endif
}
return byte;
@@ -126,7 +177,13 @@ void serial_write_byte(uint8_t data) {
} else {
serial_low();
}
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
serial_delay();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
}
}
@@ -147,7 +204,13 @@ ISR(SERIAL_PIN_INTERRUPT) {
serial_delay();
// read the middle of pulses
+#if SERIAL_DEBUG_MODE & (SERIAL_DEBUG_MODE_WATCH_SYNC|SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE)
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
_delay_us(SERIAL_DELAY/2);
+#if SERIAL_DEBUG_MODE & (SERIAL_DEBUG_MODE_WATCH_SYNC|SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE)
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
uint8_t checksum_computed = 0;
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 8f15d66753..8e48f5e094 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -24,6 +24,12 @@
#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
#endif
+#ifdef SERIAL_DEBUG_MODE
+#define SERIAL_DBGPIN_DDR DDRB
+#define SERIAL_DBGPIN_PORT PORTB
+#define SERIAL_DBGPIN_MASK _BV(PB5)
+#endif
+
// Buffers for master - slave communication
extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
From e0c1a144d6bc495180264c068bbbefbeca22df0e Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Sat, 23 Jun 2018 14:01:47 +0900
Subject: [PATCH 02/13] serial debug macro move from config.h to serial.h
---
.../helix/rev2/keymaps/five_rows/config.h | 8 ------
keyboards/helix/serial.h | 26 ++++++++++++++-----
2 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/keyboards/helix/rev2/keymaps/five_rows/config.h b/keyboards/helix/rev2/keymaps/five_rows/config.h
index 4d70cbce23..10d9fc1c4b 100644
--- a/keyboards/helix/rev2/keymaps/five_rows/config.h
+++ b/keyboards/helix/rev2/keymaps/five_rows/config.h
@@ -119,12 +119,4 @@ along with this program. If not, see .
#define USB_MAX_POWER_CONSUMPTION 100
#endif
-#define SERIAL_DEBUG_MODE_WATCH_OUTMODE 0
-#define SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE 1
-#define SERIAL_DEBUG_MODE_WATCH_SYNC 2
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_OUTMODE
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
-#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
-
#endif /* CONFIG_USER_H */
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 8e48f5e094..5f185f3137 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -24,12 +24,6 @@
#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
#endif
-#ifdef SERIAL_DEBUG_MODE
-#define SERIAL_DBGPIN_DDR DDRB
-#define SERIAL_DBGPIN_PORT PORTB
-#define SERIAL_DBGPIN_MASK _BV(PB5)
-#endif
-
// Buffers for master - slave communication
extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
@@ -39,4 +33,24 @@ void serial_slave_init(void);
int serial_update_buffers(void);
bool serial_slave_data_corrupt(void);
+#define SERIAL_DEBUG_MODE_WATCH_OUTMODE 1
+#define SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE 2
+#define SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH 4
+#define SERIAL_DEBUG_MODE_WATCH_SYNC 8
+#define SERIAL_DEBUG_MODE_WATCH_IOCHG 16
+
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_OUTMODE
+#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
+//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
+
+#ifdef SERIAL_DEBUG_MODE
+#define SERIAL_DBGPIN_DDR DDRB
+#define SERIAL_DBGPIN_PORT PORTB
+#define SERIAL_DBGPIN_MASK _BV(PB5)
+#endif
+
#endif
From 8c91470e8588b9eb0353798f6ae6c3f070129bba Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Sat, 23 Jun 2018 15:00:13 +0900
Subject: [PATCH 03/13] helix serial.c debugging...
---
keyboards/helix/serial.c | 175 +++++++++++++++++++++++++++++----------
1 file changed, 133 insertions(+), 42 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 7b4b8ceeb8..b6fb263d41 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -14,9 +14,16 @@
#ifdef USE_SERIAL
+#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
+
// Serial pulse period in microseconds. Its probably a bad idea to lower this
// value.
-#define SERIAL_DELAY 30
+#define SERIAL_DELAY 6 // micro sec
+#define READ_WRITE_START_ADJUST 20 // cycles
+#define READ_WRITE_WIDTH_ADJUST 10 // cycles
+
+#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
+#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
@@ -30,13 +37,13 @@ void serial_delay(void) {
}
inline static
-void serial_delay_half(void) {
- _delay_us(SERIAL_DELAY/2);
+void serial_delay_half1(void) {
+ _delay_us(SERIAL_DELAY_HALF1);
}
inline static
-void serial_delay_quart(void) {
- _delay_us(SERIAL_DELAY/4);
+void serial_delay_half2(void) {
+ _delay_us(SERIAL_DELAY_HALF2);
}
inline static
@@ -116,9 +123,10 @@ void sync_recv(void) {
while (!serial_read_pin());
#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
- _delay_us(3);
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ //_delay_us(3);
+ //SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
#endif
+#if 0
//serial_delay();
#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
_delay_us(SERIAL_DELAY-8);
@@ -126,6 +134,7 @@ void sync_recv(void) {
#else
_delay_us(SERIAL_DELAY-5);
#endif
+#endif
}
// Used by the slave to send a synchronization signal to the master.
@@ -149,85 +158,120 @@ void sync_send(void) {
static
uint8_t serial_read_byte(void) {
uint8_t byte = 0;
- serial_input();
+ _delay_sub_us(READ_WRITE_START_ADJUST);
for ( uint8_t i = 0; i < 8; ++i) {
+ serial_delay_half1(); // read the middle of pulses
byte = (byte << 1) | serial_read_pin();
#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
- _delay_us(1);
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
- serial_delay();
+ SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
+ //_delay_us(1);
+ _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
+ SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
+ serial_delay_half2();
#else
- serial_delay();
- _delay_us(1);
+ serial_delay_half2();
+ //_delay_us(1);
+ _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
#endif
}
-
return byte;
}
// Sends a byte with MSB ordering
static
void serial_write_byte(uint8_t data) {
- uint8_t b = 8;
- serial_output();
- while( b-- ) {
- if(data & (1 << b)) {
+ uint8_t b = 1<<7;
+ //serial_output();
+ while( b ) {
+ if(data & b) {
serial_high();
} else {
serial_low();
}
+ b >>= 1;
#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
#endif
serial_delay();
#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+ SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
#endif
}
+ serial_low();
}
// interrupt handle to be used by the slave device
ISR(SERIAL_PIN_INTERRUPT) {
sync_send();
-
+ // slave send phase
uint8_t checksum = 0;
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
serial_write_byte(serial_slave_buffer[i]);
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
sync_send();
checksum += serial_slave_buffer[i];
}
serial_write_byte(checksum);
- sync_send();
-
- // wait for the sync to finish sending
- serial_delay();
+ serial_low();
- // read the middle of pulses
-#if SERIAL_DEBUG_MODE & (SERIAL_DEBUG_MODE_WATCH_SYNC|SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE)
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ // slave switch to input
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ //1
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ _delay_us(1);
#endif
- _delay_us(SERIAL_DELAY/2);
-#if SERIAL_DEBUG_MODE & (SERIAL_DEBUG_MODE_WATCH_SYNC|SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE)
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+ sync_send();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
+ serial_delay_half1();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ //2
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ _delay_us(1);
+#endif
+ serial_low();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
+ serial_input();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ //3
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ _delay_us(1);
+#endif
+ serial_delay();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
#endif
+ // slave recv phase
+ sync_recv();
uint8_t checksum_computed = 0;
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
serial_master_buffer[i] = serial_read_byte();
- sync_send();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
+ sync_recv();
checksum_computed += serial_master_buffer[i];
}
uint8_t checksum_received = serial_read_byte();
- sync_send();
-
- serial_input(); // end transaction
if ( checksum_computed != checksum_received ) {
status |= SLAVE_DATA_CORRUPT;
} else {
status &= ~SLAVE_DATA_CORRUPT;
}
+ sync_recv(); //weit master output to hight
}
inline
@@ -258,41 +302,88 @@ int serial_update_buffers(void) {
// check if the slave is present
if (serial_read_pin()) {
// slave failed to pull the line low, assume not present
+ serial_output();
+ serial_high();
sei();
return 1;
}
+ // master recv phase
// if the slave is present syncronize with it
sync_recv();
uint8_t checksum_computed = 0;
// receive data from the slave
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
serial_slave_buffer[i] = serial_read_byte();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
sync_recv();
checksum_computed += serial_slave_buffer[i];
}
uint8_t checksum_received = serial_read_byte();
- sync_recv();
if (checksum_computed != checksum_received) {
+ serial_output();
+ serial_high();
sei();
return 2;
}
+ // master switch to output
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ //1
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ _delay_us(1);
+#endif
+ sync_recv();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
+ serial_delay();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ //2
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ _delay_us(1);
+#endif
+ serial_output();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
+ serial_low();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ //3
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+ _delay_us(1);
+#endif
+ serial_delay_half1();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
+
+ // master send phase
uint8_t checksum = 0;
- // send data to the slave
+
+ sync_send();
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
+#endif
serial_write_byte(serial_master_buffer[i]);
- sync_recv();
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
+#endif
+ sync_send();
checksum += serial_master_buffer[i];
}
serial_write_byte(checksum);
- sync_recv();
// always, release the line when not in use
- serial_output();
- serial_high();
+ sync_send();
sei();
return 0;
From 98c3c859e56c570a905dc0107b289cca2a668a89 Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Sun, 24 Jun 2018 01:01:34 +0900
Subject: [PATCH 04/13] refine debug macros
---
keyboards/helix/serial.c | 208 +++++++++++++++------------------------
keyboards/helix/serial.h | 14 +--
2 files changed, 85 insertions(+), 137 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index b6fb263d41..353fdfa436 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -31,6 +31,50 @@ uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
#define SLAVE_DATA_CORRUPT (1<<0)
volatile uint8_t status = 0;
+#ifdef SERIAL_DEBUG_MODE
+ #define serial_debug_init() SERIAL_DBGPIN_DDR |= SERIAL_DBGPIN_MASK
+#else
+ #define serial_debug_init()
+#endif
+
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_OUTMODE
+ #define debug_output_mode() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
+ #define debug_input_mode() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
+#else
+ #define debug_output_mode()
+ #define debug_input_mode()
+#endif
+
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+ #define debug_recvsample() SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK
+#else
+ #define debug_recvsample()
+#endif
+
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
+ #define debug_bytewidth_start() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
+ #define debug_bytewidth_end() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
+#else
+ #define debug_bytewidth_start()
+ #define debug_bytewidth_end()
+#endif
+
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
+ #define debug_sync_start() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
+ #define debug_sync_end() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
+#else
+ #define debug_sync_start()
+ #define debug_sync_end()
+#endif
+
+#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
+ #define debug_iochg_on() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; _delay_us(1)
+ #define debug_iochg_off() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
+#else
+ #define debug_iochg_on()
+ #define debug_iochg_off()
+#endif
+
inline static
void serial_delay(void) {
_delay_us(SERIAL_DELAY);
@@ -48,18 +92,14 @@ void serial_delay_half2(void) {
inline static
void serial_output(void) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_OUTMODE
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
+ debug_output_mode();
SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
}
// make the serial pin an input with pull-up resistor
inline static
void serial_input(void) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_OUTMODE
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_input_mode();
SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
}
@@ -79,15 +119,6 @@ void serial_high(void) {
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
}
-#ifdef SERIAL_DEBUG_MODE
-inline static
-void serial_debug_init(void) {
- SERIAL_DBGPIN_DDR |= SERIAL_DBGPIN_MASK;
-}
-#else
-#define serial_debug_init()
-#endif
-
void serial_master_init(void) {
serial_debug_init();
serial_output();
@@ -114,44 +145,21 @@ void serial_slave_init(void) {
// Used by the master to synchronize timing with the slave.
static
void sync_recv(void) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
- serial_input();
+ debug_sync_start();
// This shouldn't hang if the slave disconnects because the
// serial line will float to high if the slave does disconnect.
while (!serial_read_pin());
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
- //_delay_us(3);
- //SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
-#if 0
- //serial_delay();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
- _delay_us(SERIAL_DELAY-8);
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#else
- _delay_us(SERIAL_DELAY-5);
-#endif
-#endif
+ debug_sync_end();
}
// Used by the slave to send a synchronization signal to the master.
static
void sync_send(void) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
- serial_output();
-
+ debug_sync_start();
serial_low();
serial_delay();
-
serial_high();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_sync_end();
}
// Reads a byte from the serial line
@@ -162,17 +170,10 @@ uint8_t serial_read_byte(void) {
for ( uint8_t i = 0; i < 8; ++i) {
serial_delay_half1(); // read the middle of pulses
byte = (byte << 1) | serial_read_pin();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
- SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
- //_delay_us(1);
+ debug_recvsample();
_delay_sub_us(READ_WRITE_WIDTH_ADJUST);
- SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
+ debug_recvsample();
serial_delay_half2();
-#else
- serial_delay_half2();
- //_delay_us(1);
- _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
-#endif
}
return byte;
}
@@ -181,7 +182,6 @@ uint8_t serial_read_byte(void) {
static
void serial_write_byte(uint8_t data) {
uint8_t b = 1<<7;
- //serial_output();
while( b ) {
if(data & b) {
serial_high();
@@ -189,30 +189,24 @@ void serial_write_byte(uint8_t data) {
serial_low();
}
b >>= 1;
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
- SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
-#endif
+ debug_recvsample();
serial_delay();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
- SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK;
-#endif
+ debug_recvsample()
}
- serial_low();
+ serial_low(); // sync_recv() need low
}
// interrupt handle to be used by the slave device
ISR(SERIAL_PIN_INTERRUPT) {
+ serial_output();
sync_send();
+
// slave send phase
uint8_t checksum = 0;
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_start();
serial_write_byte(serial_slave_buffer[i]);
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_end();
sync_send();
checksum += serial_slave_buffer[i];
}
@@ -220,47 +214,25 @@ ISR(SERIAL_PIN_INTERRUPT) {
serial_low();
// slave switch to input
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- //1
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
- _delay_us(1);
-#endif
+ debug_iochg_on(); //1
sync_send();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_iochg_off();
serial_delay_half1();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- //2
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
- _delay_us(1);
-#endif
+ debug_iochg_on(); //2
serial_low();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_iochg_off();
serial_input();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- //3
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
- _delay_us(1);
-#endif
+ debug_iochg_on(); //3
serial_delay();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_iochg_off();
// slave recv phase
sync_recv();
uint8_t checksum_computed = 0;
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_start();
serial_master_buffer[i] = serial_read_byte();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_end();
sync_recv();
checksum_computed += serial_master_buffer[i];
}
@@ -315,13 +287,9 @@ int serial_update_buffers(void) {
uint8_t checksum_computed = 0;
// receive data from the slave
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_start();
serial_slave_buffer[i] = serial_read_byte();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_end();
sync_recv();
checksum_computed += serial_slave_buffer[i];
}
@@ -335,48 +303,26 @@ int serial_update_buffers(void) {
}
// master switch to output
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- //1
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
- _delay_us(1);
-#endif
+ debug_iochg_on(); //1
sync_recv();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_iochg_off();
serial_delay();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- //2
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
- _delay_us(1);
-#endif
+ debug_iochg_on(); //2
serial_output();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_iochg_off();
serial_low();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- //3
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
- _delay_us(1);
-#endif
+ debug_iochg_on(); //3
serial_delay_half1();
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_iochg_off();
// master send phase
uint8_t checksum = 0;
sync_send();
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_start();
serial_write_byte(serial_master_buffer[i]);
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK;
-#endif
+ debug_bytewidth_end();
sync_send();
checksum += serial_master_buffer[i];
}
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 5f185f3137..db3edf8342 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -33,20 +33,22 @@ void serial_slave_init(void);
int serial_update_buffers(void);
bool serial_slave_data_corrupt(void);
-#define SERIAL_DEBUG_MODE_WATCH_OUTMODE 1
-#define SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE 2
-#define SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH 4
-#define SERIAL_DEBUG_MODE_WATCH_SYNC 8
-#define SERIAL_DEBUG_MODE_WATCH_IOCHG 16
+// debug flags
+#define SERIAL_DEBUG_MODE_WATCH_OUTMODE 0x1
+#define SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE 0x2
+#define SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH 0x4
+#define SERIAL_DEBUG_MODE_WATCH_SYNC 0x8
+#define SERIAL_DEBUG_MODE_WATCH_IOCHG 0x10
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_OUTMODE
-#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
+// Helix keyboard unused port (for Logic analyzer or oscilloscope)
#ifdef SERIAL_DEBUG_MODE
#define SERIAL_DBGPIN_DDR DDRB
#define SERIAL_DBGPIN_PORT PORTB
From 0c6840ee0dadb28f135b01f662e71880daee94f8 Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Mon, 25 Jun 2018 13:15:25 +0900
Subject: [PATCH 05/13] add some comments
---
keyboards/helix/serial.c | 17 ++++++++++++-----
keyboards/helix/serial.h | 2 +-
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 353fdfa436..339da31908 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -25,6 +25,9 @@
#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
+#define SLAVE_INT_WIDTH 1
+#define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY
+
uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
@@ -198,6 +201,7 @@ void serial_write_byte(uint8_t data) {
// interrupt handle to be used by the slave device
ISR(SERIAL_PIN_INTERRUPT) {
+ // master->slave のトリガー手順、もっといい手順が無いか検討中 !!!
serial_output();
sync_send();
@@ -214,6 +218,7 @@ ISR(SERIAL_PIN_INTERRUPT) {
serial_low();
// slave switch to input
+ // 送受信の向き変更処理 もっといい手順が無いか検討中 !!!
debug_iochg_on(); //1
sync_send();
debug_iochg_off();
@@ -226,7 +231,7 @@ ISR(SERIAL_PIN_INTERRUPT) {
serial_delay();
debug_iochg_off();
- // slave recv phase
+ // slave recive phase
sync_recv();
uint8_t checksum_computed = 0;
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
@@ -243,7 +248,7 @@ ISR(SERIAL_PIN_INTERRUPT) {
} else {
status &= ~SLAVE_DATA_CORRUPT;
}
- sync_recv(); //weit master output to hight
+ sync_recv(); //weit master output to high
}
inline
@@ -261,15 +266,16 @@ int serial_update_buffers(void) {
// this code is very time dependent, so we need to disable interrupts
cli();
+ // master->slave のトリガー手順、もっといい手順が無いか検討中 !!!
// signal to the slave that we want to start a transaction
serial_output();
serial_low();
- _delay_us(1);
+ _delay_us(SLAVE_INT_WIDTH);
// wait for the slaves response
serial_input();
serial_high();
- _delay_us(SERIAL_DELAY);
+ _delay_us(SLAVE_INT_RESPONSE_TIME);
// check if the slave is present
if (serial_read_pin()) {
@@ -280,7 +286,7 @@ int serial_update_buffers(void) {
return 1;
}
- // master recv phase
+ // master recive phase
// if the slave is present syncronize with it
sync_recv();
@@ -303,6 +309,7 @@ int serial_update_buffers(void) {
}
// master switch to output
+ // 送受信の向き変更処理 もっといい手順が無いか検討中 !!!
debug_iochg_on(); //1
sync_recv();
debug_iochg_off();
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index db3edf8342..762e6db5a1 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -41,7 +41,7 @@ bool serial_slave_data_corrupt(void);
#define SERIAL_DEBUG_MODE_WATCH_IOCHG 0x10
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_OUTMODE
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
From 563d0ea1c144983985e61ca0216f10ad93f515c8 Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Mon, 25 Jun 2018 13:35:53 +0900
Subject: [PATCH 06/13] add SELECT_SERIAL_SPEED
---
keyboards/helix/serial.c | 38 ++++++++++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 6 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 339da31908..a1424e22fe 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -16,11 +16,37 @@
#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
-// Serial pulse period in microseconds. Its probably a bad idea to lower this
-// value.
-#define SERIAL_DELAY 6 // micro sec
-#define READ_WRITE_START_ADJUST 20 // cycles
-#define READ_WRITE_WIDTH_ADJUST 10 // cycles
+// Serial pulse period in microseconds.
+#define SELECT_SERIAL_SPEED 0
+// !!! 以下の3つ組の定義、、通信速度の「高速」、「中速」、「低速」、「超低速」の4パターンで、実測して合わせこみ
+// 選択できるようにしておく。
+#if SELECT_SERIAL_SPEED == 0
+ // High speed
+ #define SERIAL_DELAY 6 // micro sec
+ #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 10 // cycles
+#elif SELECT_SERIAL_SPEED == 1
+ // Middle speed
+ #define SERIAL_DELAY 12 // micro sec
+ #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 10 // cycles
+ #error Serial Speed Middle not yet
+#elif SELECT_SERIAL_SPEED == 2
+ // Low speed
+ #define SERIAL_DELAY 24 // micro sec
+ #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 10 // cycles
+ #error Serial Speed Low not yet
+#elif SELECT_SERIAL_SPEED == 3
+ // Very Low speed
+ #define SERIAL_DELAY 50 // micro sec
+ #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 10 // cycles
+ #error Serial Speed Low not yet
+#else
+#error Illegal Serial Speed
+#endif
+
#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
@@ -194,7 +220,7 @@ void serial_write_byte(uint8_t data) {
b >>= 1;
debug_recvsample();
serial_delay();
- debug_recvsample()
+ debug_recvsample();
}
serial_low(); // sync_recv() need low
}
From e56a0aece83e3f9d9c0de8b48e01225cf0f48962 Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Mon, 25 Jun 2018 14:03:57 +0900
Subject: [PATCH 07/13] add comments
---
keyboards/helix/serial.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index a1424e22fe..514f8e1191 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -172,6 +172,7 @@ void serial_slave_init(void) {
}
// Used by the master to synchronize timing with the slave.
+// !!! +- (ビット幅/2) のズレを補正する。手順再度考察
static
void sync_recv(void) {
debug_sync_start();
@@ -182,6 +183,7 @@ void sync_recv(void) {
}
// Used by the slave to send a synchronization signal to the master.
+// !!! +- (ビット幅/2) のズレを補正する。手順再度考察
static
void sync_send(void) {
debug_sync_start();
From 5f79b52ef849036553207fc43133821344f0a96b Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Mon, 25 Jun 2018 23:18:50 +0900
Subject: [PATCH 08/13] debugging sync_send/sync_recv
---
keyboards/helix/serial.c | 62 +++++++++++++++++++++++++++-------------
keyboards/helix/serial.h | 4 +--
2 files changed, 44 insertions(+), 22 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 514f8e1191..5b0a910b10 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -17,32 +17,29 @@
#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
// Serial pulse period in microseconds.
-#define SELECT_SERIAL_SPEED 0
+#define SELECT_SERIAL_SPEED 2
// !!! 以下の3つ組の定義、、通信速度の「高速」、「中速」、「低速」、「超低速」の4パターンで、実測して合わせこみ
// 選択できるようにしておく。
#if SELECT_SERIAL_SPEED == 0
// High speed
#define SERIAL_DELAY 6 // micro sec
- #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_START_ADJUST 23 // cycles
#define READ_WRITE_WIDTH_ADJUST 10 // cycles
#elif SELECT_SERIAL_SPEED == 1
// Middle speed
#define SERIAL_DELAY 12 // micro sec
- #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_START_ADJUST 25 // cycles
#define READ_WRITE_WIDTH_ADJUST 10 // cycles
- #error Serial Speed Middle not yet
#elif SELECT_SERIAL_SPEED == 2
// Low speed
#define SERIAL_DELAY 24 // micro sec
- #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_START_ADJUST 25 // cycles
#define READ_WRITE_WIDTH_ADJUST 10 // cycles
- #error Serial Speed Low not yet
#elif SELECT_SERIAL_SPEED == 3
// Very Low speed
#define SERIAL_DELAY 50 // micro sec
- #define READ_WRITE_START_ADJUST 20 // cycles
+ #define READ_WRITE_START_ADJUST 25 // cycles
#define READ_WRITE_WIDTH_ADJUST 10 // cycles
- #error Serial Speed Low not yet
#else
#error Illegal Serial Speed
#endif
@@ -97,13 +94,27 @@ volatile uint8_t status = 0;
#endif
#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- #define debug_iochg_on() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; _delay_us(1)
+ #define debug_iochg_on() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
#define debug_iochg_off() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
#else
#define debug_iochg_on()
#define debug_iochg_off()
#endif
+#define SYNC_DEBUG_MODE 0
+#if SYNC_DEBUG_MODE == 0
+#define debug_dummy_delay_recv()
+#define debug_dummy_delay_send()
+#endif
+#if SYNC_DEBUG_MODE == 1
+#define debug_dummy_delay_recv() _delay_us(SERIAL_DELAY_HALF1-5)
+#define debug_dummy_delay_send()
+#endif
+#if SYNC_DEBUG_MODE == 2
+#define debug_dummy_delay_recv()
+#define debug_dummy_delay_send() _delay_us(SERIAL_DELAY_HALF1-5)
+#endif
+
inline static
void serial_delay(void) {
_delay_us(SERIAL_DELAY);
@@ -175,7 +186,9 @@ void serial_slave_init(void) {
// !!! +- (ビット幅/2) のズレを補正する。手順再度考察
static
void sync_recv(void) {
+ debug_dummy_delay_recv();
debug_sync_start();
+ while (serial_read_pin());
// This shouldn't hang if the slave disconnects because the
// serial line will float to high if the slave does disconnect.
while (!serial_read_pin());
@@ -186,6 +199,7 @@ void sync_recv(void) {
// !!! +- (ビット幅/2) のズレを補正する。手順再度考察
static
void sync_send(void) {
+ debug_dummy_delay_send();
debug_sync_start();
serial_low();
serial_delay();
@@ -200,10 +214,10 @@ uint8_t serial_read_byte(void) {
_delay_sub_us(READ_WRITE_START_ADJUST);
for ( uint8_t i = 0; i < 8; ++i) {
serial_delay_half1(); // read the middle of pulses
+ debug_recvsample();
byte = (byte << 1) | serial_read_pin();
debug_recvsample();
_delay_sub_us(READ_WRITE_WIDTH_ADJUST);
- debug_recvsample();
serial_delay_half2();
}
return byte;
@@ -224,26 +238,27 @@ void serial_write_byte(uint8_t data) {
serial_delay();
debug_recvsample();
}
- serial_low(); // sync_recv() need low
+ serial_low(); // sync_send() / senc_recv() need raise edge
}
// interrupt handle to be used by the slave device
ISR(SERIAL_PIN_INTERRUPT) {
// master->slave のトリガー手順、もっといい手順が無いか検討中 !!!
serial_output();
- sync_send();
// slave send phase
uint8_t checksum = 0;
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+ sync_send();
debug_bytewidth_start();
serial_write_byte(serial_slave_buffer[i]);
debug_bytewidth_end();
- sync_send();
checksum += serial_slave_buffer[i];
}
+ sync_send();
+ debug_bytewidth_start();
serial_write_byte(checksum);
- serial_low();
+ debug_bytewidth_end();
// slave switch to input
// 送受信の向き変更処理 もっといい手順が無いか検討中 !!!
@@ -260,22 +275,25 @@ ISR(SERIAL_PIN_INTERRUPT) {
debug_iochg_off();
// slave recive phase
- sync_recv();
uint8_t checksum_computed = 0;
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+ sync_recv();
debug_bytewidth_start();
serial_master_buffer[i] = serial_read_byte();
debug_bytewidth_end();
- sync_recv();
checksum_computed += serial_master_buffer[i];
}
+ sync_recv();
+ debug_bytewidth_start();
uint8_t checksum_received = serial_read_byte();
+ debug_bytewidth_end();
if ( checksum_computed != checksum_received ) {
status |= SLAVE_DATA_CORRUPT;
} else {
status &= ~SLAVE_DATA_CORRUPT;
}
+
sync_recv(); //weit master output to high
}
@@ -316,18 +334,20 @@ int serial_update_buffers(void) {
// master recive phase
// if the slave is present syncronize with it
- sync_recv();
uint8_t checksum_computed = 0;
// receive data from the slave
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+ sync_recv();
debug_bytewidth_start();
serial_slave_buffer[i] = serial_read_byte();
debug_bytewidth_end();
- sync_recv();
checksum_computed += serial_slave_buffer[i];
}
+ sync_recv();
+ debug_bytewidth_start();
uint8_t checksum_received = serial_read_byte();
+ debug_bytewidth_end();
if (checksum_computed != checksum_received) {
serial_output();
@@ -353,15 +373,17 @@ int serial_update_buffers(void) {
// master send phase
uint8_t checksum = 0;
- sync_send();
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+ sync_send();
debug_bytewidth_start();
serial_write_byte(serial_master_buffer[i]);
debug_bytewidth_end();
- sync_send();
checksum += serial_master_buffer[i];
}
+ sync_send();
+ debug_bytewidth_start();
serial_write_byte(checksum);
+ debug_bytewidth_end();
// always, release the line when not in use
sync_send();
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 762e6db5a1..34d3c89603 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -41,10 +41,10 @@ bool serial_slave_data_corrupt(void);
#define SERIAL_DEBUG_MODE_WATCH_IOCHG 0x10
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_OUTMODE
-#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
+#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
From 734746f4e6d02338899c4595ffcc6e43e5faff0e Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Tue, 26 Jun 2018 01:26:23 +0900
Subject: [PATCH 09/13] add very high speed
---
keyboards/helix/serial.c | 15 +++++++++------
keyboards/helix/serial.h | 2 +-
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 5b0a910b10..1b2b875402 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -17,25 +17,28 @@
#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
// Serial pulse period in microseconds.
-#define SELECT_SERIAL_SPEED 2
-// !!! 以下の3つ組の定義、、通信速度の「高速」、「中速」、「低速」、「超低速」の4パターンで、実測して合わせこみ
-// 選択できるようにしておく。
+#define SELECT_SERIAL_SPEED 1
#if SELECT_SERIAL_SPEED == 0
+ // Very High speed
+ #define SERIAL_DELAY 4 // micro sec
+ #define READ_WRITE_START_ADJUST 30 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 10 // cycles
+#elif SELECT_SERIAL_SPEED == 1
// High speed
#define SERIAL_DELAY 6 // micro sec
#define READ_WRITE_START_ADJUST 23 // cycles
#define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#elif SELECT_SERIAL_SPEED == 1
+#elif SELECT_SERIAL_SPEED == 2
// Middle speed
#define SERIAL_DELAY 12 // micro sec
#define READ_WRITE_START_ADJUST 25 // cycles
#define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#elif SELECT_SERIAL_SPEED == 2
+#elif SELECT_SERIAL_SPEED == 3
// Low speed
#define SERIAL_DELAY 24 // micro sec
#define READ_WRITE_START_ADJUST 25 // cycles
#define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#elif SELECT_SERIAL_SPEED == 3
+#elif SELECT_SERIAL_SPEED == 4
// Very Low speed
#define SERIAL_DELAY 50 // micro sec
#define READ_WRITE_START_ADJUST 25 // cycles
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 34d3c89603..db3edf8342 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -44,7 +44,7 @@ bool serial_slave_data_corrupt(void);
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
-#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
+//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
From 982f8792bd555d02fa4bab17251351205e97f9f2 Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Tue, 26 Jun 2018 13:13:28 +0900
Subject: [PATCH 10/13] fix sync_send/sync_recv
---
keyboards/helix/serial.c | 21 +++++++++++----------
keyboards/helix/serial.h | 2 +-
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 1b2b875402..d1ad4dd71e 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -17,7 +17,7 @@
#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
// Serial pulse period in microseconds.
-#define SELECT_SERIAL_SPEED 1
+#define SELECT_SERIAL_SPEED 0
#if SELECT_SERIAL_SPEED == 0
// Very High speed
#define SERIAL_DELAY 4 // micro sec
@@ -110,12 +110,12 @@ volatile uint8_t status = 0;
#define debug_dummy_delay_send()
#endif
#if SYNC_DEBUG_MODE == 1
-#define debug_dummy_delay_recv() _delay_us(SERIAL_DELAY_HALF1-5)
+#define debug_dummy_delay_recv() _delay_us(3); _delay_sub_us(2)
#define debug_dummy_delay_send()
#endif
#if SYNC_DEBUG_MODE == 2
#define debug_dummy_delay_recv()
-#define debug_dummy_delay_send() _delay_us(SERIAL_DELAY_HALF1-5)
+#define debug_dummy_delay_send() _delay_us(3); _delay_sub_us(2)
#endif
inline static
@@ -185,24 +185,23 @@ void serial_slave_init(void) {
#endif
}
-// Used by the master to synchronize timing with the slave.
-// !!! +- (ビット幅/2) のズレを補正する。手順再度考察
+// Used by the sender to synchronize timing with the reciver.
static
void sync_recv(void) {
- debug_dummy_delay_recv();
debug_sync_start();
- while (serial_read_pin());
+ for (int i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) {
+ debug_sync_end();
+ debug_sync_start();
+ }
// This shouldn't hang if the slave disconnects because the
// serial line will float to high if the slave does disconnect.
while (!serial_read_pin());
debug_sync_end();
}
-// Used by the slave to send a synchronization signal to the master.
-// !!! +- (ビット幅/2) のズレを補正する。手順再度考察
+// Used by the reciver to send a synchronization signal to the sender.
static
void sync_send(void) {
- debug_dummy_delay_send();
debug_sync_start();
serial_low();
serial_delay();
@@ -222,6 +221,7 @@ uint8_t serial_read_byte(void) {
debug_recvsample();
_delay_sub_us(READ_WRITE_WIDTH_ADJUST);
serial_delay_half2();
+ debug_dummy_delay_recv();
}
return byte;
}
@@ -240,6 +240,7 @@ void serial_write_byte(uint8_t data) {
debug_recvsample();
serial_delay();
debug_recvsample();
+ debug_dummy_delay_send();
}
serial_low(); // sync_send() / senc_recv() need raise edge
}
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index db3edf8342..987ed049b1 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -45,7 +45,7 @@ bool serial_slave_data_corrupt(void);
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
-//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
+#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
// Helix keyboard unused port (for Logic analyzer or oscilloscope)
From 4b2a292249c91726f76bbb0a1321afb785391a10 Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Tue, 26 Jun 2018 16:26:29 +0900
Subject: [PATCH 11/13] fix com. start and switch send/recv
---
keyboards/helix/serial.c | 49 +++++++++++++++++++++-------------------
keyboards/helix/serial.h | 3 ++-
2 files changed, 28 insertions(+), 24 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index d1ad4dd71e..27f38a264b 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -141,7 +141,7 @@ void serial_output(void) {
// make the serial pin an input with pull-up resistor
inline static
-void serial_input(void) {
+void serial_input_with_pullup(void) {
debug_input_mode();
SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
@@ -170,7 +170,7 @@ void serial_master_init(void) {
void serial_slave_init(void) {
serial_debug_init();
- serial_input();
+ serial_input_with_pullup();
#ifndef USE_SERIAL_PD2
// Enable INT0
@@ -247,7 +247,6 @@ void serial_write_byte(uint8_t data) {
// interrupt handle to be used by the slave device
ISR(SERIAL_PIN_INTERRUPT) {
- // master->slave のトリガー手順、もっといい手順が無いか検討中 !!!
serial_output();
// slave send phase
@@ -265,17 +264,20 @@ ISR(SERIAL_PIN_INTERRUPT) {
debug_bytewidth_end();
// slave switch to input
- // 送受信の向き変更処理 もっといい手順が無いか検討中 !!!
- debug_iochg_on(); //1
- sync_send();
+ sync_send(); //0
+
+ debug_iochg_on();
+ serial_delay_half1(); //1
debug_iochg_off();
- serial_delay_half1();
- debug_iochg_on(); //2
- serial_low();
+
+ debug_iochg_on();
+ serial_low(); //2
debug_iochg_off();
- serial_input();
+
+ serial_input_with_pullup(); //2
+
debug_iochg_on(); //3
- serial_delay();
+ serial_delay_half1();
debug_iochg_off();
// slave recive phase
@@ -312,19 +314,18 @@ bool serial_slave_DATA_CORRUPT(void) {
// Returns:
// 0 => no error
// 1 => slave did not respond
+// 2 => checksum error
int serial_update_buffers(void) {
// this code is very time dependent, so we need to disable interrupts
cli();
- // master->slave のトリガー手順、もっといい手順が無いか検討中 !!!
// signal to the slave that we want to start a transaction
serial_output();
serial_low();
_delay_us(SLAVE_INT_WIDTH);
// wait for the slaves response
- serial_input();
- serial_high();
+ serial_input_with_pullup();
_delay_us(SLAVE_INT_RESPONSE_TIME);
// check if the slave is present
@@ -361,17 +362,19 @@ int serial_update_buffers(void) {
}
// master switch to output
- // 送受信の向き変更処理 もっといい手順が無いか検討中 !!!
- debug_iochg_on(); //1
- sync_recv();
+ sync_recv(); //0
+
+ debug_iochg_on();
+ serial_delay(); //1
debug_iochg_off();
- serial_delay();
- debug_iochg_on(); //2
- serial_output();
+
+ debug_iochg_on();
+ serial_low(); //3
+ serial_output(); // 3
debug_iochg_off();
- serial_low();
- debug_iochg_on(); //3
- serial_delay_half1();
+
+ debug_iochg_on();
+ serial_delay_half1(); //4
debug_iochg_off();
// master send phase
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 987ed049b1..6eb6f50aa0 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -45,8 +45,9 @@ bool serial_slave_data_corrupt(void);
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
-#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
+//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
+#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_IOCHG|SERIAL_DEBUG_MODE_WATCH_SYNC)
// Helix keyboard unused port (for Logic analyzer or oscilloscope)
#ifdef SERIAL_DEBUG_MODE
From 65b20a2bb11195b79dd9f359d091dde6b6862f1b Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Tue, 26 Jun 2018 16:37:13 +0900
Subject: [PATCH 12/13] debug mode off
---
keyboards/helix/serial.c | 2 +-
keyboards/helix/serial.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index 27f38a264b..b1f6871abc 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -17,7 +17,7 @@
#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
// Serial pulse period in microseconds.
-#define SELECT_SERIAL_SPEED 0
+#define SELECT_SERIAL_SPEED 1
#if SELECT_SERIAL_SPEED == 0
// Very High speed
#define SERIAL_DELAY 4 // micro sec
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 6eb6f50aa0..731d331336 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -47,7 +47,7 @@ bool serial_slave_data_corrupt(void);
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
-#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_IOCHG|SERIAL_DEBUG_MODE_WATCH_SYNC)
+//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_IOCHG|SERIAL_DEBUG_MODE_WATCH_SYNC)
// Helix keyboard unused port (for Logic analyzer or oscilloscope)
#ifdef SERIAL_DEBUG_MODE
From 4e4b157280bd0a2cde07b503177427c936cb594c Mon Sep 17 00:00:00 2001
From: mtei <2170248+mtei@users.noreply.github.com>
Date: Tue, 26 Jun 2018 16:43:28 +0900
Subject: [PATCH 13/13] remove debug codes
---
keyboards/helix/serial.c | 111 +--------------------------------------
keyboards/helix/serial.h | 23 --------
2 files changed, 1 insertion(+), 133 deletions(-)
diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c
index b1f6871abc..182f222196 100644
--- a/keyboards/helix/serial.c
+++ b/keyboards/helix/serial.c
@@ -60,64 +60,6 @@ uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
#define SLAVE_DATA_CORRUPT (1<<0)
volatile uint8_t status = 0;
-#ifdef SERIAL_DEBUG_MODE
- #define serial_debug_init() SERIAL_DBGPIN_DDR |= SERIAL_DBGPIN_MASK
-#else
- #define serial_debug_init()
-#endif
-
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_OUTMODE
- #define debug_output_mode() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
- #define debug_input_mode() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
-#else
- #define debug_output_mode()
- #define debug_input_mode()
-#endif
-
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
- #define debug_recvsample() SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK
-#else
- #define debug_recvsample()
-#endif
-
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
- #define debug_bytewidth_start() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
- #define debug_bytewidth_end() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
-#else
- #define debug_bytewidth_start()
- #define debug_bytewidth_end()
-#endif
-
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC
- #define debug_sync_start() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
- #define debug_sync_end() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
-#else
- #define debug_sync_start()
- #define debug_sync_end()
-#endif
-
-#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG
- #define debug_iochg_on() SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK
- #define debug_iochg_off() SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK
-#else
- #define debug_iochg_on()
- #define debug_iochg_off()
-#endif
-
-#define SYNC_DEBUG_MODE 0
-#if SYNC_DEBUG_MODE == 0
-#define debug_dummy_delay_recv()
-#define debug_dummy_delay_send()
-#endif
-#if SYNC_DEBUG_MODE == 1
-#define debug_dummy_delay_recv() _delay_us(3); _delay_sub_us(2)
-#define debug_dummy_delay_send()
-#endif
-#if SYNC_DEBUG_MODE == 2
-#define debug_dummy_delay_recv()
-#define debug_dummy_delay_send() _delay_us(3); _delay_sub_us(2)
-#endif
-
inline static
void serial_delay(void) {
_delay_us(SERIAL_DELAY);
@@ -135,14 +77,12 @@ void serial_delay_half2(void) {
inline static
void serial_output(void) {
- debug_output_mode();
SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
}
// make the serial pin an input with pull-up resistor
inline static
void serial_input_with_pullup(void) {
- debug_input_mode();
SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
}
@@ -163,13 +103,11 @@ void serial_high(void) {
}
void serial_master_init(void) {
- serial_debug_init();
serial_output();
serial_high();
}
void serial_slave_init(void) {
- serial_debug_init();
serial_input_with_pullup();
#ifndef USE_SERIAL_PD2
@@ -188,25 +126,19 @@ void serial_slave_init(void) {
// Used by the sender to synchronize timing with the reciver.
static
void sync_recv(void) {
- debug_sync_start();
for (int i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) {
- debug_sync_end();
- debug_sync_start();
}
// This shouldn't hang if the slave disconnects because the
// serial line will float to high if the slave does disconnect.
while (!serial_read_pin());
- debug_sync_end();
}
// Used by the reciver to send a synchronization signal to the sender.
static
void sync_send(void) {
- debug_sync_start();
serial_low();
serial_delay();
serial_high();
- debug_sync_end();
}
// Reads a byte from the serial line
@@ -216,12 +148,9 @@ uint8_t serial_read_byte(void) {
_delay_sub_us(READ_WRITE_START_ADJUST);
for ( uint8_t i = 0; i < 8; ++i) {
serial_delay_half1(); // read the middle of pulses
- debug_recvsample();
byte = (byte << 1) | serial_read_pin();
- debug_recvsample();
_delay_sub_us(READ_WRITE_WIDTH_ADJUST);
serial_delay_half2();
- debug_dummy_delay_recv();
}
return byte;
}
@@ -237,10 +166,7 @@ void serial_write_byte(uint8_t data) {
serial_low();
}
b >>= 1;
- debug_recvsample();
serial_delay();
- debug_recvsample();
- debug_dummy_delay_send();
}
serial_low(); // sync_send() / senc_recv() need raise edge
}
@@ -253,46 +179,28 @@ ISR(SERIAL_PIN_INTERRUPT) {
uint8_t checksum = 0;
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
sync_send();
- debug_bytewidth_start();
serial_write_byte(serial_slave_buffer[i]);
- debug_bytewidth_end();
checksum += serial_slave_buffer[i];
}
sync_send();
- debug_bytewidth_start();
serial_write_byte(checksum);
- debug_bytewidth_end();
// slave switch to input
sync_send(); //0
-
- debug_iochg_on();
serial_delay_half1(); //1
- debug_iochg_off();
-
- debug_iochg_on();
serial_low(); //2
- debug_iochg_off();
-
serial_input_with_pullup(); //2
-
- debug_iochg_on(); //3
- serial_delay_half1();
- debug_iochg_off();
+ serial_delay_half1(); //3
// slave recive phase
uint8_t checksum_computed = 0;
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
sync_recv();
- debug_bytewidth_start();
serial_master_buffer[i] = serial_read_byte();
- debug_bytewidth_end();
checksum_computed += serial_master_buffer[i];
}
sync_recv();
- debug_bytewidth_start();
uint8_t checksum_received = serial_read_byte();
- debug_bytewidth_end();
if ( checksum_computed != checksum_received ) {
status |= SLAVE_DATA_CORRUPT;
@@ -344,15 +252,11 @@ int serial_update_buffers(void) {
// receive data from the slave
for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
sync_recv();
- debug_bytewidth_start();
serial_slave_buffer[i] = serial_read_byte();
- debug_bytewidth_end();
checksum_computed += serial_slave_buffer[i];
}
sync_recv();
- debug_bytewidth_start();
uint8_t checksum_received = serial_read_byte();
- debug_bytewidth_end();
if (checksum_computed != checksum_received) {
serial_output();
@@ -363,34 +267,21 @@ int serial_update_buffers(void) {
// master switch to output
sync_recv(); //0
-
- debug_iochg_on();
serial_delay(); //1
- debug_iochg_off();
-
- debug_iochg_on();
serial_low(); //3
serial_output(); // 3
- debug_iochg_off();
-
- debug_iochg_on();
serial_delay_half1(); //4
- debug_iochg_off();
// master send phase
uint8_t checksum = 0;
for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
sync_send();
- debug_bytewidth_start();
serial_write_byte(serial_master_buffer[i]);
- debug_bytewidth_end();
checksum += serial_master_buffer[i];
}
sync_send();
- debug_bytewidth_start();
serial_write_byte(checksum);
- debug_bytewidth_end();
// always, release the line when not in use
sync_send();
diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h
index 731d331336..8f15d66753 100644
--- a/keyboards/helix/serial.h
+++ b/keyboards/helix/serial.h
@@ -33,27 +33,4 @@ void serial_slave_init(void);
int serial_update_buffers(void);
bool serial_slave_data_corrupt(void);
-// debug flags
-#define SERIAL_DEBUG_MODE_WATCH_OUTMODE 0x1
-#define SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE 0x2
-#define SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH 0x4
-#define SERIAL_DEBUG_MODE_WATCH_SYNC 0x8
-#define SERIAL_DEBUG_MODE_WATCH_IOCHG 0x10
-
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_OUTMODE
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH
-//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH)
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_SYNC
-//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE|SERIAL_DEBUG_MODE_WATCH_SYNC)
-//#define SERIAL_DEBUG_MODE SERIAL_DEBUG_MODE_WATCH_IOCHG
-//#define SERIAL_DEBUG_MODE (SERIAL_DEBUG_MODE_WATCH_IOCHG|SERIAL_DEBUG_MODE_WATCH_SYNC)
-
-// Helix keyboard unused port (for Logic analyzer or oscilloscope)
-#ifdef SERIAL_DEBUG_MODE
-#define SERIAL_DBGPIN_DDR DDRB
-#define SERIAL_DBGPIN_PORT PORTB
-#define SERIAL_DBGPIN_MASK _BV(PB5)
-#endif
-
#endif