Chinaunix首页 | 论坛 | 博客
  • 博客访问: 483919
  • 博文数量: 51
  • 博客积分: 1056
  • 博客等级: 少尉
  • 技术积分: 676
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-10 22:53
文章存档

2018年(2)

2017年(1)

2013年(2)

2012年(9)

2011年(36)

2010年(1)

分类: 嵌入式

2012-10-23 11:35:04

MAC to MAC ,网卡驱动应该如何调整

正常情况下,完整的网卡由MAC和PHY两部分组成。
PHY的含义很广,不知道的wiki之。
简单地说,是物理层芯片。在TCP/IP协议中,数据链路层之上的所有数据,都可以在你的内存里由软件来访问控制。但是最终在网线和光纤上的数据,不会严格按照内存里的数据发送。这是由物理特性决定的。例如高速串行总线上,如果有大量连续的1出现,会导致AC耦合电容充满,影响信号完整性。所以4/5b 、 8/10b转换是phy常见的工作。
MAC和phy之间是由MII以及衍生升级的RMII、RGMII、SGMII 连接。其中还有2根类似i2c的MDC/MDIO总线。MII用来传输大量的数据。MDC/MDIO用来访问PHY的寄存器,获取和配置链路状态。
phy的另外一头,再经过网络变压器,出来的就是熟悉的RJ45 了。
典型用法如下:
MAC ----MII及其衍生总线----PHY  -------网线、光纤------  PHY ----MII及其衍生总线---- MAC
MAC和PHY可以集合在一个芯片内,也可以分开,都很常见。phy寄存器也有一部分是遵循通用标准的。

在嵌入式产品中,典型的如交换机,很可能核心就是一个交换机芯片。高级的交换机芯片允许通过管理口IMP进行配置,这个IMP口通常连接到嵌入式cpu的网口上。这个cpu和交换机芯片都在同一个紧凑电路板上,如果它们之间再经过2个phy,实在浪费钱和电。
于是另一种经典应用诞生了: MAC to MAC

MAC ----MII及其衍生总线---- MAC

在这种配置下,因为缺少了关键的phy,对于软件的影响很严重。没办法进行链路自动配置了,不知道速度、link、全双工/半双工。
在嵌入式linux环境下,需要uboot和linux都进行修改。
uboot需要配置交换机,强行设置交换机端的MAC为需要的速度和工作模式,强行设置为link 。
然后也需要强行设置cpu的对应网口,忽略phy的操作,强行配置速度和工作模式。然后才能在uboot下使用这个网口。


linux下也一样,会简单些,因为交换机端MAC已经配置好了。
linux的操作有些通用的可能么就简单写一下:
genphy_config_init 开头添加,

点击(此处)折叠或打开

  1. #if 1
  2. //xy add
  3.     if(phydev->addr==0x1e)
  4.         {
  5.             printk("p1013 eth1 has no phy,force to fixup ,step 1\n");
  6.             features |= SUPPORTED_Autoneg;
  7.             features |= SUPPORTED_1000baseT_Full;
  8.             goto end;
  9.         }
  10. #endif


在phy_state_machine 的开头添加

点击(此处)折叠或打开

  1. #if 1
  2. //xy add
  3.     if(phydev->addr==0x1e)
  4.         {
  5.             phydev->link=1;
  6.             phydev->speed = SPEED_1000;
  7.             phydev->duplex = DUPLEX_FULL;
  8.             
  9.             phydev->autoneg = AUTONEG_DISABLE;
  10.             phydev->state = PHY_RUNNING;
  11.             if(phydev->fix==0)
  12.                 {
  13.                     printk("p1013 eth1 has no phy,force to fixup,step 2 \n");
  14.                     netif_carrier_on(phydev->attached_dev);
  15.                     phydev->adjust_link(phydev->attached_dev);
  16.                     phydev->fix=1;
  17.                 }
  18.             
  19.         }
  20. #endif

这里增加了一个struct phy_device的成员fix,记录只需要修复一次。
阅读(7148) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

UncleSam0072013-06-07 17:52:56

hi,楼主。
遇到问题,向您求教
平台:MPCP1022DS  (与P1013的差别就在于多一个核)
 Linux内核:2.6.35
 u-boot:u-boot-2010.12

现在自己的设计是把原来P1022DS上的两个网口中的一个eth0用来做网口,phy由VT的换成了bcm54616S;另一个eth1用来连接BCM5396 switch芯片的管理口,通过MDIO来控制,连接方式为RGMII,其实就是MAC to MAC的连接方式。 

这个在u-boot中对于eth1的配置需要做哪些工作?
 在kernel中,把dts修改完后,具体还要做哪些工作?
 现在被这个问题给卡住了,期盼有高手给以指点。


盼有人给以帮助,联系方式:
 QQ:185230542
 E-mail: suipl@yahoo.com.cn