转:Linux网络子系统之---- PHY 配置

标签:
linuxwork |
分类: 计算机与 Internet |
它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1)。
数据接口包括分别用于发送器和接收器的两条独立信道。每条信道都有自己的数据、时钟和控制信号。MII数据接口总共需16个信号。
管理接口是个双信号接口:一个是时钟信号,另一个是数据信号。通过管理接口,上层能监视和控制PHY。
RMII口是用两根线来传输数据的,
MII口是用4根线来传输数据的,
GMII是用8根线来传输数据的。
GMII (Gigabit MII)
GMII是8bit并行同步收发接口,采用8位接口数据,工作时钟125MHz,因此传输速率可达1000Mbps。同时兼容MII所规定的10/100 Mbps工作方式。
GMII接口数据结构符合IEEE以太网标准。该接口定义见IEEE802.3-2000。
发送器:
◇ GTXCLK——吉比特TX..信号的时钟信号(125MHz)
◇ TXCLK——10/100M信号时钟
◇ TXD[7..0]——被发送数据
◇ TXEN——发送器使能信号
◇ TXER——发送器错误(用于破坏一个数据包)
注:在千兆速率下,向PHY提供GTXCLK信号,TXD、TXEN、TXER信号与此时钟信号同步。否则,在10/100M速率下,PHY提供 TXCLK时钟信号,其它信号与此信号同步。其工作频率为25MHz(100M网络)或2.5MHz(10M网络)。
接收器:
◇ RXCLK——接收时钟信号(从收到的数据中提取,因此与GTXCLK无关联)
◇ RXD[7..0]——接收数据
◇ RXDV——接收数据有效指示
◇ RXER——接收数据出错指示
◇ COL——冲突检测(仅用于半双工状态)
管理配置
◇ MDC——配置接口时钟
◇ MDIO——配置接口I/O
管理配置接口控制PHY的特性。该接口有32个寄存器地址,每个地址16位。其中前16个已经在“IEEE 802.3,2000-22.2.4Management Functions”中规定了用途,其余的则由各器件自己指定。
MII/RMII只是一种接口,对于10M线速,MII的速率是2.5M,RMII则是5M;对于100M线速,MII的速率是25M,RMII则是50M。
SGMII--Serial Gigabit Media IndependentInterface
SGMII是PHY与MAC之间的接口,类似与GMII和RGMII,只不过GMII和RGMII都是并行的,而且需要随路时钟,PCB布线相对麻烦,而且不适应背板应用。
而SGMII是串行的,不需要提供另外的时钟,MAC和PHY都需要CDR去恢复时钟。另外SGMII是有8B/10b编码的,速率是1.25G
在 linux 配置PHY
drivers/net/phy
配置的参数
phydev-> autonet, speed, duplex.
http://blog.chinaunix.net/attachment/201103/16/24148050_1300256463kk2C.gifPHY
http://blog.chinaunix.net/attachment/201103/16/24148050_1300257589GxxE.gifPHY
2. PowerPC对MDIO的支持
PowerPC操作MDIO时,涉及以下寄存器:
MIIMCFG
MIIMCOM
MIIMADD
MIIMCON
MIIMSTAT 状态寄存器
MIIMIND
以MPC8560举例,这些寄存器在CCSR中的位置如下:
http://blog.chinaunix.net/attachment/201102/22/24148050_1298369238N353.jpgPHY
2.1 MIIMCFG:配置寄存器
http://blog.chinaunix.net/attachment/201102/22/24148050_1298369391Zn7r.jpgPHY
ResetMgmt:
MgmtClockSet:时钟设置,是CCB的 2的n次方之一
2.2 MIIMCOM
http://blog.chinaunix.net/attachment/201102/22/24148050_1298369741c7w8.jpgPHY
ReadCycle: 0->1 触发MDIO读时序
2.3 MIIMADD
http://blog.chinaunix.net/attachment/201102/22/24148050_1298370018B2Ue.jpgPHY
PHYaddr:PHY地址,共5bit,系统最多联31个PHY(地址0为保留)
REGaddr:寄存器地址,共5bit,一个PHY上最多32个寄存器地址(可以使用shadow value技术,访问更多的寄存器)
2.4 MIIMCON
http://blog.chinaunix.net/attachment/201102/22/24148050_12983703767rAB.jpgPHY
PHYcontrol:在写流程时,这里存放要写入寄存器的值
2.5 MIIMSTAT 状态寄存器
http://blog.chinaunix.net/attachment/201102/22/24148050_1298370497b3RS.jpgPHY
PHYstatus:读流程时,PHY reg的内容会放到此
2.6 MIIMIND
http://blog.chinaunix.net/attachment/201102/22/24148050_1298370657n4n3.jpgPHY
NotVal:若置1,表示读流程结束,可以去读MIIMSTAT
Scan:
Busy:
3. linux中MDIO的实现
读写PHY寄存器时通过2个函数
phy_read()和phy_write(),
最终调用
int gfar_local_mdio_read(struct gfar_mii *regs, int mii_id, int regnum)
int gfar_local_mdio_write(struct gfar_mii *regs, int mii_id, int regnum, u16 value)
参数regs就是MDIO相关寄存器:
-
struct
gfar_mii {
-
u32 miimcfg;
-
u32 miimcom;
-
u32 miimadd;
-
u32 miimcon;
-
u32 miimstat;
-
u32 miimind;
- };
参数regnum,就是寄存器地址
上代码,简单不解释
-
int
gfar_local_mdio_read(struct gfar_mii *regs, int mii_id, int regnum)
-
-
{
-
u16 value; -
-
-
gfar_write(®s->miimadd, (mii_id <</span><</span> 8) | regnum);
-
-
-
gfar_write(®s->miimcom, 0);
-
gfar_write(®s->miimcom, MII_READ_COMMAND);
-
-
-
while (gfar_read(®s->miimind) & (MIIMIND_NOTVALID | MIIMIND_BUSY))
-
cpu_relax();
-
-
-
value = gfar_read(®s->miimstat);
-
-
return value;
- }
-
int
gfar_local_mdio_write(struct gfar_mii *regs, int mii_id,
-
int regnum, u16 value) -
{
-
-
gfar_write(®s->miimadd, (mii_id <</span><</span> 8) | regnum);
-
-
-
gfar_write(®s->miimcon, value);
-
-
-
while (gfar_read(®s->miimind) & MIIMIND_BUSY)
-
cpu_relax();
-
-
return 0;
- }
内核启动时的准备工作
4.1
初始化网络相关的全局数据结构,并挂载处理网络相关软中断的钩子函数
start_kernel()
__init
{
}
NOTE:这里的网络设备是指MAC层的网络设备,即TSEC和PCI网卡(bcm5461是phy)
在网络设备驱动中创建net_device数据结构,并初始化其钩子函数 open(),close()
等
挂载TSEC的驱动的入口函数是
// 平台设备 TSEC 的数据结构
static struct platform_driver gfar_driver = {
};
int
{
#ifdef CONFIG_GFAR_NAPI
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER
#endif
}
五、启用网络设备
5.1
用户调用ifconfig等程序,然后通过ioctl系统调用进入内核
socket的ioctl()系统调用
对于TSEC来说,挂的钩子函数是
5.2
在网络设备的open钩子函数里,分配接收bd,挂中断ISR(包括rx、tx、err),对于TSEC来说
gfar_enet_open
最终,TSEC相关的Bd等数据结构应该是下面这个样子的
http://blog.chinaunix.net/attachment/201106/28/24148050_1309228048B5I2.jpgPHY
六、中断里接收以太网包
接收到一个完整的以太网数据包后,TSEC会根据event
mask触发一个 Rx 外部中断。
cpu保存现场,根据中断向量,开始执行外部中断处理函数do_IRQ()
do_IRQ 伪代码
{
}
6.1 TSEC的接收中断处理函数
gfar_receive
{
#ifdef CONFIG_GFAR_NAPI
#else
#endif
}