44#include <stddef.h>
55#include "board.h"
66#include <wolfHAL/platform/st/stm32h563xx.h>
7+ #include <wolfHAL/eth_phy/lan8742a.h>
78#include "peripheral.h"
89
910/* SysTick timing */
@@ -52,13 +53,22 @@ static const whal_Stm32h5Rcc_Clk g_clocks[] = {
5253 {WHAL_STM32H563_GPIOA_CLOCK },
5354 {WHAL_STM32H563_GPIOB_CLOCK },
5455 {WHAL_STM32H563_GPIOD_CLOCK },
56+ {WHAL_STM32H563_GPIOC_CLOCK },
5557 {WHAL_STM32H563_GPIOG_CLOCK },
5658 {WHAL_STM32H563_USART2_CLOCK },
5759 {WHAL_STM32H563_SPI1_CLOCK },
5860 {WHAL_STM32H563_RNG_CLOCK },
61+ {WHAL_STM32H563_SBS_CLOCK },
5962};
6063#define CLOCK_COUNT (sizeof(g_clocks) / sizeof(g_clocks[0]))
6164
65+ static const whal_Stm32h5Rcc_Clk g_ethClocks [] = {
66+ {WHAL_STM32H563_ETH_CLOCK },
67+ {WHAL_STM32H563_ETHTX_CLOCK },
68+ {WHAL_STM32H563_ETHRX_CLOCK },
69+ };
70+ #define ETH_CLOCK_COUNT (sizeof(g_ethClocks) / sizeof(g_ethClocks[0]))
71+
6272/* GPIO */
6373whal_Gpio g_whalGpio = {
6474 WHAL_STM32H563_GPIO_DEVICE ,
@@ -127,6 +137,78 @@ whal_Gpio g_whalGpio = {
127137 .speed = WHAL_STM32H5_GPIO_SPEED_FAST ,
128138 .pull = WHAL_STM32H5_GPIO_PULL_UP ,
129139 },
140+ [ETH_RMII_REF_CLK_PIN ] = { /* RMII REF_CLK on PA1 */
141+ .port = WHAL_STM32H5_GPIO_PORT_A ,
142+ .pin = 1 ,
143+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
144+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
145+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
146+ .altFn = 11 ,
147+ },
148+ [ETH_RMII_MDIO_PIN ] = { /* RMII MDIO on PA2 */
149+ .port = WHAL_STM32H5_GPIO_PORT_A ,
150+ .pin = 2 ,
151+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
152+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
153+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
154+ .altFn = 11 ,
155+ },
156+ [ETH_RMII_MDC_PIN ] = { /* RMII MDC on PC1 */
157+ .port = WHAL_STM32H5_GPIO_PORT_C ,
158+ .pin = 1 ,
159+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
160+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
161+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
162+ .altFn = 11 ,
163+ },
164+ [ETH_RMII_CRS_DV_PIN ] = { /* RMII CRS_DV on PA7 */
165+ .port = WHAL_STM32H5_GPIO_PORT_A ,
166+ .pin = 7 ,
167+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
168+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
169+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
170+ .altFn = 11 ,
171+ },
172+ [ETH_RMII_RXD0_PIN ] = { /* RMII RXD0 on PC4 */
173+ .port = WHAL_STM32H5_GPIO_PORT_C ,
174+ .pin = 4 ,
175+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
176+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
177+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
178+ .altFn = 11 ,
179+ },
180+ [ETH_RMII_RXD1_PIN ] = { /* RMII RXD1 on PC5 */
181+ .port = WHAL_STM32H5_GPIO_PORT_C ,
182+ .pin = 5 ,
183+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
184+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
185+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
186+ .altFn = 11 ,
187+ },
188+ [ETH_RMII_TX_EN_PIN ] = { /* RMII TX_EN on PG11 */
189+ .port = WHAL_STM32H5_GPIO_PORT_G ,
190+ .pin = 11 ,
191+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
192+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
193+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
194+ .altFn = 11 ,
195+ },
196+ [ETH_RMII_TXD0_PIN ] = { /* RMII TXD0 on PG13 */
197+ .port = WHAL_STM32H5_GPIO_PORT_G ,
198+ .pin = 13 ,
199+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
200+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
201+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
202+ .altFn = 11 ,
203+ },
204+ [ETH_RMII_TXD1_PIN ] = { /* RMII TXD1 on PB15 */
205+ .port = WHAL_STM32H5_GPIO_PORT_B ,
206+ .pin = 15 ,
207+ .mode = WHAL_STM32H5_GPIO_MODE_ALTFN ,
208+ .speed = WHAL_STM32H5_GPIO_SPEED_HIGH ,
209+ .pull = WHAL_STM32H5_GPIO_PULL_NONE ,
210+ .altFn = 11 ,
211+ },
130212 },
131213 .pinCount = PIN_COUNT ,
132214 },
@@ -184,6 +266,49 @@ whal_Flash g_whalFlash = {
184266 },
185267};
186268
269+ /* Ethernet */
270+ #define ETH_TX_DESC_COUNT 4
271+ #define ETH_RX_DESC_COUNT 4
272+ #define ETH_TX_BUF_SIZE 1536
273+ #define ETH_RX_BUF_SIZE 1536
274+
275+ static whal_Stm32h5Eth_TxDesc ethTxDescs [ETH_TX_DESC_COUNT ]
276+ __attribute__((aligned (16 )));
277+ static whal_Stm32h5Eth_RxDesc ethRxDescs [ETH_RX_DESC_COUNT ]
278+ __attribute__((aligned (16 )));
279+ static uint8_t ethTxBufs [ETH_TX_DESC_COUNT * ETH_TX_BUF_SIZE ]
280+ __attribute__((aligned (4 )));
281+ static uint8_t ethRxBufs [ETH_RX_DESC_COUNT * ETH_RX_BUF_SIZE ]
282+ __attribute__((aligned (4 )));
283+
284+ whal_Eth g_whalEth = {
285+ WHAL_STM32H563_ETH_DEVICE ,
286+
287+ .cfg = & (whal_Stm32h5Eth_Cfg ) {
288+ .macAddr = {0x00 , 0x80 , 0xE1 , 0x00 , 0x00 , 0x01 },
289+ .txDescs = ethTxDescs ,
290+ .txBufs = ethTxBufs ,
291+ .txDescCount = ETH_TX_DESC_COUNT ,
292+ .txBufSize = ETH_TX_BUF_SIZE ,
293+ .rxDescs = ethRxDescs ,
294+ .rxBufs = ethRxBufs ,
295+ .rxDescCount = ETH_RX_DESC_COUNT ,
296+ .rxBufSize = ETH_RX_BUF_SIZE ,
297+ .timeout = & g_whalTimeout ,
298+ },
299+ };
300+
301+ /* Ethernet PHY (LAN8742A) */
302+ whal_EthPhy g_whalEthPhy = {
303+ .eth = & g_whalEth ,
304+ .addr = BOARD_ETH_PHY_ADDR ,
305+ .driver = & whal_Lan8742a_Driver ,
306+
307+ .cfg = & (whal_Lan8742a_Cfg ) {
308+ .timeout = & g_whalTimeout ,
309+ },
310+ };
311+
187312void Board_WaitMs (size_t ms )
188313{
189314 uint32_t startCount = g_tick ;
@@ -210,13 +335,24 @@ whal_Error Board_Init(void)
210335 if (err )
211336 return err ;
212337
213- /* Enable clocks */
338+ /* Enable clocks (excludes ETH — needs SBS RMII config first) */
214339 for (size_t i = 0 ; i < CLOCK_COUNT ; i ++ ) {
215340 err = whal_Clock_Enable (& g_whalClock , & g_clocks [i ]);
216341 if (err )
217342 return err ;
218343 }
219344
345+ /* Select RMII mode in SBS_PMCR (SBS base 0x44000400 + 0x100) bits [23:21] = 0b100 */
346+ * (volatile uint32_t * )0x44000500 =
347+ (* (volatile uint32_t * )0x44000500 & ~(7UL << 21 )) | (4UL << 21 );
348+
349+ /* Enable ETH clocks after RMII mode is selected */
350+ for (size_t i = 0 ; i < ETH_CLOCK_COUNT ; i ++ ) {
351+ err = whal_Clock_Enable (& g_whalClock , & g_ethClocks [i ]);
352+ if (err )
353+ return err ;
354+ }
355+
220356 /* Enable HSI48 for RNG kernel clock */
221357 err = whal_Stm32h5Rcc_Ext_EnableHsi48 (& g_whalClock , 1 );
222358 if (err )
@@ -238,6 +374,14 @@ whal_Error Board_Init(void)
238374 if (err )
239375 return err ;
240376
377+ err = whal_Eth_Init (& g_whalEth );
378+ if (err )
379+ return err ;
380+
381+ err = whal_EthPhy_Init (& g_whalEthPhy );
382+ if (err )
383+ return err ;
384+
241385 err = whal_Timer_Init (& g_whalTimer );
242386 if (err )
243387 return err ;
@@ -269,6 +413,14 @@ whal_Error Board_Deinit(void)
269413 if (err )
270414 return err ;
271415
416+ err = whal_EthPhy_Deinit (& g_whalEthPhy );
417+ if (err )
418+ return err ;
419+
420+ err = whal_Eth_Deinit (& g_whalEth );
421+ if (err )
422+ return err ;
423+
272424 err = whal_Rng_Deinit (& g_whalRng );
273425 if (err )
274426 return err ;
0 commit comments