Chinaunix首页 | 论坛 | 博客
  • 博客访问: 170401
  • 博文数量: 109
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 147
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-23 16:12
文章分类

全部博文(109)

文章存档

2015年(109)

我的朋友

分类: 嵌入式

2015-02-12 15:53:44

   SDK版本:sdk-all-5.6.6
   操作系统版本:tile-linux  2.6.26
   该工作没有什么现成的文档进行参考,主要还是在实际的SDK移植工作中进行经验积累,认真阅读SDK源代码,从中获得一些Broadcom文档中没有提到过的软件流程和操作。
一.移植过程中sdk源代码主要修改的地方有:
1. 将system/bde/linux/kernel/linux-kernel-bde.c文件中无法解析的系统导出符号如virt_to_bus和bus_to_virt用tile-linux系统代码替换,因为我们选择的硬件体系make文件来自与raptor体系,所有需要注销掉raptor体系中使用的MIPS CPU相关的系统定义参数如
2. 将sdk中所有与pcie bar内存空间(主要是base_address相关的地址)的读写操作替换为tilelinux要求的tile_readl和tile_wirtel函数接口,因为tilepro36最pcie内存空间读写不允许直接对内存地址进行读写(通过指针的方式)。
其他没有修改的地方,可见broadcom的sdk软件对系统移植所作的工作非常成功,极大的方便了用户的移植,缺点只是提供的文档不够充分,要求能够从源代码中快速定位并解决问题。

二.加载BCM shell
该过程中出现了小小的插曲,刚开始时进行了一中的工作后,发现每次加载bcm.user.proxy程序后都会出现反复打印参数无法解析的错误信息直到死机,或者是进行shell了但ps查看端口状态出现死机的现象。听取总工的意见使用一个tile核运行tile-linux,防止由于SMP的原因造成模块死机,修改后BCM shell运行稳定,或许是由于sdk中的SMP及锁机制与特殊的tile-linux不符造成的,原因待查。但每次上电硬件重启后首次加载bcm模块还会出现反复打印参数无法解析的错误,但带电手动复位或中断加载过程重新加载模块则模块运行正常。总之,单核运行后,ps能正确显示link up的链路端口,以及查看各端口收发数据报数量,操作MII对phy寄存器进行读写。

补充:关于bcm-shell不能在开启多个tile时执行问题的解决。
开启多个tile时,每次启动时都发现linux-kernel-bde.c文件_dma_segment_alloc函数中,执行语句MEM_MAP_RESERVE(VIRT_TO_PAGE(page_addr));时出现系统crash,简单的注销掉即可屏蔽问题。


三.调试链路
mpcb使用bcm5461与tile的gbe0接口连接,协议是SerDes(switch)->RGMII(gbe0),phy工作在fiber模式 ;
使用bcm5464与amc子卡arm以太网接口、amc子卡fpga以太网接口以及后插卡以太网接口进行连接,协议是SGMII(switch)->1000base-T(以太网接口),phy工作在copper模式;
5464为4个5461的集合芯片,二者功能相同,需要注意的是对0x18,0x1c等shadow register的读写操作方式,不同之处是5464的phy地址以端口0开始逐渐增1。

之前链路无法ping通一直怀疑是phy芯片没有正确的配置。但最终的结论是只要硬件管脚设置到正确的工作模式,软件不需要配置任何phy寄存器,只需要检测自协商情况下的link up位等待链路建立。

5461遇到的情况及解决的方法是:
gbe0发送的报首先在交换芯片端口上可以查看到,甚至在外部pc机也可以通过抓报工作正确识别出,但gbe0接收到的数据包使用交叉编译后的工具tcpdump在tile上抓取,发现每次受到的数据报会有比特随机变化。
原因是由于tilepro36 gbe0端口的数据接收时钟线RXC需要对数据接收线RXD要求有时间上的延时,但5461对该延时控制可以在copper模式下通过设置寄存器做到,但在fiber模式下5461不支持该延时操作,所以只能通过硬件电路绕线的方式人工增加所需要的延时量。

5464遇到的情况及解决的方法是:
5461是通过tile的MII接口进行读写,而5464是通过交换芯片的MII接口进行读写的,通过BCM shell phy命令手动读写5464各寄存器发现配置及状态正常,只是BCM shell在扫描的时候把本来接在ge18~ge21的1个5464(但该四个端口都应该显示为5464)扫描成了ge0~ge2三个端口的三个5464,缺少了一个5464通道。
认真查看sdk代码发现源代码在进行各端口port对应的phy扫描时,内部存在一个定义好的每个port应该扫描的phy地址表格,当选择外部phy扫描时,从ge0(port2)到hg3(port29),对应的phy地址从0x1到0x1d,所以在没有指定kconfig_list参数字符串的情况下,默认ge0端口从phy地址1查起,所以只能扫描到3个phy通道,而且还是从不正确的port2(ge0)开始的。
可以通过函数kconfig_set("port_phy_addr.port21.BCM56334_A0", "0x01")语句人工指定mpcb对应端口的phy地址。
注:BCM shell中的ge0并不对应port0,因为port0和port1用于芯片内部通道使用,所有ge0为port2开始。

10G端口遇到的情况及解决方法是:
mpcb的10G端口xgbe0与交换芯片hg0端口进行直连。
现象是xgbe0能够发送数据报到交换芯片的对应端口,但在BCM shell和pc机端都无法抓取不到数据报,同时xgbe0端口也无接收到数据的信息显示。
解决方法是:
首先通过查看bcm shell保证经过交换芯片的数据报没有错误,尤其是CRC错误;
其次broadcom为了实现级联将10G传输的标准以太网报改装成私有的HiGig+或HiGig2形式,该私有以太网报无法被正常的网络协议栈设置所接收,所以会造成数据报显示错误或无法接收和抓取到数据报;
修改方法是在bcm shell中使用命令port 26 encap=ieee其中port26为hg0,将默认的10G Higig端口改为标准的以太网10G接口;或者是修改多核处理器端寄存器配置以适应HiGig私有报格式。

阅读(1022) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~