Browse Source

[components][drivers][include][phy] add one more parameter for mulitiple phys

- add parameter phy to specify multiple-phy instance

Signed-off-by: Jiading Xu <Jiading.Xu@hpmicro.com>
Jiading Xu 1 year ago
parent
commit
2fcf151a8e

+ 23 - 22
bsp/nxp/imx/imxrt/libraries/drivers/drv_ksz8081.c

@@ -7,6 +7,7 @@
  * Date           Author       Notes
  * Date           Author       Notes
  * 2020-10-14     wangqiang    the first version
  * 2020-10-14     wangqiang    the first version
  * 2022-08-29     xjy198903    add rt1170 support
  * 2022-08-29     xjy198903    add rt1170 support
+ * 2024-04-18     Jiading      add a parameter passed into rt_phy_ops APIs
  */
  */
 
 
 #include <rtthread.h>
 #include <rtthread.h>
@@ -140,7 +141,7 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
     /* Initialization after PHY stars to work. */
     /* Initialization after PHY stars to work. */
     while ((id_reg != PHY_CONTROL_ID1) && (counter != 0))
     while ((id_reg != PHY_CONTROL_ID1) && (counter != 0))
     {
     {
-        phy_ksz8081.ops->read(PHY_ID1_REG, &id_reg);
+        phy_ksz8081.ops->read(NULL, PHY_ID1_REG, &id_reg);
         counter--;
         counter--;
     }
     }
 
 
@@ -151,17 +152,17 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
 
 
     /* Reset PHY. */
     /* Reset PHY. */
     counter = PHY_TIMEOUT_COUNT;
     counter = PHY_TIMEOUT_COUNT;
