1 /*
2  * Copyright (c) 2006-2025, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2025-02-11     Rbb666       the first version
9  */
10 #include <hal_data.h>
11 #include <rtthread.h>
12 
13 #define RTL_8211F_PAGE_SELECT 0x1F
14 #define RTL_8211F_EEELCR_ADDR 0x11
15 #define RTL_8211F_LED_PAGE 0xD04
16 #define RTL_8211F_LCR_ADDR 0x10
17 
phy_rtl8211f_led_fixup(ether_phy_instance_ctrl_t * phydev)18 static int phy_rtl8211f_led_fixup(ether_phy_instance_ctrl_t *phydev)
19 {
20     uint32_t val1, val2 = 0;
21 
22     /* switch to led page */
23     R_ETHER_PHY_Write(phydev, RTL_8211F_PAGE_SELECT, RTL_8211F_LED_PAGE);
24 
25     /* set led1(green) Link 10/100/1000M, and set led2(yellow) Link 10/100/1000M+Active */
26     R_ETHER_PHY_Read(phydev, RTL_8211F_LCR_ADDR, &val1);
27     val1 |= (1 << 5);
28     val1 |= (1 << 8);
29     val1 &= (~(1 << 9));
30     val1 |= (1 << 10);
31     val1 |= (1 << 11);
32     R_ETHER_PHY_Write(phydev, RTL_8211F_LCR_ADDR, val1);
33 
34     /* set led1(green) EEE LED function disabled so it can keep on when linked */
35     R_ETHER_PHY_Read(phydev, RTL_8211F_EEELCR_ADDR, &val2);
36     val2 &= (~(1 << 2));
37     R_ETHER_PHY_Write(phydev, RTL_8211F_EEELCR_ADDR, val2);
38 
39     /* switch back to page0 */
40     R_ETHER_PHY_Write(phydev, RTL_8211F_PAGE_SELECT, 0xa42);
41 
42     return 0;
43 }
44 
ether_phy_targets_initialize_rtl8211_rgmii(ether_phy_instance_ctrl_t * p_instance_ctrl)45 void ether_phy_targets_initialize_rtl8211_rgmii(ether_phy_instance_ctrl_t *p_instance_ctrl)
46 {
47     rt_thread_mdelay(100);
48     phy_rtl8211f_led_fixup(p_instance_ctrl);
49 }
50