[ArDrone] GPIO rewritten to make paparazzi API more consistent

This commit is contained in:
Christophe De Wagter
2013-08-31 16:02:49 +02:00
parent a7fb3bf7cd
commit 1fac821b79
4 changed files with 77 additions and 69 deletions
+6 -5
View File
@@ -34,16 +34,17 @@
/**
* Set a gpio output to high level.
*/
static inline void gpio_set(uint32_t port, uint16_t pin) {
}
extern void gpio_set(uint32_t port, uint16_t pin);
/**
* Clear a gpio output to low level.
*/
static inline void gpio_clear(uint32_t port, uint16_t pin) {
extern void gpio_clear(uint32_t port, uint16_t pin);
}
/**
* Read a gpio value.
*/
uint16_t gpio_get(uint32_t gpioport, uint16_t gpios);
#endif /* GPIO_ARCH_H */
@@ -30,7 +30,7 @@
#include "subsystems/actuators.h"
#include "actuators_ardrone2_raw.h"
#include "gpio_ardrone.h"
#include "mcu_periph/gpio.h"
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
@@ -52,6 +52,16 @@
*/
int mot_fd; /**< File descriptor for the port */
#define ARDRONE_GPIO_PORT 0 // Dummy for paparazzi compatibility
#define ARDRONE_GPIO_PIN_MOTOR1 171
#define ARDRONE_GPIO_PIN_MOTOR2 172
#define ARDRONE_GPIO_PIN_MOTOR3 173
#define ARDRONE_GPIO_PIN_MOTOR4 174
#define ARDRONE_GPIO_PIN_IRQ_FLIPFLOP 175
#define ARDRONE_GPIO_PIN_IRQ_INPUT 176
void actuators_ardrone_init(void)
{
//open mot port
@@ -81,34 +91,34 @@ void actuators_ardrone_init(void)
tcsetattr(mot_fd, TCSANOW, &options);
//reset IRQ flipflop - on error 106 read 1, this code resets 106 to 0
gpio_set_input(176);
gpio_set(175,0);
gpio_set(175,1);
gpio_setup_input(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_IRQ_INPUT);
gpio_clear(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_IRQ_FLIPFLOP);
gpio_set(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_IRQ_FLIPFLOP);
//all select lines inactive
gpio_set(171,1);
gpio_set(172,1);
gpio_set(173,1);
gpio_set(174,1);
gpio_set(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR1);
gpio_set(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR2);
gpio_set(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR3);
gpio_set(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR4);
//configure motors
uint8_t reply[256];
for(int m=0;m<4;m++) {
gpio_set(171+m,-1);
gpio_clear(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR1 + m);
actuators_ardrone_cmd(0xe0,reply,2);
if(reply[0]!=0xe0 || reply[1]!=0x00)
{
printf("motor%d cmd=0x%02x reply=0x%02x\n",m+1,(int)reply[0],(int)reply[1]);
}
actuators_ardrone_cmd(m+1,reply,1);
gpio_set(171+m,1);
gpio_set(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR1 + m);
}
//all select lines active
gpio_set(171,0);
gpio_set(172,0);
gpio_set(173,0);
gpio_set(174,0);
gpio_clear(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR1);
gpio_clear(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR2);
gpio_clear(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR3);
gpio_clear(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_MOTOR4);
//start multicast
actuators_ardrone_cmd(0xa0,reply,1);
@@ -118,8 +128,8 @@ void actuators_ardrone_init(void)
actuators_ardrone_cmd(0xa0,reply,1);
//reset IRQ flipflop - on error 176 reads 1, this code resets 176 to 0
gpio_set(175,0);
gpio_set(175,1);
gpio_clear(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_IRQ_FLIPFLOP);
gpio_set(ARDRONE_GPIO_PORT,ARDRONE_GPIO_PIN_IRQ_FLIPFLOP);
// Left Red, Right Green
actuators_ardrone_set_leds(MOT_LEDRED,MOT_LEDGREEN, MOT_LEDGREEN, MOT_LEDRED);
@@ -136,7 +146,7 @@ void actuators_ardrone_motor_status(void);
void actuators_ardrone_motor_status(void)
{
// If a motor IRQ lines is set
if (gpio_get(176) == 1)
if (gpio_get(ARDRONE_GPIO_PORT, ARDRONE_GPIO_PIN_IRQ_INPUT) == 1)
{
if (autopilot_motors_on)
{
@@ -144,8 +154,8 @@ void actuators_ardrone_motor_status(void)
autopilot_set_motors_on(FALSE);
// Toggle Flipflop reset so motors can be re-enabled
gpio_set(175,0);
gpio_set(175,1);
gpio_clear(ARDRONE_GPIO_PORT, ARDRONE_GPIO_PIN_IRQ_FLIPFLOP);
gpio_set(ARDRONE_GPIO_PORT, ARDRONE_GPIO_PIN_IRQ_FLIPFLOP);
}
}
}
+42 -11
View File
@@ -25,7 +25,8 @@
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <sys/ioctl.h>
#include "gpio_ardrone.h"
#include "mcu_periph/gpio.h"
#define GPIO_MAGIC 'p'
#define GPIO_DIRECTION _IOW(GPIO_MAGIC, 0, struct gpio_direction)
@@ -49,22 +50,36 @@ struct gpio_direction {
enum gpio_mode mode;
};
//val=0 -> set gpio output lo
//val=1 -> set gpio output hi
void gpio_set(int nr, int val)
void gpio_set(uint32_t port, uint16_t pin)
{
struct gpio_data data;
// Open the device if not open
if (gpiofp == 0)
gpiofp = open("/dev/gpio",O_RDWR);
gpiofp = open("/dev/gpio",O_RDWR);
// Read the GPIO value
data.pin = nr;
data.value = val;
data.pin = pin;
data.value = 1;
ioctl(gpiofp, GPIO_WRITE, &data);
}
void gpio_set_input(int nr)
void gpio_clear(uint32_t port, uint16_t pin)
{
struct gpio_data data;
// Open the device if not open
if (gpiofp == 0)
gpiofp = open("/dev/gpio",O_RDWR);
// Read the GPIO value
data.pin = pin;
data.value = 0;
ioctl(gpiofp, GPIO_WRITE, &data);
}
void gpio_setup_input(uint32_t port, uint16_t pin)
{
struct gpio_direction dir;
// Open the device if not open
@@ -72,12 +87,28 @@ void gpio_set_input(int nr)
gpiofp = open("/dev/gpio",O_RDWR);
// Read the GPIO value
dir.pin = nr;
dir.pin = pin;
dir.mode = GPIO_INPUT;
ioctl(gpiofp, GPIO_DIRECTION, &dir);
}
int gpio_get(int nr)
void gpio_setup_output(uint32_t port, uint16_t pin)
{
struct gpio_direction dir;
// Open the device if not open
if (gpiofp == 0)
gpiofp = open("/dev/gpio",O_RDWR);
// Read the GPIO value
dir.pin = pin;
dir.mode = GPIO_OUTPUT_HIGH;
ioctl(gpiofp, GPIO_DIRECTION, &dir);
}
uint16_t gpio_get(uint32_t gpioport, uint16_t pin)
{
struct gpio_data data;
// Open the device if not open
@@ -85,7 +116,7 @@ int gpio_get(int nr)
gpiofp = open("/dev/gpio",O_RDWR);
// Read the GPIO value
data.pin = nr;
data.pin = pin;
ioctl(gpiofp, GPIO_READ, &data);
return data.value;
}
-34
View File
@@ -1,34 +0,0 @@
/*
* Copyright (C) 2011 Hugo Perquin - http://blog.perquin.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA.
*/
/**
* @file boards/ardrone/gpio_ardrone.h
* ardrone GPIO driver
*/
#ifndef GPIO_ARDRONE_H
#define GPIO_ARDRONE_H
//val=0 -> set gpio output lo
//val=1 -> set gpio output hi
void gpio_set(int nr,int val);
void gpio_set_input(int nr);
int gpio_get(int nr);
#endif /* GPIO_ARDRONE_H */