@@ -58,8 +58,13 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
5858 break ;
5959
6060 case OUTPUT :
61+ // enable input, to support reading back values
62+ PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].bit .INEN = 1 ;
63+
64+ // disable pullups
65+ PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].bit .PULLEN = 0 ;
66+
6167 // Set pin to output mode
62- PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].reg &=~(uint8_t )(PORT_PINCFG_INEN ) ;
6368 PORT -> Group [g_APinDescription [ulPin ].ulPort ].DIRSET .reg = (uint32_t )(1 <<g_APinDescription [ulPin ].ulPin ) ;
6469 break ;
6570
@@ -77,17 +82,23 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal )
7782 return ;
7883 }
7984
80- // Enable pull-up resistor
81- PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].reg = (uint8_t )(PORT_PINCFG_PULLEN ) ;
85+ EPortType port = g_APinDescription [ulPin ].ulPort ;
86+ uint32_t pin = g_APinDescription [ulPin ].ulPin ;
87+ uint32_t pinMask = (1ul << pin );
88+
89+ if ( (PORT -> Group [port ].DIRSET .reg & pinMask ) == 0 ) {
90+ // the pin is not an output, disable pull-up if val is LOW, otherwise enable pull-up
91+ PORT -> Group [port ].PINCFG [pin ].bit .PULLEN = ((ulVal == LOW ) ? 0 : 1 ) ;
92+ }
8293
8394 switch ( ulVal )
8495 {
8596 case LOW :
86- PORT -> Group [g_APinDescription [ ulPin ]. ulPort ]. OUTCLR .reg = ( 1ul << g_APinDescription [ ulPin ]. ulPin ) ;
97+ PORT -> Group [port ]. OUTCLR .reg = pinMask ;
8798 break ;
8899
89100 default :
90- PORT -> Group [g_APinDescription [ ulPin ]. ulPort ]. OUTSET .reg = ( 1ul << g_APinDescription [ ulPin ]. ulPin ) ;
101+ PORT -> Group [port ]. OUTSET .reg = pinMask ;
91102 break ;
92103 }
93104
0 commit comments