ingenic-mac驱动框架

ingenic-mac驱动框架 阿帅 2023-11-15 14:00:36 789

概述

本文记录君正x1600、x1000(将停产)soc内置mac驱动框架,若设备涉及网卡驱动调试,可能需要看mac框架相关代码,内容如下.

platfrom驱动

君正mac驱动类型为platform总线驱动

platform device

static struct platform_device jz_mac_device = {
    .name     = STMMAC_RESOURCE_NAME,
    .id       = 0,
    .dev = {
        .platform_data = &jz_mii_bus_device,
        .release       = jz_mac_device_release,
    },
    .num_resources     = ARRAY_SIZE(jz_mac_resources),
    .resource          = jz_mac_resources,
};

resource: io、irq资源,通过芯片PM文档获取。
platform_data:

static struct plat_stmmacenet_data jz_mii_bus_device = {
    .bus_id = 0,
    .phy_addr = -1,
    .interface = PHY_INTERFACE_MODE_RMII,
    .mdio_bus_data = &stmmac_mdio_bus_data,
    .max_speed = 100,
    .maxmtu = 1500,
    .clk_delay_us = 0,
    .init = jz_mac_init,
    .exit = jz_mac_exit,
};

platform_data用于提供给驱动使用,用于获取mac硬件接口的配置信息,其中init将在驱动probe时执行
jz_mac_init: 对mac控制器gpio引脚做初始化、时钟初始化等硬件相关操作。

phy_clk = clk_get(NULL, "div_macphy");
clk_set_rate(phy_clk, MAC_INTERFACE_RMII_RATE);

gpio_request(phy_power_gpio, "mac_power_reset");
gpio_direction_output(phy_power_gpio, phy_power_level);

gpio_request(phy_reset_gpio, "mac_phy_reset");
gpio_direction_output(phy_reset_gpio, !phy_reset_level);

platform driver

struct platform_driver stmmac_pltfr_driver = {
    .probe = stmmac_pltfr_probe,
    .remove = stmmac_pltfr_remove,
    .driver = {
        .name = STMMAC_RESOURCE_NAME,
        .owner = THIS_MODULE,
        .pm = &stmmac_pltfr_pm_ops,
        },
};

driver通过name和device匹配后,进入probe

stmmac_pltfr_probe(struct platform_device *pdev)
    stmmac_get_platfrom_resources(pdev, &stmmac_res); //获取device resource
    plat_dat = dev_get_platdata(&pdev->dev);//获取device platform_data(device私有数据)
    // 硬件相关操作。执行platform_device.dev.platform_data.init()
    plat_dat->init(pdev, plat_dat->bsp_priv);
    // driver和device匹配处理
    stmmac_dvr_probe(&(pdev->dev), plat_dat, &stmmac_res)

stmmac_dvr_probe(&(pdev->dev), plat_dat, &stmmac_res)
pdev->dev: 即platform_device.dev,包含硬件信息
plat_dat:platform_device.dev.platform_data -》 转成私有数据结构体
stmmac_res: platform_device.resource,IO、irq硬件资源

stmmac_dvr_probe(&(pdev->dev), plat_dat, &stmmac_res)
    struct net_device *ndev = NULL; //网络设备
    struct stmmac_priv *priv; // 私有数据
    ndev = alloc_etherdev(sizeof(struct stmmac_priv));
    //将device赋给net_device
    SET_NETDEV_DEV(ndev, device);
    //获取私有数据地址
    priv = netdev_priv(ndev);
    priv->device = device;
    priv->dev = ndev;
    // 初始化net_device
    ether_setup(ndev); 
    // 初始化ethtool结构体
    stmmac_set_ethtool_ops(ndev);
        netdev->ethtool_ops = &stmmac_ethtool_ops;
    // 拷贝资源信息
    priv->pause = pause;
    priv->plat = plat_dat;
    priv->ioaddr = res->addr;
    priv->dev->base_addr = (unsigned long)res->addr;
    priv->dev->irq = res->irq;  
    // platform_device.dev.driver_data <- net_device
    dev_set_drvdata(device, priv->dev);
    // 获取和使能mac控制器时钟
    priv->stmmac_clk = devm_clk_get(priv->device, "gate_gmac0");
    clk_prepare_enable(priv->stmmac_clk);
    // 初始化时钟后,是否需要delay
    if (priv->plat->clk_delay_us)
        usleep_range(priv->plat->clk_delay_us, priv->plat->clk_delay_us);
    // 初始化struct mac_device_info 结构体(存放mac控制器信息),并初始化mac设备
    stmmac_hw_init()
    // 填充net_device ops 处理接口
    ndev->netdev_ops = &stmmac_netdev_ops;
    // 注册网卡软中断,并poll以及处理该中断
    netif_napi_add(ndev, &priv->napi, stmmac_poll, 64);
    // 注册mdio操作接口,mac通过该接口获取和设置网卡
    stmmac_mdio_register(ndev);
        new_bus = mdiobus_alloc();
        new_bus->read = &stmmac_mdio_read;
        new_bus->write = &stmmac_mdio_write;
        new_bus->reset = &stmmac_mdio_reset;
        mdiobus_register(new_bus);
            __mdiobus_register
                // 扫描网卡设备
                phydev = mdiobus_scan(bus, i);
                    get_phy_device
                        // 通过上面的mii_bus.read接口获取网卡id号
                        get_phy_id
                // 如果找到了网卡设备,将其放到mii_bus.phy_map中
                phy_device_register(phydev);
    // 注册网卡设备
    ret = register_netdev(ndev);

总结

1、确定网卡连接方式
mii或rmii接口连接方式的网卡,硬件部分包括:mac控制器,mii总线,phy网卡
2、驱动采用platform总线驱动框架,包括:
mac控制器:platform device
mac驱动:platform driver
3、probe流程

  • mac时钟、irq、io口的初始化
  • mii总线初始化,并提供mii操作接口,用于mac控制器和phy网卡之间的通信
  • 通过mii总线获取网卡设备信息,构造net_device结构体,并初始化phy网卡
  • 创建网卡软中断,提供中断处理接口,并通过poll监听中断并调用
  • 注册网卡设备
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
阿帅
红包 2 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
阿帅
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区