-    result = phy_ksz8081.ops->write(PHY_BASICCONTROL_REG, PHY_BCTL_RESET_MASK);
+    result = phy_ksz8081.ops->write(NULL, PHY_BASICCONTROL_REG, PHY_BCTL_RESET_MASK);
     if (PHY_STATUS_OK == result)
     if (PHY_STATUS_OK == result)
     {
     {
         #if defined(FSL_FEATURE_PHYKSZ8081_USE_RMII50M_MODE)
         #if defined(FSL_FEATURE_PHYKSZ8081_USE_RMII50M_MODE)
         rt_uint32_t data = 0;
         rt_uint32_t data = 0;
-        result = phy_ksz8081.ops->read(PHY_CONTROL2_REG, &data);
+        result = phy_ksz8081.ops->read(NULL, PHY_CONTROL2_REG, &data);
         if (PHY_STATUS_FAIL == result)
         if (PHY_STATUS_FAIL == result)
         {
         {
             return PHY_STATUS_FAIL;
             return PHY_STATUS_FAIL;
         }
         }
-        result = phy_ksz8081.ops->write(PHY_CONTROL2_REG, (data | PHY_CTL2_REFCLK_SELECT_MASK));
+        result = phy_ksz8081.ops->write(NULL, PHY_CONTROL2_REG, (data | PHY_CTL2_REFCLK_SELECT_MASK));
         if (PHY_STATUS_FAIL == result)
         if (PHY_STATUS_FAIL == result)
         {
         {
             return PHY_STATUS_FAIL;
             return PHY_STATUS_FAIL;
@@ -169,21 +170,21 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
         #endif  /* FSL_FEATURE_PHYKSZ8081_USE_RMII50M_MODE */
         #endif  /* FSL_FEATURE_PHYKSZ8081_USE_RMII50M_MODE */
 
 
         /* Set the negotiation. */
         /* Set the negotiation. */
-        result = phy_ksz8081.ops->write(PHY_AUTONEG_ADVERTISE_REG,
+        result = phy_ksz8081.ops->write(NULL, PHY_AUTONEG_ADVERTISE_REG,
                                         (PHY_100BASETX_FULLDUPLEX_MASK | PHY_100BASETX_HALFDUPLEX_MASK |
                                         (PHY_100BASETX_FULLDUPLEX_MASK | PHY_100BASETX_HALFDUPLEX_MASK |
                                         PHY_10BASETX_FULLDUPLEX_MASK | PHY_10BASETX_HALFDUPLEX_MASK | 0x1U));
                                         PHY_10BASETX_FULLDUPLEX_MASK | PHY_10BASETX_HALFDUPLEX_MASK | 0x1U));
         if (PHY_STATUS_OK == result)
         if (PHY_STATUS_OK == result)
         {
         {
-            result = phy_ksz8081.ops->write(PHY_BASICCONTROL_REG, (PHY_BCTL_AUTONEG_MASK | PHY_BCTL_RESTART_AUTONEG_MASK));
+            result = phy_ksz8081.ops->write(NULL, PHY_BASICCONTROL_REG, (PHY_BCTL_AUTONEG_MASK | PHY_BCTL_RESTART_AUTONEG_MASK));
             if (PHY_STATUS_OK == result)
             if (PHY_STATUS_OK == result)
             {
             {
                 /* Check auto negotiation complete. */
                 /* Check auto negotiation complete. */
                 while (counter--)
                 while (counter--)
                 {
                 {
-                    result = phy_ksz8081.ops->read(PHY_BASICSTATUS_REG, &bss_reg);
+                    result = phy_ksz8081.ops->read(NULL, PHY_BASICSTATUS_REG, &bss_reg);
                     if (PHY_STATUS_OK == result)
                     if (PHY_STATUS_OK == result)
                     {
                     {
-                        phy_ksz8081.ops->read(PHY_CONTROL1_REG, &ctl_reg);
+                        phy_ksz8081.ops->read(NULL, PHY_CONTROL1_REG, &ctl_reg);
                         if (((bss_reg & PHY_BSTATUS_AUTONEGCOMP_MASK) != 0) && (ctl_reg & PHY_LINK_READY_MASK))
                         if (((bss_reg & PHY_BSTATUS_AUTONEGCOMP_MASK) != 0) && (ctl_reg & PHY_LINK_READY_MASK))
                         {
                         {
                             /* Wait a moment for Phy status stable. */
                             /* Wait a moment for Phy status stable. */
@@ -208,7 +209,7 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
 }
 }
 
 
 
 
-static rt_phy_status rt_phy_read(rt_uint32_t reg, rt_uint32_t *data)
+static rt_phy_status rt_phy_read(rt_phy_t *phy, rt_uint32_t reg, rt_uint32_t *data)
 {
 {
     rt_mdio_t *mdio_bus = phy_ksz8081.bus;
     rt_mdio_t *mdio_bus = phy_ksz8081.bus;
     rt_uint32_t device_id = phy_ksz8081.addr;
     rt_uint32_t device_id = phy_ksz8081.addr;
@@ -220,7 +221,7 @@ static rt_phy_status rt_phy_read(rt_uint32_t reg, rt_uint32_t *data)
     return PHY_STATUS_FAIL;
     return PHY_STATUS_FAIL;
 }
 }
 
 
-static rt_phy_status rt_phy_write(rt_uint32_t reg, rt_uint32_t data)
+static rt_phy_status rt_phy_write(rt_phy_t *phy, rt_uint32_t reg, rt_uint32_t data)
 {
 {
     rt_mdio_t *mdio_bus = phy_ksz8081.bus;
     rt_mdio_t *mdio_bus = phy_ksz8081.bus;
     rt_uint32_t device_id = phy_ksz8081.addr;
     rt_uint32_t device_id = phy_ksz8081.addr;
@@ -232,7 +233,7 @@ static rt_phy_status rt_phy_write(rt_uint32_t reg, rt_uint32_t data)
     return PHY_STATUS_FAIL;
     return PHY_STATUS_FAIL;
 }
 }
 
 
-static rt_phy_status rt_phy_loopback(rt_uint32_t mode, rt_uint32_t speed, rt_bool_t enable)
+static rt_phy_status rt_phy_loopback(rt_phy_t *phy, rt_uint32_t mode, rt_uint32_t speed, rt_bool_t enable)
 {
 {
     rt_uint32_t data = 0;
     rt_uint32_t data = 0;
     rt_phy_status result;
     rt_phy_status result;
@@ -250,15 +251,15 @@ static rt_phy_status rt_phy_loopback(rt_uint32_t mode, rt_uint32_t speed, rt_boo
             {
             {
                 data = PHY_BCTL_DUPLEX_MASK | PHY_BCTL_LOOP_MASK;
                 data = PHY_BCTL_DUPLEX_MASK | PHY_BCTL_LOOP_MASK;
             }
             }
-            return phy_ksz8081.ops->write(PHY_BASICCONTROL_REG, data);
+            return phy_ksz8081.ops->write(NULL, PHY_BASICCONTROL_REG, data);
         }
         }
         else
         else
         {
         {
             /* First read the current status in control register. */
             /* First read the current status in control register. */
-            result = phy_ksz8081.ops->read(PHY_CONTROL2_REG, &data);
+            result = phy_ksz8081.ops->read(NULL, PHY_CONTROL2_REG, &data);
             if (PHY_STATUS_OK == result)
             if (PHY_STATUS_OK == result)
             {
             {
-                return phy_ksz8081.ops->write(PHY_CONTROL2_REG, (data | PHY_CTL2_REMOTELOOP_MASK));
+                return phy_ksz8081.ops->write(NULL, PHY_CONTROL2_REG, (data | PHY_CTL2_REMOTELOOP_MASK));
             }
             }
         }
         }
     }
     }
@@ -268,33 +269,33 @@ static rt_phy_status rt_phy_loopback(rt_uint32_t mode, rt_uint32_t speed, rt_boo
         if (PHY_LOCAL_LOOP == mode)
         if (PHY_LOCAL_LOOP == mode)
         {
         {
             /* First read the current status in control register. */
             /* First read the current status in control register. */
-            result = phy_ksz8081.ops->read(PHY_BASICCONTROL_REG, &data);
+            result = phy_ksz8081.ops->read(NULL, PHY_BASICCONTROL_REG, &data);
             if (PHY_STATUS_OK == result)
             if (PHY_STATUS_OK == result)
             {
             {
                 data &= ~PHY_BCTL_LOOP_MASK;
                 data &= ~PHY_BCTL_LOOP_MASK;
-                return phy_ksz8081.ops->write(PHY_BASICCONTROL_REG, (data | PHY_BCTL_RESTART_AUTONEG_MASK));
+                return phy_ksz8081.ops->write(NULL, PHY_BASICCONTROL_REG, (data | PHY_BCTL_RESTART_AUTONEG_MASK));
             }
             }
         }
         }
         else
         else
         {
         {
             /* First read the current status in control one register. */
             /* First read the current status in control one register. */
-            result = phy_ksz8081.ops->read(PHY_CONTROL2_REG, &data);
+            result = phy_ksz8081.ops->read(NULL, PHY_CONTROL2_REG, &data);
             if (PHY_STATUS_OK == result)
             if (PHY_STATUS_OK == result)
             {
             {
-                return phy_ksz8081.ops->write(PHY_CONTROL2_REG, (data & ~PHY_CTL2_REMOTELOOP_MASK));
+                return phy_ksz8081.ops->write(NULL, PHY_CONTROL2_REG, (data & ~PHY_CTL2_REMOTELOOP_MASK));
             }
             }
         }
         }
     }
     }
     return result;
     return result;
 }
 }
 
 
-static rt_phy_status get_link_status(rt_bool_t *status)
+static rt_phy_status get_link_status(rt_phy_t *phy, rt_bool_t *status)
 {
 {
     rt_phy_status result;
     rt_phy_status result;
     rt_uint32_t data;
     rt_uint32_t data;
 
 
     /* Read the basic status register. */
     /* Read the basic status register. */
-    result = phy_ksz8081.ops->read(PHY_BASICSTATUS_REG, &data);
+    result = phy_ksz8081.ops->read(NULL, PHY_BASICSTATUS_REG, &data);
     if (PHY_STATUS_OK == result)
     if (PHY_STATUS_OK == result)
     {
     {
         if (!(PHY_BSTATUS_LINKSTATUS_MASK & data))
         if (!(PHY_BSTATUS_LINKSTATUS_MASK & data))
@@ -310,13 +311,13 @@ static rt_phy_status get_link_status(rt_bool_t *status)
     }
     }
     return result;
     return result;
 }
 }
-static rt_phy_status get_link_speed_duplex(rt_uint32_t *speed, rt_uint32_t *duplex)
+static rt_phy_status get_link_speed_duplex(rt_phy_t *phy, rt_uint32_t *speed, rt_uint32_t *duplex)
 {
 {
     rt_phy_status result = PHY_STATUS_OK;
     rt_phy_status result = PHY_STATUS_OK;
     rt_uint32_t data, ctl_reg;
     rt_uint32_t data, ctl_reg;
 
 
     /* Read the control two register. */
     /* Read the control two register. */
-    result = phy_ksz8081.ops->read(PHY_CONTROL1_REG, &ctl_reg);
+    result = phy_ksz8081.ops->read(NULL, PHY_CONTROL1_REG, &ctl_reg);
     if (PHY_STATUS_OK == result)
     if (PHY_STATUS_OK == result)
     {
     {
         data = ctl_reg & PHY_CTL1_SPEEDUPLX_MASK;
         data = ctl_reg & PHY_CTL1_SPEEDUPLX_MASK;

+ 12 - 11
bsp/nxp/imx/imxrt/libraries/drivers/drv_rtl8211f.c

@@ -6,6 +6,7 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2022-08-15     xjy198903    the first version
  * 2022-08-15     xjy198903    the first version
+ * 2024-04-18     Jiading      add a parameter passed into rt_phy_ops APIs
  */
  */
 #include <rtthread.h>
 #include <rtthread.h>
 
 
@@ -215,7 +216,7 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
     /* Check PHY ID. */
     /* Check PHY ID. */
     do
     do
     {
     {
-        result = phy_rtl8211f.ops->read(PHY_ID1_REG, &regValue);
+        result = phy_rtl8211f.ops->read(NULL, PHY_ID1_REG, &regValue);
         if (result != PHY_STATUS_OK)
         if (result != PHY_STATUS_OK)
         {
         {
             return result;
             return result;
@@ -244,7 +245,7 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
     }
     }
 
 
     /* Set Tx Delay */
     /* Set Tx Delay */
-    result = phy_rtl8211f.ops->read(PHY_RGMII_TX_DELAY_REG, &regValue);
+    result = phy_rtl8211f.ops->read(NULL, PHY_RGMII_TX_DELAY_REG, &regValue);
     if (PHY_STATUS_OK == result)
     if (PHY_STATUS_OK == result)
     {
     {
         regValue |= PHY_RGMII_TX_DELAY_MASK;
         regValue |= PHY_RGMII_TX_DELAY_MASK;
@@ -260,7 +261,7 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
     }
     }
 
 
     /* Set Rx Delay */
     /* Set Rx Delay */
-    result = phy_rtl8211f.ops->read(PHY_RGMII_RX_DELAY_REG, &regValue);
+    result = phy_rtl8211f.ops->read(NULL, PHY_RGMII_RX_DELAY_REG, &regValue);
     if (PHY_STATUS_OK == result)
     if (PHY_STATUS_OK == result)
     {
     {
         regValue |= PHY_RGMII_RX_DELAY_MASK;
         regValue |= PHY_RGMII_RX_DELAY_MASK;
@@ -298,7 +299,7 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
         result = phy_rtl8211f.ops->write(PHY_1000BASET_CONTROL_REG, PHY_1000BASET_FULLDUPLEX_MASK);
         result = phy_rtl8211f.ops->write(PHY_1000BASET_CONTROL_REG, PHY_1000BASET_FULLDUPLEX_MASK);
         if (result == PHY_STATUS_OK)
         if (result == PHY_STATUS_OK)
         {
         {
-            result = phy_rtl8211f.ops->read(PHY_BASICCONTROL_REG, &regValue);
+            result = phy_rtl8211f.ops->read(NULL, PHY_BASICCONTROL_REG, &regValue);
             if (result == PHY_STATUS_OK)
             if (result == PHY_STATUS_OK)
             {
             {
                 result = phy_rtl8211f.ops->write(PHY_BASICCONTROL_REG, (regValue | PHY_BCTL_AUTONEG_MASK | PHY_BCTL_RESTART_AUTONEG_MASK));
                 result = phy_rtl8211f.ops->write(PHY_BASICCONTROL_REG, (regValue | PHY_BCTL_AUTONEG_MASK | PHY_BCTL_RESTART_AUTONEG_MASK));
@@ -309,7 +310,7 @@ static rt_phy_status rt_phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t
     return result;
     return result;
 }
 }
 
 
-static rt_phy_status rt_phy_read(rt_uint32_t reg, rt_uint32_t *data)
+static rt_phy_status rt_phy_read(rt_phy_t *phy, rt_uint32_t reg, rt_uint32_t *data)
 {
 {
     rt_mdio_t *mdio_bus = phy_rtl8211f.bus;
     rt_mdio_t *mdio_bus = phy_rtl8211f.bus;
     rt_uint32_t device_id = phy_rtl8211f.addr;
     rt_uint32_t device_id = phy_rtl8211f.addr;
@@ -321,7 +322,7 @@ static rt_phy_status rt_phy_read(rt_uint32_t reg, rt_uint32_t *data)
     return PHY_STATUS_FAIL;
     return PHY_STATUS_FAIL;
 }
 }
 
 
-static rt_phy_status rt_phy_write(rt_uint32_t reg, rt_uint32_t data)
+static rt_phy_status rt_phy_write(rt_phy_t *phy, rt_uint32_t reg, rt_uint32_t data)
 {
 {
     rt_mdio_t *mdio_bus = phy_rtl8211f.bus;
     rt_mdio_t *mdio_bus = phy_rtl8211f.bus;
     rt_uint32_t device_id = phy_rtl8211f.addr;
     rt_uint32_t device_id = phy_rtl8211f.addr;
@@ -333,7 +334,7 @@ static rt_phy_status rt_phy_write(rt_uint32_t reg, rt_uint32_t data)
     return PHY_STATUS_FAIL;
     return PHY_STATUS_FAIL;
 }
 }
 
 
-static rt_phy_status rt_phy_loopback(rt_uint32_t mode, rt_uint32_t speed, rt_bool_t enable)
+static rt_phy_status rt_phy_loopback(rt_phy_t *phy, rt_uint32_t mode, rt_uint32_t speed, rt_bool_t enable)
 {
 {
     /* This PHY only supports local loopback. */
     /* This PHY only supports local loopback. */
     //    rt_assert(mode == PHY_LOCAL_LOOP);
     //    rt_assert(mode == PHY_LOCAL_LOOP);
@@ -361,7 +362,7 @@ static rt_phy_status rt_phy_loopback(rt_uint32_t mode, rt_uint32_t speed, rt_boo
     else
     else
     {
     {
         /* First read the current status in control register. */
         /* First read the current status in control register. */
-        result = phy_rtl8211f.ops->read(PHY_BASICCONTROL_REG, &regValue);
+        result = phy_rtl8211f.ops->read(NULL, PHY_BASICCONTROL_REG, &regValue);
         if (result == PHY_STATUS_OK)
         if (result == PHY_STATUS_OK)
         {
         {
             regValue &= ~PHY_BCTL_LOOP_MASK;
             regValue &= ~PHY_BCTL_LOOP_MASK;
@@ -371,7 +372,7 @@ static rt_phy_status rt_phy_loopback(rt_uint32_t mode, rt_uint32_t speed, rt_boo
     return result;
     return result;
 }
 }
 
 
-static rt_phy_status get_link_status(rt_bool_t *status)
+static rt_phy_status get_link_status(rt_phy_t *phy, rt_bool_t *status)
 {
 {
     // assert(status);
     // assert(status);
 
 
@@ -396,7 +397,7 @@ static rt_phy_status get_link_status(rt_bool_t *status)
     return result;
     return result;
 }
 }
 
 
-static rt_phy_status get_link_speed_duplex(rt_uint32_t *speed, rt_uint32_t *duplex)
+static rt_phy_status get_link_speed_duplex(rt_phy_t *phy, rt_uint32_t *speed, rt_uint32_t *duplex)
 {
 {
     // assert(!((speed == NULL) && (duplex == NULL)));
     // assert(!((speed == NULL) && (duplex == NULL)));
 
 
@@ -404,7 +405,7 @@ static rt_phy_status get_link_speed_duplex(rt_uint32_t *speed, rt_uint32_t *dupl
     uint32_t regValue;
     uint32_t regValue;
 
 
     /* Read the status register. */
     /* Read the status register. */
-    result = phy_rtl8211f.ops->read(PHY_SPECIFIC_STATUS_REG, &regValue);
+    result = phy_rtl8211f.ops->read(NULL, PHY_SPECIFIC_STATUS_REG, &regValue);
     if (result == PHY_STATUS_OK)
     if (result == PHY_STATUS_OK)
     {
     {
         if (speed != NULL)
         if (speed != NULL)

+ 5 - 5
components/drivers/include/drivers/phy.h

@@ -55,11 +55,11 @@ typedef rt_int32_t rt_phy_status;
 struct rt_phy_ops
 struct rt_phy_ops
 {
 {
     rt_phy_status (*init)(void *object, rt_uint32_t phy_addr, rt_uint32_t src_clock_hz);
     rt_phy_status (*init)(void *object, rt_uint32_t phy_addr, rt_uint32_t src_clock_hz);
-    rt_phy_status (*read)(rt_uint32_t reg, rt_uint32_t *data);
-    rt_phy_status (*write)(rt_uint32_t reg, rt_uint32_t data);
-    rt_phy_status (*loopback)(rt_uint32_t mode, rt_uint32_t speed, rt_bool_t enable);
-    rt_phy_status (*get_link_status)(rt_bool_t *status);
-    rt_phy_status (*get_link_speed_duplex)(rt_uint32_t *speed, rt_uint32_t *duplex);
+    rt_phy_status (*read)(rt_phy_t *phy, rt_uint32_t reg, rt_uint32_t *data);
+    rt_phy_status (*write)(rt_phy_t *phy, rt_uint32_t reg, rt_uint32_t data);
+    rt_phy_status (*loopback)(rt_phy_t *phy, rt_uint32_t mode, rt_uint32_t speed, rt_bool_t enable);
+    rt_phy_status (*get_link_status)(rt_phy_t *phy, rt_bool_t *status);
+    rt_phy_status (*get_link_speed_duplex)(rt_phy_t *phy, rt_uint32_t *speed, rt_uint32_t *duplex);
 };
 };
 
 
 rt_err_t rt_hw_phy_register(struct rt_phy_device *phy, const char *name);
 rt_err_t rt_hw_phy_register(struct rt_phy_device *phy, const char *name);