From e431bf7f91a2350f3cddbbd3baebbcc8e970aca7 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Thu, 21 Jan 2016 14:11:21 -0500 Subject: [PATCH 1/5] Enable input on pinMode OUTPUT to support reading back current value via digitalRead --- cores/arduino/wiring_digital.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index e123c7f85..38d5d23ee 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -58,8 +58,10 @@ void pinMode( uint32_t ulPin, uint32_t ulMode ) break ; case OUTPUT: + // enable input, to support reading back values + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.INEN = 1 ; + // Set pin to output mode - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg&=~(uint8_t)(PORT_PINCFG_INEN) ; PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1< Date: Thu, 21 Jan 2016 14:13:09 -0500 Subject: [PATCH 2/5] Disable pull-ups on pinMode OUTPUT --- cores/arduino/wiring_digital.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 38d5d23ee..966d72bd5 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -61,6 +61,9 @@ void pinMode( uint32_t ulPin, uint32_t ulMode ) // enable input, to support reading back values PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.INEN = 1 ; + // disable pullups + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.PULLEN = 0 ; + // Set pin to output mode PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1< Date: Thu, 21 Jan 2016 14:20:00 -0500 Subject: [PATCH 3/5] Only update pull-up value in digitalWrite if pin direction is not output --- cores/arduino/wiring_digital.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 966d72bd5..769bcaf79 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -82,8 +82,10 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal ) return ; } - // Enable pull-up resistor - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_PULLEN) ; + if ( (PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg & (1ul << g_APinDescription[ulPin].ulPin)) == 0 ) { + // the pin is not an output, disable pull-up if val is LOW, otherwise enable pull-up + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.PULLEN = (ulVal != LOW) ; + } switch ( ulVal ) { From bf454d85fc4e84ab1cabcfe949e772d3f2eb2480 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Thu, 21 Jan 2016 14:25:56 -0500 Subject: [PATCH 4/5] Clean up port, pin, and pin mask duplication in digitalWrite --- cores/arduino/wiring_digital.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 769bcaf79..16d79e55e 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -82,19 +82,23 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal ) return ; } - if ( (PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg & (1ul << g_APinDescription[ulPin].ulPin)) == 0 ) { + EPortType port = g_APinDescription[ulPin].ulPort; + uint32_t pin = g_APinDescription[ulPin].ulPin; + uint32_t pinMask = (1ul << pin); + + if ( (PORT->Group[port].DIRSET.reg & pinMask) == 0 ) { // the pin is not an output, disable pull-up if val is LOW, otherwise enable pull-up - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.PULLEN = (ulVal != LOW) ; + PORT->Group[port].PINCFG[pin].bit.PULLEN = (ulVal != LOW) ; } switch ( ulVal ) { case LOW: - PORT->Group[g_APinDescription[ulPin].ulPort].OUTCLR.reg = (1ul << g_APinDescription[ulPin].ulPin) ; + PORT->Group[port].OUTCLR.reg = pinMask; break ; default: - PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (1ul << g_APinDescription[ulPin].ulPin) ; + PORT->Group[port].OUTSET.reg = pinMask; break ; } From a08cb3fea9299513e3da11ab9c33c4f90e84ad4b Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Thu, 21 Jan 2016 14:27:04 -0500 Subject: [PATCH 5/5] Make assigning PULLEN value in digitalWrite a bit clearer --- cores/arduino/wiring_digital.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 16d79e55e..001c77b09 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -88,7 +88,7 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal ) if ( (PORT->Group[port].DIRSET.reg & pinMask) == 0 ) { // the pin is not an output, disable pull-up if val is LOW, otherwise enable pull-up - PORT->Group[port].PINCFG[pin].bit.PULLEN = (ulVal != LOW) ; + PORT->Group[port].PINCFG[pin].bit.PULLEN = ((ulVal == LOW) ? 0 : 1) ; } switch ( ulVal )