Browse Source

AP_HAL_Linux: GPIO: reduce macro and variable scopes

Also change the coding style in a few places.
mission-4.1.18
Lucas De Marchi 9 years ago
parent
commit
1d9d0a40db
  1. 31
      libraries/AP_HAL_Linux/GPIO_RPI.cpp
  2. 78
      libraries/AP_HAL_Linux/GPIO_RPI.h

31
libraries/AP_HAL_Linux/GPIO_RPI.cpp

@ -20,23 +20,39 @@ @@ -20,23 +20,39 @@
#include "GPIO.h"
#include "Util_RPI.h"
// Raspberry Pi GPIO memory
#define BCM2708_PERI_BASE 0x20000000
#define BCM2709_PERI_BASE 0x3F000000
#define GPIO_BASE(address) (address + 0x200000)
// GPIO setup. Always use INP_GPIO(x) before OUT_GPIO(x) or SET_GPIO_ALT(x,y)
#define GPIO_MODE_IN(g) *(_gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
#define GPIO_MODE_OUT(g) *(_gpio+((g)/10)) |= (1<<(((g)%10)*3))
#define GPIO_MODE_ALT(g,a) *(_gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
#define GPIO_SET_HIGH *(_gpio+7) // sets bits which are 1
#define GPIO_SET_LOW *(_gpio+10) // clears bits which are 1
#define GPIO_GET(g) (*(_gpio+13)&(1<<g)) // 0 if LOW, (1<<g) if HIGH
using namespace Linux;
static const AP_HAL::HAL& hal = AP_HAL::get_HAL();
static const AP_HAL::HAL &hal = AP_HAL::get_HAL();
GPIO_RPI::GPIO_RPI()
{}
{
}
void GPIO_RPI::init()
{
int rpi_version = UtilRPI::from(hal.util)->get_rpi_version();
uint32_t gpio_address = rpi_version == 1 ? GPIO_BASE(BCM2708_PERI_BASE) : GPIO_BASE(BCM2709_PERI_BASE);
// open /dev/mem
if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
int mem_fd = open("/dev/mem", O_RDWR|O_SYNC);
if (mem_fd < 0) {
AP_HAL::panic("Can't open /dev/mem");
}
// mmap GPIO
gpio_map = mmap(
void *gpio_map = mmap(
NULL, // Any adddress in our space will do
BLOCK_SIZE, // Map length
PROT_READ|PROT_WRITE, // Enable reading & writting to mapped memory
@ -51,7 +67,7 @@ void GPIO_RPI::init() @@ -51,7 +67,7 @@ void GPIO_RPI::init()
AP_HAL::panic("Can't open /dev/mem");
}
gpio = (volatile uint32_t *)gpio_map; // Always use volatile pointer!
_gpio = (volatile uint32_t *)gpio_map;
}
void GPIO_RPI::pinMode(uint8_t pin, uint8_t output)
@ -103,7 +119,8 @@ void GPIO_RPI::toggle(uint8_t pin) @@ -103,7 +119,8 @@ void GPIO_RPI::toggle(uint8_t pin)
}
/* Alternative interface: */
AP_HAL::DigitalSource* GPIO_RPI::channel(uint16_t n) {
AP_HAL::DigitalSource* GPIO_RPI::channel(uint16_t n)
{
return new DigitalSource(n);
}

78
libraries/AP_HAL_Linux/GPIO_RPI.h

@ -6,57 +6,35 @@ @@ -6,57 +6,35 @@
#define LOW 0
#define HIGH 1
// Raspberry Pi GPIO memory
#define BCM2708_PERI_BASE 0x20000000
#define BCM2709_PERI_BASE 0x3F000000
#define GPIO_BASE(address) (address + 0x200000)
#define PWM_BASE(address) (address + 0x20C000) /* PWM controller */
#define CLOCK_BASE(address) (address + 0x101000)
#define PWM_CTL 0
#define PWM_RNG1 4
#define PWM_DAT1 5
#define PWMCLK_CNTL 40
#define PWMCLK_DIV 41
#define PAGE_SIZE (4*1024)
#define BLOCK_SIZE (4*1024)
// GPIO setup. Always use INP_GPIO(x) before OUT_GPIO(x) or SET_GPIO_ALT(x,y)
#define GPIO_MODE_IN(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
#define GPIO_MODE_OUT(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3))
#define GPIO_MODE_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
#define GPIO_SET_HIGH *(gpio+7) // sets bits which are 1
#define GPIO_SET_LOW *(gpio+10) // clears bits which are 1
#define GPIO_GET(g) (*(gpio+13)&(1<<g)) // 0 if LOW, (1<<g) if HIGH
// Raspberry Pi GPIO mapping
#define RPI_GPIO_2 2 // Pin 3 SDA
#define RPI_GPIO_3 3 // Pin 5 SCL
#define RPI_GPIO_4 4 // Pin 7 BH_PCA9685_OE
#define RPI_GPIO_5 5 // Pin 29 BH_PWM_INPUT_0
#define RPI_GPIO_6 6 // Pin 31 BH_PWM_INPUT_1
#define RPI_GPIO_7 7 // Pin 26 CE1 MPU9250_CS
#define RPI_GPIO_8 8 // Pin 24 CE0 UBLOX_CS
#define RPI_GPIO_9 9 // Pin 21 MISO
#define RPI_GPIO_10 10 // Pin 19 MOSI
#define RPI_GPIO_11 11 // Pin 23 SCLK
#define RPI_GPIO_12 12 // Pin 32 BH_PWM_INPUT_2
#define RPI_GPIO_13 13 // Pin 33 BH_PWM_INPUT_3
#define RPI_GPIO_14 14 // Pin 8 TxD
#define RPI_GPIO_15 15 // Pin 10 RxD
#define RPI_GPIO_2 2 // Pin 3
#define RPI_GPIO_3 3 // Pin 5
#define RPI_GPIO_4 4 // Pin 7
#define RPI_GPIO_5 5 // Pin 29
#define RPI_GPIO_6 6 // Pin 31
#define RPI_GPIO_7 7 // Pin 26
#define RPI_GPIO_8 8 // Pin 24
#define RPI_GPIO_9 9 // Pin 21
#define RPI_GPIO_10 10 // Pin 19
#define RPI_GPIO_11 11 // Pin 23
#define RPI_GPIO_12 12 // Pin 32
#define RPI_GPIO_13 13 // Pin 33
#define RPI_GPIO_14 14 // Pin 8
#define RPI_GPIO_15 15 // Pin 10
#define RPI_GPIO_16 16 // Pin 36
#define RPI_GPIO_17 17 // Pin 11 UART_PORT_5
#define RPI_GPIO_18 18 // Pin 12 UART_PORT_4
#define RPI_GPIO_19 19 // Pin 35 BH_PWM_INPUT_4
#define RPI_GPIO_20 20 // Pin 38 BH_PWM_INPUT_5
#define RPI_GPIO_21 21 // Pin 40 BH_PWM_INPUT_6
#define RPI_GPIO_22 22 // Pin 15 UBLOX_PPS
#define RPI_GPIO_23 23 // Pin 16 MPU9250_DRDY BH_MPU6050_INTA
#define RPI_GPIO_24 24 // Pin 18 SPI_PORT_6
#define RPI_GPIO_25 25 // Pin 22 SPI_PORT_5
#define RPI_GPIO_26 26 // Pin 37 BH_PWM_INPUT_7
#define RPI_GPIO_17 17 // Pin 11
#define RPI_GPIO_18 18 // Pin 12
#define RPI_GPIO_19 19 // Pin 35
#define RPI_GPIO_20 20 // Pin 38
#define RPI_GPIO_21 21 // Pin 40
#define RPI_GPIO_22 22 // Pin 15
#define RPI_GPIO_23 23 // Pin 16
#define RPI_GPIO_24 24 // Pin 18
#define RPI_GPIO_25 25 // Pin 22
#define RPI_GPIO_26 26 // Pin 37
#define RPI_GPIO_27 27 // Pin 13
#define RPI_GPIO_28 28 // Pin 3
#define RPI_GPIO_29 29 // Pin 4
@ -64,11 +42,6 @@ @@ -64,11 +42,6 @@
#define RPI_GPIO_31 31 // Pin 6
class Linux::GPIO_RPI : public AP_HAL::GPIO {
private:
int mem_fd;
void *gpio_map;
volatile uint32_t *gpio;
public:
GPIO_RPI();
void init();
@ -88,4 +61,7 @@ public: @@ -88,4 +61,7 @@ public:
/* return true if USB cable is connected */
bool usb_connected(void);
private:
volatile uint32_t *_gpio;
};

Loading…
Cancel
Save