diff --git a/cmake/configs/posix_rpi_common.cmake b/cmake/configs/posix_rpi_common.cmake index ba0120e05f..b57f509dd0 100644 --- a/cmake/configs/posix_rpi_common.cmake +++ b/cmake/configs/posix_rpi_common.cmake @@ -75,7 +75,7 @@ set(config_module_list drivers/navio_adc drivers/navio_sysfs_rc_in drivers/navio_sysfs_pwm_out - drivers/navio_gpio + drivers/linux_gpio drivers/navio_rgbled drivers/pwm_out_sim diff --git a/cmake/configs/posix_sitl_default.cmake b/cmake/configs/posix_sitl_default.cmake index 84d1bb80fd..6fff137a85 100644 --- a/cmake/configs/posix_sitl_default.cmake +++ b/cmake/configs/posix_sitl_default.cmake @@ -9,6 +9,7 @@ set(config_module_list drivers/gps drivers/pwm_out_sim drivers/vmount + drivers/linux_gpio modules/sensors platforms/posix/drivers/accelsim platforms/posix/drivers/adcsim diff --git a/src/drivers/navio_gpio/CMakeLists.txt b/src/drivers/linux_gpio/CMakeLists.txt similarity index 96% rename from src/drivers/navio_gpio/CMakeLists.txt rename to src/drivers/linux_gpio/CMakeLists.txt index 7430c6cf01..ce4042dd2e 100644 --- a/src/drivers/navio_gpio/CMakeLists.txt +++ b/src/drivers/linux_gpio/CMakeLists.txt @@ -31,12 +31,11 @@ # ############################################################################ px4_add_module( - MODULE drivers__navio_gpio - MAIN navio_gpio + MODULE drivers__linux_gpio STACK_MAIN 1200 COMPILE_FLAGS SRCS - navio_gpio.cpp + linux_gpio.cpp DEPENDS platforms__common ) diff --git a/src/drivers/linux_gpio/linux_gpio.cpp b/src/drivers/linux_gpio/linux_gpio.cpp new file mode 100644 index 0000000000..674b445514 --- /dev/null +++ b/src/drivers/linux_gpio/linux_gpio.cpp @@ -0,0 +1,253 @@ +/**************************************************************************** + * + * Copyright (c) 2016 - 2017 PX4 Development Team. All rights reserved. + * + * 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 PX4 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. + * + ****************************************************************************/ + +#include +#include +#include +#include +#include + +#define PIN_INDEX_BUFFER_MAX (16) +#define PIN_DIRECTION_BUFFER_MAX (30 + PIN_INDEX_BUFFER_MAX) +#define PIN_VALUE_BUFFER_MAX (26 + PIN_INDEX_BUFFER_MAX) + +LinuxGPIO::LinuxGPIO(unsigned int pin) + : _pin(pin) +{ +} + +int LinuxGPIO::exportPin() +{ + return LinuxGPIO::_exportPin(_pin); +} + +int LinuxGPIO::unexportPin() +{ + return LinuxGPIO::_unexportPin(_pin); +} + +int LinuxGPIO::setDirection(LinuxGPIO::Direction dir) +{ + return LinuxGPIO::_setDirection(_pin, (int)dir); +} + +int LinuxGPIO::readValue() +{ + return LinuxGPIO::_readValue(_pin); +} + +int LinuxGPIO::writeValue(LinuxGPIO::Value value) +{ + return LinuxGPIO::_writeValue(_pin, (unsigned int)value); +} + +int LinuxGPIO::_exportPin(unsigned int pin) +{ + char pinIndex[PIN_INDEX_BUFFER_MAX]; + int fd; + int ret; + int bytes_to_write; + + fd = open("/sys/class/gpio/export", O_WRONLY); + + if (fd == -1) { + int err = errno; + PX4_ERR("export failed: open: %s (%d)", strerror(err), err); + return -1; + } + + bytes_to_write = snprintf(pinIndex, PIN_INDEX_BUFFER_MAX, "%u", pin); + ret = write(fd, pinIndex, bytes_to_write); + + if (ret == -1) { + int err = errno; + PX4_ERR("export failed: write: %s (%d)", strerror(err), err); + goto cleanup; + + } else if (ret != bytes_to_write) { + PX4_ERR("failed to write: incomplete %d != %d", ret, bytes_to_write); + goto cleanup; + } + + ret = 0; + +cleanup: + close(fd); + + return ret; +} + +int LinuxGPIO::_unexportPin(unsigned int pin) +{ + char pinIndex[PIN_INDEX_BUFFER_MAX]; + int fd; + int ret; + int bytes_to_write; + + fd = open("/sys/class/gpio/unexport", O_WRONLY); + + if (fd == -1) { + int err = errno; + PX4_ERR("unexport %u: open: %s (%d)", pin, strerror(err), err); + return -1; + } + + bytes_to_write = snprintf(pinIndex, PIN_INDEX_BUFFER_MAX, "%u", pin); + ret = write(fd, pinIndex, bytes_to_write); + + if (ret == -1) { + int err = errno; + PX4_ERR("unexport %u: write: %s (%d)", pin, strerror(err), err); + goto cleanup; + + } else if (ret != bytes_to_write) { + PX4_ERR("unexport %u: write incomplete %d != %d", pin, ret, bytes_to_write); + goto cleanup; + } + + ret = 0; + +cleanup: + close(fd); + + return ret; +} + +int LinuxGPIO::_setDirection(unsigned int pin, int dir) +{ + char path[PIN_DIRECTION_BUFFER_MAX]; + int fd; + int ret; + + snprintf(path, PIN_DIRECTION_BUFFER_MAX, "/sys/class/gpio/gpio%d/direction", pin); + fd = open(path, O_WRONLY); + + if (fd == -1) { + int err = errno; + PX4_ERR("dir %u: open: %s (%d)", pin, strerror(err), err); + return -1; + } + + if (dir == 0) { + ret = write(fd, "in", 2); + + } else { + ret = write(fd, "out", 3); + } + + if (ret == -1) { + int err = errno; + PX4_ERR("dir %u: write: %s (%d)", pin, strerror(err), err); + goto cleanup; + } + + ret = 0; + +cleanup: + close(fd); + + return ret; +} + +int LinuxGPIO::_readValue(int pin) +{ + char path[PIN_VALUE_BUFFER_MAX]; + char buf[2]; + int fd; + int ret; + + snprintf(path, PIN_VALUE_BUFFER_MAX, "/sys/class/gpio/gpio%d/value", pin); + fd = open(path, O_RDONLY); + + if (fd == -1) { + int err = errno; + PX4_ERR("read %u: open: %s (%d)", pin, strerror(err), err); + return -1; + } + + ret = read(fd, buf, sizeof(buf)); + + if (ret == -1) { + int err = errno; + PX4_ERR("read %u: write: %s (%d)", pin, strerror(err), err); + goto cleanup; + } + + ret = 0; + + ret = strtol(buf, NULL, 10); + +cleanup: + close(fd); + + return ret; +} + +int LinuxGPIO::_writeValue(int pin, unsigned int value) +{ + char path[PIN_VALUE_BUFFER_MAX]; + char buf[2]; + int fd; + int ret; + + if (value != (unsigned int)Value::LOW && value != (unsigned int)Value::HIGH) { + return -EINVAL; + } + + snprintf(path, PIN_VALUE_BUFFER_MAX, "/sys/class/gpio/gpio%d/value", pin); + fd = open(path, O_WRONLY); + + if (fd == -1) { + int err = errno; + PX4_ERR("set %u: open: %s (%d)", pin, strerror(err), err); + return -1; + } + + int buflen = snprintf(buf, sizeof(buf), "%u", value); + + ret = write(fd, buf, buflen); + + if (ret == -1) { + int err = errno; + PX4_ERR("set %u: write: %s (%d)", pin, strerror(err), err); + goto cleanup; + } + + ret = 0; + +cleanup: + close(fd); + + return ret; +} + diff --git a/src/drivers/navio_gpio/test/main.cpp b/src/drivers/linux_gpio/linux_gpio.h similarity index 67% rename from src/drivers/navio_gpio/test/main.cpp rename to src/drivers/linux_gpio/linux_gpio.h index 645404f2cf..f6f3097cb8 100644 --- a/src/drivers/navio_gpio/test/main.cpp +++ b/src/drivers/linux_gpio/linux_gpio.h @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2016 PX4 Development Team. All rights reserved. + * Copyright (c) 2017 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,9 +31,45 @@ * ****************************************************************************/ -extern int do_test(); +/** + * @file linux_gpio.h + * + * Linux sysfs GPIO Interface + * + * This interface allows manipulation of sysfs GPIOs on Linux + * + * @author Nicolae Rosia + */ -int main() + +class LinuxGPIO { - return do_test(); -} +public: + LinuxGPIO(unsigned int pin); + ~LinuxGPIO() = default; + + enum class Direction { + IN = 0, + OUT = 1, + }; + + enum class Value { + LOW = 0, + HIGH = 1, + }; + + int exportPin(); + int unexportPin(); + int setDirection(LinuxGPIO::Direction dir); + int readValue(); + int writeValue(LinuxGPIO::Value value); + +private: + static int _exportPin(unsigned int pin); + static int _unexportPin(unsigned int pin); + static int _setDirection(unsigned int pin, int dir); + static int _readValue(int pin); + static int _writeValue(int pin, unsigned int value); + + int _pin; +}; diff --git a/src/drivers/navio_gpio/navio_gpio.cpp b/src/drivers/navio_gpio/navio_gpio.cpp deleted file mode 100644 index 1da9285438..0000000000 --- a/src/drivers/navio_gpio/navio_gpio.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2016 PX4 Development Team. All rights reserved. - * - * 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 PX4 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. - * - ****************************************************************************/ - -#include -#include -#include -#include -#include - -#include "navio_gpio.h" - -namespace navio_gpio -{ -extern "C" __EXPORT int navio_gpio_main(int argc, char *argv[]); - -int Gpio::start(void) -{ - int mem_fd; - - if ((mem_fd = open("/dev/gpiomem", O_RDWR | O_SYNC)) < 0) { - PX4_WARN("failed to open gpiomem"); - return -1; - } - - if ((_gpio_map = mmap(NULL, - GPIO_BLOCK_SIZE, - PROT_READ | PROT_WRITE, - MAP_SHARED, - mem_fd, - GPIO_PHYS_ADDR)) == MAP_FAILED) { - PX4_WARN("failed to mmap GPIO region"); - close(mem_fd); - return -1; - } - - close(mem_fd); - - return 0; -} - -int Gpio::stop(void) -{ - if (munmap(_gpio_map, GPIO_BLOCK_SIZE) < 0) { - return -1; - } - - return 0; -} - -void Gpio::atomic_modify(uintptr_t addr, - unsigned int shift, - unsigned int mask, - unsigned int value) -{ - uint32_t tmp; - - m_lock.lock(); - - tmp = *(volatile uint32_t *)addr; - tmp = (tmp & ~(mask << shift)) | (value << shift); - *(volatile uint32_t *)addr = tmp; - - m_lock.unlock(); -} - - -int Gpio::configgpio(uint32_t pinset) -{ - unsigned int pin; - unsigned int cnf; - - uintptr_t addr; - unsigned int shift; - - pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; - cnf = (pinset & GPIO_CNF_MASK) >> GPIO_CNF_SHIFT; - - addr = (uintptr_t)_gpio_map + GPIO_GPFSEL0_OFFSET + pin / 10; - shift = (pin % 10) * 3; - - atomic_modify(addr, shift, GPIO_CNF_MASK >> GPIO_CNF_SHIFT, cnf); - - return 0; -} - - -int Gpio::unconfiggpio(uint32_t pinset) -{ - return Gpio::configgpio(pinset); -} - - -bool Gpio::gpioread(uint32_t pinset) -{ - unsigned int pin; - - uintptr_t addr; - unsigned int shift; - - pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; - - addr = (uintptr_t)_gpio_map + GPIO_GPLEV0_OFFSET + pin / 32; - shift = pin % 32; - - return (*(volatile uint32_t *)addr >> shift) & 0x1u; -} - - -void Gpio::gpiowrite(uint32_t pinset, bool value) -{ - unsigned int pin; - - uintptr_t addr; - unsigned int shift; - - pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; - - if (value == 0) { - addr = (uintptr_t)_gpio_map + GPIO_GPCLR0_OFFSET + pin / 32; - - } else { - addr = (uintptr_t)_gpio_map + GPIO_GPSET0_OFFSET + pin / 32; - } - - shift = pin % 32; - - *(volatile uint32_t *)addr = 0x1u << shift; -} - -static void usage(const char *reason); - -static void -usage(const char *reason) -{ - if (reason) { - PX4_ERR("%s", reason); - } - - PX4_INFO("usage: navio_gpio {start|stop|status}"); -} -static Gpio *gpio = nullptr; - -int navio_gpio_main(int argc, char *argv[]) -{ - if (argc < 2) { - usage("missing command"); - return 1; - } - - if (!strcmp(argv[1], "start")) { - PX4_WARN("gpio should only be started directly for debugging"); - - if (gpio != nullptr && gpio->isMapped()) { - PX4_WARN("already mapped"); - return 0; - } - - gpio = new Gpio(); - - if (gpio == nullptr) { - PX4_ERR("alloc failed"); - return 1; - } - - int ret = gpio->start(); - - if (ret != 0) { - PX4_ERR("start failed"); - return 1; - } - - return 0; - } - - if (!strcmp(argv[1], "stop")) { - - if (gpio == nullptr) { - PX4_WARN("gpio not started from navio_gpio"); - return 0; - } - - if (!gpio->isMapped()) { - PX4_WARN("not mapped"); - return 1; - } - - gpio->stop(); - - delete gpio; - gpio = nullptr; - - return 0; - } - - if (!strcmp(argv[1], "status")) { - if (gpio == nullptr) { - PX4_WARN("gpio not started from navio_gpio"); - return 0; - } - - if (gpio->isMapped()) { - PX4_INFO("mapped"); - - } else { - PX4_INFO("not mapped\n"); - } - - return 0; - } - - usage("unrecognized command"); - return 1; - -} - -} // navio_gpio diff --git a/src/drivers/navio_gpio/navio_gpio.h b/src/drivers/navio_gpio/navio_gpio.h deleted file mode 100644 index 062ef1ab6c..0000000000 --- a/src/drivers/navio_gpio/navio_gpio.h +++ /dev/null @@ -1,149 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2016 PX4 Development Team. All rights reserved. - * - * 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 PX4 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. - * - ****************************************************************************/ - -#include "SyncObj.hpp" -#include - -#define GPIO_BLOCK_SIZE (4096) -#define GPIO_PHYS_ADDR (0x3F200000) - -#define GPIO_GPFSEL0_OFFSET (0x0) -#define GPIO_GPLEV0_OFFSET (0x34) -#define GPIO_GPSET0_OFFSET (0x1C) -#define GPIO_GPCLR0_OFFSET (0x28) - - -#define GPIO_CNF_SHIFT 6 -#define GPIO_CNF_MASK (3 << GPIO_CNF_SHIFT) -#define GPIO_CNF_INPUT (0 << GPIO_CNF_SHIFT) -#define GPIO_CNF_OUTPUT (1 << GPIO_CNF_SHIFT) -#define GPIO_CNF_AF0 (4 << GPIO_CNF_SHIFT) -#define GPIO_CNF_AF1 (5 << GPIO_CNF_SHIFT) -#define GPIO_CNF_AF2 (6 << GPIO_CNF_SHIFT) -#define GPIO_CNF_AF3 (7 << GPIO_CNF_SHIFT) -#define GPIO_CNF_AF4 (3 << GPIO_CNF_SHIFT) -#define GPIO_CNF_AF5 (2 << GPIO_CNF_SHIFT) - -#define GPIO_PIN_SHIFT 0 -#define GPIO_PIN_MASK (63 << GPIO_PIN_SHIFT) -#define GPIO_PIN0 (0 << GPIO_PIN_SHIFT) -#define GPIO_PIN1 (1 << GPIO_PIN_SHIFT) -#define GPIO_PIN2 (2 << GPIO_PIN_SHIFT) -#define GPIO_PIN3 (3 << GPIO_PIN_SHIFT) -#define GPIO_PIN4 (4 << GPIO_PIN_SHIFT) -#define GPIO_PIN5 (5 << GPIO_PIN_SHIFT) -#define GPIO_PIN6 (6 << GPIO_PIN_SHIFT) -#define GPIO_PIN7 (7 << GPIO_PIN_SHIFT) -#define GPIO_PIN8 (8 << GPIO_PIN_SHIFT) -#define GPIO_PIN9 (9 << GPIO_PIN_SHIFT) -#define GPIO_PIN10 (10 << GPIO_PIN_SHIFT) -#define GPIO_PIN11 (11 << GPIO_PIN_SHIFT) -#define GPIO_PIN12 (12 << GPIO_PIN_SHIFT) -#define GPIO_PIN13 (13 << GPIO_PIN_SHIFT) -#define GPIO_PIN14 (14 << GPIO_PIN_SHIFT) -#define GPIO_PIN15 (15 << GPIO_PIN_SHIFT) -#define GPIO_PIN16 (16 << GPIO_PIN_SHIFT) -#define GPIO_PIN17 (17 << GPIO_PIN_SHIFT) -#define GPIO_PIN18 (18 << GPIO_PIN_SHIFT) -#define GPIO_PIN19 (19 << GPIO_PIN_SHIFT) -#define GPIO_PIN20 (20 << GPIO_PIN_SHIFT) -#define GPIO_PIN21 (21 << GPIO_PIN_SHIFT) -#define GPIO_PIN22 (22 << GPIO_PIN_SHIFT) -#define GPIO_PIN23 (23 << GPIO_PIN_SHIFT) -#define GPIO_PIN24 (24 << GPIO_PIN_SHIFT) -#define GPIO_PIN25 (25 << GPIO_PIN_SHIFT) -#define GPIO_PIN26 (26 << GPIO_PIN_SHIFT) -#define GPIO_PIN27 (27 << GPIO_PIN_SHIFT) -#define GPIO_PIN28 (28 << GPIO_PIN_SHIFT) -#define GPIO_PIN29 (29 << GPIO_PIN_SHIFT) -#define GPIO_PIN30 (30 << GPIO_PIN_SHIFT) -#define GPIO_PIN31 (31 << GPIO_PIN_SHIFT) -#define GPIO_PIN32 (32 << GPIO_PIN_SHIFT) -#define GPIO_PIN33 (33 << GPIO_PIN_SHIFT) -#define GPIO_PIN34 (34 << GPIO_PIN_SHIFT) -#define GPIO_PIN35 (35 << GPIO_PIN_SHIFT) -#define GPIO_PIN36 (36 << GPIO_PIN_SHIFT) -#define GPIO_PIN37 (37 << GPIO_PIN_SHIFT) -#define GPIO_PIN38 (38 << GPIO_PIN_SHIFT) -#define GPIO_PIN39 (39 << GPIO_PIN_SHIFT) -#define GPIO_PIN40 (40 << GPIO_PIN_SHIFT) -#define GPIO_PIN41 (41 << GPIO_PIN_SHIFT) -#define GPIO_PIN42 (42 << GPIO_PIN_SHIFT) -#define GPIO_PIN43 (43 << GPIO_PIN_SHIFT) -#define GPIO_PIN44 (44 << GPIO_PIN_SHIFT) -#define GPIO_PIN45 (45 << GPIO_PIN_SHIFT) -#define GPIO_PIN46 (46 << GPIO_PIN_SHIFT) -#define GPIO_PIN47 (47 << GPIO_PIN_SHIFT) -#define GPIO_PIN48 (48 << GPIO_PIN_SHIFT) -#define GPIO_PIN49 (49 << GPIO_PIN_SHIFT) -#define GPIO_PIN50 (50 << GPIO_PIN_SHIFT) -#define GPIO_PIN51 (51 << GPIO_PIN_SHIFT) -#define GPIO_PIN52 (52 << GPIO_PIN_SHIFT) -#define GPIO_PIN53 (53 << GPIO_PIN_SHIFT) -#define GPIO_PIN54 (54 << GPIO_PIN_SHIFT) - -using namespace DriverFramework; - -namespace navio_gpio -{ - -class Gpio -{ -public: - Gpio() - { } - ~Gpio() - { } - - int start(); - int stop(); - - int configgpio(uint32_t pinset); - int unconfiggpio(uint32_t pinset); - bool gpioread(uint32_t pinset); - void gpiowrite(uint32_t pinset, bool value); - - bool isMapped() { return _gpio_map != nullptr; } - -private: - void atomic_modify(uintptr_t addr, - unsigned int shift, - unsigned int mask, - unsigned int value); - - void *_gpio_map; - - SyncObj m_lock; -}; - -} // namespace navio_gpio diff --git a/src/drivers/navio_gpio/test/CMakeLists.txt b/src/drivers/navio_gpio/test/CMakeLists.txt deleted file mode 100644 index 2f7466fead..0000000000 --- a/src/drivers/navio_gpio/test/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -############################################################################ -# -# Copyright (c) 2016 PX4 Development Team. All rights reserved. -# -# 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 PX4 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. -# -############################################################################ -include_directories(..) - -add_executable(navio_gpio_test - main.cpp - test.cpp - ) - -target_link_libraries(navio_gpio_test - drivers__navio_gpio - platforms__posix__px4_layer - df_driver_framework - ) diff --git a/src/drivers/navio_gpio/test/test.cpp b/src/drivers/navio_gpio/test/test.cpp deleted file mode 100644 index 3377fcd259..0000000000 --- a/src/drivers/navio_gpio/test/test.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2016 PX4 Development Team. All rights reserved. - * - * 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 PX4 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. - * - ****************************************************************************/ - -#include "navio_gpio.h" - -#include -#include - -#define LED_CNF (GPIO_CNF_OUTPUT) -#define LED_pinR GPIO_PIN4 -#define LED_pinG GPIO_PIN27 -#define LED_pinB GPIO_PIN6 - -#define LED_OFF 1 -#define LED_ON 0 - -using namespace navio_gpio; - -int do_test(); - -int do_test() -{ - Gpio gpio; - - if (gpio.start() < 0) { - return -1; - } - - gpio.configgpio(LED_CNF | LED_pinR); - gpio.configgpio(LED_CNF | LED_pinG); - gpio.configgpio(LED_CNF | LED_pinB); - - - gpio.gpiowrite(LED_pinR, LED_OFF); - gpio.gpiowrite(LED_pinG, LED_OFF); - gpio.gpiowrite(LED_pinB, LED_OFF); - printf("off\n"); - sleep(2); - - gpio.gpiowrite(LED_pinR, LED_ON); - gpio.gpiowrite(LED_pinG, LED_OFF); - gpio.gpiowrite(LED_pinB, LED_OFF); - printf("red\n"); - sleep(2); - - gpio.gpiowrite(LED_pinR, LED_OFF); - gpio.gpiowrite(LED_pinG, LED_ON); - gpio.gpiowrite(LED_pinB, LED_OFF); - printf("green\n"); - sleep(2); - - gpio.gpiowrite(LED_pinR, LED_OFF); - gpio.gpiowrite(LED_pinG, LED_OFF); - gpio.gpiowrite(LED_pinB, LED_ON); - printf("blue\n"); - sleep(2); - - gpio.gpiowrite(LED_pinR, LED_OFF); - gpio.gpiowrite(LED_pinG, LED_OFF); - gpio.gpiowrite(LED_pinB, LED_OFF); - printf("off\n"); - gpio.stop(); - - return 0; -} diff --git a/src/drivers/navio_rgbled/CMakeLists.txt b/src/drivers/navio_rgbled/CMakeLists.txt index a9f70d6837..b41800f5d7 100644 --- a/src/drivers/navio_rgbled/CMakeLists.txt +++ b/src/drivers/navio_rgbled/CMakeLists.txt @@ -40,7 +40,7 @@ px4_add_module( navio_rgbled.cpp DEPENDS platforms__common - drivers__navio_gpio + drivers__linux_gpio lib__led ) diff --git a/src/drivers/navio_rgbled/navio_rgbled.cpp b/src/drivers/navio_rgbled/navio_rgbled.cpp index e82ea8bcf6..4a67dea465 100644 --- a/src/drivers/navio_rgbled/navio_rgbled.cpp +++ b/src/drivers/navio_rgbled/navio_rgbled.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2016 PX4 Development Team. All rights reserved. + * Copyright (c) 2016 - 2017 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -36,17 +36,8 @@ #include "navio_rgbled.h" -#define GPIO_LED_CNF (GPIO_CNF_OUTPUT) -#define GPIO_LED_R (GPIO_PIN4) -#define GPIO_LED_G (GPIO_PIN27) -#define GPIO_LED_B (GPIO_PIN6) - #define RGBLED_BASE_DEVICE_PATH "/dev/rgbled" -// inverted -#define LED_ON 0 -#define LED_OFF 1 - using namespace DriverFramework; @@ -56,6 +47,9 @@ RGBLED::RGBLED(const char *name) RGBLED_BASE_DEVICE_PATH, DeviceBusType_UNKNOWN, 0) + , _gpioR(4) + , _gpioG(27) + , _gpioB(6) { }; @@ -75,11 +69,47 @@ int RGBLED::start() return res; } - _gpio.start(); + res = _gpioR.exportPin(); + + if (res != 0) { + PX4_ERR("red led: failed to export"); + goto cleanup; + } + + res = _gpioR.setDirection(LinuxGPIO::Direction::OUT); + + if (res != 0) { + PX4_ERR("red led: failed to set direction"); + goto cleanup; + } + + res = _gpioG.exportPin(); - _gpio.configgpio(GPIO_LED_CNF | GPIO_LED_R); - _gpio.configgpio(GPIO_LED_CNF | GPIO_LED_G); - _gpio.configgpio(GPIO_LED_CNF | GPIO_LED_B); + if (res != 0) { + PX4_ERR("green led: failed to export"); + goto cleanup; + } + + res = _gpioG.setDirection(LinuxGPIO::Direction::OUT); + + if (res != 0) { + PX4_ERR("green led: failed to set direction"); + goto cleanup; + } + + res = _gpioB.exportPin(); + + if (res != 0) { + PX4_ERR("blue led: failed to export"); + goto cleanup; + } + + res = _gpioB.setDirection(LinuxGPIO::Direction::OUT); + + if (res != 0) { + PX4_ERR("blue led: failed to set direction"); + goto cleanup; + } // update at fixed interval DevObj::setSampleInterval(_led_controller.maximum_update_interval()); @@ -91,6 +121,13 @@ int RGBLED::start() return res; } + return res; + +cleanup: + _gpioR.unexportPin(); + _gpioG.unexportPin(); + _gpioB.unexportPin(); + return res; } @@ -98,7 +135,9 @@ int RGBLED::stop() { int res; - _gpio.stop(); + _gpioR.unexportPin(); + _gpioG.unexportPin(); + _gpioB.unexportPin(); res = DevObj::stop(); @@ -123,52 +162,52 @@ void RGBLED::_measure() if (_led_controller.update(led_control_data) == 1) { switch (led_control_data.leds[0].color) { case led_control_s::COLOR_RED: - _gpio.gpiowrite(GPIO_LED_R, LED_ON); - _gpio.gpiowrite(GPIO_LED_G, LED_OFF); - _gpio.gpiowrite(GPIO_LED_B, LED_OFF); + _gpioR.writeValue(LinuxGPIO::Value::LOW); + _gpioG.writeValue(LinuxGPIO::Value::HIGH); + _gpioB.writeValue(LinuxGPIO::Value::HIGH); break; case led_control_s::COLOR_GREEN: - _gpio.gpiowrite(GPIO_LED_R, LED_OFF); - _gpio.gpiowrite(GPIO_LED_G, LED_ON); - _gpio.gpiowrite(GPIO_LED_B, LED_OFF); + _gpioR.writeValue(LinuxGPIO::Value::HIGH); + _gpioG.writeValue(LinuxGPIO::Value::LOW); + _gpioB.writeValue(LinuxGPIO::Value::HIGH); break; case led_control_s::COLOR_BLUE: - _gpio.gpiowrite(GPIO_LED_R, LED_OFF); - _gpio.gpiowrite(GPIO_LED_G, LED_OFF); - _gpio.gpiowrite(GPIO_LED_B, LED_ON); + _gpioR.writeValue(LinuxGPIO::Value::HIGH); + _gpioG.writeValue(LinuxGPIO::Value::HIGH); + _gpioB.writeValue(LinuxGPIO::Value::LOW); break; case led_control_s::COLOR_AMBER: //make it the same as yellow case led_control_s::COLOR_YELLOW: - _gpio.gpiowrite(GPIO_LED_R, LED_ON); - _gpio.gpiowrite(GPIO_LED_G, LED_ON); - _gpio.gpiowrite(GPIO_LED_B, LED_OFF); + _gpioR.writeValue(LinuxGPIO::Value::LOW); + _gpioG.writeValue(LinuxGPIO::Value::LOW); + _gpioB.writeValue(LinuxGPIO::Value::HIGH); break; case led_control_s::COLOR_PURPLE: - _gpio.gpiowrite(GPIO_LED_R, LED_ON); - _gpio.gpiowrite(GPIO_LED_G, LED_OFF); - _gpio.gpiowrite(GPIO_LED_B, LED_ON); + _gpioR.writeValue(LinuxGPIO::Value::LOW); + _gpioG.writeValue(LinuxGPIO::Value::HIGH); + _gpioB.writeValue(LinuxGPIO::Value::LOW); break; case led_control_s::COLOR_CYAN: - _gpio.gpiowrite(GPIO_LED_R, LED_OFF); - _gpio.gpiowrite(GPIO_LED_G, LED_ON); - _gpio.gpiowrite(GPIO_LED_B, LED_ON); + _gpioR.writeValue(LinuxGPIO::Value::HIGH); + _gpioG.writeValue(LinuxGPIO::Value::LOW); + _gpioB.writeValue(LinuxGPIO::Value::LOW); break; case led_control_s::COLOR_WHITE: - _gpio.gpiowrite(GPIO_LED_R, LED_ON); - _gpio.gpiowrite(GPIO_LED_G, LED_ON); - _gpio.gpiowrite(GPIO_LED_B, LED_ON); + _gpioR.writeValue(LinuxGPIO::Value::LOW); + _gpioG.writeValue(LinuxGPIO::Value::LOW); + _gpioB.writeValue(LinuxGPIO::Value::LOW); break; default: // led_control_s::COLOR_OFF - _gpio.gpiowrite(GPIO_LED_R, LED_OFF); - _gpio.gpiowrite(GPIO_LED_G, LED_OFF); - _gpio.gpiowrite(GPIO_LED_B, LED_OFF); + _gpioR.writeValue(LinuxGPIO::Value::HIGH); + _gpioG.writeValue(LinuxGPIO::Value::HIGH); + _gpioB.writeValue(LinuxGPIO::Value::HIGH); break; } } diff --git a/src/drivers/navio_rgbled/navio_rgbled.h b/src/drivers/navio_rgbled/navio_rgbled.h index db5874ad96..2cc4cfec2b 100644 --- a/src/drivers/navio_rgbled/navio_rgbled.h +++ b/src/drivers/navio_rgbled/navio_rgbled.h @@ -32,16 +32,12 @@ ****************************************************************************/ #pragma once -#include "DevObj.hpp" - -#include "navio_gpio.h" +#include +#include #include - -using namespace navio_gpio; - -class RGBLED : public DevObj +class RGBLED : public DriverFramework::DevObj { public: RGBLED(const char *name); @@ -55,5 +51,7 @@ protected: private: LedController _led_controller; - Gpio _gpio; + LinuxGPIO _gpioR; + LinuxGPIO _gpioG; + LinuxGPIO _gpioB; };