Browse Source

Only perform GIOP operations on defined IO (#6381)

Check if the table entry fo the IO requested is defined
   so that 0 is never passed to px4_arch_gpioXXXX functions.
sbg
David Sidrane 8 years ago committed by GitHub
parent
commit
23eb07ff3e
  1. 26
      src/drivers/px4fmu/fmu.cpp

26
src/drivers/px4fmu/fmu.cpp

@ -2484,19 +2484,31 @@ PX4FMU::gpio_set_function(uint32_t gpios, int function) @@ -2484,19 +2484,31 @@ PX4FMU::gpio_set_function(uint32_t gpios, int function)
if (gpios & (1 << i)) {
switch (function) {
case GPIO_SET_INPUT:
px4_arch_configgpio(_gpio_tab[i].input);
if (_gpio_tab[i].input) {
px4_arch_configgpio(_gpio_tab[i].input);
}
break;
case GPIO_SET_OUTPUT:
px4_arch_configgpio(_gpio_tab[i].output);
if (_gpio_tab[i].output) {
px4_arch_configgpio(_gpio_tab[i].output);
}
break;
case GPIO_SET_OUTPUT_LOW:
px4_arch_configgpio((_gpio_tab[i].output & ~(GPIO_OUTPUT_SET)) | GPIO_OUTPUT_CLEAR);
if (_gpio_tab[i].output) {
px4_arch_configgpio((_gpio_tab[i].output & ~(GPIO_OUTPUT_SET)) | GPIO_OUTPUT_CLEAR);
}
break;
case GPIO_SET_OUTPUT_HIGH:
px4_arch_configgpio((_gpio_tab[i].output & ~(GPIO_OUTPUT_CLEAR)) | GPIO_OUTPUT_SET);
if (_gpio_tab[i].output) {
px4_arch_configgpio((_gpio_tab[i].output & ~(GPIO_OUTPUT_CLEAR)) | GPIO_OUTPUT_SET);
}
break;
case GPIO_SET_ALT_1:
@ -2526,7 +2538,9 @@ PX4FMU::gpio_write(uint32_t gpios, int function) @@ -2526,7 +2538,9 @@ PX4FMU::gpio_write(uint32_t gpios, int function)
for (unsigned i = 0; i < _ngpio; i++)
if (gpios & (1 << i)) {
px4_arch_gpiowrite(_gpio_tab[i].output, value);
if (_gpio_tab[i].output) {
px4_arch_gpiowrite(_gpio_tab[i].output, value);
}
}
}
@ -2536,7 +2550,7 @@ PX4FMU::gpio_read(void) @@ -2536,7 +2550,7 @@ PX4FMU::gpio_read(void)
uint32_t bits = 0;
for (unsigned i = 0; i < _ngpio; i++)
if (px4_arch_gpioread(_gpio_tab[i].input)) {
if (_gpio_tab[i].input != 0 && px4_arch_gpioread(_gpio_tab[i].input)) {
bits |= (1 << i);
}

Loading…
Cancel
Save