Chinaunix首页 | 论坛 | 博客
  • 博客访问: 822498
  • 博文数量: 124
  • 博客积分: 1927
  • 博客等级: 上尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-31 14:06
文章分类

全部博文(124)

文章存档

2018年(5)

2017年(2)

2016年(6)

2015年(4)

2014年(24)

2013年(7)

2012年(11)

2011年(13)

2010年(52)

我的朋友

分类: LINUX

2014-04-23 09:58:52

我们这款产品的硬件搭配为PowerPC860+BCM53262,尽管PowerPC860在这个年代略显不够Power,但是它以极高的稳定性还是占有一席之地。BCM53262和BCM53242是兄弟,很多人都用过BCM53242,实际上它们是一样的,在Broadcom公司的家族系列中,这两款芯片只能算是中档,但是已经够用了。BCM53262共有24个百兆口,4个千兆口和一个管理口(CPU口),该管理口是和PowerPC直接相连的,用CPU来控制BCM53262交换芯片,我们的产品CPU用的是MII方式,交换芯片用的是RVMII,这种连接方式可以在Broadcom公司的datasheet中查到,这样就可以通过PowerPC860来控制BCM53262了,PowerPC860和交换芯片交换数据采用的是EB总线,也是CPU和BCM53262直接相连,这种数据交换方式的优点是高效,但是相对于PCI相连的方式,EB还是有点不足,因为EB只是针对于中高端的芯片,而PCI总线就是相对于高端产品了,比如48个口的交换机,它的数据交换效率比EB总线更高。

            硬件做出来后,需要硬件工程师写测试代码,来确保硬件工作正常,最主要的方式就是参照datasheet对寄存器操作,如果硬件的百兆口和千兆口都能工作正常的话,那么这款硬件基本上就做成功了,接下来就是移植Broadcom的SDK。SDK是个巨大无比的系统软件,这款软件集合了所有博通公司的芯片代码,如果不懂得它的工作原理,移植起来相当麻烦。接下来让我们移植这个SDK到硬件上,然后再在移植的平台上添加功能,最后对整个系统进行优化,使之性能达到最稳定,效率最高。SDK的默认编译平台为Linux,因此我们需要安装tornado2.2的Linux版,相信很多人都没有tornado2.2的Linux安装版,那我们就在Windows下面操作。SDK中的Makefile有几处地方和Windows不兼容,这几个地方都很隐蔽,当初我是调了两个礼拜的makefile才调通,如果你还不懂得makefile,那赶紧找本makefile的书来看看,最好是英文版的,千万别怕英文,有看不懂的地方再参照中文,不出一个礼拜就能通晓makefile,另外我们还需要了解GCC,因为broadcom公司的SDK的robo系列给出的是MIPS处理器,而我们用的是PowerPC,所以还要知道GCC中参数的意思。

 

             现在开始移植SDK,在这之前,还需要自己写BSP包,因为我们的处理器是powerpc,和broadcom公司的demo板处理器不样,所以这个必须自己写,BSP最好参照broadcom公司的样品BSP,SDK中有些函数会直接调用到BSP中的函数,若你的BSP中没有这些函数,会在链接阶段通不过,其实BSP包的串口和flash驱动还是比较好写的,难就难在网口驱动程序,我们用的网口驱动程序是motfecend,这个会在以后改写。如果BSP能正常下载到板子上,且能让板子跑起来稳定,那么恭喜你,我们可以往下走了。接下来调试Makefile,最重要的一个Makefile是config,很多人都喜欢修改local这个文件,实际上我是没有用到local文件的,直接修改config文件,最后我把config文件修改到100多行,把不需要的功能都去掉了,比如调试功能,不需要的phy驱动,不需要的芯片驱动,若你不去掉这些,最后编出来的系统会比较大,而且启动速度会比较慢。在make.tools这个文件中,我们可以看到需要perl解释器,那我们就从网上down个perl解释器,然后安装,perl会自动添加到环境变量中,这个比较easy。另外我还down了个cygwin,cygwin只是把linux移植到windows上面,其实不要cygwin也可以编译系统,最重要的就是你的PC机上必须安装tornado,我们安装的是tornado for powerpc,如果你还没有tornado,可以用电驴下,我就下了power和mips的tornado。等所有工具都安装好后,我们就可以编译该SDK了,首先我们进入到systems/vxworks/bsp-name/这个目录下,输入make命令,SDK中的源文件即开始编译。我总觉得SDK中的makefile没有Linux下的makefile写的好,那是因为SDK中的makefile是个循环嵌套结构,即这个makefile包含那个makefile,让人看了比较头疼,不像Linux下的makefile看起来那么清爽,这点是broadcom做的不到位的地方。若你的源文件编译出来有问题,不要怀疑源文件错了,比如找不到头文件,或者源文件中的某个变量没有定义,那肯定是你的makefile还没有修改成功,因为最初的我也是一样,总认为是别人的源文件有问题,结果是自己的makefile没有修改对,若说源文件有问题,还真被我找到一处地方,那就是va_copy,这个在tornado下面是不能通过的,我查过Linux的技术文档,好像把va_copy改成了_va_copy,最初我在编译到这个地方的时候,死活都通不过,后来还是自己查文档才找到问题的出处。若你编译还是很顺利的话,那么链接的时候或多或少的都会出现点问题,由于BSP包中包含了Telnet,而在SDK中也是包含了Telnet,结果在链接的时候会产生冲突,我开始不知道是什么问题,后来才知道需要关闭makefile中的Telnet,但我建议你还是打开Telnet,我是把BSP中的Telnet关掉了,这样链接就不会冲突了,另外我们的BSP中打开了nfs,SDK中似乎也有这个东东,搞的我在链接的时候总是报些莫名其妙的错误,这个就需要你修改BSP了,否则链接通不过。如果链接也通过了,那么你的第一个系统映像就出来了。

               

                 接下来就需要把系统映像下载到板子上,因为还是处于开发阶段,所以我就直接把系统下到Ram里面去,等到以后做稳定,我们再用程序把系统烧写到flash中,我们用的是Tornado的FTP,这个很简单。这里有个问题要交代下,由于SDK默认的系统映像为vxWorks.st,不是vxWorks,前者只是比后面多带了个符号文件,但是你会发现将vxWorks.st下到板子上,在还没有启动sdk前,会发现PC机ping不通板子的,起初我也很疑惑,为什么不带sdk就能ping通板子,而带了后在没有启动SDK前就ping不通了呢,后来才发现需要在config.h中添加一个组件,这里就不多交代了。接下来我们分析SDK是如何启动的,在BSP中最后一个函数是usrappinit,这个函数会调用SDK的入口函数vxSpawn,vxSpawn会调用sal_core_init,sal_appl_init和diag_shell,sal_core_init和sal_appl_init这两个函数不用管,它们是两个系统无关层的函数,我们要把SDK移植到非Linux和vxWorks系统上,就需要移植这个sal层,还要交代的是sal_core_init这个函数启动了DPC这个任务,它的优先级还是蛮高的(50),如果这个任务没有起来,其他的任务都将歇菜,要不怎么说这个任务是呆在core里呢,sal_appl_init这个函数无非就是用来搞些板子上的应用,比如ls,cd等,这些我都没有用到,屏蔽了这里面的一些函数。最重要的一个函数就是diag_shell,这个函数绝对是重量级的,因为它主要做了以下几件事情,查找交换芯片,然后将驱动和芯片attach,接着是初始化交换芯片的模块,比如vlan,stp等,最后是进入到博通公司的调试shell。让我们来看看是如何查找到硬件的,其实说白了,就是查找devId和revId。当你看到probe这样的函数时,一定要多加注意,因为这个函数就是查找硬件的函数,在Linux也是这样的,在我们的SDK中,diag_shell调用了sysconf_probe函数,sysconf_probe会bde_create函数来查找硬件,bde的意思为broadcom device Enumerate ,也就是博通公司的硬件枚举,在datasheet里会讲到博通就是用bde来查找硬件的,其实找硬件也很简单,就是读了两个寄存器,一个是phyidh,另一个是phyidl,将这两个读出来的值和H文件的硬件类型相比较,若有匹配的那个硬件,就说明你的硬件找到了,否则就失败了。这里有一个特别重要的提示,当初我在开发的时候,死活都找不到硬件,后来才发现是大小端的问题,虽然这个问题不是很严重,但是你不知道板子的大小端,程序找不到硬件的时候,会直接让你崩溃。若找到硬件了,那我们就要加载相应的驱动,接着我们会调用函数sysconf_attach来将驱动和硬件相互绑定,只有驱动加载成功了,我们这块芯片才能发挥作用。在这个函数里面,SDK定义了很多函数指针,只要是写过驱动的人,都很清楚这些函数指针,无非就是写读写函数,不用管它,只要知道有这些函数就行了,这些函数将会在整个系统中发挥最不起眼但又最重要的作用,有了device,又有了drive,它们两个一结合,那我们这个交换芯片就有了最基本的功能,可读可写,可打开可关闭。

                 接着往下走,diag_shell接着调用system_init这个函数,该函数是用来做上层模块初始化用的,我们要想用到vlan、trunk、生成树这些功能,就会在该函数中调用,system_init函数会调用到bcm_robo_init_selective函数,这个函数会对port、l2、vlan和生成树等做初始化,如果我们不需要其中的某些功能,直接可以在该函数中屏蔽掉。这个函数也是共系统平台起来后,我们可以调用上层函数接口写应用程序,比如创建vlan,创建生成树等等,等到所有这些都做完后,我们就进入了broadcom公司的调试shell,调试shell很简单,就是用来查看寄存器,修改寄存器,查看memory,修改memory和查看一些高层的应用,比较简单,只需要掌握cmdlist.c这个文件就ok了,比如我在后期给网管提供接口,基本上都是从这个文件里找到相应的接口。

 

              至此,整个系统就起来了,但还需要加强稳定性和效率。以后会写到如何添加生成树,如何修改网口驱动。

除此之外,我的资源里还有一个doc文档:BCMSDK在Tornado下的编译

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