Skip to content

LoongsonLab/gmac_driver

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

gmac

硬件

ls2k1000la处理器内集成了2个千兆gmac核,兼容IEEE 802.3协议,对外部phy实现RGMII接口,分别对应片外的2块phy芯片和千兆网口,phy芯片是YT8511H

gmac寄存器物理基地址分别是0x400400000x40050000,对应中断号12和14,板卡正面靠下连着的是gmac0,靠上连着的是gmac1,gmac1需要配置引脚复用

gmac核控制网口,通过内存dma和处理器交换数据,dma仅支持32位地址,支持ring和chain两种结构

驱动

驱动代码参考自linux和uboot,仅测试gmac0,对应寄存器物理基地址0x40040000

代码中仅配置支持IEEE 802.3协议中的基础部分,以太网报文的MTU为1500,不支持timestamp、jumbo frame等特性,dma队列仅支持ring模式

驱动代码核心是结构体struct net_device,存储着各类寄存器基地址、dma描述符信息、网络包收发状态、物理链路状态等信息

函数eth_init用于初始化结构体、gmac核以及phy和网口,配置dma队列,注册中断信息

gmac本身集成了一定的对phy和网口的控制能力,尽管驱动内实现了phy寄存器读写函数,但目前主要通过gmac来完成对phy和网口的协商,仅支持1000 Mbps / Full duplex的链路

函数eth_rx是接收函数,eth_tx是发送函数,操作系统通过使用这两个函数,结合中断,完成网络包的收发

gmac中断有很多种,所有的中断都通过dma线触发,驱动通过读取寄存器信息来判断具体的中断来源,驱动中主要关注链路状态中断以及收发中断

网口的链路状态改变时(如插拔网线)会触发链路相关的中断,处理程序会调用eth_phy_rgsmii_check函数进行处理,打印出链路状态,并调用函数eth_update_linkstate向上层操作系统传递链路状态信息

网口完成发送或接收操作后会触发相应的中断,发送中断(发送完成)触发后驱动会调用eth_handle_tx_over回收dma描述符,接收中断(接收完成)触发后会调用eth_rx_ready向上层操作系统通知该信息,操作系统需要后续调度接收函数eth_rx来实现数据包接收操作

eth_rx每次只接收一个网络包,返回给操作系统一块数据区域,考虑到上层网络栈可能使用私有的数据格式,因此eth_rx会调用函数eth_handle_rx_buffer来做处理,传入接收到数据的dma地址和包大小,获得可以返回给操作系统的数据区域,操作系统需要在接收到接收中断后需要多次调用eth_rx,确保数据全部接收完

eth_tx每次只发送一个网络包,操作系统传入需要发送的数据包,由于可能存在私有的数据格式,因此eth_tx会调用eth_handle_tx_buffer来做处理,传入操作系统提供的网络包和驱动提供的dma地址,返回传输的数据大小,函数eth_handle_tx_over会持续回收所有已经发送完成的dma描述符

代码中需要实现platform.rseth_platform.h中列举的一些函数,修改或替换printf函数的实现以及具体调用

About

2K1000LA GMAC(network) Driver

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages