基于M6097 switch的STP协议调试方法

来源:互联网 发布:linux切换用户命令 编辑:程序博客网 时间:2024/05/29 05:01

1、      硬件调试

(1)switch芯片地址方式

      确定switch在板子上是多芯片还是单芯片方案(即多址与单址),通过P10_ADDR[0~4]判断:[0~4]: 0b00000:为单芯片方案;其他为多芯片方案,最大支持31个switch级联。单芯片与多芯片在寄存器访问上有很大的区别,多芯片要复杂些。一般采用单芯片方案,hi3520a上的switch就是采用单芯片模式。

 

(2)switch端口模式

    port10口连接CPU,hi3520a支持RGMII模式,因此需要在硬件上将该端口配置为RGMII模式!通过P10_MODE[0~2]判断:[0~2]:0b001为RGMII模式,0b000:GMI模式等,不同模式决定了时钟引脚不一样。

   port9口也可以通过p9_MODE[0~2]来设置模式,此处连接光口,因此设置为[0~2]:0b101为1000BASE-X千兆模式

port8口只有一个引脚P8_MODE来设置模式,高电平为1000BASE-X模式,此处设置为该模式!

 

注:以上(1)(2)值是在复位时上升沿锁存进芯片内!曾有类似问题:复位引脚有电容导致复位上升沿时间变长则有可能地址发生变化。

 

(3)switch工作模式

通过引脚SW_MODE[0:1], 0b00:CPU mode, 0b01:reserved, 0b10: test mode, 0b11:EEPROM mode。CPU模式:需要通过软件配置switch;test模式:使用默认参数;EEPROM mode模式:从EEPROM中读取参数配置switch,当没有EEPROM时使用默认参数。一般使用test模式!

 

以上(1)(2)(3)三点是硬件上实现swtich必须要注意的,否则有可能导致switch无法正常工作,或者CPU无法访问switch!以下(4)(5)两点不一定会遇到,只是本项目使用光口遇到:

 

(4)光口电压控制

     光口电压通过GPIO控制,电口则直接连接3.3V。电口测试没有问题,但是光口就是ping不同,一开始怀疑是光模块有问题,换了之后还是不行;然后怀疑是光纤有问题,换了之后还是不行,然后以为是电压没有控制好,未接光模块的情况下测量光口电压也是有3.3V的,但是接了光模块后电压就变为1V左右,最后发现是硬件的磁珠问题,把该器件去掉就好了!

 

(5)光模块丢帧

同样的测试环境电口不会有丢帧现象,而光口则丢帧比较严重!刚开始怀疑是测试环境导致(原先放在测试中心测试),而后发现自己位置上简单测试也会发生同样的丢帧。接着对比电口和光口的寄存器值,将两类不一样的寄存器值都读出来进行比较,发现基本是一样的,不一样的地方也不会有影响!然后去读取CPU的MAC寄存器,也未出现丢帧,错误帧等值!由于对switch不是很熟悉,一开始未注意到switch每个端口都可以统计进出网络包!统计各个口的接收数据包后发现光口进来的,到CPU出去的P10口,数据包增加的数值是相等的,然后查看发送另外一台设备发送的数据包,发现接收到的比发送的少!因此确定设备switch之间发生数据丢失,最终定位到是switch之间光检测模块导致!原因如下:光模块检测芯片的LOS检测信号引脚一面连接到CPU的GPIO上,另一面连接到switch的检测引脚上!LOS是输出引脚,由于CPU的GPIO未进行配置默认VOU1120_DATA的功能,从而影响了光模块检测芯片!最后将该引脚配置成GPIO输入即可!

 

2、      软件调试

(1)UBOOT修改

     swtich有两种ID,一种是phy id,另外一种是product id。每个端口都有上述两类ID(M6097中port0~port10对应的phy地址为0~A,port0~port10对应的寄存器地址0x10~0x1A),phy地址获取phy id, port寄存器地址获取product id!此处使用product id作为switch id。如果使用phy id作为switch id则需要禁止M6097 PPU,否则无法正确读取phy id。另外如果禁止M6097的ppu就无法对switch外接的PHY进行操作。修改代码如下

在uboot驱动的mdio.c中:get_phy_device()接口进行修改,禁止PPU,对phy id进行过滤,当获取到protduct ID时使能switch同CPU的端口port10,由于使用GRMII模式,还需要设置swtichGRMII时序(重要)

 

Uboot中网络驱动是针对phy进行读写的,通过读phy状态来配置CPU MAC控制器,PHY状态根据网线接入的网络不通而有所变化!但是switch同CPU始终相连接,不与PHY相连接,因此根据同CPU连接的switch端口属性强制配置CPU MAC控制器!此处设置:强制连接状态、配置成全双工,1000BASE-TX、使用RGMII接口!修改代码如下:

在stmmac.c中:stmmac_net_adjust_link()接口对各个属性接口里根据switch地址进行强制switch设置,最后设置RGMII模式。

 

(2)kernel修改

内核对switch的配置同uboot基本配置原理是一样的,只是驱动代码位置不一样而已!具体修改如下:

phy_device.c中get_phy_device接口对phy id进行过滤。

marvell.c中原来就已经修改该驱动,在修改的基础上mv6097_config_init接口中禁止PPU、强制设置swtich配置,设置swtichGRMII时序(重要)! switch_read_status接口中强制CPU连接状态、配置成全双工,1000BASE-TX。

    总之就是同时配置switch和CPU MAC控制器,使两者保持一致的模式。