gamc网卡驱动2-----gmac收发实现

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寄存器的状态做对比找出原因
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在设备树中增加 GAMC PHY 的地址,需要在对应网络设备节点中增加 `phy-handle` 属性和对应的 `phy` 节点描述符。具体步骤如下: 1. 打开设备树文件,找到对应的网络设备节点。例如,假设网络设备节点为 `eth0`,可在设备树中找到对应节点: ``` / { ... ethernet@f0000000 { compatible = "xlnx,ps-ethernet-1.00.a"; reg = <0x0 0xf0000000 0x0 0x10000>; ... }; ... }; ``` 2. 在 `eth0` 节点中增加 `phy-handle` 属性,其值为对应的 `phy` 节点描述符。例如,假设 `phy` 节点描述符为 `/amba/axi-gamc-1.0/phy0`,则可在 `eth0` 节点中增加 `phy-handle` 属性: ``` / { ... ethernet@f0000000 { compatible = "xlnx,ps-ethernet-1.00.a"; reg = <0x0 0xf0000000 0x0 0x10000>; phy-handle = <&gamc_phy>; ... }; ... gamc_phy: phy@0 { compatible = "marvell,88e1111"; reg = <0x0>; ... }; }; ``` 注意,`phy-handle` 属性的值使用 `&` 符号引用了 `gamc_phy` 节点描述符。 3. 在 `eth0` 节点下方增加 `phy` 节点描述符 `gamc_phy`,并设置对应的属性值。例如,假设 `phy` 设备为 Marvell 88E1111,可增加如下节点: ``` gamc_phy: phy@0 { compatible = "marvell,88e1111"; reg = <0x0>; ... }; ``` 其中,`compatible` 属性指定了 PHY 设备的兼容性,`reg` 属性指定了设备的基址。具体的属性值需要根据实际情况修改。 4. 保存设备树文件,并重新编译生成设备树二进制文件(`.dtb`)。将 `.dtb` 文件烧录到设备中,重启设备即可生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值