From a1b96bae515463f58509775b799457a2dac4a89f Mon Sep 17 00:00:00 2001 From: Naoto Takai Date: Thu, 3 Sep 2020 01:18:21 +0900 Subject: [PATCH] Add support for soft serial to ATmega32U2 (#10204) * Add support for soft serial to ATmega32U2 * Update drivers/avr/serial.c * Update drivers/avr/serial.c * Update drivers/avr/serial.c * Fix comment * Update drivers/avr/serial.c --- common_features.mk | 6 ++++-- drivers/avr/serial.c | 10 +++++----- quantum/mcu_selection.mk | 3 +++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/common_features.mk b/common_features.mk index 1f110d0819dd..16cbfc1a2594 100644 --- a/common_features.mk +++ b/common_features.mk @@ -417,8 +417,10 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes) # Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called. # Unused functions are pruned away, which is why we can add multiple drivers here without bloat. ifeq ($(PLATFORM),AVR) - QUANTUM_LIB_SRC += i2c_master.c \ - i2c_slave.c + ifneq ($(NO_I2C),yes) + QUANTUM_LIB_SRC += i2c_master.c \ + i2c_slave.c + endif endif SERIAL_DRIVER ?= bitbang diff --git a/drivers/avr/serial.c b/drivers/avr/serial.c index c27cbfdd0a79..8d372d3b8b21 100644 --- a/drivers/avr/serial.c +++ b/drivers/avr/serial.c @@ -20,11 +20,11 @@ #ifdef SOFT_SERIAL_PIN -# ifdef __AVR_ATmega32U4__ -// if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. +# 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. # ifdef USE_AVR_I2C # if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 -# error Using ATmega32U4 I2C, so can not use PD0, PD1 +# error Using ATmegaxxU4 I2C, so can not use PD0, PD1 # endif # endif @@ -52,7 +52,7 @@ # define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) # define SERIAL_PIN_INTERRUPT INT3_vect # endif -# elif SOFT_SERIAL_PIN == E6 +# 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 @@ -61,7 +61,7 @@ # endif # else -# error serial.c now support ATmega32U4 only +# error serial.c currently only supports ATmegaxxU2 and ATmegaxxU4 # endif # define ALWAYS_INLINE __attribute__((always_inline)) diff --git a/quantum/mcu_selection.mk b/quantum/mcu_selection.mk index 33a0cabc84e5..25fd9d8edd3a 100644 --- a/quantum/mcu_selection.mk +++ b/quantum/mcu_selection.mk @@ -252,6 +252,9 @@ ifneq (,$(filter $(MCU),atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 a ifeq (,$(filter $(NO_INTERRUPT_CONTROL_ENDPOINT),yes)) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT endif + ifneq (,$(filter $(MCU),atmega16u2 atmega32u2)) + NO_I2C = yes + endif endif ifneq (,$(filter $(MCU),atmega32a))