amiro-os / boards / LightRing / board.c @ 58fe0e0b
History | View | Annotate | Download (1.962 KB)
| 1 | 58fe0e0b | Thomas Schöpping | #include "ch.h" |
|---|---|---|---|
| 2 | #include "hal.h" |
||
| 3 | |||
| 4 | /**
|
||
| 5 | * @brief PAL setup.
|
||
| 6 | * @details Digital I/O ports static configuration as defined in @p board.h.
|
||
| 7 | * This variable is used by the HAL when initializing the PAL driver.
|
||
| 8 | */
|
||
| 9 | #if HAL_USE_PAL || defined(__DOXYGEN__)
|
||
| 10 | const PALConfig pal_default_config =
|
||
| 11 | {
|
||
| 12 | {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH},
|
||
| 13 | {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH},
|
||
| 14 | {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH},
|
||
| 15 | {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH},
|
||
| 16 | {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH},
|
||
| 17 | {VAL_GPIOFODR, VAL_GPIOFCRL, VAL_GPIOFCRH},
|
||
| 18 | {VAL_GPIOGODR, VAL_GPIOGCRL, VAL_GPIOGCRH},
|
||
| 19 | }; |
||
| 20 | |||
| 21 | #endif
|
||
| 22 | |||
| 23 | /*
|
||
| 24 | * Early initialization code.
|
||
| 25 | * This initialization must be performed just after stack setup and before
|
||
| 26 | * any other initialization.
|
||
| 27 | */
|
||
| 28 | void __early_init(void) { |
||
| 29 | |||
| 30 | stm32_clock_init(); |
||
| 31 | } |
||
| 32 | |||
| 33 | /*
|
||
| 34 | * Board-specific initialization code.
|
||
| 35 | */
|
||
| 36 | void boardInit(void) { |
||
| 37 | /*
|
||
| 38 | * Several I/O pins are re-mapped:
|
||
| 39 | * JTAG disabled and SWD enabled
|
||
| 40 | */
|
||
| 41 | AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE | |
||
| 42 | AFIO_MAPR_USART3_REMAP_PARTIALREMAP; |
||
| 43 | } |
||
| 44 | |||
| 45 | inline void boardRequestShutdown(void) |
||
| 46 | {
|
||
| 47 | palClearPad(GPIOC, GPIOC_SYS_PD_N); |
||
| 48 | } |
||
| 49 | |||
| 50 | inline void boardStandby(void) |
||
| 51 | {
|
||
| 52 | |||
| 53 | palSetPad(GPIOC, GPIOC_SYS_PD_N); |
||
| 54 | chSysLock(); |
||
| 55 | // Standby
|
||
| 56 | // set deepsleep bit
|
||
| 57 | SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; |
||
| 58 | // set PDDS, clear WUF, clear SBF
|
||
| 59 | PWR->CR |= (PWR_CR_CWUF | PWR_CR_PDDS | PWR_CR_CSBF); |
||
| 60 | // clear RTC wakeup source flags
|
||
| 61 | RTC->CRL &= ~(RTC_CRL_ALRF); |
||
| 62 | // Wait for Interrupt
|
||
| 63 | __WFI(); |
||
| 64 | |||
| 65 | } |
||
| 66 | |||
| 67 | inline void boardClearI2CBus(const uint8_t scl_pad) { |
||
| 68 | |||
| 69 | uint8_t i; |
||
| 70 | |||
| 71 | // configure I²C SCL open drain
|
||
| 72 | palSetPadMode(GPIOB, scl_pad, PAL_MODE_OUTPUT_OPENDRAIN); |
||
| 73 | |||
| 74 | // perform bus clear as per I²C Specification v5 3.1.16
|
||
| 75 | for (i = 0x00u; i < 0x09u; i++) { |
||
| 76 | palClearPad(GPIOB, scl_pad); |
||
| 77 | chThdSleepMicroseconds(5);
|
||
| 78 | palSetPad(GPIOB, scl_pad); |
||
| 79 | chThdSleepMicroseconds(5);
|
||
| 80 | } |
||
| 81 | |||
| 82 | // reconfigure I²C SCL
|
||
| 83 | palSetPadMode(GPIOB, scl_pad, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); |
||
| 84 | |||
| 85 | } |