QCA9531 MAC分析
1 硬件
QCA9531的硬件上有GMAC0和GMAC1,GMAC1通过GMII/MII接口连接到内部的switch上,GMAC0可以通过配置实现几种不同的连接
1,GMAC0可以连接到P4或者P4 FE(Fast Ethernet) PHY端口,GMAC1连接到以太网交换机用于并且用于控制剩余的4个FE端口
2,如果SW_ONLY_MODE置位,GMAC0不连接到任何地方,GMAC1连接到以太网交换机并且控制剩余的5个FE端口
内部的5口以太网交换机
1,通过GMAC1管理接口寄存器和MDC,MDIO进行配置
2,第5口(PORT4)可配置为WAN口
3,第1口(PORT0)可以被配置为连接一个外部管理CPU或者内部CPU
2 软件
GMAC0和GMAC1使用了Linux下的平台设备驱动框架,如下:
ath79
dev-eth.c
struct ag71xx_platform_data ath79_eth0_data = {
.reset_bit = AR71XX_RESET_GE0_MAC,
};
struct platform_device ath79_eth0_device = {
.name = "ag71xx",
.id = 0,
.resource = ath79_eth0_resources,
.num_resources = ARRAY_SIZE(ath79_eth0_resources),
.dev = {
.platform_data = &ath79_eth0_data,
},
};
static struct resource ath79_eth1_resources[] = {
{
.name = "mac_base",
.flags = IORESOURCE_MEM,
.start = AR71XX_GE1_BASE,
.end = AR71XX_GE1_BASE + 0x200 - 1,
}, {
.name = "mac_irq",
.flags = IORESOURCE_IRQ,
.start = ATH79_CPU_IRQ(5),
.end = ATH79_CPU_IRQ(5),
},
};
struct ag71xx_platform_data ath79_eth1_data = {
.reset_bit = AR71XX_RESET_GE1_MAC,
};
struct platform_device ath79_eth1_device = {
.name = "ag71xx",
.id = 1,
.resource = ath79_eth1_resources,
.num_resources = ARRAY_SIZE(ath79_eth1_resources),
.dev = {
.platform_data = &ath79_eth1_data,
},
};
struct ag71xx_switch_platform_data ath79_switch_data;
如上定义了GMAC0和GMAC1的platform device
定义了platform_device ath79_eth0_device和platform_device ath79_eth1_device
在板级描述文件根据硬件的实际连接方法填充ath79_eth1_data, ath79_eth0_data以及ath79_switch_data
void __init ath79_register_eth(unsigned int id)函数中,根据id获取不同的platform_device,
大多数情况下,当id为1时,将ath79_switch_data的地址存放在 pdata->switch_data中
最后调用platform_device_register将此设备注册到系统中,这个平台设备将来会作为网络设备
根据设备名称为"ag71xx",我们支持platform_devices是根据名字进行match,因此驱动的名字也应该为ag71xx, 如下
我们在Linux源码中进行搜索,在ag71xx_main.c中看到一个如下的定义
static struct platform_driver ag71xx_driver = {
.probe = ag71xx_probe,
.remove = ag71xx_remove,
.driver = {
.name = AG71XX_DRV_NAME,
}
};
因此我们知道,驱动会进入到ag71xx_probe函数中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律