void HAL_ETH_MspInit( ETH_HandleTypeDef *heth ) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOs clocks */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); /* Ethernet pins configuration ************************************************/ /* RMII_REF_CLK ----------------------> PA1 RMII_MDIO -------------------------> PA2 RMII_MDC --------------------------> PC1 RMII_MII_CRS_DV -------------------> PA7 RMII_MII_RXD0 ---------------------> PC4 RMII_MII_RXD1 ---------------------> PC5 RMII_MII_RXER ---------------------> PG2 RMII_MII_TX_EN --------------------> uint32_t stm32f_ethernet_get_num_tx_msg(void) { return num_ethernet_tx_msg; }PG11 RMII_MII_TXD0 ---------------------> PG13 RMII_MII_TXD1 ---------------------> PG14 */ /* Configure PA1, PA2 and PA7 */ GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Alternate = GPIO_AF11_ETH; GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7; HAL_GPIO_Init( GPIOA, &GPIO_InitStructure ); /* Configure PC1, PC4 and PC5 */ GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5; HAL_GPIO_Init( GPIOC, &GPIO_InitStructure ); /* Configure PG2, PG11, PG13 and PG14 */ GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14; HAL_GPIO_Init( GPIOG, &GPIO_InitStructure ); // Install HAL Ethernet ISR rtems_interrupt_handler_install( ETH_IRQn, NULL, 0, stm32f_ethernet_isr, heth ); /* Enable ETHERNET clock */ __HAL_RCC_ETH_CLK_ENABLE(); }
/** * Override HAL Eth Init function */ void HAL_ETH_MspInit(ETH_HandleTypeDef* heth) { GPIO_InitTypeDef GPIO_InitStructure; if (heth->Instance == ETH) { /* Enable GPIOs clocks */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); /** ETH GPIO Configuration RMII_REF_CLK ----------------------> PA1 RMII_MDIO -------------------------> PA2 RMII_MDC --------------------------> PC1 RMII_MII_CRS_DV -------------------> PA7 RMII_MII_RXD0 ---------------------> PC4 RMII_MII_RXD1 ---------------------> PC5 RMII_MII_RXER ---------------------> PG2 RMII_MII_TX_EN --------------------> PG11 RMII_MII_TXD0 ---------------------> PG13 RMII_MII_TXD1 ---------------------> PB13 */ /* Configure PA1, PA2 and PA7 */ GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Alternate = GPIO_AF11_ETH; GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure PB13 */ GPIO_InitStructure.Pin = GPIO_PIN_13; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure PC1, PC4 and PC5 */ GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure PG2, PG11 and PG13 */ GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_11 | GPIO_PIN_13; HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); /* Enable the Ethernet global Interrupt */ HAL_NVIC_SetPriority(ETH_IRQn, 0x7, 0); HAL_NVIC_EnableIRQ(ETH_IRQn); /* Enable ETHERNET clock */ __HAL_RCC_ETH_CLK_ENABLE(); } }
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOs clocks */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); /* Ethernet pins configuration ************************************************/ /* ETH_MDIO -------------------------> PA2 ETH_MDC --------------------------> PC1 ETH_PPS_OUT ----------------------> PB5 ETH_MII_RXD2 ---------------------> PH6 ETH_MII_RXD3 ---------------------> PH7 ETH_MII_TX_CLK -------------------> PC3 ETH_MII_TXD2 ---------------------> PC2 ETH_MII_TXD3 ---------------------> PE2 (or PB8 if trace is enabled) ETH_MII_RX_CLK -------------------> PA1 ETH_MII_RX_DV --------------------> PA7 ETH_MII_RXD0 ---------------------> PC4 ETH_MII_RXD1 ---------------------> PC5 ETH_MII_TX_EN --------------------> PG11 ETH_MII_TXD0 ---------------------> PG13 ETH_MII_TXD1 ---------------------> PG14 ETH_MII_RX_ER --------------------> PI10 (not configured) ETH_MII_CRS ----------------------> PA0 (not configured) ETH_MII_COL ----------------------> PH3 (not configured) */ /* Configure PA1, PA2 and PA7 */ GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Alternate = GPIO_AF11_ETH; GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); /* Note : ETH_MDIO is connected to PA2 which is shared with other signals like SAI2_SCKB. By default on STM32756G-EVAL board, PA2 is connected to SAI2_SCKB, so to connect PA2 to ETH_MDIO : - unsolder bridge SB24 (SAI2_CKB) - solder bridge SB5 (ETH_MDIO) */ /* Configure PB5 */ GPIO_InitStructure.Pin = GPIO_PIN_5; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); /* If ETM interface is used then you can't use PE2 for * ETH_MII_TX3 because that must be used for TRACE_CLK */ #if TRACE_ENABLED /* Configure PB8 */ GPIO_InitStructure.Pin = GPIO_PIN_8; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); #else /* Configure PE2 */ GPIO_InitStructure.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); #endif /* Configure PC1, PC2, PC3, PC4 and PC5 */ GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); /* Note : ETH_MDC is connected to PC1 which is shared with other signals like SAI1_SDA. By default on STM32756G-EVAL board, PC1 is connected to SAI1_SDA, so to connect PC1 to ETH_MDC : - unsolder bridge SB22 (SAI1_SDA) - solder bridge SB33 (ETH_MDC) */ /* Configure PG11, PG14 and PG13 */ GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14; HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); /* Configure PH6, PH7 */ GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7; HAL_GPIO_Init(GPIOH, &GPIO_InitStructure); /* Configure PA0 GPIO_InitStructure.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); Note: Ethernet Full duplex mode works properly in the default setting (which MII_CRS is not connected to PA0 of STM32F756NGH6) because PA0 is shared with MC_ENA. If Half duplex mode is needed, uncomment PA0 configuration code source (above the note) and close the SB36 solder bridge of the STM32756G-EVAL board . */ /* Configure PH3 GPIO_InitStructure.Pin = GPIO_PIN_3; HAL_GPIO_Init(GPIOH, &GPIO_InitStructure); Note: Ethernet Full duplex mode works properly in the default setting (which MII_COL is not connected to PH3 of STM32F756NGH6) because PH3 is shared with SDRAM chip select SDNE0. If Half duplex mode is needed, uncomment PH3 configuration code source (above the note) and close SB47 solder bridge of the STM32756G-EVAL board. */ /* Configure PI10 GPIO_InitStructure.Pin = GPIO_PIN_10; HAL_GPIO_Init(GPIOI, &GPIO_InitStructure); Note: Ethernet works properly in the default setting (which RX_ER is not connected to PI10 of STM32F756NGH6) because PI10 is shared with data signal of SDRAM. If RX_ER signal is needed, uncomment PI10 configuration code source (above the note) then remove R248 and solder SB9 of the STM32756G-EVAL board. */ /* Explicitly configure PG6 and PA7 as inputs */ /* GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_INPUT; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7; HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); */ // Install HAL Ethernet ISR rtems_interrupt_handler_install( ETH_IRQn, NULL, 0, stm32f_ethernet_isr, heth ); /* Enable ETHERNET clock */ __HAL_RCC_ETH_CLK_ENABLE(); }
void stm32_flash_early_init(void) { /* Enable FLASH clock */ __HAL_RCC_ETH_CLK_ENABLE(); }
status_t eth_init(const uint8_t *mac_addr, eth_phy_itf eth_phy) { LTRACE_ENTRY; DEBUG_ASSERT(mac_addr); eth.eth_phy = eth_phy; /* Enable ETHERNET clock */ __HAL_RCC_ETH_CLK_ENABLE(); eth.EthHandle.Instance = ETH; eth.EthHandle.Init.MACAddr = (uint8_t *)mac_addr; eth.EthHandle.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE; eth.EthHandle.Init.Speed = ETH_SPEED_100M; eth.EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX; switch (eth_phy) { case PHY_DP83848: eth.EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_MII; eth.EthHandle.Init.PhyAddress = DP83848_PHY_ADDRESS; break; case PHY_LAN8742A: eth.EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII; eth.EthHandle.Init.PhyAddress = LAN8742A_PHY_ADDRESS; break; case PHY_KSZ8721: eth.EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII; eth.EthHandle.Init.PhyAddress = KSZ8721_PHY_ADDRESS; break; default: return ERR_NOT_CONFIGURED; } eth.EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE; //eth.EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; // XXX icmp checksums corrupted if stack stuff valid checksum eth.EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE; /* configure ethernet peripheral (GPIOs, clocks, MAC, DMA) */ if (HAL_ETH_Init(ð.EthHandle) != HAL_OK) return ERR_NOT_CONFIGURED; /* allocate descriptor and buffer memory from DTCM */ /* XXX do in a more generic way */ #if MEMBASE == 0x20000000 #error DTCM will collide with MEMBASE #endif addr_t tcm_ptr = RAMDTCM_BASE; eth.DMATxDscrTab = (void *)tcm_ptr; tcm_ptr += sizeof(*eth.DMATxDscrTab) * ETH_TXBUFNB; eth.DMARxDscrTab = (void *)tcm_ptr; tcm_ptr += sizeof(*eth.DMARxDscrTab) * ETH_RXBUFNB; eth.Tx_Buff = (void *)tcm_ptr; tcm_ptr += ETH_TX_BUF_SIZE * ETH_TXBUFNB; eth.Rx_Buff = (void *)tcm_ptr; tcm_ptr += ETH_RX_BUF_SIZE * ETH_RXBUFNB; /* Initialize Tx Descriptors list: Chain Mode */ HAL_ETH_DMATxDescListInit(ð.EthHandle, eth.DMATxDscrTab, eth.Tx_Buff, ETH_TXBUFNB); /* Initialize Rx Descriptors list: Chain Mode */ HAL_ETH_DMARxDescListInit(ð.EthHandle, eth.DMARxDscrTab, eth.Rx_Buff, ETH_RXBUFNB); /* Enable MAC and DMA transmission and reception */ HAL_ETH_Start(ð.EthHandle); #if 0 // XXX DP83848 specific /**** Configure PHY to generate an interrupt when Eth Link state changes ****/ /* Read Register Configuration */ uint32_t regvalue; HAL_ETH_ReadPHYRegister(ð.EthHandle, PHY_MICR, ®value); regvalue |= (PHY_MICR_INT_EN | PHY_MICR_INT_OE); /* Enable Interrupts */ HAL_ETH_WritePHYRegister(ð.EthHandle, PHY_MICR, regvalue ); /* Read Register Configuration */ HAL_ETH_ReadPHYRegister(ð.EthHandle, PHY_MISR, ®value); regvalue |= PHY_MISR_LINK_INT_EN; /* Enable Interrupt on change of link status */ HAL_ETH_WritePHYRegister(ð.EthHandle, PHY_MISR, regvalue); #endif /* set up an event to block the rx thread on */ event_init(ð.rx_event, false, EVENT_FLAG_AUTOUNSIGNAL); /* start worker thread */ thread_resume(thread_create("eth_rx", ð_rx_worker, NULL, HIGH_PRIORITY, DEFAULT_STACK_SIZE)); /* enable interrupts */ HAL_NVIC_EnableIRQ(ETH_IRQn); LTRACE_EXIT; return NO_ERROR; }
/** * @brief ETH MSP Initialization * This function configures the hardware resources used in this example * @param heth: ETH handle pointer * @retval None */ void HAL_ETH_MspInit(ETH_HandleTypeDef* heth) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(heth->Instance==ETH) { /* USER CODE BEGIN ETH_MspInit 0 */ /* USER CODE END ETH_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_ETH_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); /**ETH GPIO Configuration PC1 ------> ETH_MDC PA1 ------> ETH_REF_CLK PA2 ------> ETH_MDIO PA7 ------> ETH_CRS_DV PC4 ------> ETH_RXD0 PC5 ------> ETH_RXD1 PB13 ------> ETH_TXD1 PG11 ------> ETH_TX_EN PG13 ------> ETH_TXD0 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /* USER CODE BEGIN ETH_MspInit 1 */ /* USER CODE END ETH_MspInit 1 */ } }