CODE_LINUX_DRV_MAC

主要用途:实现网卡控制器功能,实现GEM网卡控制器IO接口。

能力分类:嵌入式

应用领域:安防监控,电源电池,机器人,健康医疗,智能家居

交易方式: 定制

参考价格:50000.00 小贴士:当前佣金是0%

好评率:100%| 综合评分:5.0| 已购买:0次
联系我 收藏店铺
分享: 

 模块描述

1.1  原理及方式

该驱动实现ZYNQ平台下GEM(Gigabit Ethernet MAC)网卡控制器驱动

1.2  主要功能

实现网卡控制器功能,实现GEM网卡控制器IO接口

 标准模块

根据Linux驱动架构设计。

 模块设计

3.1  结构体设计

1) macb

网卡控制器核心结构体,定义设备结构体,NAPI结构体,PHY设备结构体,接收发送buffer

struct macb {

void __iomem  *regs;

 

unsigned int  rx_tail;

unsigned int  rx_prepared_head;

struct macb_dma_desc *rx_ring;

struct sk_buff  **rx_skbuff;

void   *rx_buffers;

size_t   rx_buffer_size;

 

unsigned int  num_queues;

struct macb_queue queues[MACB_MAX_QUEUES];

 

spinlock_t  lock;

struct platform_device *pdev;

struct clk  *pclk;

struct clk  *hclk;

struct clk  *tx_clk;

struct net_device *dev;

struct napi_struct napi;

struct net_device_stats stats;

union {

struct macb_stats macb;

struct gem_stats gem;

}hw_stats;

 

dma_addr_t  rx_ring_dma;

dma_addr_t  rx_buffers_dma;

 

struct macb_or_gem_ops macbgem_ops;

 

struct mii_bus  *mii_bus;

struct phy_device *phy_dev;

unsigned int  link;

unsigned int  speed;

unsigned int  duplex;

 

u32   caps;

unsigned int  dma_burst_length;

 

phy_interface_t  phy_interface;

 

/* AT91RM9200 transmit */

struct sk_buff *skb;  /* holds skb until xmit interrupt completes */

dma_addr_t skb_physaddr;  /* phys addr from pci_map_single */

int skb_length;    /* saved skb length for pci_unmap_single */

unsigned int  max_tx_length;

 

u64   ethtool_stats[GEM_STATS_LEN];

unsigned int  rx_frm_len_mask;

unsigned int  jumbo_max_len;

unsigned int  tsu_clk;

struct ptp_clock *ptp_clock;

struct ptp_clock_info ptp_caps;

int   rx_hwtstamp_filter;

int   phc_index;

unsigned int  ns_incr;

 unsigned int  subns_incr;

};

 

2) macb_or_gem_ops

MACGEM操作函数结构体,定义读写Buffer函数等

struct macb_or_gem_ops {

int (*mog_alloc_rx_buffers)(struct macb *bp);

void (*mog_free_rx_buffers)(struct macb *bp);

void (*mog_init_rings)(struct macb *bp);

int (*mog_rx)(struct macb *bp, int budget);

};

3) macb_config

MACB配置结构体,定义配置信息

struct macb_config {

u32   caps;

unsigned int  dma_burst_length;

int jumbo_max_len;

};

4) macb_queue

MACB队列结构体,定义传输队列等信息

struct macb_queue {

struct macb  *bp;

int   irq;

 

unsigned int  ISR;

unsigned int  IER;

unsigned int  IDR;

unsigned int  IMR;

unsigned int  TBQP;

 

unsigned int  tx_head, tx_tail;

struct macb_dma_desc *tx_ring;

struct macb_tx_skb *tx_skb;

dma_addr_t  tx_ring_dma;

struct work_struct tx_error_task;

};

 

3.2  主要函数说明

1) MAC设备初始化函数

函数原型

int macb_mii_init(struct macb *bp);

功能描述

MAC设备初始化函数

输入参数

bp,驱动指针

输出参数

全局变量值的变化

返回值

0,成功;其他,失败

2) MAC设备打开函数

函数原型

static int macb_open(struct net_device *dev)

功能描述

MAC设备打开函数

输入参数

dev,网络设备指针

输出参数

全局变量值的变化

返回值

0成功;其他,错误

3) 获取MAC设备关闭函数

函数原型

static int macb_close(struct net_device *dev)

功能描述

MAC设备关闭函数

输入参数

dev,设备指针

输出参数

全局变量值的变化

返回值

0

4) MAC设备搜索函数

函数原型

static int macb_probe(struct platform_device *pdev)

功能描述

MAC设备搜索函数,查询PHY设备并连接PHY设备。并为MAC和PHY设备驱动申请必要的资源

输入参数

pdev,设备指针

输出参数

全局变量值的变化

返回值

0成功;其他,失败

5) MAC设备移除函数

函数原型

static int macb_remove(struct platform_device *pdev)

功能描述

移除MAC设备驱动,取消注册的设备,并释放资源等

输入参数

pdev,设备指针

输出参数

全局变量值的变化

返回值

0

6) MAC设备发送数据函数

函数原型

static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)

功能描述

MAC设备发送数据函数

输入参数

skb,socket buffer数据指针

pdev,设备指针

输出参数

全局变量值的变化

返回值

0,成功;其他,失败

7) MAC设备接收数据函数

函数原型

static int macb_rx(struct macb *bp, int budget)

功能描述

MAC设备接收数据函数

输入参数

bp,MAC设备结构体指针,存放接收的buffer

budget,buffer预算。即最大Buffer数目

输出参数

全局变量值的变化

返回值

接收到的数据个数

8) MAC设备IO控制函数

函数原型

int macb_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);

功能描述

MAC设备IO控制函数

输入参数

dev,网络设备指针

rq,ifreq网络设备信息结构体指针

cmd,ioctl命令

输出参数

全局变量值的变化

返回值

0成功;其他,错误

9) 获取MAC设备状态函数

函数原型

struct net_device_stats *macb_get_stats(struct net_device *dev);

功能描述

获取MAC设备状态

输入参数

dev,设备指针

输出参数

全局变量值的变化

返回值

返回当前MAC设备状态信息

 使用方法

1. macb.c和macb.c放置在Linux内核的drivers/net/ethernet/cadence

2. 在该目录下的Makefile中增加

obj-$(CONFIG_MACB) += macb.o”

3. 在该目录下的Kconfig文件中增加

config MACB

tristate "Cadence MACB/GEM support"

depends on HAS_DMA

select PHYLIB

select PTP_1588_CLOCK

---help---

  The Cadence MACB ethernet interface is found on many Atmel AT32 and

  AT91 parts.  This driver also supports the Cadence GEM (Gigabit

  Ethernet MAC found in some ARM SoC devices).  Say Y to include

  support for the MACB/GEM chip.

 

  To compile this driver as a module, choose M here: the module will be called macb.

 应用举例

通过上层封装的ethernet库中代码,可以进行网络数据发送接收

 其他


总体评价

好评率:100%

好评数量:0

总体评分

工作速度:5分

工作质量:5分

工作态度:5分

暂无评价

企业其他能力

More>