S3C2410X开发总结及心得

2002年12月,我来到现在的这家公司,当时来的时候还是一肚子的气,
现在是2003年8月,我打算离开这家公司,虽然有气,但是已经不是像当初来的时候那样了……

来到公司,就开始搞这个2410的项目,2410作为CPU,其他的部分由于商业的原因,涉及到芯片的细节我就不在这里细细说了,大致是一个DSP作为MPEG4的Encoder,还有一个FPGA和这个DSP共同工作,产品的要求是一个嵌入式的硬盘录像系统,2410负责调动这个DPS、通过网络发送数据和存储视频。

当初老板买了一套这个DSP的开发板,花了他8500,准确的说是美金(我当时听了差点没有晕到)板子很漂亮,StrongARM的,上面跑的Linux,开发包很全,什么都有,DSP的Linux驱动程序,FPGA的firmware……

其实我心里一直以为嵌入式Linux这样的东西是不能当初商品来买的,因为谁也不敢保证说就没有这样那样的问题~至于卖得满天飞的开发板……

S3C2410X是我向老板推荐的,理由就不说了,主要的原因就是资源丰富,性能够用,价格适中~支持多种OS~不过要是能像Coldfire5272那样能内置以太网的话……嘿嘿

原理图地球人都知道哪里有下载的,我的想法就是按照这个来布线,至少原理上不会有错误。大家注意好,现在我说的事情是过年以前的事情,到过年的这段时间里,搭建好了交叉编译环境,按照官方的SMDK2410的原理图还有一些ARM Linux的资料看,还有现成的驱动程序和firmware,我想等到系统跑起来的那天,差不多就可以出产品了,但是……

年过完了,老板找公司另外的一个牛人来画PCB,其实这个人我一直以来比较喜欢,做事情和我一样,很踏实的那种:)SARS开始盛行,老板似乎也是看到了这是个发国难财的好机会,然后就要搞什么红外体温检测,好家伙,光是红外探头就买了50000个!中间公司的人事变动比较大,几个水平很高的搞上层的兄弟先后都另谋高就了~前后也来了些搞单片机的兄弟,因为项目管理实在是混乱,先后也离开了~现在他们还在搞红外的测温,总是有这样那样的问题出现,或者说上面有这样那样的意见,改来改去,这两天趁着他们都出去了,才偷偷写下这份文档。

我在中间的这段时间,就是写了写开发文档和一些商业计划书。很是无聊。中间我曾经主动帮他们这些搞单片机的人写了些C语言的代码,我对自己的C语言很是放心,我15岁的时候就自学了这东西,到现在仍然很是自豪,果然,他们都说我写的代码真是强,短小精悍,正是他们需要的……

