瑞萨RH850/U2A8以太网模块mcal说明

瑞萨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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TAlice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值