Statistics
| Branch: | Tag: | Revision:

amiro-os / boards / LightRing / board.c @ 58fe0e0b

History | View | Annotate | Download (1.96 KB)

1
#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
}