原本以为板子很快都能交给我,谁知道,等板子给我的时候已经7月了:(
拿到板子的时候我一看,线倒是布得很宽,但是有些线走得太长了,像ram和flash这样的东西,但是我也没有太在意。
废话不说就开始干活,下载了vivi,当初我想把板子上flash都按照SMDK2410的留好,因为这种高频的电路和布线的关系很大,谁也不知道会不会出什么怪问题。

这里要说的是现在从mizi下载的vivi在编译的时候会报错,这里有个小BUG,在一个加载vivi command的地方,有个command的单词打错了,改过来就行了,看来mizi的人也会犯这种低级错误啊~

开始的时候调试板子上的一块nand flash(k9f2808),这个和SMDK2410上的不太一样(k9s2808,是那种SMC卡)。
调试的过程中发现怎么老是跳到SDRAM的地方就出错

vivi里对nand flash启动作了处理,因为本身S3C2410X支持nand flash作为bootrom,S3C2410X在启动的时候,会把nand flash前面的一小部分装载到2410里面自己一个4k大小的buffer里面(Steppingstone)在vivi里专门有一行on_the_ram,这个是在vivi复制自身到ram里之后,一跳进去就出错,而且在前面有一段用来检测copy vivi到ram里是否正确的代码也老是过不去,但是vivi里自己的ram检测是可以的,注意这个地方,vivi里检测ram只检测了1M的大小,这个也和后来的最关键的地方埋藏了祸根……

可以用objdump把编译好的vivi-elf反汇编来看汇编代码~
(xxx-objdump -D vivi-elf > vivi.s)

在调试的过程中,和mizi(三星指定的S3C2410X的官方技术支持)的人也作了交流,他们说怀疑我的硬件上有问题,我想不明白,两周之后我发现这个问题老是不对也没有办法,

就换到板子上另外的一个Strata flash的地方,为了和公司节省成本(考虑真周到),我们选用了和strata完全兼容的Qflash,狂加了三天班,把flash烧写搞好了,2410官方的那个烧写是在windows上用的,不但要装驱动,而且是烧写32位的strata flash的,而我们这个板子上只用了一片(16位的)这三天,我每天加班到早上5点,第四天,我实在是盯不住了,回到住的地方大睡,醒来发现尿里都有血了!唉,简直成了拼命三郎了~

vivi在这个板子上能动,但是在启动的地方有乱码,我想这个也许是BUG,改了改,一切看起来似乎都OK,但是没有想到……

烧上编译好的zImage,事情就不对了,一加载zImage就跑飞了~仔细检查检查,没有发现明显的错误,

后来发现了一个问题,这个是和编译器相关的,相同版本的vivi,如果用vivi里原来的Makefile里所用的编译器和用arm-linux-GCC 2.95.3编译的东西在我的板子上完全是两个样子。用vivi指定的编译器,从minicom来看,启动的时候字符乱得一塌糊涂,而且在Makefile里LINUXDIR也是要修改的,要用打了补丁的Linux,我的是在(/use/src/arm/linux/include),不然问题更多,LIBS也要作修改,我修改到那个安装cross compiler lib的位置(具体请看附加的档案)

而且从官方网页下载的vivi和从CVS下载的代码在同样编译器编译的执行结果也有稍许差异

这个问题究竟是为什么,还需要进一步研究(可能和编译器的版本有关系)~

等我消除了一些大的问题后,原本以为没有问题了,结果在启动Linux的地方就出现了crc error的问题,这个地方我开始怀疑我的烧写不对,但是通过串口下载vivi到内存里也是crc error郁闷开始了……

我开始找这样那样的可能,最后全部排除后,我才开始怀疑我的板子硬件上布线有问题,最后写了一段代码检测ram,错误居然是随机产生的~我哭,反复修改了寄存器的设置,问题依旧

找了我一个朋友,他那里有一快能用的2410的开发板子,测试软件没有问题,和布线的同事仔细沟通了一下,再和别人能用的板子对比,发现问题有两点:
1.ram flash的线太走得太长
2.2410的文档里有个布线的要求很重要,sdram的所有信号线要近似等长,而且sclk要分两根,

布线的问题,2410的手册里说的很清楚,兄弟们如果也有在搞2410的话,请注意这些细节。
这种高频板和布线的关系很大,也是很关键的问题,2410本身布线是比较困难的,听朋友讲他们的2410改了三次版之多,
这两个问题是布线的同事没有注意到的,这也不能怪他,因为他从来也没有布过高频板,也没有布过多层板~

我想如果我的小孙兄弟来布线的话,估计就不会有这个问题了,可惜他现在怎么样我也不知道,祝他好运~

至此,关键问题找到了,但是不是那么容易解决的,因为要重新布线:(
不过我的老板对我的态度似乎不像我刚来公司的时候啊,唉,tnnd

现在的公司大多没有项目管理的概念,出了问题好像永远都是搞技术的人的错,
如果这里的兄弟哪天开公司,希望大家能作大,不然总是这样下去的话,恐怕中国的IT水平……

心得也大概就这么多了,在开发过程中还要感谢我从前在华恒的兄弟对我的关心,特别是hn,
当然还要感谢tpu大哥的热心帮助,还有我的诸多好兄弟,你们对我的帮助让我在这个世态炎凉的世界里还稍许感到有点温暖~

最后说一点,估计这个版里的兄弟也都是搞技术的多吧,希望这里的好兄弟都能事业有成