瑞萨RH850/U2A8以太网模块mcal说明
文章目录
1. 说明
- 支持全双工
- 内置DMA传输功能:DMA transfer controller (AVB-DMAC)
- 支持双通道以太网:ETNB0(最高支持100 Mbps)和ETNB1(最高支持1Gbps)
- 支持以太网音视频桥接技术(Ethernet AVB):通过在传统以太网的基础上新增一系列协议标准,能提供高质量的音视频传输服务
- 支持发送4种类型的流,对应数据发送寄存器中4个Queue(SR为音视频流):SR-A流、SR-B流、Network Control流、Best-effort流(普通的流量)
- 支持接收18种类型的流,对应数据接收寄存器中18个Queue:音视频流Stream0~Stream15、Network Control流、Best-effort流(普通的流量)
- 对于上述发送/接收Queue, 每个Queue下可以自定义设置多个描述符
2. MAC帧格式&ETNB1框图
3. ETNB1初始化流程
3.1. 初始化Eth_Controller基础参数
/* 根据达芬奇配置项初始化MAC地址 */
Eth_GaaCtrlStat[LulCtrlIdx].stMacAddr
/* controller状态设置为DOWN */
Eth_GaaCtrlStat[LulCtrlIdx].enMode = ETH_MODE_DOWN;
/* 不开启过滤操作,设置为非混杂模式 */
Eth_GaaCtrlStat[LulCtrlIdx].ulActiveFilterBits = 0UL;
Eth_GaaCtrlStat[LulCtrlIdx].blPromiscuous = ETH_FALSE;
3.2. 初始化Tx/Rx缓冲池
-
初始化Rx缓冲池
//后续会从RAM分配出多个RxBuffer,每个buf的前4个字节放置Eth_GaaRxBufferIndex Eth_GaaRxBufferIndex[LulCtrlIdx] = 0UL; //ulFrameAddr为MAC帧在内存中的实际地址 Eth_GaaRxFrame[LulCtrlIdx].ulFrameAddr = 0UL; //ulFrameLength对应描述符中的DS字段 Eth_GaaRxFrame[LulCtrlIdx].ulFrameLength = 0UL; //ulEthTypeAddr为描述符中DPTR字段指向的地址向后偏移12字节得到(跳过6Byte源地址+6Byte目的地址) Eth_GaaRxFrame[LulCtrlIdx].ulEthTypeAddr = 0UL; //时间戳信息 Eth_GaaRxFrame[LulCtrlIdx].stTimestamp.ulTimestamp0 = 0UL; Eth_GaaRxFrame[LulCtrlIdx].stTimestamp.ulTimestamp1 = 0UL; Eth_GaaRxFrame[LulCtrlIdx].stTimestamp.usTimestamp2 = 0U; //时间戳质量:ETH_VALID,ETH_INVALID,ETH_UNCERTAIN Eth_GaaRxFrame[LulCtrlIdx].enTimeQual = ETH_INVALID;
-
初始化Tx缓冲池
//ETH_TX_DESC_MAX = TxQueue*TxQueueBuf(达芬奇配置) for (LusCnt = 0U; LusCnt < ETH_TX_DESC_MAX; LusCnt++) { //后续收数据时,会先从RAM分配出一段TxBuffer, //该段buf的首地址赋值给LpTxBuffer->blLocked为ETH_FASLE的LpTxBuffer->pBufferHdr LpTxBuffer = (Eth_TxBufferType *)&Eth_GaaTxBufferIndex[LulCtrlIdx][LusCnt]; LpTxBuffer->pBufferHdr = NULL_PTR; LpTxBuffer->blLocked = ETH_FALSE; #if (ETH_GLOBAL_TIME_SUPPORT == STD_ON) LpTxBuffer->enTimeQual = ETH_INVALID; LpTxBuffer->stTimeStamp.nanoseconds = (uint32)0U; LpTxBuffer->stTimeStamp.seconds = (uint32)0U; LpTxBuffer->stTimeStamp.secondsHi = (uint16)0U; #endif } //ulTxBufTail用来记录存放TxBuffer的Index号,对应上面代码的LusCnt //ulTxBufTail值不能超过ETH_TX_DESC_MAX //ETH_TXQ_NUM为4,对应4种类型的流(SR-A流、SR-B流、Network Control流、Best-effort流) Eth_GaaCtrlStat[LulCtrlIdx].ulTxBufTail = 0UL; for (LusCnt = 0U; LusCnt < ETH_TXQ_NUM; LusCnt++) { //aaBufTxCnt记录当前TxQueue中有多少个描述符发送请求,TCCR寄存器TSRQ字段每置1一次,aaBufTxCnt++ Eth_GaaCtrlStat[LulCtrlIdx].stHwStat.aaBufTxCnt[LusCnt] = 0UL; //Eth_GaaBufferLock用于记录后续从RAM分配出来的TxBuffer信息,方便遍历和释放 //每一个TxBuffer对应一个Eth_GaaBufferLock节点 Eth_GaaBufferLock[LulCtrlIdx][LusCnt].ulCount = 0UL; Eth_GaaBufferLock[LulCtrlIdx][LusCnt].pLast = NULL_PTR; Eth_GaaBufferLock[LulCtrlIdx][LusCnt].pHead