/**************************************************************************** * boards/arm/imxrt/imxrt1060-evk/src/imxrt_gpio.c * * Copyright (C) 2017-2018 Gregory Nutt. All rights reserved. * Copyright (C) 2017 Alan Carvalho de Assis. All rights reserved. * Author: Alan Carvalho de Assis * * Based on: boards/imxrt1050-evk/src/imxrt_gpio.c * * Author: Pavlina Koleva * Modified by: Ivan Ucherdzhiev * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name NuttX nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #include #include "chip.h" #include #include "imxrt1060-evk.h" #if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF) /**************************************************************************** * Private Types ****************************************************************************/ struct imxrtgpio_dev_s { struct gpio_dev_s gpio; uint8_t id; }; /**************************************************************************** * Private Function Prototypes ****************************************************************************/ #if BOARD_NGPIOIN > 0 static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value); #endif #if BOARD_NGPIOOUT > 0 static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value); static int gpout_write(FAR struct gpio_dev_s *dev, bool value); #endif /**************************************************************************** * Private Data ****************************************************************************/ #if BOARD_NGPIOIN > 0 static const struct gpio_operations_s gpin_ops = { .go_read = gpin_read, .go_write = NULL, .go_attach = NULL, .go_enable = NULL, }; /* This array maps the GPIO pins used as INPUT */ static const uint32_t g_gpioinputs[BOARD_NGPIOIN] = { GPIO_IN1, }; static struct imxrtgpio_dev_s g_gpin[BOARD_NGPIOIN]; #endif #if BOARD_NGPIOOUT > 0 static const struct gpio_operations_s gpout_ops = { .go_read = gpout_read, .go_write = gpout_write, .go_attach = NULL, .go_enable = NULL, }; /* This array maps the GPIO pins used as OUTPUT */ static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] = { GPIO_GOUT1, GPIO_GOUT2, GPIO_GOUT3, GPIO_GOUT4, }; static struct imxrtgpio_dev_s g_gpout[BOARD_NGPIOOUT]; #endif /**************************************************************************** * Private Functions ****************************************************************************/ #if BOARD_NGPIOIN > 0 static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value) { FAR struct imxrtgpio_dev_s *imxrtgpio = (FAR struct imxrtgpio_dev_s *)dev; DEBUGASSERT(imxrtgpio != NULL && value != NULL); DEBUGASSERT(imxrtgpio->id < BOARD_NGPIOIN); gpioinfo("Reading...\n"); *value = imxrt_gpio_read(g_gpioinputs[imxrtgpio->id]); return OK; } #endif #if BOARD_NGPIOOUT > 0 static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value) { FAR struct imxrtgpio_dev_s *imxrtgpio = (FAR struct imxrtgpio_dev_s *)dev; DEBUGASSERT(imxrtgpio != NULL && value != NULL); DEBUGASSERT(imxrtgpio->id < BOARD_NGPIOOUT); gpioinfo("Reading...\n"); *value = imxrt_gpio_read(g_gpiooutputs[imxrtgpio->id]); return OK; } static int gpout_write(FAR struct gpio_dev_s *dev, bool value) { FAR struct imxrtgpio_dev_s *imxrtgpio = (FAR struct imxrtgpio_dev_s *)dev; DEBUGASSERT(imxrtgpio != NULL); DEBUGASSERT(imxrtgpio->id < BOARD_NGPIOOUT); gpioinfo("Writing %d\n", (int)value); imxrt_gpio_write(g_gpiooutputs[imxrtgpio->id], value); return OK; } #endif /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: imxrt_gpio_initialize * * Description: * Initialize GPIO drivers for use with /apps/examples/gpio * ****************************************************************************/ int imxrt_gpio_initialize(void) { int pincount = 0; int i; #if BOARD_NGPIOIN > 0 for (i = 0; i < BOARD_NGPIOIN; i++) { /* Setup and register the GPIO pin */ g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN; g_gpin[i].gpio.gp_ops = &gpin_ops; g_gpin[i].id = i; (void)gpio_pin_register(&g_gpin[i].gpio, pincount); /* Configure the pin that will be used as input */ imxrt_config_gpio(g_gpioinputs[i]); pincount++; } #endif #if BOARD_NGPIOOUT > 0 for (i = 0; i < BOARD_NGPIOOUT; i++) { /* Setup and register the GPIO pin */ g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN; g_gpout[i].gpio.gp_ops = &gpout_ops; g_gpout[i].id = i; (void)gpio_pin_register(&g_gpout[i].gpio, pincount); /* Configure the pin that will be used as output */ imxrt_gpio_write(g_gpiooutputs[i], 0); imxrt_config_gpio(g_gpiooutputs[i]); pincount++; } #endif return 0; } #endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */