drivers : ethernet: add SOC_SERIES_STM32H5X
add Ethernet SOC_SERIES_STM32H5X Signed-off-by: Marc Desvaux <marc.desvaux-ext@st.com>
This commit is contained in:
parent
935268ee64
commit
2e4d7ec5a8
|
@ -22,12 +22,13 @@ choice ETH_STM32_HAL_API_VERSION
|
|||
|
||||
config ETH_STM32_HAL_API_V2
|
||||
bool "Use new HAL driver"
|
||||
depends on SOC_SERIES_STM32H7X || SOC_SERIES_STM32F4X || SOC_SERIES_STM32F7X
|
||||
depends on SOC_SERIES_STM32H7X || SOC_SERIES_STM32H5X || SOC_SERIES_STM32F4X || SOC_SERIES_STM32F7X
|
||||
help
|
||||
Use the new HAL driver instead of the legacy one.
|
||||
|
||||
config ETH_STM32_HAL_API_V1
|
||||
bool "Use new HAL driver"
|
||||
depends on !SOC_SERIES_STM32H5X
|
||||
select DEPRECATED if SOC_SERIES_STM32H7X || SOC_SERIES_STM32F4X || SOC_SERIES_STM32F7X
|
||||
help
|
||||
Driver version based on legacy HAL version. Deprecated unless using STM32F2 series.
|
||||
|
@ -135,7 +136,7 @@ config ETH_STM32_AUTO_NEGOTIATION_ENABLE
|
|||
|
||||
config ETH_STM32_HW_CHECKSUM
|
||||
bool "Use TX and RX hardware checksum"
|
||||
depends on !SOC_SERIES_STM32H7X
|
||||
depends on (!SOC_SERIES_STM32H7X && !SOC_SERIES_STM32H5X )
|
||||
help
|
||||
Enable receive and transmit checksum offload to enhance throughput
|
||||
performances.
|
||||
|
@ -157,7 +158,7 @@ config ETH_STM32_MODE_HALFDUPLEX
|
|||
|
||||
endif # !ETH_STM32_AUTO_NEGOTIATION_ENABLE
|
||||
|
||||
if SOC_SERIES_STM32F7X || SOC_SERIES_STM32H7X
|
||||
if SOC_SERIES_STM32F7X || SOC_SERIES_STM32H7X || SOC_SERIES_STM32H5X
|
||||
|
||||
config PTP_CLOCK_STM32_HAL
|
||||
bool "STM32 HAL PTP clock driver support"
|
||||
|
@ -197,7 +198,7 @@ config ETH_STM32_HAL_PTP_CLOCK_INIT_PRIO
|
|||
a dependency from the network stack that this device
|
||||
initializes before network stack (NET_INIT_PRIO).
|
||||
|
||||
endif # SOC_SERIES_STM32F7X || SOC_SERIES_STM32H7X
|
||||
endif # SOC_SERIES_STM32F7X || SOC_SERIES_STM32H7X || SOC_SERIES_STM32H5X
|
||||
|
||||
config ETH_STM32_MULTICAST_FILTER
|
||||
bool "Multicast hash filter support"
|
||||
|
|
|
@ -51,7 +51,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
|
|||
|
||||
#define PHY_ADDR CONFIG_ETH_STM32_HAL_PHY_ADDRESS
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
|
||||
#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
|
||||
#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
|
||||
|
@ -72,7 +72,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
|
|||
#define IS_ETH_DMATXDESC_OWN(dma_tx_desc) (dma_tx_desc->Status & \
|
||||
ETH_DMATXDESC_OWN)
|
||||
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
#define ETH_DMA_TX_TIMEOUT_MS 20U /* transmit timeout in milliseconds */
|
||||
|
||||
|
@ -80,7 +80,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
|
|||
DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
|
||||
#define __eth_stm32_desc __dtcm_noinit_section
|
||||
#define __eth_stm32_buf __dtcm_noinit_section
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
#define __eth_stm32_desc __attribute__((section(".eth_stm32_desc")))
|
||||
#define __eth_stm32_buf __attribute__((section(".eth_stm32_buf")))
|
||||
#elif defined(CONFIG_NOCACHE_MEMORY)
|
||||
|
@ -213,7 +213,8 @@ static inline uint16_t allocate_tx_buffer(void)
|
|||
}
|
||||
#endif /* CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
static ETH_TxPacketConfig tx_config;
|
||||
#endif
|
||||
|
||||
|
@ -222,19 +223,20 @@ static HAL_StatusTypeDef read_eth_phy_register(ETH_HandleTypeDef *heth,
|
|||
uint32_t PHYReg,
|
||||
uint32_t *RegVal)
|
||||
{
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
return HAL_ETH_ReadPHYRegister(heth, PHYAddr, PHYReg, RegVal);
|
||||
#else
|
||||
ARG_UNUSED(PHYAddr);
|
||||
return HAL_ETH_ReadPHYRegister(heth, PHYReg, RegVal);
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
}
|
||||
|
||||
static inline void setup_mac_filter(ETH_HandleTypeDef *heth)
|
||||
{
|
||||
__ASSERT_NO_MSG(heth != NULL);
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
ETH_MACFilterConfigTypeDef MACFilterConf;
|
||||
|
||||
HAL_ETH_GetMACFilterConfig(heth, &MACFilterConf);
|
||||
|
@ -275,7 +277,7 @@ static inline void setup_mac_filter(ETH_HandleTypeDef *heth)
|
|||
tmp = heth->Instance->MACFFR;
|
||||
k_sleep(K_MSEC(1));
|
||||
heth->Instance->MACFFR = tmp;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X) */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X) */
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PTP_CLOCK_STM32_HAL)
|
||||
|
@ -355,14 +357,14 @@ static int eth_tx(const struct device *dev, struct net_pkt *pkt)
|
|||
ctx.first_tx_buffer_index = allocate_tx_buffer();
|
||||
buf_header = &dma_tx_buffer_header[ctx.first_tx_buffer_index];
|
||||
#else /* CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
uint32_t cur_tx_desc_idx;
|
||||
|
||||
cur_tx_desc_idx = heth->TxDescList.CurTxDesc;
|
||||
dma_tx_desc = (ETH_DMADescTypeDef *)heth->TxDescList.TxDesc[cur_tx_desc_idx];
|
||||
#else
|
||||
dma_tx_desc = heth->TxDesc;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
while (IS_ETH_DMATXDESC_OWN(dma_tx_desc) != (uint32_t)RESET) {
|
||||
k_yield();
|
||||
|
@ -375,7 +377,7 @@ static int eth_tx(const struct device *dev, struct net_pkt *pkt)
|
|||
/* Enable transmit timestamp */
|
||||
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
HAL_ETH_PTP_InsertTxTimestamp(heth);
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
dma_tx_desc->DESC2 |= ETH_DMATXNDESCRF_TTSE;
|
||||
#else
|
||||
dma_tx_desc->Status |= ETH_DMATXDESC_TTSE;
|
||||
|
@ -408,27 +410,28 @@ static int eth_tx(const struct device *dev, struct net_pkt *pkt)
|
|||
buf_header->tx_buff.next = NULL;
|
||||
|
||||
#else /* CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
dma_buffer = dma_tx_buffer[cur_tx_desc_idx];
|
||||
#else
|
||||
dma_buffer = (uint8_t *)(dma_tx_desc->Buffer1Addr);
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
if (net_pkt_read(pkt, dma_buffer, total_len)) {
|
||||
res = -ENOBUFS;
|
||||
goto error;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
ETH_BufferTypeDef tx_buffer_def;
|
||||
|
||||
tx_buffer_def.buffer = dma_buffer;
|
||||
tx_buffer_def.len = total_len;
|
||||
tx_buffer_def.next = NULL;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
#endif /* CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
|
||||
tx_config.Length = total_len;
|
||||
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
|
@ -517,12 +520,12 @@ static int eth_tx(const struct device *dev, struct net_pkt *pkt)
|
|||
res = -EIO;
|
||||
goto error;
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
#if defined(CONFIG_PTP_CLOCK_STM32_HAL) && !defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
if (timestamped_frame) {
|
||||
/* Retrieve transmission timestamp from last DMA TX descriptor */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
ETH_TxDescListTypeDef * dma_tx_desc_list;
|
||||
|
||||
__IO ETH_DMADescTypeDef *last_dma_tx_desc;
|
||||
|
@ -575,7 +578,7 @@ static int eth_tx(const struct device *dev, struct net_pkt *pkt)
|
|||
pkt->timestamp.second = UINT64_MAX;
|
||||
pkt->timestamp.nanosecond = UINT32_MAX;
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
net_if_add_tx_timestamp(pkt);
|
||||
}
|
||||
|
@ -628,7 +631,7 @@ static struct net_pkt *eth_rx(const struct device *dev, uint16_t *vlan_tag)
|
|||
void *appbuf = NULL;
|
||||
struct eth_stm32_rx_buffer_header *rx_header;
|
||||
#else
|
||||
#if !defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if !defined(CONFIG_SOC_SERIES_STM32H7X) && !defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
__IO ETH_DMADescTypeDef *dma_rx_desc;
|
||||
#endif /* !CONFIG_SOC_SERIES_STM32H7X */
|
||||
uint8_t *dma_buffer;
|
||||
|
@ -663,7 +666,7 @@ static struct net_pkt *eth_rx(const struct device *dev, uint16_t *vlan_tag)
|
|||
rx_header; rx_header = rx_header->next) {
|
||||
total_len += rx_header->size;
|
||||
}
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
if (HAL_ETH_IsRxDataAvailable(heth) != true) {
|
||||
/* no frame available */
|
||||
return NULL;
|
||||
|
@ -697,7 +700,7 @@ static struct net_pkt *eth_rx(const struct device *dev, uint16_t *vlan_tag)
|
|||
|
||||
total_len = heth->RxFrameInfos.length;
|
||||
dma_buffer = (uint8_t *)heth->RxFrameInfos.buffer;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
#if defined(CONFIG_PTP_CLOCK_STM32_HAL)
|
||||
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
|
@ -707,7 +710,7 @@ static struct net_pkt *eth_rx(const struct device *dev, uint16_t *vlan_tag)
|
|||
timestamp.nanosecond = ts_registers.TimeStampLow;
|
||||
}
|
||||
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
ETH_RxDescListTypeDef * dma_rx_desc_list;
|
||||
|
||||
dma_rx_desc_list = &heth->RxDescList;
|
||||
|
@ -746,7 +749,7 @@ static struct net_pkt *eth_rx(const struct device *dev, uint16_t *vlan_tag)
|
|||
timestamp.second = last_dma_rx_desc->TimeStampHigh;
|
||||
timestamp.nanosecond = last_dma_rx_desc->TimeStampLow;
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
#endif /* CONFIG_PTP_CLOCK_STM32_HAL */
|
||||
|
||||
pkt = net_pkt_rx_alloc_with_buffer(get_iface(dev_data, *vlan_tag),
|
||||
|
@ -785,7 +788,7 @@ release_desc:
|
|||
rx_header->used = false;
|
||||
}
|
||||
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
hal_ret = HAL_ETH_BuildRxDescriptors(heth);
|
||||
if (hal_ret != HAL_OK) {
|
||||
LOG_ERR("HAL_ETH_BuildRxDescriptors: failed: %d", hal_ret);
|
||||
|
@ -940,7 +943,8 @@ static void eth_isr(const struct device *dev)
|
|||
|
||||
HAL_ETH_IRQHandler(heth);
|
||||
}
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth_handle)
|
||||
{
|
||||
__ASSERT_NO_MSG(heth_handle != NULL);
|
||||
|
@ -953,7 +957,7 @@ void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth_handle)
|
|||
k_sem_give(&dev_data->tx_int_sem);
|
||||
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
|
||||
|
@ -965,9 +969,9 @@ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
|
|||
__ASSERT_NO_MSG(heth != NULL);
|
||||
|
||||
uint32_t dma_error;
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
uint32_t mac_error;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
const uint32_t error_code = HAL_ETH_GetError(heth);
|
||||
|
||||
struct eth_stm32_hal_dev_data *dev_data =
|
||||
|
@ -977,7 +981,7 @@ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
|
|||
case HAL_ETH_ERROR_DMA:
|
||||
dma_error = HAL_ETH_GetDMAError(heth);
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
if ((dma_error & ETH_DMA_RX_WATCHDOG_TIMEOUT_FLAG) ||
|
||||
(dma_error & ETH_DMA_RX_PROCESS_STOPPED_FLAG) ||
|
||||
(dma_error & ETH_DMA_RX_BUFFER_UNAVAILABLE_FLAG)) {
|
||||
|
@ -998,10 +1002,10 @@ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
|
|||
(dma_error & ETH_DMASR_TJTS)) {
|
||||
eth_stats_update_errors_tx(dev_data->iface);
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
break;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
case HAL_ETH_ERROR_MAC:
|
||||
mac_error = HAL_ETH_GetMACError(heth);
|
||||
|
||||
|
@ -1018,20 +1022,20 @@ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
|
|||
eth_stats_update_errors_tx(dev_data->iface);
|
||||
}
|
||||
break;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
dev_data->stats.error_details.rx_crc_errors = heth->Instance->MMCRCRCEPR;
|
||||
dev_data->stats.error_details.rx_align_errors = heth->Instance->MMCRAEPR;
|
||||
#else
|
||||
dev_data->stats.error_details.rx_crc_errors = heth->Instance->MMCRFCECR;
|
||||
dev_data->stats.error_details.rx_align_errors = heth->Instance->MMCRFAECR;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
#endif /* CONFIG_NET_STATISTICS_ETHERNET */
|
||||
}
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
/* DMA and MAC errors callback only appear in H7 series */
|
||||
void HAL_ETH_DMAErrorCallback(ETH_HandleTypeDef *heth_handle)
|
||||
{
|
||||
|
@ -1170,11 +1174,12 @@ static int eth_initialize(const struct device *dev)
|
|||
|
||||
heth->Init.MACAddr = dev_data->mac_addr;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
heth->Init.TxDesc = dma_tx_desc_tab;
|
||||
heth->Init.RxDesc = dma_rx_desc_tab;
|
||||
heth->Init.RxBuffLen = ETH_STM32_RX_BUF_SIZE;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
hal_ret = HAL_ETH_Init(heth);
|
||||
if (hal_ret == HAL_TIMEOUT) {
|
||||
|
@ -1191,14 +1196,15 @@ static int eth_initialize(const struct device *dev)
|
|||
/* Enable timestamping of RX packets. We enable all packets to be
|
||||
* timestamped to cover both IEEE 1588 and gPTP.
|
||||
*/
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSENALL;
|
||||
#else
|
||||
heth->Instance->PTPTSCR |= ETH_PTPTSCR_TSSARFE;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
#endif /* CONFIG_PTP_CLOCK_STM32_HAL */
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
/* Tx config init: */
|
||||
memset(&tx_config, 0, sizeof(ETH_TxPacketConfig));
|
||||
tx_config.Attributes = ETH_TX_PACKETS_FEATURES_CSUM |
|
||||
|
@ -1206,18 +1212,20 @@ static int eth_initialize(const struct device *dev)
|
|||
tx_config.ChecksumCtrl = IS_ENABLED(CONFIG_ETH_STM32_HW_CHECKSUM) ?
|
||||
ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC : ETH_CHECKSUM_DISABLE;
|
||||
tx_config.CRCPadCtrl = ETH_CRC_PAD_INSERT;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
dev_data->link_up = false;
|
||||
|
||||
/* Initialize semaphores */
|
||||
k_mutex_init(&dev_data->tx_mutex);
|
||||
k_sem_init(&dev_data->rx_int_sem, 0, K_SEM_MAX_LIMIT);
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
k_sem_init(&dev_data->tx_int_sem, 0, K_SEM_MAX_LIMIT);
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
/* Adjust MDC clock range depending on HCLK frequency: */
|
||||
HAL_ETH_SetMDIOClockRange(heth);
|
||||
|
||||
|
@ -1234,7 +1242,7 @@ static int eth_initialize(const struct device *dev)
|
|||
if (hal_ret != HAL_OK) {
|
||||
LOG_ERR("HAL_ETH_SetMACConfig: failed: %d", hal_ret);
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2 */
|
||||
|
||||
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
|
||||
|
@ -1244,7 +1252,7 @@ static int eth_initialize(const struct device *dev)
|
|||
}
|
||||
|
||||
hal_ret = HAL_ETH_Start_IT(heth);
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
for (uint32_t i = 0; i < ETH_RX_DESC_CNT; i++) {
|
||||
hal_ret = HAL_ETH_DescAssignMemory(heth, i, dma_rx_buffer[i],
|
||||
NULL);
|
||||
|
@ -1380,13 +1388,13 @@ static void net_if_stm32_mcast_cb(struct net_if *iface,
|
|||
/* Save a copy of the hash table which we update with
|
||||
* the hash for a single multicast address for join
|
||||
*/
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
hash_table[0] = heth->Instance->MACHT0R;
|
||||
hash_table[1] = heth->Instance->MACHT1R;
|
||||
#else
|
||||
hash_table[0] = heth->Instance->MACHTLR;
|
||||
hash_table[1] = heth->Instance->MACHTHR;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
}
|
||||
|
||||
k_mutex_lock(&multicast_addr_lock, K_FOREVER);
|
||||
|
@ -1459,13 +1467,13 @@ static void net_if_stm32_mcast_cb(struct net_if *iface,
|
|||
|
||||
k_mutex_unlock(&multicast_addr_lock);
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACHT0R = hash_table[0];
|
||||
heth->Instance->MACHT1R = hash_table[1];
|
||||
#else
|
||||
heth->Instance->MACHTLR = hash_table[0];
|
||||
heth->Instance->MACHTHR = hash_table[1];
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
}
|
||||
|
||||
#endif /* CONFIG_ETH_STM32_MULTICAST_FILTER */
|
||||
|
@ -1576,7 +1584,7 @@ static int eth_stm32_hal_set_config(const struct device *dev,
|
|||
break;
|
||||
case ETHERNET_CONFIG_TYPE_PROMISC_MODE:
|
||||
#if defined(CONFIG_NET_PROMISCUOUS_MODE)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
if (config->promisc_mode) {
|
||||
heth->Instance->MACPFR |= ETH_MACPFR_PR;
|
||||
} else {
|
||||
|
@ -1588,7 +1596,7 @@ static int eth_stm32_hal_set_config(const struct device *dev,
|
|||
} else {
|
||||
heth->Instance->MACFFR &= ~ETH_MACFFR_PM;
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
ret = 0;
|
||||
#endif /* CONFIG_NET_PROMISCUOUS_MODE */
|
||||
break;
|
||||
|
@ -1658,7 +1666,8 @@ static struct eth_stm32_hal_dev_data eth0_data = {
|
|||
.heth = {
|
||||
.Instance = (ETH_TypeDef *)DT_INST_REG_ADDR(0),
|
||||
.Init = {
|
||||
#if !defined(CONFIG_SOC_SERIES_STM32H7X) && !defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if !defined(CONFIG_SOC_SERIES_STM32H7X) && !defined(CONFIG_SOC_SERIES_STM32H5X) && \
|
||||
!defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_ETH_STM32_AUTO_NEGOTIATION_ENABLE)
|
||||
.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE,
|
||||
#else
|
||||
|
@ -1701,7 +1710,7 @@ static int ptp_clock_stm32_set(const struct device *dev,
|
|||
|
||||
key = irq_lock();
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACSTSUR = tm->second;
|
||||
heth->Instance->MACSTNUR = tm->nanosecond;
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSINIT;
|
||||
|
@ -1715,7 +1724,7 @@ static int ptp_clock_stm32_set(const struct device *dev,
|
|||
while (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSSTI_Msk) {
|
||||
/* spin lock */
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
irq_unlock(key);
|
||||
|
||||
|
@ -1733,7 +1742,7 @@ static int ptp_clock_stm32_get(const struct device *dev,
|
|||
|
||||
key = irq_lock();
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
tm->second = heth->Instance->MACSTSR;
|
||||
tm->nanosecond = heth->Instance->MACSTNR;
|
||||
second_2 = heth->Instance->MACSTSR;
|
||||
|
@ -1741,7 +1750,7 @@ static int ptp_clock_stm32_get(const struct device *dev,
|
|||
tm->second = heth->Instance->PTPTSHR;
|
||||
tm->nanosecond = heth->Instance->PTPTSLR;
|
||||
second_2 = heth->Instance->PTPTSHR;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
irq_unlock(key);
|
||||
|
||||
|
@ -1769,7 +1778,7 @@ static int ptp_clock_stm32_adjust(const struct device *dev, int increment)
|
|||
} else {
|
||||
key = irq_lock();
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACSTSUR = 0;
|
||||
if (increment >= 0) {
|
||||
heth->Instance->MACSTNUR = increment;
|
||||
|
@ -1791,7 +1800,7 @@ static int ptp_clock_stm32_adjust(const struct device *dev, int increment)
|
|||
while (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSSTU_Msk) {
|
||||
/* spin lock */
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
ret = 0;
|
||||
irq_unlock(key);
|
||||
|
@ -1830,7 +1839,7 @@ static int ptp_clock_stm32_rate_adjust(const struct device *dev, double ratio)
|
|||
/* Update addend register */
|
||||
addend_val = UINT32_MAX * eth_dev_data->clk_ratio * ratio;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACTSAR = addend_val;
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSADDREG;
|
||||
while (heth->Instance->MACTSCR & ETH_MACTSCR_TSADDREG_Msk) {
|
||||
|
@ -1842,7 +1851,7 @@ static int ptp_clock_stm32_rate_adjust(const struct device *dev, double ratio)
|
|||
while (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSARU_Msk) {
|
||||
/* spin lock */
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
ret = 0;
|
||||
|
||||
|
@ -1875,26 +1884,26 @@ static int ptp_stm32_init(const struct device *port)
|
|||
ptp_context->eth_dev_data = eth_dev_data;
|
||||
|
||||
/* Mask the Timestamp Trigger interrupt */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACIER &= ~(ETH_MACIER_TSIE);
|
||||
#else
|
||||
heth->Instance->MACIMR &= ~(ETH_MACIMR_TSTIM);
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
/* Enable timestamping */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSENA;
|
||||
#else
|
||||
heth->Instance->PTPTSCR |= ETH_PTPTSCR_TSE;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
/* Query ethernet clock rate */
|
||||
ret = clock_control_get_rate(eth_dev_data->clock,
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
(clock_control_subsys_t)ð_cfg->pclken,
|
||||
#else
|
||||
(clock_control_subsys_t)ð_cfg->pclken_ptp,
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
&ptp_hclk_rate);
|
||||
if (ret) {
|
||||
LOG_ERR("Failed to query ethernet clock");
|
||||
|
@ -1911,11 +1920,11 @@ static int ptp_stm32_init(const struct device *port)
|
|||
LOG_ERR("PTP clock period is more than %d nanoseconds", UINT8_MAX);
|
||||
return -EINVAL;
|
||||
}
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACSSIR = ss_incr_ns << ETH_MACMACSSIR_SSINC_Pos;
|
||||
#else
|
||||
heth->Instance->PTPSSIR = ss_incr_ns;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
/* Program timestamp addend register */
|
||||
eth_dev_data->clk_ratio =
|
||||
|
@ -1930,7 +1939,7 @@ static int ptp_stm32_init(const struct device *port)
|
|||
eth_dev_data->clk_ratio_adj = 1.0f;
|
||||
addend_val =
|
||||
UINT32_MAX * eth_dev_data->clk_ratio * eth_dev_data->clk_ratio_adj;
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACTSAR = addend_val;
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSADDREG;
|
||||
while (heth->Instance->MACTSCR & ETH_MACTSCR_TSADDREG_Msk) {
|
||||
|
@ -1942,24 +1951,24 @@ static int ptp_stm32_init(const struct device *port)
|
|||
while (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSARU_Msk) {
|
||||
k_yield();
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
/* Enable fine timestamp correction method */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSCFUPDT;
|
||||
#else
|
||||
heth->Instance->PTPTSCR |= ETH_PTPTSCR_TSFCU;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
/* Enable nanosecond rollover into a new second */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSCTRLSSR;
|
||||
#else
|
||||
heth->Instance->PTPTSCR |= ETH_PTPTSCR_TSSSR;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
/* Initialize timestamp */
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X)
|
||||
heth->Instance->MACSTSUR = 0;
|
||||
heth->Instance->MACSTNUR = 0;
|
||||
heth->Instance->MACTSCR |= ETH_MACTSCR_TSINIT;
|
||||
|
@ -1973,7 +1982,7 @@ static int ptp_stm32_init(const struct device *port)
|
|||
while (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSSTI_Msk) {
|
||||
k_yield();
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X */
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X */
|
||||
|
||||
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
/* Set PTP Configuration done */
|
||||
|
|
|
@ -41,9 +41,10 @@ struct eth_stm32_hal_dev_data {
|
|||
const struct device *clock;
|
||||
struct k_mutex tx_mutex;
|
||||
struct k_sem rx_int_sem;
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32H5X) || \
|
||||
defined(CONFIG_ETH_STM32_HAL_API_V2)
|
||||
struct k_sem tx_int_sem;
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_ETH_STM32_HAL_API_V2*/
|
||||
#endif /* CONFIG_SOC_SERIES_STM32H7X || CONFIG_SOC_SERIES_STM32H5X || CONFIG_ETH_STM32_HAL_API_V2*/
|
||||
K_KERNEL_STACK_MEMBER(rx_thread_stack,
|
||||
CONFIG_ETH_STM32_HAL_RX_THREAD_STACK_SIZE);
|
||||
struct k_thread rx_thread;
|
||||
|
|
Loading…
Reference in a new issue