diff --git a/flight/RevoMini/System/pios_board.c b/flight/RevoMini/System/pios_board.c index 380f5fe59..5f3121110 100644 --- a/flight/RevoMini/System/pios_board.c +++ b/flight/RevoMini/System/pios_board.c @@ -293,6 +293,31 @@ static void PIOS_Board_configure_dsm(const struct pios_usart_cfg *pios_usart_dsm pios_rcvr_group_map[channelgroup] = pios_dsm_rcvr_id; } +static void PIOS_Board_configure_pwm(const struct pios_pwm_cfg *pios_pwm_cfg) +{ + /* Set up the receiver port. Later this should be optional */ + uint32_t pios_pwm_id; + PIOS_PWM_Init(&pios_pwm_id, pios_pwm_cfg); + + uint32_t pios_pwm_rcvr_id; + if (PIOS_RCVR_Init(&pios_pwm_rcvr_id, &pios_pwm_rcvr_driver, pios_pwm_id)) { + PIOS_Assert(0); + } + pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_PWM] = pios_pwm_rcvr_id; +} + +static void PIOS_Board_configure_ppm(const struct pios_ppm_cfg *pios_ppm_cfg) +{ + uint32_t pios_ppm_id; + PIOS_PPM_Init(&pios_ppm_id, pios_ppm_cfg); + + uint32_t pios_ppm_rcvr_id; + if (PIOS_RCVR_Init(&pios_ppm_rcvr_id, &pios_ppm_rcvr_driver, pios_ppm_id)) { + PIOS_Assert(0); + } + pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_PPM] = pios_ppm_rcvr_id; +} + /** * PIOS_Board_Init() * initializes all the core subsystems on this specific hardware @@ -641,6 +666,13 @@ void PIOS_Board_Init(void) { } #endif /* PIOS_INCLUDE_RFM22B */ +#if defined(PIOS_INCLUDE_PWM) || defined(PIOS_INCLUDE_PWM) + + const struct pios_servo_cfg *pios_servo_cfg; + // default to servo outputs only + pios_servo_cfg = &pios_servo_cfg_out; +#endif + /* Configure the receiver port*/ uint8_t hwsettings_rcvrport; HwSettingsRM_RcvrPortGet(&hwsettings_rcvrport); @@ -650,35 +682,33 @@ void PIOS_Board_Init(void) { break; case HWSETTINGS_RM_RCVRPORT_PWM: #if defined(PIOS_INCLUDE_PWM) - { /* Set up the receiver port. Later this should be optional */ - uint32_t pios_pwm_id; - PIOS_PWM_Init(&pios_pwm_id, &pios_pwm_cfg); - - uint32_t pios_pwm_rcvr_id; - if (PIOS_RCVR_Init(&pios_pwm_rcvr_id, &pios_pwm_rcvr_driver, pios_pwm_id)) { - PIOS_Assert(0); - } - pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_PWM] = pios_pwm_rcvr_id; - } + PIOS_Board_configure_pwm(&pios_pwm_cfg); #endif /* PIOS_INCLUDE_PWM */ break; case HWSETTINGS_RM_RCVRPORT_PPM: case HWSETTINGS_RM_RCVRPORT_PPMOUTPUTS: + case HWSETTINGS_RM_RCVRPORT_PPMPWM: #if defined(PIOS_INCLUDE_PPM) - { - uint32_t pios_ppm_id; - PIOS_PPM_Init(&pios_ppm_id, &pios_ppm_cfg); - - uint32_t pios_ppm_rcvr_id; - if (PIOS_RCVR_Init(&pios_ppm_rcvr_id, &pios_ppm_rcvr_driver, pios_ppm_id)) { - PIOS_Assert(0); + if(hwsettings_rcvrport == HWSETTINGS_RM_RCVRPORT_PPMOUTPUTS) + { + // configure servo outputs and the remaining 5 inputs as outputs + pios_servo_cfg = &pios_servo_cfg_out_in_ppm; } - pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_PPM] = pios_ppm_rcvr_id; - } + + PIOS_Board_configure_ppm(&pios_ppm_cfg); + + // enable pwm on the remaining channels + if(hwsettings_rcvrport == HWSETTINGS_RM_RCVRPORT_PPMPWM) + { + PIOS_Board_configure_pwm(&pios_pwm_ppm_cfg); + } + + break; #endif /* PIOS_INCLUDE_PPM */ case HWSETTINGS_RM_RCVRPORT_OUTPUTS: - + // configure only the servo outputs + pios_servo_cfg = &pios_servo_cfg_out_in; break; } @@ -695,20 +725,8 @@ void PIOS_Board_Init(void) { #endif /* PIOS_INCLUDE_GCSRCVR */ #ifndef PIOS_DEBUG_ENABLE_DEBUG_PINS - switch (hwsettings_rcvrport) { - case HWSETTINGS_RM_RCVRPORT_DISABLED: - case HWSETTINGS_RM_RCVRPORT_PWM: - case HWSETTINGS_RM_RCVRPORT_PPM: - /* Set up the servo outputs */ - PIOS_Servo_Init(&pios_servo_cfg); - break; - case HWSETTINGS_RM_RCVRPORT_PPMOUTPUTS: - case HWSETTINGS_RM_RCVRPORT_OUTPUTS: - //PIOS_Servo_Init(&pios_servo_rcvr_cfg); - //TODO: Prepare the configurations on board_hw_defs and handle here: - PIOS_Servo_Init(&pios_servo_cfg); - break; - } + // pios_servo_cfg points to the correct configuration based on input port settings + PIOS_Servo_Init(pios_servo_cfg); #else PIOS_DEBUG_Init(&pios_tim_servo_all_channels, NELEMENTS(pios_tim_servo_all_channels)); #endif diff --git a/flight/board_hw_defs/revomini/board_hw_defs.c b/flight/board_hw_defs/revomini/board_hw_defs.c index 538131b91..4dfc9af2a 100644 --- a/flight/board_hw_defs/revomini/board_hw_defs.c +++ b/flight/board_hw_defs/revomini/board_hw_defs.c @@ -1291,9 +1291,120 @@ static const struct pios_tim_channel pios_tim_servoport_all_pins[] = { }, .remap = GPIO_AF_TIM5, }, -}; + // PWM pins on FlexiIO(receiver) port + { + // * 6: PB15 = SPI2 MOSI, TIM12 CH2 -const struct pios_servo_cfg pios_servo_cfg = { + .timer = TIM12, + .timer_chan = TIM_Channel_2, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_15, + .GPIO_Speed = GPIO_Speed_2MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP + }, + .pin_source = GPIO_PinSource15, + }, + .remap = GPIO_AF_TIM12, + }, + { + // * 7: PC6 = TIM8 CH1, USART6 TX + .timer = TIM8, + .timer_chan = TIM_Channel_1, + .pin = { + .gpio = GPIOC, + .init = { + .GPIO_Pin = GPIO_Pin_6, + .GPIO_Speed = GPIO_Speed_2MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP + }, + .pin_source = GPIO_PinSource6, + }, + .remap = GPIO_AF_TIM8, + }, + + { + // * 8: PC7 = TIM8 CH2, USART6 RX + .timer = TIM8, + .timer_chan = TIM_Channel_2, + .pin = { + .gpio = GPIOC, + .init = { + .GPIO_Pin = GPIO_Pin_7, + .GPIO_Speed = GPIO_Speed_2MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP + }, + .pin_source = GPIO_PinSource7, + }, + .remap = GPIO_AF_TIM8, + }, + + { + // * 9: PC8 = TIM8 CH3 + .timer = TIM8, + .timer_chan = TIM_Channel_3, + .pin = { + .gpio = GPIOC, + .init = { + .GPIO_Pin = GPIO_Pin_8, + .GPIO_Speed = GPIO_Speed_2MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP + }, + .pin_source = GPIO_PinSource8, + }, + .remap = GPIO_AF_TIM8, + }, + + { + // * 10: PC9 = TIM8 CH4 + .timer = TIM8, + .timer_chan = TIM_Channel_4, + .pin = { + .gpio = GPIOC, + .init = { + .GPIO_Pin = GPIO_Pin_9, + .GPIO_Speed = GPIO_Speed_2MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP + }, + .pin_source = GPIO_PinSource9, + }, + .remap = GPIO_AF_TIM8, + }, + + { + // * 5: PB14 = SPI2 MISO, TIM12 CH1, USART3 RTS + .timer = TIM12, + .timer_chan = TIM_Channel_1, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_14, + .GPIO_Speed = GPIO_Speed_2MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP + }, + .pin_source = GPIO_PinSource14, + }, + .remap = GPIO_AF_TIM12, + }, +}; +#define PIOS_SERVOPORT_ALL_PINS_PWMOUT 6 +#define PIOS_SERVOPORT_ALL_PINS_PWMOUT_IN_PPM 11 +#define PIOS_SERVOPORT_ALL_PINS_PWMOUT_IN 12 + +const struct pios_servo_cfg pios_servo_cfg_out = { .tim_oc_init = { .TIM_OCMode = TIM_OCMode_PWM1, .TIM_OutputState = TIM_OutputState_Enable, @@ -1305,7 +1416,37 @@ const struct pios_servo_cfg pios_servo_cfg = { .TIM_OCNIdleState = TIM_OCNIdleState_Reset, }, .channels = pios_tim_servoport_all_pins, - .num_channels = NELEMENTS(pios_tim_servoport_all_pins), + .num_channels = PIOS_SERVOPORT_ALL_PINS_PWMOUT, +}; +// All servo outputs, servo input ch1 ppm, ch2-6 outputs +const struct pios_servo_cfg pios_servo_cfg_out_in_ppm = { + .tim_oc_init = { + .TIM_OCMode = TIM_OCMode_PWM1, + .TIM_OutputState = TIM_OutputState_Enable, + .TIM_OutputNState = TIM_OutputNState_Disable, + .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION, + .TIM_OCPolarity = TIM_OCPolarity_High, + .TIM_OCNPolarity = TIM_OCPolarity_High, + .TIM_OCIdleState = TIM_OCIdleState_Reset, + .TIM_OCNIdleState = TIM_OCNIdleState_Reset, + }, + .channels = pios_tim_servoport_all_pins, + .num_channels = PIOS_SERVOPORT_ALL_PINS_PWMOUT_IN_PPM, +}; +// All servo outputs, servo inputs ch1-6 Outputs +const struct pios_servo_cfg pios_servo_cfg_out_in = { + .tim_oc_init = { + .TIM_OCMode = TIM_OCMode_PWM1, + .TIM_OutputState = TIM_OutputState_Enable, + .TIM_OutputNState = TIM_OutputNState_Disable, + .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION, + .TIM_OCPolarity = TIM_OCPolarity_High, + .TIM_OCNPolarity = TIM_OCPolarity_High, + .TIM_OCIdleState = TIM_OCIdleState_Reset, + .TIM_OCNIdleState = TIM_OCNIdleState_Reset, + }, + .channels = pios_tim_servoport_all_pins, + .num_channels = PIOS_SERVOPORT_ALL_PINS_PWMOUT_IN, }; @@ -1424,6 +1565,18 @@ const struct pios_pwm_cfg pios_pwm_cfg = { .channels = pios_tim_rcvrport_all_channels, .num_channels = NELEMENTS(pios_tim_rcvrport_all_channels), }; +// this configures outputs 2-6 as pwm inputs +const struct pios_pwm_cfg pios_pwm_ppm_cfg = { + .tim_ic_init = { + .TIM_ICPolarity = TIM_ICPolarity_Rising, + .TIM_ICSelection = TIM_ICSelection_DirectTI, + .TIM_ICPrescaler = TIM_ICPSC_DIV1, + .TIM_ICFilter = 0x0, + }, + .channels = &pios_tim_rcvrport_all_channels[1], + .num_channels = NELEMENTS(pios_tim_rcvrport_all_channels) - 1, +}; + #endif /* @@ -1437,7 +1590,7 @@ static const struct pios_ppm_cfg pios_ppm_cfg = { .TIM_ICSelection = TIM_ICSelection_DirectTI, .TIM_ICPrescaler = TIM_ICPSC_DIV1, .TIM_ICFilter = 0x0, - .TIM_Channel = TIM_Channel_2, + .TIM_Channel = TIM_Channel_1, }, /* Use only the first channel for ppm */ .channels = &pios_tim_rcvrport_all_channels[0],