imx515 fec 驱动mii 的实现
来源:互联网 发布:java.util.zip jar包 编辑:程序博客网 时间:2024/06/09 07:41
1. mii 的实现
初始化函数:fec_enet_init里初始化一个mii命令队列,mii_free指向空闲队列的头,mii_head和mii_tail在队列中加入第一项时初始化,指示待处理命令队列。mii_queue往队列中放入一个待处理命令,若列表为空,则直接改变mii寄存器的值。
fec_enet_mii处理mii中断,即在mii操作完成后执行回调函数func。
mk_mii_read(REG) 用于组装读PHY寄存器的命令;
mk_mii_write(REG)用于组装写PHY寄存器的命令;
1) 原型声明
typedef struct mii_list {
uint mii_regval;
void (*mii_func)(uint val, struct net_device *dev);
struct mii_list *mii_next;
} mii_list_t;
#define NMII 20
static mii_list_t mii_cmds[NMII];
static mii_list_t *mii_free;
static mii_list_t *mii_head;
static mii_list_t *mii_tail;
static int mii_queue(struct net_device *dev, int request,
void (*func)(uint, struct net_device *));
/* Make MII read/write commands for the FEC.
*/
#define mk_mii_read(REG) (0x60020000 | ((REG & 0x1f) << 18))
#define mk_mii_write(REG, VAL) (0x50020000 | ((REG & 0x1f) << 18) | /
(VAL & 0xffff))
#define mk_mii_end 0
2) 相关函数
创建mii命令队列:
nt __init fec_enet_init(struct net_device *dev)
{
…
/*初始化一个空的mii命令列表*/
for (i=0; i<NMII-1; i++)
mii_cmds[i].mii_next = &mii_cmds[i+1];
/*mii_free指向可用节点*/
mii_free = mii_cmds;
...
}
mii中断:
fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
{
…
/*响应中断调用fec_enet_mii*/
if (int_events & FEC_ENET_MII)
fec_enet_mii(dev);
…
}
mii中断处理程序: /* called from interrupt context */ static void fec_enet_mii(struct net_device *dev) { struct fec_enet_private *fep; volatile fec_t *ep; mii_list_t *mip; uint mii_reg; fep = netdev_priv(dev); spin_lock_irq(&fep->mii_lock); ep = fep->hwp; /* 指向fec映射地址 */ mii_reg = ep->fec_mii_data; if ((mip = mii_head) == NULL) { printk("MII and no head!/n"); goto unlock; } if (mip->mii_func != NULL) (*(mip->mii_func))(mii_reg, dev); /* 通过mii获得的数据供用户使用 */ mii_head = mip->mii_next; mip->mii_next = mii_free; mii_free = mip; if ((mip = mii_head) != NULL) ep->fec_mii_data = mip->mii_regval; unlock: spin_unlock_irq(&fep->mii_lock); }
配置fec接口模式为mii
static void __inline__ fec_set_mii(struct net_device *dev, struct fec_enet_private *fep)
{
u32 rate;
struct clk *clk;
volatile fec_t *fecp;
fecp = fep->hwp;
fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04;
fecp->fec_x_cntrl = 0x00;
/*
* Set MII speed to 2.5 MHz
*/
clk = clk_get(NULL, "fec_clk");
rate = clk_get_rate(clk);
clk_put(clk);
fep->phy_speed =
((((rate / 2 + 4999999) / 2500000) / 2) & 0x3F) << 1;
fecp->fec_mii_speed = fep->phy_speed;
fec_restart(dev, 0);
}
- imx515 fec 驱动mii 的实现
- 目前的FEC标准以及实现
- 关于FEC驱动
- 网卡驱动8-MII接口以及linux内核对MII的支持
- FEC原理及其实现
- FEC原理及其实现
- 基于FPGA的以太网MII接口扩展设计与实现
- FEC的RTP荷载格式
- MII
- MII
- MII
- MII
- MII
- MII
- MAC、MII、PHY的关系
- mii-tool的限制/mii-tool和千兆网络
- mii-tool的限制/mii-tool与千兆网络
- mii-tool的限制/mii-tool与千兆网络
- 学习java一些快捷键
- 3-DES加密解密
- Ubuntu 中和中文相关的命令总结
- C#动态生成gridview
- RSS阅读器及Java实现Rss的发布
- imx515 fec 驱动mii 的实现
- div中文字垂直居中
- vb找不到Datagrid控件
- Fckeditor的Java使用
- ESC_JavaScript压缩工具的使用
- junit-实践方法(转)
- js获取系统日期(精确到秒)
- Code61在ASP.Net中打印
- 很少来