@ -33,52 +33,21 @@
# define PRINT_PORT(p)
# define GET_ARRAY_PIN(p) pin_array[p].pin
# define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
# define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%d.%02d"), LPC176 8_PIN_PORT(p), LPC1768_PIN_PIN (p)); SERIAL_ECHO(buffer); }while(0)
# define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%d.%02d"), LPC176 x::pin_port(p), LPC176x::pin_bit (p)); SERIAL_ECHO(buffer); }while(0)
# define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities
// uses pin index
# ifndef M43_NEVER_TOUCH
# define M43_NEVER_TOUCH(Q) ((Q) == 29 || (Q) == 30 || (Q) == 73 ) // USB pins
# define M43_NEVER_TOUCH(Q) ((Q) == P0_29 || (Q) == P0_30 || (Q) == P2_09 ) // USB pins
# endif
// active ADC function/mode/code values for PINSEL registers
constexpr int8_t ADC_pin_mode ( pin_t pin ) {
return ( LPC1768_PIN_PORT ( pin ) = = 0 & & LPC1768_PIN_PIN ( pin ) = = 2 ? 2 :
LPC1768_PIN_PORT ( pin ) = = 0 & & LPC1768_PIN_PIN ( pin ) = = 3 ? 2 :
LPC1768_PIN_PORT ( pin ) = = 0 & & LPC1768_PIN_PIN ( pin ) = = 23 ? 1 :
LPC1768_PIN_PORT ( pin ) = = 0 & & LPC1768_PIN_PIN ( pin ) = = 24 ? 1 :
LPC1768_PIN_PORT ( pin ) = = 0 & & LPC1768_PIN_PIN ( pin ) = = 25 ? 1 :
LPC1768_PIN_PORT ( pin ) = = 0 & & LPC1768_PIN_PIN ( pin ) = = 26 ? 1 :
LPC1768_PIN_PORT ( pin ) = = 1 & & LPC1768_PIN_PIN ( pin ) = = 30 ? 3 :
LPC1768_PIN_PORT ( pin ) = = 1 & & LPC1768_PIN_PIN ( pin ) = = 31 ? 3 : - 1 ) ;
}
int8_t get_pin_mode ( pin_t pin ) {
if ( ! VALID_PIN ( pin ) ) return - 1 ;
uint8_t pin_port = LPC1768_PIN_PORT ( pin ) ;
uint8_t pin_port_pin = LPC1768_PIN_PIN ( pin ) ;
//get appropriate PINSEL register
volatile uint32_t * pinsel_reg = ( pin_port = = 0 & & pin_port_pin < = 15 ) ? & LPC_PINCON - > PINSEL0 :
( pin_port = = 0 ) ? & LPC_PINCON - > PINSEL1 :
( pin_port = = 1 & & pin_port_pin < = 15 ) ? & LPC_PINCON - > PINSEL2 :
pin_port = = 1 ? & LPC_PINCON - > PINSEL3 :
pin_port = = 2 ? & LPC_PINCON - > PINSEL4 :
pin_port = = 3 ? & LPC_PINCON - > PINSEL7 : & LPC_PINCON - > PINSEL9 ;
uint8_t pinsel_start_bit = pin_port_pin > 15 ? 2 * ( pin_port_pin - 16 ) : 2 * pin_port_pin ;
int8_t pin_mode = ( int8_t ) ( ( * pinsel_reg > > pinsel_start_bit ) & 0x3 ) ;
return pin_mode ;
}
bool GET_PINMODE ( pin_t pin ) {
int8_t pin_mode = get_pin_mode ( pin ) ;
if ( pin_mode = = - 1 | | pin_mode = = ADC_pin_mode ( pin ) ) // found an invalid pin or active analog pin
bool GET_PINMODE ( const pin_t pin ) {
if ( ! LPC176x : : pin_is_valid ( pin ) | | LPC176x : : pin_adc_enabled ( pin ) ) // found an invalid pin or active analog pin
return false ;
uint32_t * FIO_reg [ 5 ] PROGMEM = { ( uint32_t * ) 0x2009C000 , ( uint32_t * ) 0x2009C020 , ( uint32_t * ) 0x2009C040 , ( uint32_t * ) 0x2009C060 , ( uint32_t * ) 0x2009C080 } ;
return ( ( * FIO_reg [ LPC1768_PIN_PORT ( pin ) ] > > LPC1768_PIN_PIN ( pin ) & 1 ) ! = 0 ) ; //input/output state
return LPC176x : : gpio_direction ( pin ) ;
}
bool GET_ARRAY_IS_DIGITAL ( pin_t pin ) {
return ( ! IS_ANALOG ( pin ) | | get_pin_mode ( pin ) ! = ADC_pin_mode ( pin ) ) ;
bool GET_ARRAY_IS_DIGITAL ( const pin_t pin ) {
return ( ! LPC176x : : pin_has_adc ( pin ) | | ! LPC176x : : pin_adc_enabled ( pin ) ) ;
}