151-5197-5087
扬州华为授权服务中心
当前位置:网站首页 > 网络设备调试 正文 网络设备调试

RK3568 + YT9215交换机芯片调试

2024-12-09 21:54:55 网络设备调试 27 ℃ 0 评论

本文目的在于介绍一种在rk3568上驱动YT9215的方法,方法是参考DSA驱动(Distributed Switch Architecture drivers)和switch厂家提供的“yt_smi_mib_rw.c”修改而来。因为DSA在低版本的内核的stmmac驱动未被支持,所以对于较低版本的内核该方法未必适用,这里选用的linux内核版本为5.10.198。
硬件连接上采用mac to mac的连接方式,将rk3568通过RGMII接口连接到YT9215的gmac8上。YT9215的管理接口支持MDIO、I2C和SPI。下面适配过程将以MDIO接口为例。另外软件方面因YT9215是一颗switch芯片,所以rk3568的gmac将采用fixed-link方式。

1.stmmac

为了更好的理解整个过程,下面针对stmmac驱动做一个简单的梳理分析。stmmac驱动源码位于“drivers/net/ethernet/stmicro/stmmac”目录下,调用关系如下:

module_platform_driver(rk_gmac_dwmac_driver);  //注册一个platform_driver  《dwmac-rk.c》
    rk_gmac_probe()
        stmmac_probe_config_dt()    //对dts中的gmac节点惊进行解析  《stmmac_platform.c》
            plat->phy_node = of_parse_phandle(np, "phy-handle", 0);  //解析phy-handle
            stmmac_dt_phy()
    stmmac_dvr_probe()       //   《stmmac_main.c》
        stmmac_mdio_register()   //注册mdio bus    《stmmac_mdio.c》
            of_mdiobus_register()     // 《linux/of_mdio.h》
  • stmmac_dt_phy函数
static int stmmac_dt_phy(struct plat_stmmacenet_data *plat,
                         struct device_node *np, struct device *dev)
{
   
        bool mdio = !of_phy_is_fixed_link(np);        /*判断gmac中是否配置了fixed_link,当配置fixed_link时mdio=flase*/
        static const struct of_device_id need_mdio_ids[] = {
   
                {
    .compatible = "snps,dwc-qos-ethernet-4.10" },
                {
   },
        };
        //dts中可以看到没有定义“snps,dwc-qos-ethernet-4.10”,所以下面的if会进入else的流程。
        if (of_match_node(need_mdio_ids, np)) {
   
                plat->mdio_node = of_get_child_by_name(np, "mdio");  
        } else {
   
                /**
                 * 遍历np(dts中的gmac节点),每次都会将获取的子节点存放在plat->mdio_node中,
                 * 然后判断子节点的"compatible"值是不是"snps,dwmac-mdio",匹配成功将会break。
                 * break的时候plat->mdio_node中存放的就是匹配到的结果。
                 * 这个地方必须能匹配到否则没法注册mdio bus。
                 */
                for_each_child_of_node(np, plat->mdio_node) {
   
                        if (of_device_is_compatible(plat->mdio_node,
                                                    "snps,dwmac-mdio"))
                                break;
                }
        }
        /* plat->mdio_node非空,所以会进入if语句,mdio将被设置成true*/         
        if (plat->mdio_node) {
   
                dev_dbg(dev, "Found MDIO subnode\n");
                mdio = true;
        }
        /*mdio为true时,将会为mdio_bus_data申请内存空间,
        * 后面stmmac_mdio_register时将需要这个数据。
        */
        if (mdio) {
   
                plat->mdio_bus_data =
                        devm_kzalloc(dev, sizeof(struct stmmac_mdio_bus_data),
                                     GFP_KERNEL);
                if (!plat->mdio_bus_data)
                        

版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接

请在这里放置你的在线分享代码
«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接