首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Open Ethernet IP core 介绍及其 ucLinux 驱动(1)

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 接口。
  • MAC 包含接收,发送和控制模块;
  • 支持 MII 管理 (Media Independent Interface Management),MII 串行信号连接至外部PHY;
  • 主机接口采用开放的 Wishbone 总线。
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 的主要特性如下:
  • 实现 IEEE 802.3 以太网 MAC 功能
  • 10M/100Mbps 速率;
  • 全双工支持;
  • IEEE 802.3 MII;
  • Wishbone SOC总线接口;
  • 内部RAM可存放128 TX/RX BD(Buffer Descriptors);
  • 事件触发中断。
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 记录了网络接口的所有信息,其成员可以分为四类:
  • 全局信息: 接口名字,状态以及初始化函数;
  • 硬件信息:占用内存起始地址,IO 基地址和中断号以及 DMA 使用等;
  • 接口信息:MAC接口本身的信息,比如发送队列长度,MAC地址,和接口标志(UP/BROADCAST/PROMISC) 等;
  • 设备方法:open(), stop(), hard_start_xmit(), tx_timeout(), get_stats(), set_config() 等。
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 将数据包适当处理后发送出去,并在发送完成后(在中断使能的情况下)产生中断。
返回列表