diff options
Diffstat (limited to 'keyboards/crkbd')
31 files changed, 580 insertions, 233 deletions
diff --git a/keyboards/crkbd/config.h b/keyboards/crkbd/config.h index c910d8f24f..64fee75457 100644 --- a/keyboards/crkbd/config.h +++ b/keyboards/crkbd/config.h @@ -16,9 +16,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" +#include <serial_config.h> -#endif +#ifdef USE_Link_Time_Optimization + // LTO has issues with macros (action_get_macro) and "functions" (fn_actions), + // so just disable them + #define NO_ACTION_MACRO + #define NO_ACTION_FUNCTION + + #define DISABLE_LEADER +#endif // USE_Link_Time_Optimization diff --git a/keyboards/crkbd/crkbd.h b/keyboards/crkbd/crkbd.h index 889bcb9ae3..73f2a3f074 100644 --- a/keyboards/crkbd/crkbd.h +++ b/keyboards/crkbd/crkbd.h @@ -1,8 +1,5 @@ -#ifndef CRKBD_H -#define CRKBD_H +#pragma once #ifdef KEYBOARD_crkbd_rev1 #include "rev1.h" #endif - -#endif diff --git a/keyboards/crkbd/i2c.c b/keyboards/crkbd/i2c.c index 084c890c40..4bee5c6398 100644 --- a/keyboards/crkbd/i2c.c +++ b/keyboards/crkbd/i2c.c @@ -34,7 +34,7 @@ void i2c_delay(void) { // _delay_us(100); } -// Setup twi to run at 100kHz +// Setup twi to run at 100kHz or 400kHz (see ./i2c.h SCL_CLOCK) void i2c_master_init(void) { // no prescaler TWSR = 0; diff --git a/keyboards/crkbd/i2c.h b/keyboards/crkbd/i2c.h index c15b6bc506..710662c7ab 100644 --- a/keyboards/crkbd/i2c.h +++ b/keyboards/crkbd/i2c.h @@ -1,5 +1,4 @@ -#ifndef I2C_H -#define I2C_H +#pragma once #include <stdint.h> @@ -15,7 +14,7 @@ #define SLAVE_BUFFER_SIZE 0x10 -// i2c SCL clock frequency +// i2c SCL clock frequency 400kHz #define SCL_CLOCK 400000L extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; @@ -45,5 +44,3 @@ extern unsigned char i2c_readNak(void); extern unsigned char i2c_read(unsigned char ack); #define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c index 87661d3451..e92fbdebfa 100644 --- a/keyboards/crkbd/keymaps/default/keymap.c +++ b/keyboards/crkbd/keymaps/default/keymap.c @@ -5,7 +5,6 @@ #include "split_util.h" #endif #ifdef SSD1306OLED - #include "LUFA/Drivers/Peripheral/TWI.h" #include "ssd1306.h" #endif @@ -130,7 +129,6 @@ void matrix_init_user(void) { #endif //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED - TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); iota_gfx_init(!has_usb()); // turns on the display #endif } diff --git a/keyboards/crkbd/keymaps/default/rules.mk b/keyboards/crkbd/keymaps/default/rules.mk index 6570e2f5cb..0edf1181f0 100644 --- a/keyboards/crkbd/keymaps/default/rules.mk +++ b/keyboards/crkbd/keymaps/default/rules.mk @@ -21,10 +21,10 @@ SWAP_HANDS_ENABLE = no # Enable one-hand typing SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here -SRC += ../lib/rgb_state_reader.c \ - ../lib/layer_state_reader.c \ - ../lib/logo_reader.c \ - ../lib/keylogger.c \ - # ../lib/mode_icon_reader.c \ - # ../lib/host_led_state_reader.c \ - # ../lib/timelogger.c \ +SRC += ./lib/rgb_state_reader.c \ + ./lib/layer_state_reader.c \ + ./lib/logo_reader.c \ + ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/keyboards/crkbd/keymaps/like_jis/keymap.c b/keyboards/crkbd/keymaps/like_jis/keymap.c index 31b5230b10..90e5b7ec17 100644 --- a/keyboards/crkbd/keymaps/like_jis/keymap.c +++ b/keyboards/crkbd/keymaps/like_jis/keymap.c @@ -5,7 +5,6 @@ #include "split_util.h" #endif #ifdef SSD1306OLED - #include "LUFA/Drivers/Peripheral/TWI.h" #include "ssd1306.h" #endif @@ -124,7 +123,6 @@ void matrix_init_user(void) { #endif //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED - TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); iota_gfx_init(!has_usb()); // turns on the display #endif } diff --git a/keyboards/crkbd/keymaps/like_jis/rules.mk b/keyboards/crkbd/keymaps/like_jis/rules.mk index 6570e2f5cb..0edf1181f0 100644 --- a/keyboards/crkbd/keymaps/like_jis/rules.mk +++ b/keyboards/crkbd/keymaps/like_jis/rules.mk @@ -21,10 +21,10 @@ SWAP_HANDS_ENABLE = no # Enable one-hand typing SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here -SRC += ../lib/rgb_state_reader.c \ - ../lib/layer_state_reader.c \ - ../lib/logo_reader.c \ - ../lib/keylogger.c \ - # ../lib/mode_icon_reader.c \ - # ../lib/host_led_state_reader.c \ - # ../lib/timelogger.c \ +SRC += ./lib/rgb_state_reader.c \ + ./lib/layer_state_reader.c \ + ./lib/logo_reader.c \ + ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/keyboards/crkbd/keymaps/lib/host_led_state_reader.c b/keyboards/crkbd/lib/host_led_state_reader.c index 41ac55dc2b..41ac55dc2b 100644 --- a/keyboards/crkbd/keymaps/lib/host_led_state_reader.c +++ b/keyboards/crkbd/lib/host_led_state_reader.c diff --git a/keyboards/crkbd/keymaps/lib/keylogger.c b/keyboards/crkbd/lib/keylogger.c index 8f2a8ce3cc..8f2a8ce3cc 100644 --- a/keyboards/crkbd/keymaps/lib/keylogger.c +++ b/keyboards/crkbd/lib/keylogger.c diff --git a/keyboards/crkbd/keymaps/lib/layer_state_reader.c b/keyboards/crkbd/lib/layer_state_reader.c index eddb71337e..eddb71337e 100644 --- a/keyboards/crkbd/keymaps/lib/layer_state_reader.c +++ b/keyboards/crkbd/lib/layer_state_reader.c diff --git a/keyboards/crkbd/keymaps/lib/logo_reader.c b/keyboards/crkbd/lib/logo_reader.c index 1bc1503a60..1bc1503a60 100644 --- a/keyboards/crkbd/keymaps/lib/logo_reader.c +++ b/keyboards/crkbd/lib/logo_reader.c diff --git a/keyboards/crkbd/keymaps/lib/mode_icon_reader.c b/keyboards/crkbd/lib/mode_icon_reader.c index 04c226506a..04c226506a 100644 --- a/keyboards/crkbd/keymaps/lib/mode_icon_reader.c +++ b/keyboards/crkbd/lib/mode_icon_reader.c diff --git a/keyboards/crkbd/keymaps/lib/rgb_state_reader.c b/keyboards/crkbd/lib/rgb_state_reader.c index e0efe2e528..e0efe2e528 100644 --- a/keyboards/crkbd/keymaps/lib/rgb_state_reader.c +++ b/keyboards/crkbd/lib/rgb_state_reader.c diff --git a/keyboards/crkbd/keymaps/lib/timelogger.c b/keyboards/crkbd/lib/timelogger.c index 69828a3a08..69828a3a08 100644 --- a/keyboards/crkbd/keymaps/lib/timelogger.c +++ b/keyboards/crkbd/lib/timelogger.c diff --git a/keyboards/crkbd/pro_micro.h b/keyboards/crkbd/pro_micro.h index f9e7ed75d9..3666333727 100644 --- a/keyboards/crkbd/pro_micro.h +++ b/keyboards/crkbd/pro_micro.h @@ -21,9 +21,7 @@ $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ */ - -#ifndef Pins_Arduino_h -#define Pins_Arduino_h +#pragma once #include <avr/pgmspace.h> @@ -358,5 +356,3 @@ const uint8_t PROGMEM analog_pin_to_channel_PGM[] = { #define SERIAL_PORT_USBVIRTUAL Serial #define SERIAL_PORT_HARDWARE Serial1 #define SERIAL_PORT_HARDWARE_OPEN Serial1 - -#endif /* Pins_Arduino_h */ diff --git a/keyboards/crkbd/rev1/config.h b/keyboards/crkbd/rev1/config.h index 6321136a73..efce13a490 100644 --- a/keyboards/crkbd/rev1/config.h +++ b/keyboards/crkbd/rev1/config.h @@ -16,10 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include "../config.h" +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED @@ -82,6 +79,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - - -#endif diff --git a/keyboards/crkbd/rev1/matrix.c b/keyboards/crkbd/rev1/matrix.c index 117ff8d37f..718cc57448 100644 --- a/keyboards/crkbd/rev1/matrix.c +++ b/keyboards/crkbd/rev1/matrix.c @@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <stdint.h> #include <stdbool.h> +#include <string.h> #include <avr/io.h> #include <avr/wdt.h> #include <avr/interrupt.h> @@ -30,12 +31,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "matrix.h" #include "split_util.h" #include "pro_micro.h" -#include "config.h" #ifdef USE_MATRIX_I2C # include "i2c.h" #else // USE_SERIAL -# include "serial.h" +# include "split_scomm.h" #endif #ifndef DEBOUNCE @@ -103,6 +103,8 @@ void matrix_init(void) init_cols(); TX_RX_LED_INIT; + TXLED0; + RXLED0; // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) { @@ -179,17 +181,20 @@ i2c_error: // the cable is disconnceted, or something else went wrong #else // USE_SERIAL -int serial_transaction(void) { +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; + if(ret==2) RXLED1; return 1; } -RXLED0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } + RXLED0; + memcpy(&matrix[slaveOffset], + (void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH); return 0; } #endif @@ -200,19 +205,9 @@ uint8_t matrix_scan(void) matrix_master_scan(); }else{ matrix_slave_scan(); - -// if(serial_slave_DATA_CORRUPT()){ -// TXLED0; - int offset = (isLeftHand) ? ROWS_PER_HAND : 0; - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[offset+i] = serial_master_buffer[i]; - } - -// }else{ -// TXLED1; -// } - + int offset = (isLeftHand) ? ROWS_PER_HAND : 0; + memcpy(&matrix[offset], + (void *)serial_master_buffer, SERIAL_MASTER_BUFFER_LENGTH); matrix_scan_quantum(); } return 1; @@ -222,6 +217,7 @@ uint8_t matrix_scan(void) uint8_t matrix_master_scan(void) { int ret = _matrix_scan(); + int mchanged = 1; int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; @@ -231,15 +227,18 @@ uint8_t matrix_master_scan(void) { // i2c_slave_buffer[i] = matrix[offset+i]; // } #else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_master_buffer[i] = matrix[offset+i]; - } + #ifdef SERIAL_USE_MULTI_TRANSACTION + mchanged = memcmp((void *)serial_master_buffer, + &matrix[offset], SERIAL_MASTER_BUFFER_LENGTH); + #endif + memcpy((void *)serial_master_buffer, + &matrix[offset], SERIAL_MASTER_BUFFER_LENGTH); #endif #ifdef USE_MATRIX_I2C if( i2c_transaction() ) { #else // USE_SERIAL - if( serial_transaction() ) { + if( serial_transaction(mchanged) ) { #endif // turn on the indicator led when halves are disconnected TXLED1; @@ -273,9 +272,19 @@ void matrix_slave_scan(void) { i2c_slave_buffer[i] = matrix[offset+i]; } #else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + int change = 0; + #endif for (int i = 0; i < ROWS_PER_HAND; ++i) { + #ifdef SERIAL_USE_MULTI_TRANSACTION + if( serial_slave_buffer[i] != matrix[offset+i] ) + change = 1; + #endif serial_slave_buffer[i] = matrix[offset+i]; } + #ifdef SERIAL_USE_MULTI_TRANSACTION + slave_buffer_change_count += change; + #endif #endif } diff --git a/keyboards/crkbd/rev1/rev1.h b/keyboards/crkbd/rev1/rev1.h index d02c51f30e..cdd61d2bf9 100644 --- a/keyboards/crkbd/rev1/rev1.h +++ b/keyboards/crkbd/rev1/rev1.h @@ -1,5 +1,4 @@ -#ifndef REV1_H -#define REV1_CONFIG_H +#pragma once #include "../crkbd.h" @@ -49,5 +48,3 @@ KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ KC_##L30, KC_##L31, KC_##L32, KC_##R30, KC_##R31, KC_##R32 \ ) - -#endif diff --git a/keyboards/crkbd/rev1/rules.mk b/keyboards/crkbd/rev1/rules.mk index 7af7ffdb8a..6028b5a5b9 100644 --- a/keyboards/crkbd/rev1/rules.mk +++ b/keyboards/crkbd/rev1/rules.mk @@ -1,2 +1,3 @@ -SRC += rev1/matrix.c \ - ws2812.c +SRC += rev1/matrix.c +SRC += rev1/split_util.c +SRC += rev1/split_scomm.c diff --git a/keyboards/crkbd/rev1/serial_config.h b/keyboards/crkbd/rev1/serial_config.h new file mode 100644 index 0000000000..671ed821d2 --- /dev/null +++ b/keyboards/crkbd/rev1/serial_config.h @@ -0,0 +1,10 @@ +#pragma once + +/* Soft Serial defines */ +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_INPUT PIND +#define SERIAL_PIN_MASK _BV(PD2) +#define SERIAL_PIN_INTERRUPT INT2_vect + +#define SERIAL_USE_MULTI_TRANSACTION diff --git a/keyboards/crkbd/rev1/serial_config_simpleapi.h b/keyboards/crkbd/rev1/serial_config_simpleapi.h new file mode 100644 index 0000000000..0e1dd9e4ac --- /dev/null +++ b/keyboards/crkbd/rev1/serial_config_simpleapi.h @@ -0,0 +1,5 @@ +#pragma once + +#undef SERIAL_USE_MULTI_TRANSACTION +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 diff --git a/keyboards/crkbd/rev1/split_scomm.c b/keyboards/crkbd/rev1/split_scomm.c new file mode 100644 index 0000000000..9719eb22ea --- /dev/null +++ b/keyboards/crkbd/rev1/split_scomm.c @@ -0,0 +1,73 @@ +#ifdef USE_SERIAL +#ifdef SERIAL_USE_MULTI_TRANSACTION +/* --- USE flexible API (using multi-type transaction function) --- */ + +#include <stdbool.h> +#include <stdint.h> +#include <stddef.h> +#include <split_scomm.h> +#include "serial.h" +#ifdef SERIAL_DEBUG_MODE +#include <avr/io.h> +#endif + +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; +uint8_t slave_buffer_change_count = 0; +uint8_t s_change_old = 0xff; + +SSTD_t transactions[] = { +#define GET_SLAVE_STATUS 0 + /* master buffer not changed, only recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + 0, NULL, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define PUT_MASTER_GET_SLAVE_STATUS 1 + /* master buffer changed need send, and recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define GET_SLAVE_BUFFER 2 + /* recive serial_slave_buffer */ + { (uint8_t *)&status1, + 0, NULL, + 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) +{ + int status; + static int need_retry = 0; + if( s_change_old != slave_buffer_change_count ) { + status = soft_serial_transaction(GET_SLAVE_BUFFER); + if( status == TRANSACTION_END ) + s_change_old = slave_buffer_change_count; + } + if( !master_update && !need_retry) + status = soft_serial_transaction(GET_SLAVE_STATUS); + else + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + need_retry = ( status == TRANSACTION_END ) ? 0 : 1; + return status; +} + +#endif // SERIAL_USE_MULTI_TRANSACTION +#endif /* USE_SERIAL */ diff --git a/keyboards/crkbd/rev1/split_scomm.h b/keyboards/crkbd/rev1/split_scomm.h new file mode 100644 index 0000000000..16887eb74f --- /dev/null +++ b/keyboards/crkbd/rev1/split_scomm.h @@ -0,0 +1,21 @@ +#pragma once + +#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]; +extern uint8_t slave_buffer_change_count; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(int master_changed); + +#endif diff --git a/keyboards/crkbd/split_util.c b/keyboards/crkbd/rev1/split_util.c index 8bc064174e..e1ff8b4379 100644 --- a/keyboards/crkbd/split_util.c +++ b/keyboards/crkbd/rev1/split_util.c @@ -7,12 +7,11 @@ #include "split_util.h" #include "matrix.h" #include "keyboard.h" -#include "config.h" #ifdef USE_MATRIX_I2C # include "i2c.h" #else -# include "serial.h" +# include "split_scomm.h" #endif volatile bool isLeftHand = true; diff --git a/keyboards/crkbd/split_util.h b/keyboards/crkbd/rev1/split_util.h index 687ca19bd3..f593047560 100644 --- a/keyboards/crkbd/split_util.h +++ b/keyboards/crkbd/rev1/split_util.h @@ -1,5 +1,4 @@ -#ifndef SPLIT_KEYBOARD_UTIL_H -#define SPLIT_KEYBOARD_UTIL_H +#pragma once #include <stdbool.h> #include "eeconfig.h" @@ -15,5 +14,3 @@ void split_keyboard_setup(void); bool has_usb(void); void matrix_master_OLED_init (void); - -#endif diff --git a/keyboards/crkbd/rules.mk b/keyboards/crkbd/rules.mk index d88daebf3a..6396b115de 100644 --- a/keyboards/crkbd/rules.mk +++ b/keyboards/crkbd/rules.mk @@ -1,7 +1,9 @@ -SRC += i2c.c \ - serial.c \ - split_util.c \ - ssd1306.c +SRC += i2c.c +SRC += serial.c +SRC += ssd1306.c + +# if firmware size over limit, try this option +# CFLAGS += -flto # MCU name #MCU = at90usb1287 diff --git a/keyboards/crkbd/serial.c b/keyboards/crkbd/serial.c index e918ab6ee6..11ceff0b37 100644 --- a/keyboards/crkbd/serial.c +++ b/keyboards/crkbd/serial.c @@ -9,36 +9,128 @@ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> +#include <stddef.h> #include <stdbool.h> #include "serial.h" +//#include <pro_micro.h> #ifdef USE_SERIAL -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 +#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); } -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +void serial_slave_init(void) +{ soft_serial_target_init(transactions); } -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; +// 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) + +// Serial pulse period in microseconds. +#define TID_SEND_ADJUST 14 + +#define SELECT_SERIAL_SPEED 1 +#if SELECT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 50 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#else +#error Illegal Serial Speed +#endif + + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; 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_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); } + +inline static void serial_output(void) ALWAYS_INLINE; inline static void serial_output(void) { SERIAL_PIN_DDR |= SERIAL_PIN_MASK; } // make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; inline static -void serial_input(void) { +void serial_input_with_pullup(void) { SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } @@ -48,191 +140,305 @@ uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); } +inline static void serial_low(void) ALWAYS_INLINE; inline static void serial_low(void) { SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; } +inline static void serial_high(void) ALWAYS_INLINE; inline static void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void serial_master_init(void) { - serial_output(); - serial_high(); +void soft_serial_initiator_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_output(); + serial_high(); } -void serial_slave_init |