AVR GPIO macro defines more readable (#5937)
* A little easier to read the definition of the GPIO control macro for AVR. No change in build result. * Changed to not use GNU statement expression extension. No change in build result. * Modified split_common/serial.c to use qmk_firmware standard GPIO control macro. No change in build result. * fix PE6 -> E6 * remove some space * add some comment to config_common.h * Changed split_common/serial.c to use a newer version of qmk_firmware standard GPIO control macro.master
parent
b62e160a89
commit
1c5b0cbbeb
|
@ -132,6 +132,16 @@
|
||||||
#define F7 PINDEF(F, 7)
|
#define F7 PINDEF(F, 7)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLER__
|
||||||
|
#define _PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset)
|
||||||
|
// Port X Input Pins Address
|
||||||
|
#define PINx_ADDRESS(p) _PIN_ADDRESS(p, 0)
|
||||||
|
// Port X Data Direction Register, 0:input 1:output
|
||||||
|
#define DDRx_ADDRESS(p) _PIN_ADDRESS(p, 1)
|
||||||
|
// Port X Data Register
|
||||||
|
#define PORTx_ADDRESS(p) _PIN_ADDRESS(p, 2)
|
||||||
|
#endif
|
||||||
|
|
||||||
#elif defined(PROTOCOL_CHIBIOS)
|
#elif defined(PROTOCOL_CHIBIOS)
|
||||||
// Defines mapping for Proton C replacement
|
// Defines mapping for Proton C replacement
|
||||||
#ifdef CONVERT_TO_PROTON_C
|
#ifdef CONVERT_TO_PROTON_C
|
||||||
|
|
|
@ -149,18 +149,17 @@ extern layer_state_t default_layer_state;
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
typedef uint8_t pin_t;
|
typedef uint8_t pin_t;
|
||||||
|
|
||||||
#define PIN_ADDRESS(p, offset) (_SFR_IO8(ADDRESS_BASE + ((p) >> PORT_SHIFTER) + (offset)))
|
#define setPinInput(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin) & 0xF))
|
||||||
#define setPinInput(pin) (PIN_ADDRESS(pin, 1) &= ~_BV((pin) & 0xF))
|
#define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin) & 0xF), \
|
||||||
#define setPinInputHigh(pin) (PIN_ADDRESS(pin, 1) &= ~_BV((pin) & 0xF), \
|
PORTx_ADDRESS(pin) |= _BV((pin) & 0xF))
|
||||||
PIN_ADDRESS(pin, 2) |= _BV((pin) & 0xF))
|
|
||||||
#define setPinInputLow(pin) _Static_assert(0, "AVR processors cannot implement an input as pull low")
|
#define setPinInputLow(pin) _Static_assert(0, "AVR processors cannot implement an input as pull low")
|
||||||
#define setPinOutput(pin) (PIN_ADDRESS(pin, 1) |= _BV((pin) & 0xF))
|
#define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin) & 0xF))
|
||||||
|
|
||||||
#define writePinHigh(pin) (PIN_ADDRESS(pin, 2) |= _BV((pin) & 0xF))
|
#define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin) & 0xF))
|
||||||
#define writePinLow(pin) (PIN_ADDRESS(pin, 2) &= ~_BV((pin) & 0xF))
|
#define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin) & 0xF))
|
||||||
#define writePin(pin, level) ((level) ? writePinHigh(pin) : writePinLow(pin))
|
#define writePin(pin, level) ((level) ? writePinHigh(pin) : writePinLow(pin))
|
||||||
|
|
||||||
#define readPin(pin) ((bool)(PIN_ADDRESS(pin, 0) & _BV((pin) & 0xF)))
|
#define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin) & 0xF)))
|
||||||
#elif defined(PROTOCOL_CHIBIOS)
|
#elif defined(PROTOCOL_CHIBIOS)
|
||||||
typedef ioline_t pin_t;
|
typedef ioline_t pin_t;
|
||||||
|
|
||||||
|
|
|
@ -29,36 +29,32 @@
|
||||||
#endif
|
#endif
|
||||||
#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 && SOFT_SERIAL_PIN <= D3
|
||||||
#define SERIAL_PIN_DDR DDRD
|
|
||||||
#define SERIAL_PIN_PORT PORTD
|
|
||||||
#define SERIAL_PIN_INPUT PIND
|
|
||||||
#if SOFT_SERIAL_PIN == D0
|
#if SOFT_SERIAL_PIN == D0
|
||||||
#define SERIAL_PIN_MASK _BV(PD0)
|
|
||||||
#define EIMSK_BIT _BV(INT0)
|
#define EIMSK_BIT _BV(INT0)
|
||||||
#define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01)))
|
#define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01)))
|
||||||
#define SERIAL_PIN_INTERRUPT INT0_vect
|
#define SERIAL_PIN_INTERRUPT INT0_vect
|
||||||
#elif SOFT_SERIAL_PIN == D1
|
#elif SOFT_SERIAL_PIN == D1
|
||||||
#define SERIAL_PIN_MASK _BV(PD1)
|
|
||||||
#define EIMSK_BIT _BV(INT1)
|
#define EIMSK_BIT _BV(INT1)
|
||||||
#define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11)))
|
#define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11)))
|
||||||
#define SERIAL_PIN_INTERRUPT INT1_vect
|
#define SERIAL_PIN_INTERRUPT INT1_vect
|
||||||
#elif SOFT_SERIAL_PIN == D2
|
#elif SOFT_SERIAL_PIN == D2
|
||||||
#define SERIAL_PIN_MASK _BV(PD2)
|
|
||||||
#define EIMSK_BIT _BV(INT2)
|
#define EIMSK_BIT _BV(INT2)
|
||||||
#define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21)))
|
#define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21)))
|
||||||
#define SERIAL_PIN_INTERRUPT INT2_vect
|
#define SERIAL_PIN_INTERRUPT INT2_vect
|
||||||
#elif SOFT_SERIAL_PIN == D3
|
#elif SOFT_SERIAL_PIN == D3
|
||||||
#define SERIAL_PIN_MASK _BV(PD3)
|
|
||||||
#define EIMSK_BIT _BV(INT3)
|
#define EIMSK_BIT _BV(INT3)
|
||||||
#define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31)))
|
#define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31)))
|
||||||
#define SERIAL_PIN_INTERRUPT INT3_vect
|
#define SERIAL_PIN_INTERRUPT INT3_vect
|
||||||
#endif
|
#endif
|
||||||
#elif SOFT_SERIAL_PIN == E6
|
#elif SOFT_SERIAL_PIN == E6
|
||||||
#define SERIAL_PIN_DDR DDRE
|
|
||||||
#define SERIAL_PIN_PORT PORTE
|
|
||||||
#define SERIAL_PIN_INPUT PINE
|
|
||||||
#define SERIAL_PIN_MASK _BV(PE6)
|
|
||||||
#define EIMSK_BIT _BV(INT6)
|
#define EIMSK_BIT _BV(INT6)
|
||||||
#define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61)))
|
#define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61)))
|
||||||
#define SERIAL_PIN_INTERRUPT INT6_vect
|
#define SERIAL_PIN_INTERRUPT INT6_vect
|
||||||
|
@ -200,33 +196,32 @@ void serial_delay_half2(void) {
|
||||||
inline static void serial_output(void) ALWAYS_INLINE;
|
inline static void serial_output(void) ALWAYS_INLINE;
|
||||||
inline static
|
inline static
|
||||||
void serial_output(void) {
|
void serial_output(void) {
|
||||||
SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
|
setPinOutput(SOFT_SERIAL_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// make the serial pin an input with pull-up resistor
|
// 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_with_pullup(void) ALWAYS_INLINE;
|
||||||
inline static
|
inline static
|
||||||
void serial_input_with_pullup(void) {
|
void serial_input_with_pullup(void) {
|
||||||
SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
|
setPinInputHigh(SOFT_SERIAL_PIN);
|
||||||
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static uint8_t serial_read_pin(void) ALWAYS_INLINE;
|
inline static uint8_t serial_read_pin(void) ALWAYS_INLINE;
|
||||||
inline static
|
inline static
|
||||||
uint8_t serial_read_pin(void) {
|
uint8_t serial_read_pin(void) {
|
||||||
return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK);
|
return !! readPin(SOFT_SERIAL_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static void serial_low(void) ALWAYS_INLINE;
|
inline static void serial_low(void) ALWAYS_INLINE;
|
||||||
inline static
|
inline static
|
||||||
void serial_low(void) {
|
void serial_low(void) {
|
||||||
SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK;
|
writePinLow(SOFT_SERIAL_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static void serial_high(void) ALWAYS_INLINE;
|
inline static void serial_high(void) ALWAYS_INLINE;
|
||||||
inline static
|
inline static
|
||||||
void serial_high(void) {
|
void serial_high(void) {
|
||||||
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
|
writePinHigh(SOFT_SERIAL_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size)
|
void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size)
|
||||||
|
@ -245,7 +240,7 @@ void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size)
|
||||||
|
|
||||||
// Enable INT0-INT3,INT6
|
// Enable INT0-INT3,INT6
|
||||||
EIMSK |= EIMSK_BIT;
|
EIMSK |= EIMSK_BIT;
|
||||||
#if SERIAL_PIN_MASK == _BV(PE6)
|
#if SOFT_SERIAL_PIN == E6
|
||||||
// Trigger on falling edge of INT6
|
// Trigger on falling edge of INT6
|
||||||
EICRB &= EICRx_BIT;
|
EICRB &= EICRx_BIT;
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in New Issue