mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Fix PD IRQ
This commit is contained in:
@@ -13,10 +13,13 @@
|
||||
*/
|
||||
const uint16_t USB_PD_Desired_Levels[] = {
|
||||
//mV desired input, mA minimum required current
|
||||
12000, 2400, //12V @ 2.4A
|
||||
9000, 2000, //9V @ 2A
|
||||
//Tip is ~ 7.5 ohms
|
||||
20000, 2666, // 20V, 2.6A
|
||||
15000, 2000, // 15V 2A
|
||||
12000, 1600, //12V @ 1.6A
|
||||
9000, 1200, //9V @ 1.2A
|
||||
5000, 100, //5V @ whatever
|
||||
|
||||
};
|
||||
const uint8_t USB_PD_Desired_Levels_Len = 3;
|
||||
const uint8_t USB_PD_Desired_Levels_Len = 5;
|
||||
#endif
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
*/
|
||||
|
||||
#include "IRQ.h"
|
||||
|
||||
#include "Pins.h"
|
||||
#include "int_n.h"
|
||||
void ADC0_1_IRQHandler(void) {
|
||||
|
||||
adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
|
||||
@@ -51,3 +52,17 @@ void setTipPWM(uint8_t pulse) {
|
||||
|
||||
pendingPWM = pulse;
|
||||
}
|
||||
|
||||
|
||||
void EXTI5_9_IRQHandler(void)
|
||||
{
|
||||
#ifdef POW_PD
|
||||
if (RESET != exti_interrupt_flag_get(EXTI_5)){
|
||||
exti_interrupt_flag_clear(EXTI_5);
|
||||
|
||||
if(RESET == gpio_input_bit_get(FUSB302_IRQ_GPIO_Port, FUSB302_IRQ_Pin)){
|
||||
InterruptHandler::irqCallback();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ extern "C" {
|
||||
#endif
|
||||
void ADC0_1_IRQHandler(void);
|
||||
void TIMER1_IRQHandler(void);
|
||||
void EXTI5_9_IRQHandler(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -35,4 +35,7 @@
|
||||
#define SDA_Pin BIT(7)
|
||||
#define SDA_GPIO_Port GPIOB
|
||||
|
||||
#define FUSB302_IRQ_Pin BIT(5)
|
||||
#define FUSB302_IRQ_GPIO_Port GPIOB
|
||||
|
||||
#endif /* BSP_MINIWARE_PINS_H_ */
|
||||
|
||||
@@ -35,11 +35,12 @@ void hardware_init() {
|
||||
//Timers
|
||||
setup_timers();
|
||||
//Watchdog
|
||||
// setup_iwdg();
|
||||
setup_iwdg();
|
||||
|
||||
/* enable TIMER1 - PWM control timing*/
|
||||
timer_enable(TIMER1);
|
||||
timer_enable(TIMER2);
|
||||
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL4_PRIO0);
|
||||
eclic_global_interrupt_enable();
|
||||
}
|
||||
// channel 0 -> temperature sensor, 1-> VIN
|
||||
@@ -64,8 +65,8 @@ void setup_gpio() {
|
||||
gpio_init(OLED_RESET_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,
|
||||
OLED_RESET_Pin);
|
||||
//I2C as AF Open Drain
|
||||
gpio_init(SDA_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_2MHZ, SDA_Pin);
|
||||
gpio_init(SCL_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_2MHZ, SCL_Pin);
|
||||
gpio_init(SDA_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SDA_Pin);
|
||||
gpio_init(SCL_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SCL_Pin);
|
||||
//PWM output as AF Push Pull
|
||||
gpio_init(PWM_Out_GPIO_Port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ,
|
||||
PWM_Out_Pin);
|
||||
@@ -78,6 +79,16 @@ void setup_gpio() {
|
||||
|
||||
//Remap PB4 away from JTAG NJRST
|
||||
gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);
|
||||
//Setup IRQ for USB-PD
|
||||
gpio_init(FUSB302_IRQ_GPIO_Port, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, FUSB302_IRQ_Pin);
|
||||
eclic_irq_enable(EXTI5_9_IRQn, 1, 1);
|
||||
/* connect key EXTI line to key GPIO pin */
|
||||
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_5);
|
||||
|
||||
/* configure key EXTI line */
|
||||
exti_init(EXTI_5, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
|
||||
exti_interrupt_flag_clear(EXTI_5);
|
||||
|
||||
//TODO - rest of pins as floating
|
||||
}
|
||||
void setup_dma() {
|
||||
@@ -114,7 +125,7 @@ void setup_i2c() {
|
||||
//TODO - DMA
|
||||
/* enable I2C0 clock */
|
||||
rcu_periph_clock_enable(RCU_I2C0);
|
||||
//Setup I20 at 100kHz with DMA?
|
||||
//Setup I20 at 400kHz
|
||||
i2c_clock_config(I2C0, 100 * 1000, I2C_DTCY_16_9);
|
||||
i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0x00);
|
||||
i2c_enable(I2C0);
|
||||
@@ -189,8 +200,8 @@ void setup_adc() {
|
||||
adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
|
||||
adc_interrupt_enable(ADC0, ADC_INT_EOIC);
|
||||
eclic_irq_enable(ADC0_1_IRQn, 2, 0);
|
||||
// adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
|
||||
// adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL);
|
||||
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
|
||||
adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL);
|
||||
adc_tempsensor_vrefint_disable();
|
||||
}
|
||||
void setup_timers() {
|
||||
@@ -266,7 +277,6 @@ void setup_timers() {
|
||||
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
|
||||
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
|
||||
timer_channel_output_config(TIMER2, TIMER_CH_0, &timer_ocintpara);
|
||||
//todo
|
||||
timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 50);
|
||||
timer_channel_output_mode_config(TIMER2, TIMER_CH_0,
|
||||
TIMER_OC_MODE_PWM0);
|
||||
|
||||
@@ -70,9 +70,11 @@ void InterruptHandler::Thread(const void *arg) {
|
||||
}
|
||||
}
|
||||
void InterruptHandler::irqCallback() {
|
||||
if (TaskHandle != NULL) {
|
||||
BaseType_t taskWoke = pdFALSE;
|
||||
xTaskNotifyFromISR(TaskHandle, 0x01, eNotifyAction::eSetBits, &taskWoke);
|
||||
portYIELD_FROM_ISR(taskWoke);
|
||||
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
|
||||
if (TaskHandle != NULL) {
|
||||
BaseType_t taskWoke = pdFALSE;
|
||||
xTaskNotifyFromISR(TaskHandle, 0x01, eNotifyAction::eSetBits, &taskWoke);
|
||||
portYIELD_FROM_ISR(taskWoke);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user