gamc数据传输
gmac_dma_desc:
GMAC内部DMA通过一个描述符链表在内存和TX/RX_FIFO之间传输数据,每个描述符结构如下图:
其详细介绍如下:
gmac_dma_desc结构:(16B)
status:传输控制信息
当前gmac_dma_desc结构是否可用,
当前接收到的数据帧长度。(如果为接收状态)
当前gmac_dma_desc结构是否是数据帧的第一个或最后一个
帧头校验和是否正确~~~~~~~~~~~~~~~~~~~~~~~~
buffer size:
[31] rx_int_ctl: 当设置并接收到帧时,将不会使RX_INT置1。
[10-0]当前addr指向有效数据的长度
addr:
指向待传输的数据
nextdesc:
指向下一个gmac_dma_desc结构
在gmac的驱动中需要定义对应类型的结构体:
struct dma_desc {
UINT32 DMADESC_desc1;
UINT32 DMADESC_desc2;
UINT32 DMADESC_desc3;
UINT32 DMADESC_desc4;
} __attribute__((aligned(4)));
pGmacPriv->GMAC_pvDmaTxPhy = API_VmmDmaAllocAlignWithFlags(DMA_DESC_TX * sizeof(GMAC_DMA_DESC),
4, LW_VMM_FLAG_DMA);
pGmacPriv->GMAC_pvDmaRxPhy = API_VmmDmaAllocAlignWithFlags(DMA_DESC_RX * sizeof(GMAC_DMA_DESC),
4, LW_VMM_FLAG_DMA);
发送与接收时主要起作用的寄存器
tx_dma_desc_list: 记录tx_dma_desc[]的首地址
rx_dma_desc_list: 记录rx_dma_desc[]的首地址
tx_cur_desc: 记录当前传输使用的dma_desc的地址
tx_cur_buf: 记录当前传输使用的dma_desc.DMADESC_desc3,实际数据的地址
rx_cur_desc: 记录当前传输使用的dma_desc的地址
rx_cur_buf: 记录当前传输使用的dma_desc.DMADESC_desc3,实际数据的地址
gmac传输模式配置:
主要由以下寄存器实现:(以t3为例)
base_ctl0: 速率1000/100/10M,是否回环,半、全双工
base_ctl1: 最大传输长度,rx_pri_tx, soft_reset
int_status: 当前链接状态,溢出错误挂起,超时错误,rx_dma停止
int_en:
tx_ctl0
tx_ctl1
flow_ctl
rx_ctl0
rx_ctl1
rx_frame_filter:接收帧过滤,调试时尽量全部关掉
rx_hash0:校验使用
rx_hash1:校验使用
addr_high0:一般存当前网卡的mac地址,混杂模式下可以不配
addr_low0:
addr_highX:
addr_lowX:
tx_dma_state:
rx_dma_state:
rgmii_state:
令附通信成功时的gmac状态:
input addr: 0x1c50000, get value: 0x0 //1000M 禁用回环 半双功
input addr: 0x1c50004, get value: 0x8000002 //rx优先级高于tx
input addr: 0x1c50008, get value: 0x40000000
input addr: 0x1c5000c, get value: 0x111 //中断使能
input addr: 0x1c50010, get value: 0xc0000000 //使能tx,使能巨型帧
input addr: 0x1c50014, get value: 0x40000006 //当前帧传输完成后,继续执行tx
input addr: 0x1c5001c, get value: 0x0
input addr: 0x1c50020, get value: 0x4a7c1000 //addr
input addr: 0x1c50024, get value: 0xb8000000
input addr: 0x1c50028, get value: 0x40000002
input addr: 0x1c50034, get value: 0x4a7c3000 //addr
input addr: 0x1c50038, get value: 0x80010000 //帧控制
input addr: 0x1c50040, get value: 0x0
input addr: 0x1c50044, get value: 0x0
input addr: 0x1c50048, get value: 0x301010 //MII
input addr: 0x1c5004c, get value: 0x7849 //MII
input addr: 0x1c50050, get value: 0xffff //MAC addr
input addr: 0x1c50054, get value: 0xffffffff //MAC addr
input addr: 0x1c500b0, get value: 0x6
input addr: 0x1c500b4, get value: 0x4a7c11d0 //cur tx desc
input addr: 0x1c500b8, get value: 0x0
input addr: 0x1c500c0, get value: 0x3
input addr: 0x1c500c4, get value: 0x4a7c3000 //cur rx desc
input addr: 0x1c500c8, get value: 0x4a1a1046 //cur rx buf addr
input addr: 0x1c500d0, get value: 0x0
通信失败可以打印所以gmac寄存器的状态做对比找出原因