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