1.mac控制器,phy芯片,rgmii协议
2.寄存器介绍
3.驱动源码解析
4.nanopi t2 移植rtl8211e网卡驱动(首发)
驱动的注册分两个部分,一个部分是静态编译的时候就会注册好,另一个是动态注册。动态网络驱动注册的入口主要是从initr_net进入,不熟悉源码的参见我的uboot源码解析
board_r.c
从eth_initialize进入eth.c,继续初始化网络,检查有没有网卡等等
eth.c
eth_common_init做一些框架初始化和phy驱动的注册,最后注册扳级初始化代码,我这里使用的设备树,不存在扳级代码,有需要添加扳级操作,例如GPIO设置的可以添加到board_eth_init,这两个函数都是弱引用,不写就是空的代替。
phy_init()会做PHY驱动的注册,可以看到有realtek的驱动注册。
phy.c
cpu级别的初始话和设备注册在上面eth_common_init的最后cpu_eth_init
函数进行。
忽略其他部分,直接看sunxi_gmac_initialize
忽略sunxi_gmac_initialize中的其他部分,看到designware_initialize
网络设备就这里注册了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"
probe里面对gmac进行初始化:nexell_gmac_initialize
,mdio管理接口初始化:dw_mdio_init
,phy初始化:dw_phy_init
nexell_gmac_initialize
只要设置gamc工作频率,以及复位gmac
dw_mdio_init
主要注册管理接口的读写函数,读写类似I2C
看一下读写函数
给出读取地址和寄存器就可以了,devad应该是没什么作用的。
dw_phy_init
设置PHY支持的速度PHY_GBIT_FEATURES
基本所有速度都有,不展开,初始化PHY驱动,调用之前注册好的初始化函数。
phy_config会调用到realtek phy驱动的config函数,看一下realtek phy的驱动
上面的config就调用到这里了,这里主要重启PHY和禁用中断,然后跳转到通用初始化phy.c中,其实这里的realtek.c和phy.c是一个层次的,realtek.c是phy.c抽出的特殊配置。
匹配的关键信息到这里就结束了。
终于到最后的数据通信部分了
这里的设备初始化是指抽象意义上的,主要是完成dev抽象设备的初始化,完成链路速度匹配,分配DMA传输控制块,DMA内存等等。
首当其冲的就是上面留下的悬念函数dw_eth_init了
这里面主要是以下四个函数
rx_descs_init
tx_descs_init
phy_startup
dw_adjust_link
主要就是初始化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最终调用的是realtek驱动中的开始函数
realtek.c
phy.c
主要通过mii管理接口设置链路,参考寄存器,不展开。
主要获取phy的连接速度,使用命令的时候显示的速度就是这里来的。
终于到了最后的发送数据部分了
invalidate_dcache_range:
禁用cachememcpy:
拷贝传送数据flush_dcache_range:
将cache写入内存(主要操作cp15寄存器)。DMA读写内存,必须确保数据写入内存writel(POLL_DATA, &dma_p->txpolldemand):
开始DMA传送,寄存器篇有讲过一个txpolldemand寄存器就是这个。