From 2b2d6e30811986f55ec5769f443f2937c3856c5d Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Tue, 20 Oct 2020 19:42:27 -0700 Subject: [PATCH 1/5] Expand list of supported controllers for serial.c --- drivers/avr/serial.c | 71 ++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/drivers/avr/serial.c b/drivers/avr/serial.c index 8d372d3b8b21..256f168eb60c 100644 --- a/drivers/avr/serial.c +++ b/drivers/avr/serial.c @@ -20,50 +20,83 @@ #ifdef SOFT_SERIAL_PIN -# if defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) -// if using ATmegaxxU4 I2C, can not use PD0 and PD1 in soft serial. +# if (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) +// if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. # ifdef USE_AVR_I2C # if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 -# error Using ATmegaxxU4 I2C, so can not use PD0, PD1 +# error Using I2C, so can not use PD0, PD1 # endif # endif - -# define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) -# define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) -# define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) -# define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) -# define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF))) - # if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 # if SOFT_SERIAL_PIN == D0 # define EIMSK_BIT _BV(INT0) # define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) # define SERIAL_PIN_INTERRUPT INT0_vect -# elif SOFT_SERIAL_PIN == D1 +# endif +# if SOFT_SERIAL_PIN == D1 # define EIMSK_BIT _BV(INT1) # define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) # define SERIAL_PIN_INTERRUPT INT1_vect -# elif SOFT_SERIAL_PIN == D2 +# endif +# if SOFT_SERIAL_PIN == D2 # define EIMSK_BIT _BV(INT2) # define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) # define SERIAL_PIN_INTERRUPT INT2_vect -# elif SOFT_SERIAL_PIN == D3 +# endif +# if SOFT_SERIAL_PIN == D3 # define EIMSK_BIT _BV(INT3) # define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) # define SERIAL_PIN_INTERRUPT INT3_vect # endif -# elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) && SOFT_SERIAL_PIN == E6 -# define EIMSK_BIT _BV(INT6) -# define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) -# define SERIAL_PIN_INTERRUPT INT6_vect -# else +# elif SOFT_SERIAL_PIN >= E4 && SOFT_SERIAL_PIN <= E7 +# if (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)) +# if SOFT_SERIAL_PIN == E4 +# define EIMSK_BIT _BV(INT4) +# define EICRx_BIT (~(_BV(ISC40) | _BV(ISC41))) +# define SERIAL_PIN_INTERRUPT INT4_vect +# endif +# if SOFT_SERIAL_PIN == E5 +# define EIMSK_BIT _BV(INT5) +# define EICRx_BIT (~(_BV(ISC50) | _BV(ISC51))) +# define SERIAL_PIN_INTERRUPT INT5_vect +# endif +# if SOFT_SERIAL_PIN == E7 +# define EIMSK_BIT _BV(INT7) +# define EICRx_BIT (~(_BV(ISC70) | _BV(ISC71))) +# define SERIAL_PIN_INTERRUPT INT7_vect +# endif +# endif +# if !(defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__)) && SOFT_SERIAL_PIN == E6 +# define EIMSK_BIT _BV(INT6) +# define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) +# define SERIAL_PIN_INTERRUPT INT6_vect +# endif +# endif +# elif defined(__AVR_ATmega32A__) +# if SOFT_SERIAL_PIN == D2 +# define EIMSK_BIT _BV(INT0) +# define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) +# define SERIAL_PIN_INTERRUPT INT0_vect +# elif SOFT_SERIAL_PIN == D3 +# define EIMSK_BIT _BV(INT1) +# define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) +# define SERIAL_PIN_INTERRUPT INT1_vect +# endif + +# ifndef SERIAL_PIN_INTERRUPT # error invalid SOFT_SERIAL_PIN value # endif # else -# error serial.c currently only supports ATmegaxxU2 and ATmegaxxU4 +# error serial.c does not currently support selected MCU # endif +# define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) +# define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) +# define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) +# define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) +# define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF))) + # define ALWAYS_INLINE __attribute__((always_inline)) # define NO_INLINE __attribute__((noinline)) # define _delay_sub_us(x) __builtin_avr_delay_cycles(x) From 3dce10705bd3802a34a1bf7dbc01f9a1e2e6c5bf Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Wed, 21 Oct 2020 14:07:36 -0700 Subject: [PATCH 2/5] Fix pin defines based on mtei's feedback --- drivers/avr/serial.c | 141 ++++++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 63 deletions(-) diff --git a/drivers/avr/serial.c b/drivers/avr/serial.c index 256f168eb60c..c45169f52434 100644 --- a/drivers/avr/serial.c +++ b/drivers/avr/serial.c @@ -20,75 +20,90 @@ #ifdef SOFT_SERIAL_PIN -# if (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) -// if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. -# ifdef USE_AVR_I2C -# if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 -# error Using I2C, so can not use PD0, PD1 -# endif +# if !(defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) +# error serial.c is not supported for the currently selected MCU +# endif +// if using ATmega32U4/2, AT90USBxxx I2C, can not use PD0 and PD1 in soft serial. +# if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) +# if defined(USE_AVR_I2C) && (SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1) +# error Using I2C, so can not use PD0, PD1 # endif -# if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 -# if SOFT_SERIAL_PIN == D0 -# define EIMSK_BIT _BV(INT0) -# define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) -# define SERIAL_PIN_INTERRUPT INT0_vect -# endif -# if SOFT_SERIAL_PIN == D1 -# define EIMSK_BIT _BV(INT1) -# define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) -# define SERIAL_PIN_INTERRUPT INT1_vect -# endif -# if SOFT_SERIAL_PIN == D2 -# define EIMSK_BIT _BV(INT2) -# define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) -# define SERIAL_PIN_INTERRUPT INT2_vect -# endif -# if SOFT_SERIAL_PIN == D3 -# define EIMSK_BIT _BV(INT3) -# define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) -# define SERIAL_PIN_INTERRUPT INT3_vect -# endif -# elif SOFT_SERIAL_PIN >= E4 && SOFT_SERIAL_PIN <= E7 -# if (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)) -# if SOFT_SERIAL_PIN == E4 -# define EIMSK_BIT _BV(INT4) -# define EICRx_BIT (~(_BV(ISC40) | _BV(ISC41))) -# define SERIAL_PIN_INTERRUPT INT4_vect -# endif -# if SOFT_SERIAL_PIN == E5 -# define EIMSK_BIT _BV(INT5) -# define EICRx_BIT (~(_BV(ISC50) | _BV(ISC51))) -# define SERIAL_PIN_INTERRUPT INT5_vect -# endif -# if SOFT_SERIAL_PIN == E7 -# define EIMSK_BIT _BV(INT7) -# define EICRx_BIT (~(_BV(ISC70) | _BV(ISC71))) -# define SERIAL_PIN_INTERRUPT INT7_vect -# endif -# endif -# if !(defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__)) && SOFT_SERIAL_PIN == E6 -# define EIMSK_BIT _BV(INT6) -# define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) -# define SERIAL_PIN_INTERRUPT INT6_vect -# endif +# endif +// PD0..PD3, common config +# if SOFT_SERIAL_PIN == D0 +# define EIMSK_BIT _BV(INT0) +# define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) +# define SERIAL_PIN_INTERRUPT INT0_vect +# elif SOFT_SERIAL_PIN == D1 +# define EIMSK_BIT _BV(INT1) +# define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) +# define SERIAL_PIN_INTERRUPT INT1_vect +# elif SOFT_SERIAL_PIN == D2 +# define EIMSK_BIT _BV(INT2) +# define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) +# define SERIAL_PIN_INTERRUPT INT2_vect +# elif SOFT_SERIAL_PIN == D3 +# define EIMSK_BIT _BV(INT3) +# define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) +# define SERIAL_PIN_INTERRUPT INT3_vect +# endif + +// ATmegaxxU2 specific config +# if defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) +// PD4(INT5), PD6(INT6), PD7(INT7), PC7(INT4) +# if SOFT_SERIAL_PIN == D4 +# define EIMSK_BIT _BV(INT5) +# define EICRx_BIT (~(_BV(ISC50) | _BV(ISC51))) +# define SERIAL_PIN_INTERRUPT INT5_vect +# elif SOFT_SERIAL_PIN == D6 +# define EIMSK_BIT _BV(INT6) +# define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) +# define SERIAL_PIN_INTERRUPT INT6_vect +# elif SOFT_SERIAL_PIN == D7 +# define EIMSK_BIT _BV(INT7) +# define EICRx_BIT (~(_BV(ISC70) | _BV(ISC71))) +# define SERIAL_PIN_INTERRUPT INT7_vect +# elif SOFT_SERIAL_PIN == C7 +# define EIMSK_BIT _BV(INT4) +# define EICRx_BIT (~(_BV(ISC40) | _BV(ISC41))) +# define SERIAL_PIN_INTERRUPT INT4_vect # endif -# elif defined(__AVR_ATmega32A__) -# if SOFT_SERIAL_PIN == D2 -# define EIMSK_BIT _BV(INT0) -# define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) -# define SERIAL_PIN_INTERRUPT INT0_vect -# elif SOFT_SERIAL_PIN == D3 -# define EIMSK_BIT _BV(INT1) -# define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) -# define SERIAL_PIN_INTERRUPT INT1_vect +# endif + +// ATmegaxxU4 specific config +# if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) +// PE6(INT6) +# if SOFT_SERIAL_PIN == E6 +# define EIMSK_BIT _BV(INT6) +# define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) +# define SERIAL_PIN_INTERRUPT INT6_vect # endif +# endif -# ifndef SERIAL_PIN_INTERRUPT -# error invalid SOFT_SERIAL_PIN value +// AT90USBxxx specific config +# if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) +// PE4..PE7(INT4..INT7) +# if SOFT_SERIAL_PIN == E4 +# define EIMSK_BIT _BV(INT4) +# define EICRx_BIT (~(_BV(ISC40) | _BV(ISC41))) +# define SERIAL_PIN_INTERRUPT INT4_vect +# elif SOFT_SERIAL_PIN == E5 +# define EIMSK_BIT _BV(INT5) +# define EICRx_BIT (~(_BV(ISC50) | _BV(ISC51))) +# define SERIAL_PIN_INTERRUPT INT5_vect +# elif SOFT_SERIAL_PIN == E6 +# define EIMSK_BIT _BV(INT6) +# define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) +# define SERIAL_PIN_INTERRUPT INT6_vect +# elif SOFT_SERIAL_PIN == E7 +# define EIMSK_BIT _BV(INT7) +# define EICRx_BIT (~(_BV(ISC70) | _BV(ISC71))) +# define SERIAL_PIN_INTERRUPT INT7_vect # endif +# endif -# else -# error serial.c does not currently support selected MCU +# ifndef SERIAL_PIN_INTERRUPT +# error invalid SOFT_SERIAL_PIN value # endif # define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) From 583943c80f652062c890fa507440ac887bb21365 Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Thu, 22 Oct 2020 14:33:47 -0700 Subject: [PATCH 3/5] Fix EICRx checks in soft_serial_target_init --- drivers/avr/serial.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/avr/serial.c b/drivers/avr/serial.c index c45169f52434..ddba209814ab 100644 --- a/drivers/avr/serial.c +++ b/drivers/avr/serial.c @@ -258,13 +258,11 @@ void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); - // Enable INT0-INT3,INT6 +- // Enable INT0-INT7 EIMSK |= EIMSK_BIT; -# if SOFT_SERIAL_PIN == E6 - // Trigger on falling edge of INT6 +# if EIMSK_BIT >= _BV(INT4) EICRB &= EICRx_BIT; # else - // Trigger on falling edge of INT0-INT3 EICRA &= EICRx_BIT; # endif } From 01256ec09253468af7e41a2511a57c17f768c634 Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Thu, 22 Oct 2020 19:28:11 -0700 Subject: [PATCH 4/5] Fix copy-paste typo --- drivers/avr/serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/avr/serial.c b/drivers/avr/serial.c index ddba209814ab..9e99425c3fc7 100644 --- a/drivers/avr/serial.c +++ b/drivers/avr/serial.c @@ -258,7 +258,7 @@ void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); -- // Enable INT0-INT7 + // Enable INT0-INT7 EIMSK |= EIMSK_BIT; # if EIMSK_BIT >= _BV(INT4) EICRB &= EICRx_BIT; From 57a3616d4604332c38d55c4be92017780e0cd236 Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Mon, 26 Oct 2020 18:43:42 -0700 Subject: [PATCH 5/5] Add defines for EICRx --- drivers/avr/serial.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/avr/serial.c b/drivers/avr/serial.c index 9e99425c3fc7..526a0946b268 100644 --- a/drivers/avr/serial.c +++ b/drivers/avr/serial.c @@ -34,18 +34,22 @@ # define EIMSK_BIT _BV(INT0) # define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) # define SERIAL_PIN_INTERRUPT INT0_vect +# define EICRx EICRA # elif SOFT_SERIAL_PIN == D1 # define EIMSK_BIT _BV(INT1) # define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) # define SERIAL_PIN_INTERRUPT INT1_vect +# define EICRx EICRA # elif SOFT_SERIAL_PIN == D2 # define EIMSK_BIT _BV(INT2) # define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) # define SERIAL_PIN_INTERRUPT INT2_vect +# define EICRx EICRA # elif SOFT_SERIAL_PIN == D3 # define EIMSK_BIT _BV(INT3) # define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) # define SERIAL_PIN_INTERRUPT INT3_vect +# define EICRx EICRA # endif // ATmegaxxU2 specific config @@ -55,18 +59,22 @@ # define EIMSK_BIT _BV(INT5) # define EICRx_BIT (~(_BV(ISC50) | _BV(ISC51))) # define SERIAL_PIN_INTERRUPT INT5_vect +# define EICRx EICRB # elif SOFT_SERIAL_PIN == D6 # define EIMSK_BIT _BV(INT6) # define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) # define SERIAL_PIN_INTERRUPT INT6_vect +# define EICRx EICRB # elif SOFT_SERIAL_PIN == D7 # define EIMSK_BIT _BV(INT7) # define EICRx_BIT (~(_BV(ISC70) | _BV(ISC71))) # define SERIAL_PIN_INTERRUPT INT7_vect +# define EICRx EICRB # elif SOFT_SERIAL_PIN == C7 # define EIMSK_BIT _BV(INT4) # define EICRx_BIT (~(_BV(ISC40) | _BV(ISC41))) # define SERIAL_PIN_INTERRUPT INT4_vect +# define EICRx EICRB # endif # endif @@ -77,6 +85,7 @@ # define EIMSK_BIT _BV(INT6) # define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) # define SERIAL_PIN_INTERRUPT INT6_vect +# define EICRx EICRB # endif # endif @@ -87,18 +96,22 @@ # define EIMSK_BIT _BV(INT4) # define EICRx_BIT (~(_BV(ISC40) | _BV(ISC41))) # define SERIAL_PIN_INTERRUPT INT4_vect +# define EICRx EICRB # elif SOFT_SERIAL_PIN == E5 # define EIMSK_BIT _BV(INT5) # define EICRx_BIT (~(_BV(ISC50) | _BV(ISC51))) # define SERIAL_PIN_INTERRUPT INT5_vect +# define EICRx EICRB # elif SOFT_SERIAL_PIN == E6 # define EIMSK_BIT _BV(INT6) # define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) # define SERIAL_PIN_INTERRUPT INT6_vect +# define EICRx EICRB # elif SOFT_SERIAL_PIN == E7 # define EIMSK_BIT _BV(INT7) # define EICRx_BIT (~(_BV(ISC70) | _BV(ISC71))) # define SERIAL_PIN_INTERRUPT INT7_vect +# define EICRx EICRB # endif # endif @@ -260,11 +273,7 @@ void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { // Enable INT0-INT7 EIMSK |= EIMSK_BIT; -# if EIMSK_BIT >= _BV(INT4) - EICRB &= EICRx_BIT; -# else - EICRA &= EICRx_BIT; -# endif + EICRx &= EICRx_BIT; } // Used by the sender to synchronize timing with the reciver.