【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析

1.mac控制器,phy芯片,rgmii协议
2.寄存器介绍
3.驱动源码解析
4.nanopi t2 移植rtl8211e网卡驱动(首发)

驱动注册入口

驱动的注册分两个部分,一个部分是静态编译的时候就会注册好,另一个是动态注册。动态网络驱动注册的入口主要是从initr_net进入,不熟悉源码的参见我的uboot源码解析
board_r.c
在这里插入图片描述
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第1张图片
从eth_initialize进入eth.c,继续初始化网络,检查有没有网卡等等
eth.c
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第2张图片
eth_common_init做一些框架初始化和phy驱动的注册,最后注册扳级初始化代码,我这里使用的设备树,不存在扳级代码,有需要添加扳级操作,例如GPIO设置的可以添加到board_eth_init,这两个函数都是弱引用,不写就是空的代替。
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第3张图片
phy_init()会做PHY驱动的注册,可以看到有realtek的驱动注册。
phy.c
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第4张图片

cpu_eth_init

cpu级别的初始话和设备注册在上面eth_common_init的最后cpu_eth_init函数进行。
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第5张图片
忽略其他部分,直接看sunxi_gmac_initialize

gmac.c

忽略sunxi_gmac_initialize中的其他部分,看到designware_initialize
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第6张图片

designware_initialize

【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第7张图片
网络设备就这里注册了dw_eth_init dw_eth_send dw_eth_recv dw_eth_halt 这几个函数比较重要,后面数据传输的时候分析。dw_mdio_init dw_phy_init在驱动匹配的时候又调用了一次,后面匹配的时候分析。

驱动的匹配

驱动的动态注册讲完了,下面看一下驱动的probe
先是gmac驱动的匹配,gmac驱动使用的是designware.c这个是在静态编译的时候就已经注册好了的,通过设备树中的compatible匹配到就开始初始化。我这边设备树的compatible值是compatible = "nexell,nexell-gmac"
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第8张图片
probe里面对gmac进行初始化:nexell_gmac_initialize,mdio管理接口初始化:dw_mdio_init,phy初始化:dw_phy_init
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第9张图片

nexell_gmac_initialize

nexell_gmac_initialize只要设置gamc工作频率,以及复位gmac
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第10张图片

dw_mdio_init

dw_mdio_init主要注册管理接口的读写函数,读写类似I2C
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第11张图片
看一下读写函数
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第12张图片
给出读取地址和寄存器就可以了,devad应该是没什么作用的。

dw_phy_init设置PHY支持的速度PHY_GBIT_FEATURES基本所有速度都有,不展开,初始化PHY驱动,调用之前注册好的初始化函数。
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第13张图片
phy_config会调用到realtek phy驱动的config函数,看一下realtek phy的驱动

realtek.c

【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第14张图片
上面的config就调用到这里了,这里主要重启PHY和禁用中断,然后跳转到通用初始化phy.c中,其实这里的realtek.c和phy.c是一个层次的,realtek.c是phy.c抽出的特殊配置。
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第15张图片
匹配的关键信息到这里就结束了。

数据通信

终于到最后的数据通信部分了

设备初始化

这里的设备初始化是指抽象意义上的,主要是完成dev抽象设备的初始化,完成链路速度匹配,分配DMA传输控制块,DMA内存等等。
首当其冲的就是上面留下的悬念函数dw_eth_init了
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第16张图片
这里面主要是以下四个函数
rx_descs_init
tx_descs_init
phy_startup
dw_adjust_link

rx_descs_init

【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第17张图片
主要就是初始化dmamacdescr 结构体,这个就是前面寄存器部分讲的DMA控制符
dmamacdescr 结构体

struct dmamacdescr {
	u32 txrx_status;
	u32 dmamac_cntl;
	u32 dmamac_addr;
	u32 dmamac_next;
} __aligned(ARCH_DMA_MINALIGN);

DMA不展开解释,基本流程就是使用这个描述符信息进行数据传输,完成一个通过dmamac_next寻找下一个继续传输。这里dmamacdescr被放在数组里面的,并且最后一个的next是第一个,形成一个循环单向链表。dmamac_addr为需要传送的数据存放的地址,也是一个数组。tx_descs_init类似。

phy_startup

phy_startup最终调用的是realtek驱动中的开始函数
realtek.c
在这里插入图片描述
phy.c
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第18张图片
主要通过mii管理接口设置链路,参考寄存器,不展开。
【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第19张图片
主要获取phy的连接速度,使用命令的时候显示的速度就是这里来的。

dw_adjust_link

【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第20张图片
根据上一步获取的速度重新配置gmac速度使之匹配。

发送数据

终于到了最后的发送数据部分了

dw_eth_send

【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析_第21张图片
主要流程解析:

  • invalidate_dcache_range:禁用cache
  • memcpy:拷贝传送数据
  • flush_dcache_range:将cache写入内存(主要操作cp15寄存器)。DMA读写内存,必须确保数据写入内存
  • writel(POLL_DATA, &dma_p->txpolldemand):开始DMA传送,寄存器篇有讲过一个txpolldemand寄存器就是这个。
    接收数据类似,到这里整个流程就结束了。

你可能感兴趣的:(uboot,uboot,源码解析,gmac,驱动程序,嵌入式)