| @@ -983,25 +983,37 @@ void pinMode(uint8_t pin, uint8_t mode) | |||
| if (pin >= CORE_NUM_DIGITAL) return; | |||
| config = portConfigRegister(pin); | |||
| if (mode == OUTPUT) { | |||
| if (mode == OUTPUT || mode == OUTPUT_OPENDRAIN) { | |||
| #ifdef KINETISK | |||
| *portModeRegister(pin) = 1; | |||
| #else | |||
| *portModeRegister(pin) |= digitalPinToBitMask(pin); // TODO: atomic | |||
| #endif | |||
| *config = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); | |||
| if (mode == OUTPUT_OPENDRAIN) { | |||
| *config |= PORT_PCR_ODE; | |||
| } else { | |||
| *config &= ~PORT_PCR_ODE; | |||
| } | |||
| } else { | |||
| #ifdef KINETISK | |||
| *portModeRegister(pin) = 0; | |||
| #else | |||
| *portModeRegister(pin) &= ~digitalPinToBitMask(pin); | |||
| #endif | |||
| if (mode == INPUT) { | |||
| if (mode == INPUT || mode == INPUT_PULLUP || mode == INPUT_PULLDOWN) { | |||
| *config = PORT_PCR_MUX(1); | |||
| if (mode == INPUT_PULLUP) { | |||
| *config |= (PORT_PCR_PE | PORT_PCR_PS); // pullup | |||
| } else if (mode == INPUT_PULLDOWN) { | |||
| *config |= (PORT_PCR_PE); // pulldown | |||
| *config &= ~(PORT_PCR_PS); | |||
| } | |||
| } else { | |||
| *config = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; // pullup | |||
| } | |||
| } | |||
| } | |||