summaryrefslogtreecommitdiff
path: root/board/zinger/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/zinger/board.c')
-rw-r--r--board/zinger/board.c197
1 files changed, 12 insertions, 185 deletions
diff --git a/board/zinger/board.c b/board/zinger/board.c
index f48979dbd0..9a830e7e14 100644
--- a/board/zinger/board.c
+++ b/board/zinger/board.c
@@ -6,205 +6,32 @@
#include "common.h"
#include "debug.h"
+#include "irq_handler.h"
#include "registers.h"
-#include "timer.h"
+#include "usb_pd.h"
#include "util.h"
-static void clock_init(void)
-{
- /* put 1 Wait-State for flash access to ensure proper reads at 48Mhz */
- STM32_FLASH_ACR = 0x1001; /* 1 WS / Prefetch enabled */
-
- /* Ensure that HSI8 is ON */
- if (!(STM32_RCC_CR & (1 << 1))) {
- /* Enable HSI */
- STM32_RCC_CR |= 1 << 0;
- /* Wait for HSI to be ready */
- while (!(STM32_RCC_CR & (1 << 1)))
- ;
- }
- /* PLLSRC = HSI, PLLMUL = x12 (x HSI/2) = 48Mhz */
- STM32_RCC_CFGR = 0x00288000;
- /* Enable PLL */
- STM32_RCC_CR |= 1 << 24;
- /* Wait for PLL to be ready */
- while (!(STM32_RCC_CR & (1 << 25)))
- ;
-
- /* switch SYSCLK to PLL */
- STM32_RCC_CFGR = 0x00288002;
- /* wait until the PLL is the clock source */
- while ((STM32_RCC_CFGR & 0xc) != 0x8)
- ;
-}
-
-static void power_init(void)
-{
- /* enable SYSCFG, COMP, ADC, SPI1, USART1, TIM17 */
- STM32_RCC_APB2ENR = 0x00045201;
- /* enable TIM2, TIM14, PWR */
- STM32_RCC_APB1ENR = 0x10000101;
- /* enable DMA, SRAM, CRC, GPA, GPB, GPC, GPF */
- STM32_RCC_AHBENR = 0x4e0045;
- /* TODO: remove GPC on real board */
-}
-
-/* GPIO setting helpers */
-#define OUT(n) (1 << ((n) * 2))
-#define AF(n) (2 << ((n) * 2))
-#define ANALOG(n) (3 << ((n) * 2))
-#define HIGH(n) (1 << (n))
-#define ODR(n) (1 << (n))
-#define HISPEED(n) (3 << ((n) * 2))
-#define AFx(n, x) (x << (((n) % 8) * 4))
-/* GPIO level setting helpers through BSRR register */
-#define GPIO_SET(n) (1 << (n))
-#define GPIO_RESET(n) (1 << ((n) + 16))
-
-static void pins_init(void)
-{
- /* Pin usage:
- * PA0 () : Wakeup on Vnc / Threshold
- * PA1 (ANALOG - ADC_IN1) : CC sense
- * PA2 (ANALOG - ADC_IN2) : Current sense
- * PA3 (ANALOG - ADC_IN3) : Voltage sense
- * PA4 (OUT - OD GPIO) : PD TX enable
- * PA5 (AF0 - SPI1_SCK) : TX clock in
- * PA6 (AF0 - SPI1_MISO) : PD TX
- * PA7 (AF5 - TIM17_CH1) : PD RX
- * PA9 (AF1 - UART1_TX) : [DEBUG] UART TX
- * PA10 (AF1 - UART1_RX) : [DEBUG] UART RX
- * PA13 (OUT - GPIO) : voltage select[0]
- * PA14 (OUT - GPIO) : voltage select[1]
- * PB1 (AF0 - TIM14_CH1) : TX clock out
- * PF0 (OUT - GPIO) : LM5050 FET driver off
- * PF1 (OUT - GPIO) : discharge FET
- */
- STM32_GPIO_ODR(GPIO_A) = HIGH(4) | HIGH(6);
- STM32_GPIO_AFRL(GPIO_A) = AFx(7, 5);
- STM32_GPIO_AFRH(GPIO_A) = AFx(9, 1) | AFx(10, 1);
- STM32_GPIO_OTYPER(GPIO_A) = ODR(4) | ODR(6);
- STM32_GPIO_OSPEEDR(GPIO_A) = HISPEED(5) | HISPEED(6) | HISPEED(7);
- STM32_GPIO_MODER(GPIO_A) = ANALOG(1) | ANALOG(2) | ANALOG(3) | OUT(4)
- | AF(5) /*| AF(6)*/ | AF(7) | AF(9) | AF(10)
- | OUT(13) | OUT(14);
- /* set PF0 / PF1 as output, PF0 is open-drain, high by default */
- STM32_GPIO_ODR(GPIO_F) = HIGH(0);
- STM32_GPIO_MODER(GPIO_F) = OUT(0) | OUT(1);
- STM32_GPIO_OTYPER(GPIO_F) = ODR(1);
-
- /* Set PB1 as AF0 (TIM14_CH1) */
- STM32_GPIO_OSPEEDR(GPIO_B) = HISPEED(1);
- STM32_GPIO_MODER(GPIO_B) = AF(1);
-
- /* --- dev board only --- */
- /*
- * Blue LED : PC8 (OUT)
- * Green LED : PC9 (OUT)
- */
- STM32_GPIO_ODR(GPIO_C) = HIGH(9);
- STM32_GPIO_MODER(GPIO_C) = OUT(8) | OUT(9);
-}
-
-
-static void uart_init(void)
-{
- /* set baudrate */
- STM32_USART_BRR(UARTN) =
- DIV_ROUND_NEAREST(CPU_CLOCK, CONFIG_UART_BAUD_RATE);
- /* UART enabled, 8 Data bits, oversampling x16, no parity */
- STM32_USART_CR1(UARTN) =
- STM32_USART_CR1_UE | STM32_USART_CR1_TE | STM32_USART_CR1_RE;
- /* 1 stop bit, no fancy stuff */
- STM32_USART_CR2(UARTN) = 0x0000;
- /* DMA disabled, special modes disabled, error interrupt disabled */
- STM32_USART_CR3(UARTN) = 0x0000;
-}
-
-static void timers_init(void)
-{
- /* TIM2 is a 32-bit free running counter with 1Mhz frequency */
- STM32_TIM_CR2(2) = 0x0000;
- STM32_TIM32_ARR(2) = 0xFFFFFFFF;
- STM32_TIM32_CNT(2) = 0;
- STM32_TIM_PSC(2) = CPU_CLOCK / 1000000 - 1;
- STM32_TIM_EGR(2) = 0x0001; /* Reload the pre-scaler */
- STM32_TIM_CR1(2) = 1;
-}
-
-timestamp_t get_time(void)
-{
- timestamp_t t;
-
- t.le.lo = STM32_TIM32_CNT(2);
- t.le.hi = 0;
- return t;
-}
-
-void udelay(unsigned us)
-{
- unsigned t0 = STM32_TIM32_CNT(2);
- while ((STM32_TIM32_CNT(2) - t0) < us)
- ;
-}
-
-static void hardware_init(void)
-{
- power_init();
- clock_init();
- pins_init();
- uart_init();
- timers_init();
-}
-
-/* ------------------------- Power supply control ------------------------ */
-
-/* Output voltage selection */
-enum volt {
- VO_5V = GPIO_RESET(13) | GPIO_RESET(14),
- VO_12V = GPIO_SET(13) | GPIO_RESET(14),
- VO_13V = GPIO_RESET(13) | GPIO_SET(14),
- VO_20V = GPIO_SET(13) | GPIO_SET(14),
-};
-
-static inline void set_output_voltage(enum volt v)
-{
- /* set voltage_select on PA13/PA14 */
- STM32_GPIO_BSRR(GPIO_A) = v;
-}
-
-static inline void output_enable(void)
-{
- /* GPF0 (FET driver shutdown) = 0 */
- STM32_GPIO_BSRR(GPIO_F) = GPIO_RESET(0);
-}
+extern void pd_rx_handler(void);
-static inline void output_disable(void)
+/* External interrupt EXTINT7 for external comparator on PA7 */
+void IRQ_HANDLER(STM32_IRQ_EXTI4_15)(void)
{
- /* GPF0 (FET driver shutdown) = 1 */
- STM32_GPIO_BSRR(GPIO_F) = GPIO_SET(0);
+ /* clear the interrupt */
+ STM32_EXTI_PR = STM32_EXTI_PR;
+ /* trigger reception handling */
+ pd_rx_handler();
}
-/* default forced output voltage */
-#define VO_DEFAULT VO_12V
+extern void pd_task(void);
int main(void)
{
hardware_init();
debug_printf("Power supply started ...\n");
- set_output_voltage(VO_DEFAULT);
- debug_printf("set output voltage : " STRINGIFY(VO_DEFAULT) "\n");
- output_enable();
+ /* background loop for PD events */
+ pd_task();
- while (1) {
- /* magic LED blinker on the test board */
- STM32_GPIO_BSRR(GPIO_C) = GPIO_SET(8);
- udelay(200000);
- STM32_GPIO_BSRR(GPIO_C) = GPIO_RESET(8);
- udelay(750000);
- debug_printf("%T ALIVE\n");
- }
while (1)
;
}