AM335x支持KSZ8863调试总结
最近由于技术支持需要,接触到交换机芯片KSZ8863,由于以前未接触过这款芯片,调试过程中也越到了一系列的问题,需要对问题总结,积累,方便以后的项目,也方便遇到相同问题的朋友。
在客户需求中,需要组建环形网络,也就是A设备接B设备,B设备接C设备......,,要求A,B,C,D设备之间可以进行网络通信。组建环行网络的原因主要是为了节约成本(可以不用交换机),方便布线。满足客户这样的需求就要求每台设备要有两个网口,且环形网络上面的设备需要在同一网段,设备和设备之间可以进行网络交换,类似于所有的设备都接到交换机上面。
如上图所示,每台设备有两个网口,B设备的网口1与A设备的网口2连接,C设备的网口1 跟B设备的网口2连接,D设备的网口1跟C设备的网口2连接,A设备的网口1跟C设备的网口2连接,只要四台设备的IP地址在同一网段,他们之间就可以互相通信。
实际上每台设备的网口1代表该设备的网络,拥有设备的IP地址,而网口2其实是交换机接口,跟该设备没有什么必然的关系,独立使用,可以挂载网络设备,这样理解整个组网就很容易了。
为了实现客户的需求,采用了网络芯片 KSZ8863RLL,该芯片有三个端口,端口1与网口1连接,端口2与网口2连接,端口3与SoC的CPU连接,SoC我们采用的TI Cortex-A8 处理器,端口3与CPU的连接使用RMII接口,MDIO管理KSZ8863。
我们采用的是FET335xD核心板,该核心板支持RMII接口,MDIO接口,软件上面我们使用的是Linux系统,Uboot和Kernel里面不需要KSZ8863特别的驱动,直接使用通用Phy驱动即可,软件修改需要注意:
1 Phy在MDIO总线上面的地址
本例中CPU通过port3连接的是Port1的Phy,Port1端口作为设备X的Phy设备,进行网络通信,KSZ8863的Port1 Phy 地址是1,故我们需要在Uboot和Kernel中设置Phy address 为 0x01.
2 KSZ8863的工作模式
该芯片通过Port3与CPU进行RMII物理连接,另外在AM335X上面我们需要通过MDIO总线管理KSZ8863,KSZ8863支持IIC接口,SPI接口,SMI接口(也就是MDIO接口),需要设定Pin43和Pin44的引脚状态,让芯片采用SMI接口。(Datasheet有模式配置说明)
需要注意以上两点,这样KSZ8863就可以工作了,在Uboot命令行中可以执行mii 命令查看网络Phy设备寄存器,如果不知道Phy在MDIO总线上面的地址,也可以在Uboot命令行执行mii命令扫描MDIO总线上面的设备,另外KSZ8863的芯片与AM335X连接时芯片务必工作在SMI模式下面,客户的板子就是因为模式设置引脚状态不对(上下拉电阻导致),CPU总是无法识别该设备。
设备识别KSZ8863后进可以正常工作了,通用的Phy驱动确实很不错,不需要单独移植芯片的驱动了,很给力,当然KSZ8863还支持其他的工作模式,本例中使用的是一个端口作为Phy,另外一个端口作为交换机工作模式。对了,可以测试一下,使用一台PC与一台设备的网口2连接,两台设备设置在同一网段,网络不通?奇怪,哦,原来是设备的网口1没有激活(网口1的灯不亮),需要用一条网线连接网口1与其他的任意网络设备,网络1的灯闪烁时,PC就可以Ping通设备了。网口1建立连接后(网口灯闪烁),才激活设备的网络功能,这一点跟普通的Phy芯片有点不同。