From 15e76ad993df77bc70f45691e3aeda1438ba30d0 Mon Sep 17 00:00:00 2001 From: Daniel Agar Date: Thu, 28 Jan 2021 10:02:40 -0500 Subject: [PATCH] PWM12 mode for pwm_out and dshot --- src/drivers/drv_pwm_output.h | 13 ++++---- src/drivers/dshot/DShot.cpp | 61 ++++++++++++++++++++++++++++------ src/drivers/dshot/DShot.h | 2 ++ src/drivers/pwm_out/PWMOut.cpp | 52 ++++++++++++++++++++++++++++- src/drivers/pwm_out/PWMOut.hpp | 2 ++ 5 files changed, 113 insertions(+), 17 deletions(-) diff --git a/src/drivers/drv_pwm_output.h b/src/drivers/drv_pwm_output.h index 7bb3df1727..821390e435 100644 --- a/src/drivers/drv_pwm_output.h +++ b/src/drivers/drv_pwm_output.h @@ -232,12 +232,13 @@ typedef uint16_t servo_position_t; #define PWM_SERVO_MODE_5PWM1CAP 10 #define PWM_SERVO_MODE_6PWM 11 #define PWM_SERVO_MODE_8PWM 12 -#define PWM_SERVO_MODE_14PWM 13 -#define PWM_SERVO_MODE_4CAP 14 -#define PWM_SERVO_MODE_5CAP 15 -#define PWM_SERVO_MODE_6CAP 16 -#define PWM_SERVO_ENTER_TEST_MODE 17 -#define PWM_SERVO_EXIT_TEST_MODE 18 +#define PWM_SERVO_MODE_12PWM 13 +#define PWM_SERVO_MODE_14PWM 14 +#define PWM_SERVO_MODE_4CAP 15 +#define PWM_SERVO_MODE_5CAP 16 +#define PWM_SERVO_MODE_6CAP 17 +#define PWM_SERVO_ENTER_TEST_MODE 18 +#define PWM_SERVO_EXIT_TEST_MODE 19 #define PWM_SERVO_SET_MODE _PX4_IOC(_PWM_SERVO_BASE, 34) /* diff --git a/src/drivers/dshot/DShot.cpp b/src/drivers/dshot/DShot.cpp index dde41ee043..42449567ac 100644 --- a/src/drivers/dshot/DShot.cpp +++ b/src/drivers/dshot/DShot.cpp @@ -221,6 +221,18 @@ int DShot::set_mode(const Mode mode) break; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + + case MODE_12PWM: + PX4_DEBUG("MODE_12PWM"); + // default output rates + _output_mask = 0xfff; + _outputs_initialized = false; + _num_outputs = 12; + + break; +#endif + #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 case MODE_14PWM: @@ -642,6 +654,9 @@ int DShot::ioctl(file *filp, int cmd, unsigned long arg) #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case MODE_8PWM: #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + case MODE_12PWM: +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 case MODE_14PWM: #endif @@ -680,6 +695,13 @@ int DShot::pwm_ioctl(file *filp, const int cmd, const unsigned long arg) break; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + + case MODE_12PWM: + *(unsigned *)arg = 12; + break; +#endif + #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case MODE_8PWM: @@ -1003,6 +1025,9 @@ int DShot::module_new_mode(const PortMode new_mode) #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 8 mode = DShot::MODE_8PWM; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 12 + mode = DShot::MODE_12PWM; +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 14 mode = DShot::MODE_14PWM; #endif @@ -1268,6 +1293,16 @@ int DShot::custom_command(int argc, char *argv[]) } else if (!strcmp(verb, "mode_pwm8")) { new_mode = PORT_PWM8; +#endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + + } else if (!strcmp(verb, "mode_pwm12")) { + new_mode = PORT_PWM12; +#endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + + } else if (!strcmp(verb, "mode_pwm14")) { + new_mode = PORT_PWM14; #endif } @@ -1371,23 +1406,29 @@ After saving, the reversed direction will be regarded as the normal one. So to r PRINT_MODULE_USAGE_COMMAND("mode_gpio"); PRINT_MODULE_USAGE_COMMAND_DESCR("mode_pwm", "Select all available pins as PWM"); +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 + PRINT_MODULE_USAGE_COMMAND("mode_pwm14"); +#endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + PRINT_MODULE_USAGE_COMMAND("mode_pwm12"); +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 - PRINT_MODULE_USAGE_COMMAND("mode_pwm8"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm8"); #endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 6 - PRINT_MODULE_USAGE_COMMAND("mode_pwm6"); - PRINT_MODULE_USAGE_COMMAND("mode_pwm5"); - PRINT_MODULE_USAGE_COMMAND("mode_pwm5cap1"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm6"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm5"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm5cap1"); PRINT_MODULE_USAGE_COMMAND("mode_pwm4"); - PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap1"); - PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap2"); - PRINT_MODULE_USAGE_COMMAND("mode_pwm3"); - PRINT_MODULE_USAGE_COMMAND("mode_pwm3cap1"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap1"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap2"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm3"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm3cap1"); PRINT_MODULE_USAGE_COMMAND("mode_pwm2"); - PRINT_MODULE_USAGE_COMMAND("mode_pwm2cap2"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm2cap2"); #endif #if defined(BOARD_HAS_PWM) - PRINT_MODULE_USAGE_COMMAND("mode_pwm1"); + PRINT_MODULE_USAGE_COMMAND("mode_pwm1"); #endif PRINT_MODULE_USAGE_COMMAND_DESCR("telemetry", "Enable Telemetry on a UART"); diff --git a/src/drivers/dshot/DShot.h b/src/drivers/dshot/DShot.h index 332dfd3615..31f009a21c 100644 --- a/src/drivers/dshot/DShot.h +++ b/src/drivers/dshot/DShot.h @@ -78,6 +78,7 @@ public: MODE_5PWM1CAP, MODE_6PWM, MODE_8PWM, + MODE_12PWM, MODE_14PWM, MODE_4CAP, MODE_5CAP, @@ -90,6 +91,7 @@ public: PORT_FULL_GPIO, PORT_FULL_PWM, PORT_PWM14, + PORT_PWM12, PORT_PWM8, PORT_PWM6, PORT_PWM5, diff --git a/src/drivers/pwm_out/PWMOut.cpp b/src/drivers/pwm_out/PWMOut.cpp index 45f07466ae..b2faca0851 100644 --- a/src/drivers/pwm_out/PWMOut.cpp +++ b/src/drivers/pwm_out/PWMOut.cpp @@ -256,6 +256,22 @@ int PWMOut::set_mode(Mode mode) break; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + + case MODE_12PWM: + PX4_DEBUG("MODE_12PWM"); + /* default output rates */ + _pwm_default_rate = 50; + _pwm_alt_rate = 50; + _pwm_alt_rate_channels = 0; + _pwm_mask = 0xFFF; + _pwm_initialized = false; + _num_outputs = 12; + update_params(); + + break; +#endif + #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 case MODE_14PWM: @@ -751,6 +767,9 @@ int PWMOut::ioctl(file *filp, int cmd, unsigned long arg) #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case MODE_8PWM: #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + case MODE_12PWM: +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 case MODE_14PWM: #endif @@ -1192,6 +1211,13 @@ int PWMOut::pwm_ioctl(file *filp, int cmd, unsigned long arg) break; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + + case MODE_12PWM: + *(unsigned *)arg = 12; + break; +#endif + #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case MODE_8PWM: @@ -1292,6 +1318,10 @@ int PWMOut::pwm_ioctl(file *filp, int cmd, unsigned long arg) ret = set_mode(MODE_8PWM); break; + case PWM_SERVO_MODE_12PWM: + ret = set_mode(MODE_12PWM); + break; + case PWM_SERVO_MODE_14PWM: ret = set_mode(MODE_14PWM); break; @@ -1546,6 +1576,9 @@ int PWMOut::fmu_new_mode(PortMode new_mode) #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 8 servo_mode = PWMOut::MODE_8PWM; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 12 + servo_mode = PWMOut::MODE_12PWM; +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 14 servo_mode = PWMOut::MODE_14PWM; #endif @@ -1563,6 +1596,13 @@ int PWMOut::fmu_new_mode(PortMode new_mode) servo_mode = PWMOut::MODE_14PWM; break; #endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + + case PORT_PWM12: + /* select 12-pin PWM mode */ + servo_mode = PWMOut::MODE_12PWM; + break; +#endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 case PORT_PWM8: @@ -1986,7 +2026,12 @@ int PWMOut::custom_command(int argc, char *argv[]) #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 } else if (!strcmp(verb, "mode_pwm8")) { - new_mode = PORT_PWM14; + new_mode = PORT_PWM8; +#endif +#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12 + + } else if (!strcmp(verb, "mode_pwm12")) { + new_mode = PORT_PWM12; #endif #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 @@ -2042,6 +2087,8 @@ int PWMOut::print_status() case MODE_8PWM: mode_str = "pwm8"; break; + case MODE_12PWM: mode_str = "pwm12"; break; + case MODE_14PWM: mode_str = "pwm14"; break; case MODE_4CAP: mode_str = "cap4"; break; @@ -2113,6 +2160,9 @@ mixer files. # if BOARD_HAS_PWM >= 14 PRINT_MODULE_USAGE_COMMAND("mode_pwm14"); # endif +# if BOARD_HAS_PWM >= 12 + PRINT_MODULE_USAGE_COMMAND("mode_pwm12"); +# endif # if BOARD_HAS_PWM >= 8 PRINT_MODULE_USAGE_COMMAND("mode_pwm8"); # endif diff --git a/src/drivers/pwm_out/PWMOut.hpp b/src/drivers/pwm_out/PWMOut.hpp index bb12fbee44..020369a523 100644 --- a/src/drivers/pwm_out/PWMOut.hpp +++ b/src/drivers/pwm_out/PWMOut.hpp @@ -70,6 +70,7 @@ enum PortMode { PORT_FULL_GPIO, PORT_FULL_PWM, PORT_PWM14, + PORT_PWM12, PORT_PWM8, PORT_PWM6, PORT_PWM5, @@ -109,6 +110,7 @@ public: MODE_5PWM1CAP, MODE_6PWM, MODE_8PWM, + MODE_12PWM, MODE_14PWM, MODE_4CAP, MODE_5CAP,