From 444a7a2aecf5df199038ad970ae9520847ee68d9 Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Mon, 15 May 2017 14:33:23 -1000 Subject: [PATCH] PX4 System changes to support 14 Timer IO channels --- src/drivers/drv_pwm_output.h | 27 +++++++-------- src/drivers/px4fmu/fmu.cpp | 65 ++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 13 deletions(-) diff --git a/src/drivers/drv_pwm_output.h b/src/drivers/drv_pwm_output.h index 245d4501e0..13e728f5ba 100644 --- a/src/drivers/drv_pwm_output.h +++ b/src/drivers/drv_pwm_output.h @@ -266,19 +266,20 @@ struct pwm_output_rc_config { #define PWM_SERVO_SET_SBUS_RATE _PX4_IOC(_PWM_SERVO_BASE, 33) /** set auxillary output mode. These correspond to enum Mode in px4fmu/fmu.cpp */ -#define PWM_SERVO_MODE_NONE 0 -#define PWM_SERVO_MODE_1PWM 1 -#define PWM_SERVO_MODE_2PWM 2 -#define PWM_SERVO_MODE_2PWM2CAP 3 -#define PWM_SERVO_MODE_3PWM 4 -#define PWM_SERVO_MODE_3PWM1CAP 5 -#define PWM_SERVO_MODE_4PWM 6 -#define PWM_SERVO_MODE_6PWM 7 -#define PWM_SERVO_MODE_8PWM 8 -#define PWM_SERVO_MODE_4CAP 9 -#define PWM_SERVO_MODE_5CAP 10 -#define PWM_SERVO_MODE_6CAP 11 -#define PWM_SERVO_SET_MODE _PX4_IOC(_PWM_SERVO_BASE, 34) +#define PWM_SERVO_MODE_NONE 0 +#define PWM_SERVO_MODE_1PWM 1 +#define PWM_SERVO_MODE_2PWM 2 +#define PWM_SERVO_MODE_2PWM2CAP 3 +#define PWM_SERVO_MODE_3PWM 4 +#define PWM_SERVO_MODE_3PWM1CAP 5 +#define PWM_SERVO_MODE_4PWM 6 +#define PWM_SERVO_MODE_6PWM 7 +#define PWM_SERVO_MODE_8PWM 8 +#define PWM_SERVO_MODE_14PWM 9 +#define PWM_SERVO_MODE_4CAP 10 +#define PWM_SERVO_MODE_5CAP 11 +#define PWM_SERVO_MODE_6CAP 12 +#define PWM_SERVO_SET_MODE _PX4_IOC(_PWM_SERVO_BASE, 34) /* * diff --git a/src/drivers/px4fmu/fmu.cpp b/src/drivers/px4fmu/fmu.cpp index a7d1e74c50..892caa68af 100644 --- a/src/drivers/px4fmu/fmu.cpp +++ b/src/drivers/px4fmu/fmu.cpp @@ -134,6 +134,7 @@ public: MODE_4PWM, MODE_6PWM, MODE_8PWM, + MODE_14PWM, MODE_4CAP, MODE_5CAP, MODE_6CAP, @@ -727,6 +728,21 @@ PX4FMU::set_mode(Mode mode) break; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + + case MODE_14PWM: + DEVICE_DEBUG("MODE_14PWM"); + /* default output rates */ + _pwm_default_rate = 50; + _pwm_alt_rate = 50; + _pwm_alt_rate_channels = 0; + _pwm_mask = 0x3fff; + _pwm_initialized = false; + _num_outputs = 14; + + break; +#endif + case MODE_NONE: DEVICE_DEBUG("MODE_NONE"); @@ -1838,6 +1854,9 @@ PX4FMU::ioctl(file *filp, int cmd, unsigned long arg) #endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case MODE_8PWM: +#endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + case MODE_14PWM: #endif ret = pwm_ioctl(filp, cmd, arg); break; @@ -2136,6 +2155,20 @@ PX4FMU::pwm_ioctl(file *filp, int cmd, unsigned long arg) break; } +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + + case PWM_SERVO_SET(13): + case PWM_SERVO_SET(12): + case PWM_SERVO_SET(11): + case PWM_SERVO_SET(10): + case PWM_SERVO_SET(9): + case PWM_SERVO_SET(8): + if (_mode < MODE_14PWM) { + ret = -EINVAL; + break; + } + +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case PWM_SERVO_SET(7): @@ -2189,6 +2222,20 @@ PX4FMU::pwm_ioctl(file *filp, int cmd, unsigned long arg) break; +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + + case PWM_SERVO_GET(13): + case PWM_SERVO_GET(12): + case PWM_SERVO_GET(11): + case PWM_SERVO_GET(10): + case PWM_SERVO_GET(9): + case PWM_SERVO_GET(8): + if (_mode < MODE_14PWM) { + ret = -EINVAL; + break; + } + +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 /* FALLTHROUGH */ @@ -2244,6 +2291,14 @@ PX4FMU::pwm_ioctl(file *filp, int cmd, unsigned long arg) #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case PWM_SERVO_GET_RATEGROUP(6): case PWM_SERVO_GET_RATEGROUP(7): +#endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + case PWM_SERVO_GET_RATEGROUP(8): + case PWM_SERVO_GET_RATEGROUP(9): + case PWM_SERVO_GET_RATEGROUP(10): + case PWM_SERVO_GET_RATEGROUP(11): + case PWM_SERVO_GET_RATEGROUP(12): + case PWM_SERVO_GET_RATEGROUP(13): #endif *(uint32_t *)arg = up_pwm_servo_get_rate_group(cmd - PWM_SERVO_GET_RATEGROUP(0)); break; @@ -2252,6 +2307,13 @@ PX4FMU::pwm_ioctl(file *filp, int cmd, unsigned long arg) case MIXERIOCGETOUTPUTCOUNT: switch (_mode) { +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + + case MODE_14PWM: + *(unsigned *)arg = 14; + break; +#endif + #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case MODE_8PWM: @@ -2896,6 +2958,9 @@ PX4FMU::fmu_new_mode(PortMode new_mode) #endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 8 servo_mode = PX4FMU::MODE_8PWM; +#endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 14 + servo_mode = PX4FMU::MODE_14PWM; #endif break;