/* Copyright (c) 2015 Arduino LLC. All right reserved. Copyright (c) 2016 Sandeep Mistry 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 "nrf.h" #include "Arduino.h" #ifdef __cplusplus extern "C" { #endif void pinMode( uint32_t ulPin, uint32_t ulMode ) { if (ulPin >= PINS_COUNT) { return; } ulPin = g_ADigitalPinMap[ulPin]; NRF_GPIO_Type * port = nrf_gpio_pin_port_decode(&ulPin); // Set pin mode according to chapter '22.6.3 I/O Pin Configuration' switch ( ulMode ) { case INPUT: // Set pin to input mode port->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | ((uint32_t)GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); break; case INPUT_PULLUP: // Set pin to input mode with pull-up resistor enabled port->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); break; case INPUT_PULLDOWN: // Set pin to input mode with pull-down resistor enabled port->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | ((uint32_t)GPIO_PIN_CNF_PULL_Pulldown << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); break; case OUTPUT: // Set pin to output mode port->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t)GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) | ((uint32_t)GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); break; default: // do nothing break ; } } void digitalWrite( uint32_t ulPin, uint32_t ulVal ) { if (ulPin >= PINS_COUNT) { return; } ulPin = g_ADigitalPinMap[ulPin]; NRF_GPIO_Type * port = nrf_gpio_pin_port_decode(&ulPin); switch ( ulVal ) { case LOW: port->OUTCLR = (1UL << ulPin); break ; default: port->OUTSET = (1UL << ulPin); break ; } } int digitalRead( uint32_t ulPin ) { if (ulPin >= PINS_COUNT) { return 0; } ulPin = g_ADigitalPinMap[ulPin]; NRF_GPIO_Type * port = nrf_gpio_pin_port_decode(&ulPin); uint32_t const bm = (1UL << ulPin); // Return bit in OUT or IN depending on configured direction return (bm & ((port->DIR & bm) ? port->OUT : port->IN)) ? 1 : 0; } void digitalToggle( uint32_t pin ) { int state = 1 - digitalRead(pin); digitalWrite(pin, state); } void ledOn(uint32_t pin) { digitalWrite(pin, LED_STATE_ON); } void ledOff(uint32_t pin) { digitalWrite(pin, 1-LED_STATE_ON); } #ifdef __cplusplus } #endif