board.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "board.h"
  2. __attribute__((weak))
  3. SYS_HSE_BypassTypeDef board_hse_source(void)
  4. {
  5. #ifdef BOARD_HSE_BYPASS
  6. return BOARD_HSE_BYPASS;
  7. #else
  8. return SYS_HSE_BYPASS_OFF;
  9. #endif
  10. }
  11. __attribute__((weak))
  12. RTC_ClkSourceTypeDef board_rtc_source(void)
  13. {
  14. #ifdef BOARD_RTC_SOURCE
  15. return BOARD_RTC_SOURCE;
  16. #else
  17. return RTC_CLK_SOURCE_LSE;
  18. #endif
  19. }
  20. uint32_t board_lse_freq(void)
  21. {
  22. #ifdef BOARD_LSE_FREQ
  23. return BOARD_LSE_FREQ;
  24. #else
  25. return 32768;
  26. #endif
  27. }
  28. uint32_t board_pll_clkin_freq(void)
  29. {
  30. #ifdef BOARD_PLL_CLKIN_FREQ
  31. return BOARD_PLL_CLKIN_FREQ;
  32. #else
  33. return SYS_GetHSEFreq();
  34. #endif
  35. }
  36. MAC_MediaInterfaceTypeDef board_mac_media(void)
  37. {
  38. #ifdef BOARD_MAC_MEDIA_INTERFACE
  39. return BOARD_MAC_MEDIA_INTERFACE;
  40. #else
  41. return MAC_MEDIA_INTERFACE_RMII;
  42. #endif
  43. }
  44. uint8_t board_mac_phy_addr(void)
  45. {
  46. // PHY address depends on how it is physically configured on board
  47. return 3;
  48. }
  49. #define RMII_CLK_DIR 0 // REF_CLK direction in RMII mode, 0: PHY to MAC, 1: MAC to PHY
  50. void board_init_mac(void)
  51. {
  52. }
  53. void board_init_phy(MAC_HandleTypeDef *hmac)
  54. {
  55. // RMII mode setting and clk direction. This can override the mode decided by RX_DV at power on
  56. MAC_MdioWrite(hmac, MAC_PHY_REG_PAGE, 7);
  57. uint16_t mdio = MAC_MdioRead(hmac, MAC_PHY_REG_RMSR);
  58. MODIFY_REG(mdio, MAC_PHY_RMSR_RMII_MODE, (hmac->Init.MediaInterface == MAC_MEDIA_INTERFACE_RMII) << MAC_PHY_RMSR_RMII_OFFSET);
  59. MODIFY_REG(mdio, MAC_PHY_RMSR_RMII_CLKDIR, RMII_CLK_DIR == 0 ? MAC_PHY_RMSR_RMII_CLK_OUT : MAC_PHY_RMSR_RMII_CLK_IN);
  60. MAC_MdioWrite(hmac, MAC_PHY_REG_RMSR, mdio);
  61. // Enable INTB for link change
  62. mdio = MAC_MdioRead(hmac, MAC_PHY_REG_IWL);
  63. MAC_MdioWrite(hmac, MAC_PHY_REG_IWL, mdio | MAC_PHY_IWL_INT_LINKCHG);
  64. MAC_MdioWrite(hmac, MAC_PHY_REG_PAGE, 0);
  65. dbg_printf("Mac media: %s\n", hmac->Init.MediaInterface == MAC_MEDIA_INTERFACE_MII ? "MII" : "RMII");
  66. dbg_printf("Mac macaddr: 0x%02x%04x\n", MAC0->MACMSB, MAC0->MACLSB);
  67. dbg_printf("Mac phyaddr: 0x%x\n", hmac->Init.PhyAddress);
  68. dbg_printf("Mac autoneg: 0x%x\n", hmac->Init.AutoNegotiation);
  69. dbg_printf("Mac interface: 0x%x\n", hmac->Init.MediaInterface);
  70. dbg_printf("Mac loopback: 0x%x\n", hmac->Init.LoopbackMode);
  71. dbg_printf("Mac mdcscaler: 0x%x\n", hmac->Init.MdcScaler);
  72. dbg_printf("Mac duplex: 0x%x\n", hmac->Init.DuplexMode);
  73. dbg_printf("Mac speed: 0x%x\n", hmac->Init.Speed);
  74. uint16_t mac_phy_stat = MAC_MdioRead(hmac, MAC_PHY_REG_STAT);
  75. dbg_printf("Mac phy autoneg done: %s, link status: %s\n",
  76. mac_phy_stat & MAC_PHY_STAT_AUTONEG_DONE ? "yes" : "no",
  77. mac_phy_stat & MAC_PHY_STAT_LINK_STATUS ? "yes" : "no");
  78. }
  79. __attribute__((weak)) uint32_t FCB_GetPLLFreq(uint32_t clkin_freq);
  80. __attribute__((weak)) void board_init(void)
  81. {
  82. PERIPHERAL_ENABLE(DMAC, 0);
  83. DMAC_Init();
  84. #ifdef AGM_LOGIC_EMBED_INC
  85. static __attribute__((section(".flash.logic"))) __attribute__((aligned(4))) const uint8_t logic_config[] = {
  86. #include AGM_LOGIC_EMBED_INC
  87. };
  88. PERIPHERAL_ENABLE(FCB, 0);
  89. if (sizeof(logic_config) < FCB_AUTO_WORDS * 4) {
  90. FCB_AutoDecompress((uint32_t)logic_config);
  91. } else {
  92. FCB_AutoConfigDma((uint32_t)logic_config, DMAC_CHANNEL0);
  93. }
  94. PERIPHERAL_DISABLE(FCB, 0);
  95. #endif
  96. if (FCB_GetPLLFreq) {
  97. uint32_t freq = BOARD_PLL_FREQUENCY;
  98. SYS_EnableAPBClock(APB_MASK_FCB0);
  99. if (FCB_IsActive()) {
  100. freq = FCB_GetPLLFreq(board_pll_clkin_freq());
  101. } else {
  102. FCB_Activate();
  103. }
  104. SYS_SetPLLFreq(freq);
  105. }
  106. SYS_SwitchPLLClock(board_hse_source());
  107. INT_Init(); // This will disabe all interrupts. INT_EnableIRQ should be called after this to enable any external interrupt.
  108. INT_EnableIntGlobal();
  109. INT_EnableIntExternal();
  110. SYS_DisableJTDI();
  111. SYS_DisableJTDO();
  112. SYS_DisableNJTRST();
  113. // Enable LED_GPIO and EXT_GPIO to drive LED's on board
  114. SYS_EnableAPBClock(LED_GPIO_MASK);
  115. GPIO_SetOutput(LED_GPIO, LED_GPIO_BITS);
  116. GPIO_SetHigh(LED_GPIO, LED_GPIO_BITS);
  117. SYS_EnableAPBClock(EXT_GPIO_MASK);
  118. GPIO_SetOutput(EXT_GPIO, EXT_GPIO_BITS);
  119. GPIO_SetHigh(EXT_GPIO, EXT_GPIO_BITS);
  120. // Enable BUT_GPIO to make buttons on board to trigger interrupts
  121. SYS_EnableAPBClock(BUT_GPIO_MASK);
  122. GPIO_SetInput(BUT_GPIO, BUT_GPIO_BITS);
  123. GPIO_EnableInt(BUT_GPIO, BUT_GPIO_BITS);
  124. GPIO_IntConfig(BUT_GPIO, BUT_GPIO_BITS, GPIO_INTMODE_FALLEDGE);
  125. #ifdef LOGGER_UART
  126. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTRXD));
  127. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTTXD));
  128. MSG_UART = UARTx(LOGGER_UART);
  129. SYS_EnableAPBClock(APB_MASK_UARTx(LOGGER_UART));//BAUD_RATE
  130. UART_Init(UARTx(LOGGER_UART), 921600, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_16);
  131. #endif
  132. board_init_mac();
  133. dbg_printf("\nInit done. CLK: %.3fMHz, RTC: %dHz\n", SYS_GetSysClkFreq()/(double)1e6, BOARD_RTC_FREQUENCY);
  134. }
  135. void board_led_write(bool state)
  136. {
  137. GPIO_SetValue(LED_GPIO, LED_GPIO_BITS, state ? LED_GPIO_BITS : 0);
  138. }
  139. uint32_t board_button_read(void)
  140. {
  141. return GPIO_GetValue(BUT_GPIO, BUT_GPIO_BITS);
  142. }
  143. int board_uart_read(uint8_t *buf, int len)
  144. {
  145. (void) buf; (void) len;
  146. return 0;
  147. }
  148. int board_uart_write(void const *buf, int len)
  149. {
  150. UART_Send(UART0, (const unsigned char *)buf, len);
  151. return len;
  152. }
  153. uint32_t board_millis(void)
  154. {
  155. return UTIL_GetTick();
  156. }