mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-16 00:43:34 +08:00
emlid navio2: update RGB LED driver (move away from DriverFramework)
- delete unused linux gpio wrapper
This commit is contained in:
@@ -37,7 +37,6 @@ add_subdirectory(barometer)
|
||||
add_subdirectory(device)
|
||||
add_subdirectory(gyroscope)
|
||||
add_subdirectory(led)
|
||||
add_subdirectory(linux_gpio)
|
||||
add_subdirectory(magnetometer)
|
||||
add_subdirectory(rangefinder)
|
||||
add_subdirectory(smbus)
|
||||
|
||||
@@ -1,38 +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.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
px4_add_library(linux_gpio
|
||||
linux_gpio.cpp
|
||||
)
|
||||
|
||||
#add_subdirectory(test)
|
||||
@@ -1,241 +0,0 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* 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 "linux_gpio.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <px4_platform_common/posix.h>
|
||||
|
||||
#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)
|
||||
, _fd(-1)
|
||||
{
|
||||
}
|
||||
|
||||
LinuxGPIO::~LinuxGPIO()
|
||||
{
|
||||
if (_fd != -1) {
|
||||
close(_fd);
|
||||
}
|
||||
}
|
||||
|
||||
int LinuxGPIO::exportPin()
|
||||
{
|
||||
int ret;
|
||||
char pinIndex[PIN_INDEX_BUFFER_MAX];
|
||||
char valuePath[PIN_VALUE_BUFFER_MAX];
|
||||
int fd = -1;
|
||||
int bytes_to_write;
|
||||
|
||||
struct stat statbuf;
|
||||
|
||||
/* If GPIO was already opened, close it */
|
||||
if (_fd != -1) {
|
||||
close(_fd);
|
||||
_fd = -1;
|
||||
}
|
||||
|
||||
/* Check if GPIO is already exported */
|
||||
snprintf(valuePath, PIN_VALUE_BUFFER_MAX, "/sys/class/gpio/gpio%d/value", _pin);
|
||||
ret = stat(valuePath, &statbuf);
|
||||
|
||||
if (ret == -1) {
|
||||
/* GPIO is not exported */
|
||||
fd = open("/sys/class/gpio/export", O_WRONLY);
|
||||
|
||||
if (fd == -1) {
|
||||
int err = errno;
|
||||
PX4_ERR("export %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("export %u: write: %s (%d)", _pin, strerror(err), err);
|
||||
goto cleanup;
|
||||
|
||||
} else if (ret != bytes_to_write) {
|
||||
PX4_ERR("export %u: write incomplete %d != %d", _pin, ret, bytes_to_write);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
_fd = open(valuePath, O_RDWR);
|
||||
|
||||
if (_fd == -1) {
|
||||
int err = errno;
|
||||
ret = -1;
|
||||
PX4_ERR("export %u: open: %s (%d)", _pin, strerror(err), err);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int LinuxGPIO::unexportPin()
|
||||
{
|
||||
char pinIndex[PIN_INDEX_BUFFER_MAX];
|
||||
int fd;
|
||||
int ret;
|
||||
int bytes_to_write;
|
||||
|
||||
if (_fd != -1) {
|
||||
close(_fd);
|
||||
_fd = -1;
|
||||
}
|
||||
|
||||
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(LinuxGPIO::Direction 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 == Direction::IN) {
|
||||
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()
|
||||
{
|
||||
char buf[2];
|
||||
int ret;
|
||||
|
||||
ret = ::read(_fd, buf, sizeof(buf));
|
||||
|
||||
if (ret == -1) {
|
||||
int err = errno;
|
||||
PX4_ERR("readValue %u: read: %s (%d)", _pin, strerror(err), err);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = strtol(buf, nullptr, 10);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int LinuxGPIO::writeValue(LinuxGPIO::Value value)
|
||||
{
|
||||
char buf[2];
|
||||
int ret;
|
||||
|
||||
if (value != Value::LOW && value != Value::HIGH) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int buflen = snprintf(buf, sizeof(buf), "%u", (unsigned int)value);
|
||||
|
||||
ret = ::write(_fd, buf, buflen);
|
||||
|
||||
if (ret == -1) {
|
||||
int err = errno;
|
||||
PX4_ERR("writeValue %u: write: %s (%d)", _pin, strerror(err), err);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* 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
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/**
|
||||
* @file linux_gpio.h
|
||||
*
|
||||
* Linux sysfs GPIO Interface
|
||||
*
|
||||
* This interface allows manipulation of sysfs GPIOs on Linux
|
||||
*
|
||||
* @author Nicolae Rosia <nicolae.rosia@gmail.com>
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
class LinuxGPIO
|
||||
{
|
||||
public:
|
||||
LinuxGPIO(unsigned int pin);
|
||||
~LinuxGPIO();
|
||||
|
||||
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:
|
||||
int _pin;
|
||||
int _fd;
|
||||
};
|
||||
@@ -63,9 +63,6 @@
|
||||
#include <drivers/drv_tone_alarm.h>
|
||||
|
||||
#include "commander_helper.h"
|
||||
#include "DevMgr.hpp"
|
||||
|
||||
using namespace DriverFramework;
|
||||
|
||||
#define VEHICLE_TYPE_FIXED_WING 1
|
||||
#define VEHICLE_TYPE_QUADROTOR 2
|
||||
@@ -131,8 +128,8 @@ static hrt_abstime tune_end = 0; // end time of currently played tune, 0 for rep
|
||||
static int tune_current = TONE_STOP_TUNE; // currently playing tune, can be interrupted after tune_end
|
||||
static unsigned int tune_durations[TONE_NUMBER_OF_TUNES] {};
|
||||
|
||||
static DevHandle h_leds;
|
||||
static DevHandle h_buzzer;
|
||||
static int fd_leds{-1};
|
||||
|
||||
static led_control_s led_control {};
|
||||
static orb_advert_t led_control_pub = nullptr;
|
||||
static tune_control_s tune_control {};
|
||||
@@ -296,25 +293,25 @@ int led_init()
|
||||
led_control_pub = orb_advertise_queue(ORB_ID(led_control), &led_control, led_control_s::ORB_QUEUE_LENGTH);
|
||||
|
||||
/* first open normal LEDs */
|
||||
DevMgr::getHandle(LED0_DEVICE_PATH, h_leds);
|
||||
fd_leds = px4_open(LED0_DEVICE_PATH, O_RDWR);
|
||||
|
||||
if (!h_leds.isValid()) {
|
||||
PX4_WARN("LED: getHandle fail\n");
|
||||
if (fd_leds < 0) {
|
||||
PX4_ERR("LED: open %s failed", LED0_DEVICE_PATH);
|
||||
return PX4_ERROR;
|
||||
}
|
||||
|
||||
/* the green LED is only available on FMUv5 */
|
||||
(void)h_leds.ioctl(LED_ON, LED_GREEN);
|
||||
px4_ioctl(fd_leds, LED_ON, LED_GREEN);
|
||||
|
||||
/* the blue LED is only available on AeroCore but not FMUv2 */
|
||||
(void)h_leds.ioctl(LED_ON, LED_BLUE);
|
||||
px4_ioctl(fd_leds, LED_ON, LED_BLUE);
|
||||
|
||||
/* switch blue off */
|
||||
led_off(LED_BLUE);
|
||||
|
||||
/* we consider the amber led mandatory */
|
||||
if (h_leds.ioctl(LED_ON, LED_AMBER)) {
|
||||
PX4_WARN("Amber LED: ioctl fail\n");
|
||||
if (px4_ioctl(fd_leds, LED_ON, LED_AMBER)) {
|
||||
PX4_WARN("Amber LED: ioctl fail");
|
||||
return PX4_ERROR;
|
||||
}
|
||||
|
||||
@@ -327,22 +324,22 @@ int led_init()
|
||||
void led_deinit()
|
||||
{
|
||||
orb_unadvertise(led_control_pub);
|
||||
DevMgr::releaseHandle(h_leds);
|
||||
px4_close(fd_leds);
|
||||
}
|
||||
|
||||
int led_toggle(int led)
|
||||
{
|
||||
return h_leds.ioctl(LED_TOGGLE, led);
|
||||
return px4_ioctl(fd_leds, LED_TOGGLE, led);
|
||||
}
|
||||
|
||||
int led_on(int led)
|
||||
{
|
||||
return h_leds.ioctl(LED_ON, led);
|
||||
return px4_ioctl(fd_leds, LED_ON, led);
|
||||
}
|
||||
|
||||
int led_off(int led)
|
||||
{
|
||||
return h_leds.ioctl(LED_OFF, led);
|
||||
return px4_ioctl(fd_leds, LED_OFF, led);
|
||||
}
|
||||
|
||||
void rgbled_set_color_and_mode(uint8_t color, uint8_t mode, uint8_t blinks, uint8_t prio)
|
||||
|
||||
Reference in New Issue
Block a user