mirror of
https://github.com/digistump/DigistumpArduino.git
synced 2025-04-28 07:39:02 -07:00
110 lines
3.0 KiB
C
110 lines
3.0 KiB
C
/*
|
|
Copyright (c) 2011 Arduino. All right reserved.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the GNU Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "Arduino.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern void pinMode( uint32_t ulPin, uint32_t ulMode )
|
|
{
|
|
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
switch ( ulMode )
|
|
{
|
|
case INPUT:
|
|
/* Enable peripheral for clocking input */
|
|
pmc_enable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
|
|
PIO_Configure(
|
|
g_APinDescription[ulPin].pPort,
|
|
PIO_INPUT,
|
|
g_APinDescription[ulPin].ulPin,
|
|
0 ) ;
|
|
break ;
|
|
|
|
case INPUT_PULLUP:
|
|
/* Enable peripheral for clocking input */
|
|
pmc_enable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
|
|
PIO_Configure(
|
|
g_APinDescription[ulPin].pPort,
|
|
PIO_INPUT,
|
|
g_APinDescription[ulPin].ulPin,
|
|
PIO_PULLUP ) ;
|
|
break ;
|
|
|
|
case OUTPUT:
|
|
PIO_Configure(
|
|
g_APinDescription[ulPin].pPort,
|
|
PIO_OUTPUT_1,
|
|
g_APinDescription[ulPin].ulPin,
|
|
g_APinDescription[ulPin].ulPinConfiguration ) ;
|
|
|
|
/* if all pins are output, disable PIO Controller clocking, reduce power consumption */
|
|
if ( g_APinDescription[ulPin].pPort->PIO_OSR == 0xffffffff )
|
|
{
|
|
pmc_disable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
|
|
}
|
|
break ;
|
|
|
|
default:
|
|
break ;
|
|
}
|
|
}
|
|
|
|
extern void digitalWrite( uint32_t ulPin, uint32_t ulVal )
|
|
{
|
|
/* Handle */
|
|
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
if ( PIO_GetOutputDataStatus( g_APinDescription[ulPin].pPort, g_APinDescription[ulPin].ulPin ) == 0 )
|
|
{
|
|
PIO_PullUp( g_APinDescription[ulPin].pPort, g_APinDescription[ulPin].ulPin, ulVal ) ;
|
|
}
|
|
else
|
|
{
|
|
PIO_SetOutput( g_APinDescription[ulPin].pPort, g_APinDescription[ulPin].ulPin, ulVal, 0, PIO_PULLUP ) ;
|
|
}
|
|
}
|
|
|
|
extern int digitalRead( uint32_t ulPin )
|
|
{
|
|
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
|
|
{
|
|
return LOW ;
|
|
}
|
|
|
|
if ( PIO_Get( g_APinDescription[ulPin].pPort, PIO_INPUT, g_APinDescription[ulPin].ulPin ) == 1 )
|
|
{
|
|
return HIGH ;
|
|
}
|
|
|
|
return LOW ;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|