Skip to content

Commit

Permalink
Fix PD IRQ
Browse files Browse the repository at this point in the history
  • Loading branch information
Ralim committed Sep 20, 2020
1 parent 470cae2 commit 60e3616
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 15 deletions.
9 changes: 6 additions & 3 deletions workspace/TS100/Core/BSP/Pine64/BSP_PD.c
Expand Up @@ -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
17 changes: 16 additions & 1 deletion workspace/TS100/Core/BSP/Pine64/IRQ.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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
}
1 change: 1 addition & 0 deletions workspace/TS100/Core/BSP/Pine64/IRQ.h
Expand Up @@ -19,6 +19,7 @@ extern "C" {
#endif
void ADC0_1_IRQHandler(void);
void TIMER1_IRQHandler(void);
void EXTI5_9_IRQHandler(void);
#ifdef __cplusplus
}
#endif
Expand Down
3 changes: 3 additions & 0 deletions workspace/TS100/Core/BSP/Pine64/Pins.h
Expand Up @@ -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_ */
24 changes: 17 additions & 7 deletions workspace/TS100/Core/BSP/Pine64/Setup.c
Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -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() {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 6 additions & 4 deletions workspace/TS100/Core/Drivers/FUSB302/int_n.cpp
Expand Up @@ -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);
}
}
}

0 comments on commit 60e3616

Please sign in to comment.