diff --git a/workspace/TS100/Core/BSP/Pine64/BSP_PD.c b/workspace/TS100/Core/BSP/Pine64/BSP_PD.c index 0b3c2af9..7796ed51 100644 --- a/workspace/TS100/Core/BSP/Pine64/BSP_PD.c +++ b/workspace/TS100/Core/BSP/Pine64/BSP_PD.c @@ -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 diff --git a/workspace/TS100/Core/BSP/Pine64/IRQ.cpp b/workspace/TS100/Core/BSP/Pine64/IRQ.cpp index eb2c8885..380f51e6 100644 --- a/workspace/TS100/Core/BSP/Pine64/IRQ.cpp +++ b/workspace/TS100/Core/BSP/Pine64/IRQ.cpp @@ -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 +} diff --git a/workspace/TS100/Core/BSP/Pine64/IRQ.h b/workspace/TS100/Core/BSP/Pine64/IRQ.h index 8c6c7325..f1490828 100644 --- a/workspace/TS100/Core/BSP/Pine64/IRQ.h +++ b/workspace/TS100/Core/BSP/Pine64/IRQ.h @@ -19,6 +19,7 @@ extern "C" { #endif void ADC0_1_IRQHandler(void); void TIMER1_IRQHandler(void); +void EXTI5_9_IRQHandler(void); #ifdef __cplusplus } #endif diff --git a/workspace/TS100/Core/BSP/Pine64/Pins.h b/workspace/TS100/Core/BSP/Pine64/Pins.h index 371675da..42cae4c3 100644 --- a/workspace/TS100/Core/BSP/Pine64/Pins.h +++ b/workspace/TS100/Core/BSP/Pine64/Pins.h @@ -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_ */ diff --git a/workspace/TS100/Core/BSP/Pine64/Setup.c b/workspace/TS100/Core/BSP/Pine64/Setup.c index a7763dbf..f202d302 100644 --- a/workspace/TS100/Core/BSP/Pine64/Setup.c +++ b/workspace/TS100/Core/BSP/Pine64/Setup.c @@ -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); diff --git a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp index addd92e3..9250b4a0 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp @@ -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); + } } }