From 8142a3c7403e6a598400ae94360fced6bba14b5a Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Fri, 10 Aug 2018 00:17:05 +0900 Subject: [PATCH] Improved compatibility with let's split of serial.c. Finish helix/serial.c improvement. - The difference with the original let's split's serial.c - It's high-speed about 4 times. - Stable bi-directional data transfer. (Helix need master to slave transfer) - serial.h was divided 2 files, serial_config.h and sereial.h - With multiple types of transaction support, communication contents can be optimized. (NEW flexible API) - USE OLD Simple APIs (compatible with let's split serial.c) - files : - serial_config.h -- hardware configuration (need include by config.h) - serial.c/serial.h -- serial communication - USE NEW flexible APIs. (Support multi-type transaction function.) serial.c was divided into 2 layers, split_scom.c and serial.c. The upper layer split_scomm.c is called from matrix.c. The lower layer serial.c accesses the hardware. - files - split_scomm.c -- communication buffer is defined in here. call by matrix.c. - split_scomm.h -- buffer size is defined in here. include by matrix.c, split_util.c - serial_config.h -- hardware configuration (need include by config.h) To use the NEW API, specify #define SERIAL_USE_MULTI_TRANSACTION - serial.c/serial.h -- serial communication lower layer - NEW APIs for serial.c / serial.h (The lower layer) // Soft Serial Transaction Descriptor typedef struct _SSTD_t { uint8_t *status; uint8_t initiator2target_buffer_size; uint8_t *initiator2target_buffer; uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; // initiator is transaction start side void soft_serial_initiator_init(SSTD_t *sstd_table); // target is interrupt accept side void soft_serial_target_init(SSTD_t *sstd_table); int soft_serial_transaction(int sstd_index); int soft_serial_get_and_clean_target_status(int sstd_index); - NEW APIs for split_scomm.c / split_scomm.h (The upper layer) move from old serial.c the following buffer and functions serial_slave_buffer[] serial_master_buffer[] void serial_master_init(void) void serial_slave_init(void) int serial_update_buffers(void) define SERIAL_xxxxx_BUFFER_LENGTH move from serial_config.h to split_scomm.h --- .../rev1/keymaps/OLED_sample/serial_config.h | 3 ++ keyboards/helix/rev1/matrix.c | 4 +- keyboards/helix/rev1/rules.mk | 1 - keyboards/helix/rev1/serial_config.h | 3 ++ keyboards/helix/rev1/split_scomm.c | 36 ----------------- keyboards/helix/rev1/split_scomm.h | 15 ------- keyboards/helix/rev1/split_util.c | 2 +- keyboards/helix/rev2/keymaps/default/config.h | 2 +- .../helix/rev2/keymaps/edvorakjp/config.h | 2 +- .../helix/rev2/keymaps/five_rows/config.h | 2 +- .../helix/rev2/keymaps/five_rows_jis/config.h | 2 +- keyboards/helix/rev2/keymaps/froggy/config.h | 2 +- .../helix/rev2/keymaps/led_test/config.h | 2 +- keyboards/helix/rev2/matrix.c | 4 ++ .../helix/rev2/serial_config_simpleapi.h | 8 ++++ keyboards/helix/rev2/split_scomm.c | 23 +++-------- keyboards/helix/rev2/split_scomm.h | 10 ++++- keyboards/helix/serial.c | 39 +++++++++++++++++++ keyboards/helix/serial.h | 31 +++++++++++++-- 19 files changed, 106 insertions(+), 85 deletions(-) delete mode 100644 keyboards/helix/rev1/split_scomm.c delete mode 100644 keyboards/helix/rev1/split_scomm.h create mode 100644 keyboards/helix/rev2/serial_config_simpleapi.h diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h b/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h index 289a165fa3..b991b874b7 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h +++ b/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h @@ -8,6 +8,9 @@ #define SERIAL_PIN_MASK _BV(PD2) #define SERIAL_PIN_INTERRUPT INT2_vect +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH 0 + //// #error rev1/keymaps/OLED_sample serial config #endif /* SOFT_SERIAL_CONFIG_H */ diff --git a/keyboards/helix/rev1/matrix.c b/keyboards/helix/rev1/matrix.c index 6613c02b00..f2506868ea 100644 --- a/keyboards/helix/rev1/matrix.c +++ b/keyboards/helix/rev1/matrix.c @@ -35,7 +35,7 @@ along with this program. If not, see . #ifdef USE_MATRIX_I2C # include "i2c.h" #else // USE_SERIAL -# include "split_scomm.h" +# include "serial.h" #endif #ifndef DEBOUNCE @@ -178,7 +178,7 @@ i2c_error: // the cable is disconnceted, or something else went wrong int serial_transaction(void) { int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - if (serial_update_buffers(1)) { + if (serial_update_buffers()) { return 1; } diff --git a/keyboards/helix/rev1/rules.mk b/keyboards/helix/rev1/rules.mk index 5ecfa33a2a..13834f5da1 100644 --- a/keyboards/helix/rev1/rules.mk +++ b/keyboards/helix/rev1/rules.mk @@ -1,5 +1,4 @@ SRC += rev1/matrix.c SRC += rev1/split_util.c -SRC += rev1/split_scomm.c BACKLIGHT_ENABLE = no diff --git a/keyboards/helix/rev1/serial_config.h b/keyboards/helix/rev1/serial_config.h index f021d6e04b..51c6aa3750 100644 --- a/keyboards/helix/rev1/serial_config.h +++ b/keyboards/helix/rev1/serial_config.h @@ -8,6 +8,9 @@ #define SERIAL_PIN_MASK _BV(PD0) #define SERIAL_PIN_INTERRUPT INT0_vect +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH 0 + /// #error rev1 serial config #endif /* SOFT_SERIAL_CONFIG_H */ diff --git a/keyboards/helix/rev1/split_scomm.c b/keyboards/helix/rev1/split_scomm.c deleted file mode 100644 index a5c0485e30..0000000000 --- a/keyboards/helix/rev1/split_scomm.c +++ /dev/null @@ -1,36 +0,0 @@ -#ifdef USE_SERIAL -#include -#include -#include -#include -#include "serial.h" - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; -uint8_t volatile status0 = 0; - -SSTD_t transactions[] = { - { (uint8_t *)&status0, - sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, - sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer - } -}; - -void serial_master_init(void) -{ - soft_serial_initiator_init(transactions); -} - -void serial_slave_init(void) -{ - soft_serial_target_init(transactions); -} - -// 0 => no error -// 1 => slave did not respond -// 2 => checksum error -int serial_update_buffers(int master_update) -{ - return soft_serial_transaction(); -} -#endif /* USE_SERIAL */ diff --git a/keyboards/helix/rev1/split_scomm.h b/keyboards/helix/rev1/split_scomm.h deleted file mode 100644 index c81eff4ffe..0000000000 --- a/keyboards/helix/rev1/split_scomm.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SPLIT_COMM_H -#define SPLIT_COMM_H - -// Buffers for master - slave communication -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(int master_changed); - -#endif /* SPLIT_COMM_H */ diff --git a/keyboards/helix/rev1/split_util.c b/keyboards/helix/rev1/split_util.c index fe17e14f84..5debd6e00b 100644 --- a/keyboards/helix/rev1/split_util.c +++ b/keyboards/helix/rev1/split_util.c @@ -12,7 +12,7 @@ #ifdef USE_MATRIX_I2C # include "i2c.h" #else -# include "split_scomm.h" +# include "serial.h" #endif volatile bool isLeftHand = true; diff --git a/keyboards/helix/rev2/keymaps/default/config.h b/keyboards/helix/rev2/keymaps/default/config.h index cf9c8e5e39..185e678385 100644 --- a/keyboards/helix/rev2/keymaps/default/config.h +++ b/keyboards/helix/rev2/keymaps/default/config.h @@ -22,7 +22,7 @@ along with this program. If not, see . #define CONFIG_USER_H // if you need more program area, try uncomment follow line -//#undef SERIAL_USE_MULTI_TRANSACTION +//#include "serial_config_simpleapi.h" // place overrides here diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/config.h b/keyboards/helix/rev2/keymaps/edvorakjp/config.h index 51cd1d6417..ead31605b2 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/config.h +++ b/keyboards/helix/rev2/keymaps/edvorakjp/config.h @@ -2,7 +2,7 @@ #define CONFIG_USER_H // if you need more program area, try uncomment follow line -//#undef SERIAL_USE_MULTI_TRANSACTION +//#include "serial_config_simpleapi.h" #undef TAPPING_FORCE_HOLD #undef TAPPING_TERM diff --git a/keyboards/helix/rev2/keymaps/five_rows/config.h b/keyboards/helix/rev2/keymaps/five_rows/config.h index 7e7daf0f64..8372194604 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/config.h +++ b/keyboards/helix/rev2/keymaps/five_rows/config.h @@ -22,7 +22,7 @@ along with this program. If not, see . #define CONFIG_USER_H // if you need more program area, try uncomment follow line -//#undef SERIAL_USE_MULTI_TRANSACTION +//#include "serial_config_simpleapi.h" #undef TAPPING_TERM #define TAPPING_TERM 140 diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h b/keyboards/helix/rev2/keymaps/five_rows_jis/config.h index 8cdfdb4e72..c380b7db4e 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . // place overrides here // if you need more program area, try uncomment follow line -//#undef SERIAL_USE_MULTI_TRANSACTION +//#include "serial_config_simpleapi.h" #ifdef MOUSEKEY_ENABLE #undef MOUSEKEY_INTERVAL diff --git a/keyboards/helix/rev2/keymaps/froggy/config.h b/keyboards/helix/rev2/keymaps/froggy/config.h index a1fea15067..dad2483034 100644 --- a/keyboards/helix/rev2/keymaps/froggy/config.h +++ b/keyboards/helix/rev2/keymaps/froggy/config.h @@ -22,7 +22,7 @@ along with this program. If not, see . #define CONFIG_USER_H // if you need more program area, try uncomment follow line -//#undef SERIAL_USE_MULTI_TRANSACTION +//#include "serial_config_simpleapi.h" #undef TAPPING_TERM #define TAPPING_TERM 200 diff --git a/keyboards/helix/rev2/keymaps/led_test/config.h b/keyboards/helix/rev2/keymaps/led_test/config.h index 56d5f91345..0438254528 100644 --- a/keyboards/helix/rev2/keymaps/led_test/config.h +++ b/keyboards/helix/rev2/keymaps/led_test/config.h @@ -22,7 +22,7 @@ along with this program. If not, see . #define CONFIG_USER_H // if you need more program area, try uncomment follow line -#undef SERIAL_USE_MULTI_TRANSACTION +#include "serial_config_simpleapi.h" // place overrides here diff --git a/keyboards/helix/rev2/matrix.c b/keyboards/helix/rev2/matrix.c index fd64c37ab1..322959dbbb 100644 --- a/keyboards/helix/rev2/matrix.c +++ b/keyboards/helix/rev2/matrix.c @@ -183,7 +183,11 @@ i2c_error: // the cable is disconnceted, or something else went wrong int serial_transaction(int master_changed) { int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; +#ifdef SERIAL_USE_MULTI_TRANSACTION int ret=serial_update_buffers(master_changed); +#else + int ret=serial_update_buffers(); +#endif if (ret ) { if(ret==2) RXLED1; return 1; diff --git a/keyboards/helix/rev2/serial_config_simpleapi.h b/keyboards/helix/rev2/serial_config_simpleapi.h new file mode 100644 index 0000000000..e2d22a41e7 --- /dev/null +++ b/keyboards/helix/rev2/serial_config_simpleapi.h @@ -0,0 +1,8 @@ +#ifndef SERIAL_CONFIG_SIMPLEAPI_H +#define SERIAL_CONFIG_SIMPLEAPI_H + +#undef SERIAL_USE_MULTI_TRANSACTION +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +#endif // SERIAL_CONFIG_SIMPLEAPI_H diff --git a/keyboards/helix/rev2/split_scomm.c b/keyboards/helix/rev2/split_scomm.c index f37b783d8a..9719eb22ea 100644 --- a/keyboards/helix/rev2/split_scomm.c +++ b/keyboards/helix/rev2/split_scomm.c @@ -1,4 +1,7 @@ #ifdef USE_SERIAL +#ifdef SERIAL_USE_MULTI_TRANSACTION +/* --- USE flexible API (using multi-type transaction function) --- */ + #include #include #include @@ -12,19 +15,8 @@ uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; uint8_t volatile status_com = 0; uint8_t volatile status1 = 0; -#ifdef SERIAL_USE_MULTI_TRANSACTION uint8_t slave_buffer_change_count = 0; uint8_t s_change_old = 0xff; -#endif - -#ifndef SERIAL_USE_MULTI_TRANSACTION -SSTD_t transactions[] = { - { (uint8_t *)&status_com, - sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, - sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer - } -}; -#else SSTD_t transactions[] = { #define GET_SLAVE_STATUS 0 @@ -46,7 +38,6 @@ SSTD_t transactions[] = { sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer } }; -#endif void serial_master_init(void) { @@ -63,7 +54,6 @@ void serial_slave_init(void) // 2 => checksum error int serial_update_buffers(int master_update) { -#ifdef SERIAL_USE_MULTI_TRANSACTION int status; static int need_retry = 0; if( s_change_old != slave_buffer_change_count ) { @@ -77,10 +67,7 @@ int serial_update_buffers(int master_update) status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); need_retry = ( status == TRANSACTION_END ) ? 0 : 1; return status; -#else - int status; - status = soft_serial_transaction(); - return status; -#endif } + +#endif // SERIAL_USE_MULTI_TRANSACTION #endif /* USE_SERIAL */ diff --git a/keyboards/helix/rev2/split_scomm.h b/keyboards/helix/rev2/split_scomm.h index daa680f8d2..873d8939d8 100644 --- a/keyboards/helix/rev2/split_scomm.h +++ b/keyboards/helix/rev2/split_scomm.h @@ -1,18 +1,24 @@ #ifndef SPLIT_COMM_H #define SPLIT_COMM_H +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ +#include "serial.h" + +#else +/* --- USE flexible API (using multi-type transaction function) --- */ // Buffers for master - slave communication #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; -#ifdef SERIAL_USE_MULTI_TRANSACTION extern uint8_t slave_buffer_change_count; -#endif void serial_master_init(void); void serial_slave_init(void); int serial_update_buffers(int master_changed); +#endif + #endif /* SPLIT_COMM_H */ diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index b030451248..11ceff0b37 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -16,6 +16,45 @@ #ifdef USE_SERIAL +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + #endif + uint8_t volatile status0 = 0; + +SSTD_t transactions[] = { + { (uint8_t *)&status0, + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + #else + 0, (uint8_t *)NULL, + #endif + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + #else + 0, (uint8_t *)NULL, + #endif + } +}; + +void serial_master_init(void) +{ soft_serial_initiator_init(transactions); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions); } + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers() +{ return soft_serial_transaction(); } + +#endif // Simple API (OLD API, compatible with let's split serial.c) + #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) #define _delay_sub_us(x) __builtin_avr_delay_cycles(x) diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h index d3cf1743a3..d2b7fd8e60 100644 --- a/keyboards/helix/serial.h +++ b/keyboards/helix/serial.h @@ -3,9 +3,9 @@ #include -// //////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// // Need Soft Serial defines in serial_config.h -// //////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// // ex. // #define SERIAL_PIN_DDR DDRD // #define SERIAL_PIN_PORT PORTD @@ -13,8 +13,31 @@ // #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 // #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 // -// When using multi-type transaction function, define the following macro. -// #define SERIAL_USE_MULTI_TRANSACTION +// //// USE Simple API (OLD API, compatible with let's split serial.c) +// ex. +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// + + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if SERIAL_SLAVE_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +#endif +#if SERIAL_MASTER_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +#endif + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(void); + +#endif // USE Simple API // Soft Serial Transaction Descriptor typedef struct _SSTD_t {