Board logo

标题: Open Ethernet IP core 介绍及其 ucLinux 驱动(1) [打印本页]

作者: look_w    时间: 2017-12-9 13:01     标题: Open Ethernet IP core 介绍及其 ucLinux 驱动(1)

Open Ethernet IP core 介绍Open Ethernet IP core 是一种支持 10M/100Mbps 以太网的 MAC IP core,实现数据链路层的功能,其最大的特点便是公开免费,它不同于常见的 ASIC 网卡芯片,能够很方便的集成到片上系统(SOC)设计中去。
基本结构MAC, 即 Media Access control, 位于 OSI 七层模型中数据链路部分,主要负责控制与物理层的物理介质通信。Ethernet IP core自身实现MAC收发和控制的功能,本身不具有物理层(PHY)的功能。MAC core 对外接口有两个:和 Host 端采用 Wishbone 总线通信,对外 PHY 芯片采用通用的 MII 接口。
Wishbone 是一种片上(SOC)总线,常见的片上总线有 ARM 的 AMBA, Altera 公司的 Avalon,以及 Silicon公司的 Wishbone。以上三种总线只有 Wishbone是开放并且完全免费的总线标准。 Wishbone 由 Silicon 开发并目前由 Opencores 组织维护。
MII 实际上可分为两部分,分别是数据流和管理流。MIIM(MII Management) 是用于对外围 PHY 芯片的管理所用的,通过 MIIM 串行接口可以查看 PHY 寄存器状态等信息。
图 1. Ethernet MAC core overview主要特性Open Ethernet core 处于 Host(CPU) 和外围 PHY 芯片之间,实现了 MAC 层的所有功能,并且采用开放的 wishbone 总线接口,源码公开便于移植,广泛应用于 FPGA SOC(System On Chip) 设计中,Flextronics Semiconductor 公司在设计中就选用了该IP core。该 IP core 的主要特性如下:
MAC registersMAC register用于MAC操作,提供MAC core控制和状态信息。ucLinux设备驱动需要对这些寄存器进行配置。有关MAC register的操作在后面章节会有描述,在此不再赘述。
Open Ethernet Core在ucLinux-2.6上的设备驱动目前 ucLinux-2.6已经支持 Open Ethernet MAC,在 make menuconfig 配置菜单中选中
Device driver->Network device support->Ethernet (10 or 100Mbit)->Opencores (Igor) Emac support
这样 Open Ethernet 的设备驱动将会被编译进 ucLinux 内核,负责 MAC 物理网络设备的支持。
图 2. Open Ethernet device driver in ucLinux-2.6参见 linux/drivers/net/open_eth.c
重要的数据结构参考 linux-2.6/include/linux/netdevice.h
a) struct net_device;
在 Linux 系统中每一个网络设备接口都对应着一个 net_device 的数据结构体,  net_device 记录了网络接口的所有信息,其成员可以分为四类:
ucLinux 网络设备驱动初始化函数的部分工作便是填充上述结构成员。
b) struct oeth_private是 ucLinux open Ethernet 驱动层用于记录网络数据包的环型缓冲区而建立的数据结构,sk_buff  是用于和上层 TCP/IP 协议处理层交互的,而 oeth_bd 是用于和MAC 硬件层交互的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct oeth_private {
    struct sk_buff  *rx_skbuff[OETH_RXBD_NUM];
    struct sk_buff  *tx_skbuff[OETH_TXBD_NUM];

    ushort  tx_next;   /* Next buffer to be sent */
    ushort  tx_last;   /* Next buffer to be checked if packet sent */
    ushort  tx_full;   /* Buffer ring full indicator */
    ushort rx_cur; /* Next buffer to be checked if packet received */

    volatile oeth_regs  *regs; /* Address of controller registers. */
    volatile oeth_bd    *rx_bd_base;/* Address of Rx BDs. */
    volatile oeth_bd    *tx_bd_base;/* Address of Tx BDs. */

    struct net_device_stats stats;
    struct tasklet_struct    oeth_rx_tasklet;
    struct tasklet_struct    oeth_tx_tasklet;

    struct mii_if_info mii;
    spinlock_t  lock;
};




c) Buffer Descriptor (BD) 结构是是用于 MAC 控制和数据传递的核心数据结构。每个 BD描述 MAC 层收发的数据包,包括 len_status 和 addr 成员,len_status 描述每个数据包的长度和状态信息;addr 表示数据包存放的 RAM 地址,便于设备驱动的访问。MAC core支持最多128个 BD,每 BD 占用64bit。
1
2
3
4
struct _oeth_bd {
        uint    len_status;
        uint    addr;           /* Buffer address */
} oeth_bd;




下面两个表格分别描述了 len_status 和 addr 的位域信息
31302928272625242322212019181716Packet length1514131211109876543210RDIRQWRPADCRCReservedURRTRY[3:0]RLLCDFCSFig.3 len_status in struct _oeth_bd
31302928272625242322212019181716Buffer address[31:16]1514131211109876543210Buffer address[15:0]Fig.4 addr in struct _oeth_bd
oeth_private 包含了数据收发 oeth_bd 单向队列,打开设备时驱动必须给每个 oeth_bd addr 分配 RAM 空间, MAC 层接收到数据包会将数据自动放到 BD addr 指向的内存空间,并设置相应 len_status 状态信息,然后(在中断使能的情况下)产生中断;Linux 需要发送数据时,open Ethernet 接口驱动将从上层 TCP/IP 协议驱动层的 skbuff 数据包转移到发送缓冲 BD 的内存地址空间(BD address), 并设置好 len_status 的长度,这样便会触发 MAC 将数据包适当处理后发送出去,并在发送完成后(在中断使能的情况下)产生中断。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0