技术专栏
ingenic-mac驱动框架
概述
本文记录君正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个
手气红包
暂无数据
相关专栏
-
浏览量:3954次2020-10-21 15:44:26
-
浏览量:1072次2024-02-05 11:02:54
-
浏览量:7031次2020-08-14 11:34:19
-
浏览量:1673次2019-12-03 16:26:29
-
2023-12-27 15:03:48
-
浏览量:854次2023-06-12 14:34:15
-
浏览量:2991次2020-08-18 20:29:07
-
浏览量:3038次2022-04-01 09:00:17
-
浏览量:3326次2020-04-10 11:14:21
-
浏览量:2567次2018-10-08 15:41:20
-
浏览量:2182次2020-07-09 10:36:39
-
浏览量:1664次2022-10-24 10:09:51
-
浏览量:1886次2018-04-05 19:06:53
-
浏览量:4636次2020-04-23 20:06:57
-
2022-03-29 09:00:13
-
浏览量:2363次2023-06-12 14:34:18
-
浏览量:1406次2018-09-28 18:49:59
-
浏览量:7008次2022-03-21 09:00:27
-
浏览量:2165次2021-12-30 13:59:29
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
阿帅
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注