RK3568 + YT9215交换机芯片调试

本文详细介绍了在RK3568平台上,如何通过Linux内核5.10.198驱动YT9215交换机芯片,涉及stmmac驱动分析、dts配置、MDIO接口注册以及问题排查。针对stmmac驱动的流程,解析了如何绕过条件判断注册MDIO设备,并在YT9215驱动中完成设备与驱动的关联。同时,列举了移植后可能遇到的问题及解决方法,如DMA初始化失败和RX数据丢失等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文目的在于介绍一种在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)
                        return 
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘忽不定的bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值