board.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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_EnableAPBClock(SIM_RST_G0_GPIO_MASK);
  111. GPIO_SetOutput(SIM_RST_G0_GPIO, SIM_RST_G0_BITS);
  112. GPIO_SetHigh(SIM_RST_G0_GPIO, SIM_RST_G0_BITS);
  113. SYS_EnableAPBClock(SIM_RST_G1_GPIO_MASK);
  114. GPIO_SetOutput(SIM_RST_G1_GPIO, SIM_RST_G1_BITS);
  115. GPIO_SetHigh(SIM_RST_G1_GPIO, SIM_RST_G1_BITS);
  116. SYS_EnableAPBClock(LED_GPIO_MASK);
  117. GPIO_SetOutput(LED_GPIO, LED_GPIO_BITS);
  118. GPIO_SetHigh(LED_GPIO, LED_GPIO_BITS);
  119. SYS_EnableAPBClock(IOEX_I2C_GPIO_MASK);
  120. GPIO_SetOutput(IOEX_I2C_GPIO, IOEX_I2C_SCL_BIT);
  121. GPIO_SetHigh(IOEX_I2C_GPIO, IOEX_I2C_SCL_BIT);
  122. GPIO_SetInput(IOEX_I2C_GPIO, IOEX_I2C_SDA_BIT);
  123. SYS_EnableAPBClock(SIM_TXEN_GPIO_MASK);
  124. GPIO_SetOutput(SIM_TXEN_GPIO, SIM_12_TXEN_BIT|SIM_13_TXEN_BIT|SIM_14_TXEN_BIT);
  125. GPIO_SetInput(SIM_TXEN_GPIO, SIM_15_TXEN_BIT); // IO口状态。Input:MCU'u0 日志输出,Output:SIM15.默认日志口。
  126. GPIO_SetLow(SIM_TXEN_GPIO, SIM_TXEN_BITS); // 低电平=接收,高电平=发送.默认输入。
  127. SYS_EnableAPBClock(EEPROM_GPIO_MASK);
  128. GPIO_SetOutput(EEPROM_GPIO, EEPROM_BITS);
  129. GPIO_SetHigh(EEPROM_GPIO, EEPROM_BITS);
  130. SYS_EnableAPBClock(SIM_VCC_EN_GPIO_MASK);
  131. GPIO_SetOutput(SIM_VCC_EN_GPIO, SIM_VCC_EN_BIT);
  132. GPIO_SetHigh(SIM_VCC_EN_GPIO, SIM_VCC_EN_BIT);
  133. SYS_EnableAPBClock(WIFI_OUT_GPIO_MASK);
  134. GPIO_SetOutput(WIFI_OUT_GPIO, WIFI_OUT_BITS);
  135. GPIO_SetLow(WIFI_OUT_GPIO, WIFI_OUT_BITS);
  136. UTIL_IdleMs(50);
  137. GPIO_SetHigh(WIFI_OUT_GPIO, WIFI_OUT_BITS);
  138. SYS_EnableAPBClock(NE2_OUT_GPIO_MASK);
  139. GPIO_SetOutput(NE2_OUT_GPIO, NE2_OUT_BITS);
  140. GPIO_SetHigh(NE2_OUT_GPIO, NE2_OUT_BITS);
  141. // SYS_EnableAPBClock(IOINT_GPIO_MASK);
  142. // GPIO_SetInput(IOINT_GPIO, IOINT_BITS);
  143. // GPIO_IntConfig(IOINT_GPIO, IOINT_BITS, GPIO_INTMODE_FALLEDGE);
  144. // INT_EnableIRQ(IOINT_GPIO_IRQ, PLIC_MAX_PRIORITY);
  145. SYS_EnableAPBClock(IOINT_GPIO_MASK);
  146. GPIO_SetInput(IOINT_GPIO, IOINT_BITS);
  147. GPIO_IntConfig(IOINT_GPIO, IOINT_BITS, GPIO_INTMODE_BOTHEDGE);
  148. GPIO_EnableInt(IOINT_GPIO, IOINT_BITS);
  149. INT_EnableIRQ(IOINT_GPIO_IRQ, PLIC_MAX_PRIORITY);
  150. /*
  151. SYS_EnableAPBClock(SIM_IO_INT_G0_GPIO_MASK);
  152. GPIO_SetInput(SIM_IO_INT_G0_GPIO, SIM_IO_INT_G0_BITS);
  153. GPIO_IntConfig(IOINT_GPIO, SIM_IO_INT_G0_BITS, GPIO_INTMODE_HIGHLEVEL);
  154. GPIO_EnableInt(SIM_IO_INT_G0_GPIO, PLIC_MAX_PRIORITY);
  155. INT_EnableIRQ(SIM_IO_INT_G0_GPIO_IRQ, PLIC_MAX_PRIORITY);
  156. SYS_EnableAPBClock(SIM_IO_INT_G1_GPIO_MASK);
  157. GPIO_SetInput(SIM_IO_INT_G1_GPIO, SIM_IO_INT_G1_BITS);
  158. GPIO_IntConfig(SIM_IO_INT_G1_GPIO, SIM_IO_INT_G1_BITS, GPIO_INTMODE_HIGHLEVEL);
  159. GPIO_EnableInt(SIM_IO_INT_G1_GPIO, PLIC_MAX_PRIORITY);
  160. INT_EnableIRQ(SIM_IO_INT_G1_GPIO_IRQ, PLIC_MAX_PRIORITY);
  161. */
  162. #ifdef LOGGER_UART
  163. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTRXD));
  164. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTTXD));
  165. MSG_UART = UARTx(LOGGER_UART);
  166. SYS_EnableAPBClock(APB_MASK_UARTx(LOGGER_UART));
  167. UART_Init(UARTx(LOGGER_UART), BAUD_RATE, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_16);
  168. #endif
  169. board_init_mac();
  170. dbg_printf("\nInit done. CLK: %.3fMHz, RTC: %dHz\n", SYS_GetSysClkFreq()/(double)1e6, BOARD_RTC_FREQUENCY);
  171. }
  172. void board_led_write(bool state)
  173. {
  174. GPIO_SetValue(LED_GPIO, LED_GPIO_BITS, state ? LED_GPIO_BITS : 0);
  175. }
  176. uint32_t board_button_read(void)
  177. {
  178. return GPIO_GetValue(IOINT_GPIO, IOINT_BUT_INT_BIT);
  179. }
  180. int board_uart_read(uint8_t *buf, int len)
  181. {
  182. (void) buf; (void) len;
  183. return 0;
  184. }
  185. int board_uart_write(void const *buf, int len)
  186. {
  187. UART_Send(UART0, (const unsigned char *)buf, len);
  188. return len;
  189. }
  190. uint32_t board_millis(void)
  191. {
  192. return UTIL_GetTick();
  193. }