Fixed workaround with correct macro
This commit is contained in:
parent
1265702325
commit
d991959bff
33
io.hpp
33
io.hpp
@ -131,16 +131,13 @@ The following works in avr-gcc 5.4.0, but is not legal C++, because ptr's are no
|
||||
constexpr auto *foo = ptr;
|
||||
|
||||
Workaround is to store the the address of the ptr in a uintptr_t and reinterpret_cast it at call site
|
||||
For this to work we need to temporarily disable the _SFR_IO8 macro so that the register macro just gives the address
|
||||
For this the sfr_defs.h provides a macro which returns the address of a register
|
||||
*/
|
||||
|
||||
#undef _SFR_IO8
|
||||
#define _SFR_IO8
|
||||
|
||||
#ifdef PORT_A_AVAILABLE
|
||||
static constexpr uintptr_t PORT_A_DIR_REG_ADDR = DDRA + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_A_OUTPUT_REG_ADDR = PORTA + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_A_INPUT_REG_ADDR = PINA + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_A_DIR_REG_ADDR = _SFR_ADDR(DDRA);
|
||||
static constexpr uintptr_t PORT_A_OUTPUT_REG_ADDR = _SFR_ADDR(PORTA);
|
||||
static constexpr uintptr_t PORT_A_INPUT_REG_ADDR = _SFR_ADDR(PINA);
|
||||
#else
|
||||
static constexpr uintptr_t PORT_A_DIR_REG_ADDR = 0;
|
||||
static constexpr uintptr_t PORT_A_OUTPUT_REG_ADDR = 0;
|
||||
@ -148,9 +145,10 @@ static constexpr uintptr_t PORT_A_INPUT_REG_ADDR = 0;
|
||||
#endif
|
||||
|
||||
#ifdef PORT_B_AVAILABLE
|
||||
static constexpr uintptr_t PORT_B_DIR_REG_ADDR = DDRB + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_B_OUTPUT_REG_ADDR = PORTB + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_B_INPUT_REG_ADDR = PINB + __SFR_OFFSET;
|
||||
|
||||
static constexpr uintptr_t PORT_B_DIR_REG_ADDR = _SFR_ADDR(DDRB);
|
||||
static constexpr uintptr_t PORT_B_OUTPUT_REG_ADDR = _SFR_ADDR(PORTB);
|
||||
static constexpr uintptr_t PORT_B_INPUT_REG_ADDR = _SFR_ADDR(PINB);
|
||||
#else
|
||||
static constexpr uintptr_t PORT_B_DIR_REG_ADDR = 0;
|
||||
static constexpr uintptr_t PORT_B_OUTPUT_REG_ADDR = 0;
|
||||
@ -158,9 +156,9 @@ static constexpr uintptr_t PORT_B_INPUT_REG_ADDR = 0;
|
||||
#endif
|
||||
|
||||
#ifdef PORT_C_AVAILABLE
|
||||
static constexpr uintptr_t PORT_C_DIR_REG_ADDR = DDRC + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_C_OUTPUT_REG_ADDR = PORTC + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_C_INPUT_REG_ADDR = PINC + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_C_DIR_REG_ADDR = _SFR_ADDR(DDRC);
|
||||
static constexpr uintptr_t PORT_C_OUTPUT_REG_ADDR = _SFR_ADDR(PORTC);
|
||||
static constexpr uintptr_t PORT_C_INPUT_REG_ADDR = _SFR_ADDR(PINC);
|
||||
#else
|
||||
static constexpr uintptr_t PORT_C_DIR_REG_ADDR = 0;
|
||||
static constexpr uintptr_t PORT_C_OUTPUT_REG_ADDR = 0;
|
||||
@ -168,18 +166,15 @@ static constexpr uintptr_t PORT_C_INPUT_REG_ADDR = 0;
|
||||
#endif
|
||||
|
||||
#ifdef PORT_D_AVAILABLE
|
||||
static constexpr uintptr_t PORT_D_DIR_REG_ADDR = DDRD + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_D_OUTPUT_REG_ADDR = PORTD + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_D_INPUT_REG_ADDR = PIND + __SFR_OFFSET;
|
||||
static constexpr uintptr_t PORT_D_DIR_REG_ADDR = _SFR_ADDR(DDRD);
|
||||
static constexpr uintptr_t PORT_D_OUTPUT_REG_ADDR = _SFR_ADDR(PORTD);
|
||||
static constexpr uintptr_t PORT_D_INPUT_REG_ADDR = _SFR_ADDR(PIND);
|
||||
#else
|
||||
static constexpr uintptr_t PORT_D_DIR_REG_ADDR = 0;
|
||||
static constexpr uintptr_t PORT_D_OUTPUT_REG_ADDR = 0;
|
||||
static constexpr uintptr_t PORT_D_INPUT_REG_ADDR = 0;
|
||||
#endif
|
||||
|
||||
#undef _SFR_IO8
|
||||
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
|
||||
|
||||
static constexpr auto getBus(const P pin)
|
||||
{
|
||||
// Upper 4 bits of pin encode which port this pin is on
|
||||
|
Loading…
Reference in New Issue
Block a user