From f7835a8677482dc4d617cd868a20c7c384140794 Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Mon, 1 May 2017 12:41:21 -1000 Subject: [PATCH] io_timer driver:Only support capture if DIRECT_INPUT_TIMER_CHANNELS > 0 This removes the unused input capture capabilities from the px4io and saves 128 bytes of ram. --- src/drivers/boards/common/board_common.h | 7 +++++++ src/drivers/px4fmu/fmu.cpp | 13 +++++++++++-- src/drivers/stm32/drv_input_capture.c | 5 +++++ src/drivers/stm32/drv_io_timer.c | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/drivers/boards/common/board_common.h b/src/drivers/boards/common/board_common.h index d5498ecd06..d905f1470b 100644 --- a/src/drivers/boards/common/board_common.h +++ b/src/drivers/boards/common/board_common.h @@ -185,6 +185,13 @@ # define BOARD_EEPROM_WP_CTRL(on_true) #endif +/* + * Defined when a board has capture and uses channels. + */ +#if defined(DIRECT_INPUT_TIMER_CHANNELS) && DIRECT_INPUT_TIMER_CHANNELS > 0 +#define BOARD_HAS_CAPTURE 1 +#endif + /************************************************************************************ * Public Data diff --git a/src/drivers/px4fmu/fmu.cpp b/src/drivers/px4fmu/fmu.cpp index 72a67d6bdb..8542e073bc 100644 --- a/src/drivers/px4fmu/fmu.cpp +++ b/src/drivers/px4fmu/fmu.cpp @@ -579,12 +579,15 @@ PX4FMU::set_mode(Mode mode) _num_outputs = 1; break; +#if defined(BOARD_HAS_CAPTURE) + case MODE_2PWM2CAP: // v1 multi-port with flow control lines as PWM up_input_capture_set(2, Rising, 0, NULL, NULL); up_input_capture_set(3, Rising, 0, NULL, NULL); DEVICE_DEBUG("MODE_2PWM2CAP"); + // no break +#endif - // no break case MODE_2PWM: // v1 multi-port with flow control lines as PWM DEVICE_DEBUG("MODE_2PWM"); @@ -598,11 +601,14 @@ PX4FMU::set_mode(Mode mode) break; +#if defined(BOARD_HAS_CAPTURE) + case MODE_3PWM1CAP: // v1 multi-port with flow control lines as PWM DEVICE_DEBUG("MODE_3PWM1CAP"); up_input_capture_set(3, Rising, 0, NULL, NULL); + // no break +#endif - // no break case MODE_3PWM: // v1 multi-port with flow control lines as PWM DEVICE_DEBUG("MODE_3PWM"); @@ -2701,6 +2707,8 @@ PX4FMU::capture_ioctl(struct file *filp, int cmd, unsigned long arg) { int ret = -EINVAL; +#if defined(BOARD_HAS_CAPTURE) + lock(); input_capture_config_t *pconfig = 0; @@ -2822,6 +2830,7 @@ PX4FMU::capture_ioctl(struct file *filp, int cmd, unsigned long arg) } unlock(); +#endif return ret; } diff --git a/src/drivers/stm32/drv_input_capture.c b/src/drivers/stm32/drv_input_capture.c index 0c3dda0343..14441d5cdb 100644 --- a/src/drivers/stm32/drv_input_capture.c +++ b/src/drivers/stm32/drv_input_capture.c @@ -79,6 +79,10 @@ #include #include +#if defined(BOARD_HAS_CAPTURE) + +/* Support Input capture */ + #define _REG32(_base, _reg) (*(volatile uint32_t *)(_base + _reg)) #define REG(_tmr, _reg) _REG32(io_timers[_tmr].base, _reg) @@ -499,3 +503,4 @@ int up_input_capture_get_stats(unsigned channel, input_capture_stats_t *stats, b return rv; } +#endif // defined(BOARD_HAS_CAPTURE) diff --git a/src/drivers/stm32/drv_io_timer.c b/src/drivers/stm32/drv_io_timer.c index 304f1ae74f..ab12a332c2 100644 --- a/src/drivers/stm32/drv_io_timer.c +++ b/src/drivers/stm32/drv_io_timer.c @@ -132,6 +132,10 @@ typedef uint8_t io_timer_allocation_t; /* big enough to hold MAX_IO_TIMERS */ static io_timer_allocation_t once = 0; +#if defined(BOARD_HAS_CAPTURE) + +/* Stats and handlers are only useful for Capture */ + typedef struct channel_stat_t { uint32_t isr_cout; uint32_t overflows; @@ -143,10 +147,12 @@ static struct channel_handler_entry { channel_handler_t callback; void *context; } channel_handlers[MAX_TIMER_IO_CHANNELS]; +#endif // defined(BOARD_HAS_CAPTURE) static int io_timer_handler(uint16_t timer_index) { +#if defined(BOARD_HAS_CAPTURE) /* Read the count at the time of the interrupt */ uint16_t count = rCNT(timer_index); @@ -198,6 +204,7 @@ static int io_timer_handler(uint16_t timer_index) /* Clear all the SR bits for interrupt enabled channels only */ rSR(timer_index) = ~(statusr & (enabled | enabled << 8)); +#endif // defined(BOARD_HAS_CAPTURE) return 0; } @@ -651,10 +658,13 @@ int io_timer_channel_init(unsigned channel, io_timer_channel_mode_t mode, gpio = timer_io_channels[channel].gpio_in; break; +#if defined(BOARD_HAS_CAPTURE) + case IOTimerChanMode_Capture: setbits = CCMR_C1_CAPTURE_INIT; gpio = timer_io_channels[channel].gpio_in; break; +#endif case IOTimerChanMode_NotUsed: setbits = 0; @@ -721,9 +731,13 @@ int io_timer_channel_init(unsigned channel, io_timer_channel_mode_t mode, rvalue |= setbits; rCCER(timer) = rvalue; +#if !defined(BOARD_HAS_CAPTURE) + UNUSED(dier_setbits); +#else channel_handlers[channel].callback = channel_handler; channel_handlers[channel].context = context; rDIER(timer) |= dier_setbits << shifts; +#endif px4_leave_critical_section(flags); }