• 【BRCM】博通ESDK6.5中添加50210S光口驱动及配置光电自适应的实例



    ENV

    H/W

    1. SOC:bcm47623L
    2. PHY:bcm50210S (RGMII)

    S/W

    1. SDK:ESDK6.5ga
    2. kernel:linux-4.19

    需求

    1. SOC - RGMII - 50210

    2. 50210 auto detect :Copper/Fiber


    需求分析

    需求分析:1. SOC - RGMII - 50210

    需要SOC提供一个RGMII的port给这个PHY

    需求分析:2. 50210 auto detect :Copper/Fiber

    配置switch的寄存器就可以实现切换
    在phy init阶段配置修改初始化寄存器可以实现auto功能


    解决方案

    1. 添加PHY信息到DTS,开放RGMII接口给PHY
    # 添加 RGMII pinctrl
    +    pinctrl-names = "default", "rgmii";
    +    pinctrl-0 = <&a_rgmii_mdc_pin_68 &a_rgmii_mdio_pin_69 &rgmii_pins>;
    +    pinctrl-1 = <&rgmii_pins>;
    
    # 添加 RGMII PORT1
    +            port1@1 {
    +            	phy-handle = <&phy_rgmii>;
    +            	mii-pinctrl-state = "rgmii";
    +            	phy-mode = "rgmii";
    +            	rgmii-3p3v;
    +            	status = "okay";
    +			};
    # 修改 PHYAD
                    phy_rgmii:rgmii {
    +                       reg = <0>;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 初始化中添加修改寄存器的程序段:实现AUTO功能
     static int phy_init (phy_dev_t *phy_dev)
     {
    ...
    +    if (0x0 == phy_dev->addr) // PHYAD
    +    {
    +        int ret = 0;
    +        ret = rgmii_to_copper_fiber_auto_detect(phy_dev);
    +        if (ret)
    +            printk("rgmii_to_copper_fiber_auto_detect have error\n");
    +    }
    
    # 配置寄存器函数rgmii_to_copper_fiber_auto_detect():
    phy_dev_write(phy_dev, RDB_ACCESS | 0x..... 0x....); // EXT REG
    ...
    phy_dev_write(phy_dev, MII_BMCR, 0x....); // MII
    ....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    PS: 上述配置寄存器时,具体寄存器参数需要更具bcm50210S寄存器文档说明来修改。

    1. 驱动中添加1000Base-X支持
    # 添加1000Base-X宏
    +#define ESTATUS_1000_XFULL      0x8000  /* Can do 1000BX Full                   */
    +#define ESTATUS_1000_XHALF      0x4000  /* Can do 1000BX Half                   */
    # 驱动
    # 1. mii驱动中添加phy_drv_brcm.h的头文件,
    # 2. mii_caps_get()中添加Fiber判断程序,并初始化1000BX标志信息
    # 2.1 判断EXT REG | 0x21 的标志位,判断是否为Fiber。
    # 2.2 判断Fiber后修改adv标志 & 1000BX = xxxxxx
    # 2.3 修改链接状态位,添加判断程序。(1000 0100与电口标志位不重合)
    # 3. mii_cpas_set()与上述方式类似,添加对Fiber的判断与标志位修改。(注意不要移除非光口程序段)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    小结

    1. 添加PHY信息到DTS,开放RGMII接口给PHY
    2. 初始化中添加修改寄存器的程序段
    3. 驱动中添加1000Base-X支持
  • 相关阅读:
    [算法]数组给定长度的所有排列
    内存取证系列3
    Debezium系列之:支持 mysql8 的 set role 语句
    【探索排序算法的魅力:优化、性能与实用技巧】
    8086与8088
    shiroFilter配置详解
    数据库中的undo与redo的作用
    网络-fetch
    python入门基础(7)--字典及相关操作
    MySQL模块---查询和插入数据
  • 原文地址:https://blog.csdn.net/yujianliam/article/details/125618315