| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #include "board.h"
- __attribute__((weak))
- SYS_HSE_BypassTypeDef board_hse_source(void)
- {
- #ifdef BOARD_HSE_BYPASS
- return BOARD_HSE_BYPASS;
- #else
- return SYS_HSE_BYPASS_OFF;
- #endif
- }
- __attribute__((weak))
- RTC_ClkSourceTypeDef board_rtc_source(void)
- {
- #ifdef BOARD_RTC_SOURCE
- return BOARD_RTC_SOURCE;
- #else
- return RTC_CLK_SOURCE_LSE;
- #endif
- }
- uint32_t board_lse_freq(void)
- {
- #ifdef BOARD_LSE_FREQ
- return BOARD_LSE_FREQ;
- #else
- return 32768;
- #endif
- }
- uint32_t board_pll_clkin_freq(void)
- {
- #ifdef BOARD_PLL_CLKIN_FREQ
- return BOARD_PLL_CLKIN_FREQ;
- #else
- return SYS_GetHSEFreq();
- #endif
- }
- MAC_MediaInterfaceTypeDef board_mac_media(void)
- {
- #ifdef BOARD_MAC_MEDIA_INTERFACE
- return BOARD_MAC_MEDIA_INTERFACE;
- #else
- return MAC_MEDIA_INTERFACE_RMII;
- #endif
- }
- uint8_t board_mac_phy_addr(void)
- {
- // PHY address depends on how it is physically configured on board
- return 3;
- }
- #define RMII_CLK_DIR 0 // REF_CLK direction in RMII mode, 0: PHY to MAC, 1: MAC to PHY
- void board_init_mac(void)
- {
- }
- void board_init_phy(MAC_HandleTypeDef *hmac)
- {
- // RMII mode setting and clk direction. This can override the mode decided by RX_DV at power on
- MAC_MdioWrite(hmac, MAC_PHY_REG_PAGE, 7);
- uint16_t mdio = MAC_MdioRead(hmac, MAC_PHY_REG_RMSR);
- MODIFY_REG(mdio, MAC_PHY_RMSR_RMII_MODE, (hmac->Init.MediaInterface == MAC_MEDIA_INTERFACE_RMII) << MAC_PHY_RMSR_RMII_OFFSET);
- MODIFY_REG(mdio, MAC_PHY_RMSR_RMII_CLKDIR, RMII_CLK_DIR == 0 ? MAC_PHY_RMSR_RMII_CLK_OUT : MAC_PHY_RMSR_RMII_CLK_IN);
- MAC_MdioWrite(hmac, MAC_PHY_REG_RMSR, mdio);
- // Enable INTB for link change
- mdio = MAC_MdioRead(hmac, MAC_PHY_REG_IWL);
- MAC_MdioWrite(hmac, MAC_PHY_REG_IWL, mdio | MAC_PHY_IWL_INT_LINKCHG);
- MAC_MdioWrite(hmac, MAC_PHY_REG_PAGE, 0);
- dbg_printf("Mac media: %s\n", hmac->Init.MediaInterface == MAC_MEDIA_INTERFACE_MII ? "MII" : "RMII");
- dbg_printf("Mac macaddr: 0x%02x%04x\n", MAC0->MACMSB, MAC0->MACLSB);
- dbg_printf("Mac phyaddr: 0x%x\n", hmac->Init.PhyAddress);
- dbg_printf("Mac autoneg: 0x%x\n", hmac->Init.AutoNegotiation);
- dbg_printf("Mac interface: 0x%x\n", hmac->Init.MediaInterface);
- dbg_printf("Mac loopback: 0x%x\n", hmac->Init.LoopbackMode);
- dbg_printf("Mac mdcscaler: 0x%x\n", hmac->Init.MdcScaler);
- dbg_printf("Mac duplex: 0x%x\n", hmac->Init.DuplexMode);
- dbg_printf("Mac speed: 0x%x\n", hmac->Init.Speed);
- uint16_t mac_phy_stat = MAC_MdioRead(hmac, MAC_PHY_REG_STAT);
- dbg_printf("Mac phy autoneg done: %s, link status: %s\n",
- mac_phy_stat & MAC_PHY_STAT_AUTONEG_DONE ? "yes" : "no",
- mac_phy_stat & MAC_PHY_STAT_LINK_STATUS ? "yes" : "no");
- }
- __attribute__((weak)) uint32_t FCB_GetPLLFreq(uint32_t clkin_freq);
- __attribute__((weak)) void board_init(void)
- {
- PERIPHERAL_ENABLE(DMAC, 0);
- DMAC_Init();
- #ifdef AGM_LOGIC_EMBED_INC
- static __attribute__((section(".flash.logic"))) __attribute__((aligned(4))) const uint8_t logic_config[] = {
- #include AGM_LOGIC_EMBED_INC
- };
- PERIPHERAL_ENABLE(FCB, 0);
- if (sizeof(logic_config) < FCB_AUTO_WORDS * 4) {
- FCB_AutoDecompress((uint32_t)logic_config);
- } else {
- FCB_AutoConfigDma((uint32_t)logic_config, DMAC_CHANNEL0);
- }
- PERIPHERAL_DISABLE(FCB, 0);
- #endif
- if (FCB_GetPLLFreq) {
- uint32_t freq = BOARD_PLL_FREQUENCY;
- SYS_EnableAPBClock(APB_MASK_FCB0);
- if (FCB_IsActive()) {
- freq = FCB_GetPLLFreq(board_pll_clkin_freq());
- } else {
- FCB_Activate();
- }
- SYS_SetPLLFreq(freq);
- }
- SYS_SwitchPLLClock(board_hse_source());
- INT_Init(); // This will disabe all interrupts. INT_EnableIRQ should be called after this to enable any external interrupt.
- INT_EnableIntGlobal();
- INT_EnableIntExternal();
-
- SYS_EnableAPBClock(SIM_RST_G0_GPIO_MASK);
- GPIO_SetOutput(SIM_RST_G0_GPIO, SIM_RST_G0_BITS);
- GPIO_SetHigh(SIM_RST_G0_GPIO, SIM_RST_G0_BITS);
- SYS_EnableAPBClock(SIM_RST_G1_GPIO_MASK);
- GPIO_SetOutput(SIM_RST_G1_GPIO, SIM_RST_G1_BITS);
- GPIO_SetHigh(SIM_RST_G1_GPIO, SIM_RST_G1_BITS);
- SYS_EnableAPBClock(LED_GPIO_MASK);
- GPIO_SetOutput(LED_GPIO, LED_GPIO_BITS);
- GPIO_SetHigh(LED_GPIO, LED_GPIO_BITS);
- SYS_EnableAPBClock(IOEX_I2C_GPIO_MASK);
- GPIO_SetOutput(IOEX_I2C_GPIO, IOEX_I2C_SCL_BIT);
- GPIO_SetHigh(IOEX_I2C_GPIO, IOEX_I2C_SCL_BIT);
- GPIO_SetInput(IOEX_I2C_GPIO, IOEX_I2C_SDA_BIT);
- SYS_EnableAPBClock(SIM_TXEN_GPIO_MASK);
- GPIO_SetOutput(SIM_TXEN_GPIO, SIM_12_TXEN_BIT|SIM_13_TXEN_BIT|SIM_14_TXEN_BIT);
- GPIO_SetInput(SIM_TXEN_GPIO, SIM_15_TXEN_BIT); // IO口状态。Input:MCU'u0 日志输出,Output:SIM15.默认日志口。
- GPIO_SetLow(SIM_TXEN_GPIO, SIM_TXEN_BITS); // 低电平=接收,高电平=发送.默认输入。
- SYS_EnableAPBClock(EEPROM_GPIO_MASK);
- GPIO_SetOutput(EEPROM_GPIO, EEPROM_BITS);
- GPIO_SetHigh(EEPROM_GPIO, EEPROM_BITS);
- SYS_EnableAPBClock(SIM_VCC_EN_GPIO_MASK);
- GPIO_SetOutput(SIM_VCC_EN_GPIO, SIM_VCC_EN_BIT);
- GPIO_SetHigh(SIM_VCC_EN_GPIO, SIM_VCC_EN_BIT);
- SYS_EnableAPBClock(WIFI_OUT_GPIO_MASK);
- GPIO_SetOutput(WIFI_OUT_GPIO, WIFI_OUT_BITS);
- GPIO_SetLow(WIFI_OUT_GPIO, WIFI_OUT_BITS);
- UTIL_IdleMs(50);
- GPIO_SetHigh(WIFI_OUT_GPIO, WIFI_OUT_BITS);
- SYS_EnableAPBClock(NE2_OUT_GPIO_MASK);
- GPIO_SetOutput(NE2_OUT_GPIO, NE2_OUT_BITS);
- GPIO_SetHigh(NE2_OUT_GPIO, NE2_OUT_BITS);
- // SYS_EnableAPBClock(IOINT_GPIO_MASK);
- // GPIO_SetInput(IOINT_GPIO, IOINT_BITS);
- // GPIO_IntConfig(IOINT_GPIO, IOINT_BITS, GPIO_INTMODE_FALLEDGE);
- // INT_EnableIRQ(IOINT_GPIO_IRQ, PLIC_MAX_PRIORITY);
- SYS_EnableAPBClock(IOINT_GPIO_MASK);
- GPIO_SetInput(IOINT_GPIO, IOINT_BITS);
- GPIO_IntConfig(IOINT_GPIO, IOINT_BITS, GPIO_INTMODE_BOTHEDGE);
- GPIO_EnableInt(IOINT_GPIO, IOINT_BITS);
- INT_EnableIRQ(IOINT_GPIO_IRQ, PLIC_MAX_PRIORITY);
- /*
- SYS_EnableAPBClock(SIM_IO_INT_G0_GPIO_MASK);
- GPIO_SetInput(SIM_IO_INT_G0_GPIO, SIM_IO_INT_G0_BITS);
- GPIO_IntConfig(IOINT_GPIO, SIM_IO_INT_G0_BITS, GPIO_INTMODE_HIGHLEVEL);
- GPIO_EnableInt(SIM_IO_INT_G0_GPIO, PLIC_MAX_PRIORITY);
- INT_EnableIRQ(SIM_IO_INT_G0_GPIO_IRQ, PLIC_MAX_PRIORITY);
- SYS_EnableAPBClock(SIM_IO_INT_G1_GPIO_MASK);
- GPIO_SetInput(SIM_IO_INT_G1_GPIO, SIM_IO_INT_G1_BITS);
- GPIO_IntConfig(SIM_IO_INT_G1_GPIO, SIM_IO_INT_G1_BITS, GPIO_INTMODE_HIGHLEVEL);
- GPIO_EnableInt(SIM_IO_INT_G1_GPIO, PLIC_MAX_PRIORITY);
- INT_EnableIRQ(SIM_IO_INT_G1_GPIO_IRQ, PLIC_MAX_PRIORITY);
- */
- #ifdef LOGGER_UART
- GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTRXD));
- GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTTXD));
- MSG_UART = UARTx(LOGGER_UART);
- SYS_EnableAPBClock(APB_MASK_UARTx(LOGGER_UART));
- UART_Init(UARTx(LOGGER_UART), BAUD_RATE, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_16);
- #endif
- board_init_mac();
- dbg_printf("\nInit done. CLK: %.3fMHz, RTC: %dHz\n", SYS_GetSysClkFreq()/(double)1e6, BOARD_RTC_FREQUENCY);
- }
- void board_led_write(bool state)
- {
- GPIO_SetValue(LED_GPIO, LED_GPIO_BITS, state ? LED_GPIO_BITS : 0);
- }
- uint32_t board_button_read(void)
- {
- return GPIO_GetValue(IOINT_GPIO, IOINT_BUT_INT_BIT);
- }
- int board_uart_read(uint8_t *buf, int len)
- {
- (void) buf; (void) len;
- return 0;
- }
- int board_uart_write(void const *buf, int len)
- {
- UART_Send(UART0, (const unsigned char *)buf, len);
- return len;
- }
- uint32_t board_millis(void)
- {
- return UTIL_GetTick();
- }
|