#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(); }