本文目的在于介绍一种在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方式。
为了更好的理解整个过程,下面针对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》
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)
版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接。
请在这里放置你的在线分享代码