需求:前段时间做过一款产品,要求高速和高精度,每秒钟数据采样与处理在两千次以上,初步做两种方案,一种是在Linux操作系统下,稳定性高,升级方便,但操作系统对主控芯片的开销会增大,担心不能满足要求;第二种:是前后台模式。
简析:一直很信赖TI的产品,经再三考虑选了AM3505这款芯片,主频600M,理论推算可以满足要求,因为暂时没有界面处理,所以选了一个不带图形加速器的,但在样片申请时AM3505暂时没有,就给了AM3517,很感谢TI的样片申请业务。
系统:主控芯片AM3517,内存:美光DDR2 MT47H64M16HR-25,Flash:三星K9K8G08U0A,电源芯片:tps65910,网卡:IP101A,另外预留了HDMI和CAN接口,芯片型号:TFP410PAP和ISO1050等。
应用开始:
第一步,焼写启动代码,从ti技术支持得到的开发包,TI的启动代码包含了两部分一个是X-loader TI自己做到,另一个是linux通用引导U-boot。用ti的flash tool烧写工具,用之前需要根据自己的硬件类型做一些配置,如NandFlash是几位的,最大容量,块大小,页大小等,对相应的只修改一下。其他还有一些配置,由于个人没有用过就不再多说,有问题时建议多看Help文件,Ti论坛也有很多相关资料。
接下来是将x-loader和U-boot合并到一起。X-loader存在的原因可能是,U-boot内容过多,芯片内部Ram有限(64K),所以就做了一级缓冲,先运行x-loader对硬件环境一个简单的初始化,然后将u-boot拷贝到内存中,再将控制权交给U-boot。
对编译后的X-loader做了一下分析,发现x-loader头部是一个固定的内容,就是X-loader的大小,合并方法是将U-boot的对硬件必要的初始化和添加搬运自己代码到内存中的这段程序压缩到64K以内,等Uboot把自己搬运完了就跳到内存中从新运行U-boot,在U-boot中要判断自己是在内存中还是在Flash中,这个可以通过地址来判断,在Flash中就运行拷贝自己的程序,在内存中就跳过。这个很简单,都是U-boot内部函数的一些拷贝。
第二步:网卡移植,IP101A非常好用,我们用的是RMII精简接口,需要给AM3517的网络部分提供一个50M的时钟,IP101A内部可以产生这个时钟,其他都用默认配置即可。在U-boot里添加以下IP101A的PHY地址做个判断就可以。
第三步:一键更新,使用u-boot通过网络自己更新自己、内核、文件系统会很方便,而且速度很快,只是指令多了点。这里就是把u-boot的tftp下载命令,擦出nand flash命令和写命令综合到一起,其他也没什么,值得说的就是,烧写u-boot时用的是硬件1bit Ecc校验,这个是am3517内部定义的。烧写内核时用的是硬件Ecc 4 bit校验方式。
第四步:在U-boot里验证开启指令缓存,数据缓存后与开启前的速度对比。
之前一直都是在搞51和M3,所以对缓存不是很清楚,但硬件的资源一般都是根据要求配置一些寄存器,于是就开始看AM3517数据手册,两千多页全英文,想想都头大,哎!英语不好。
于是就挑了一些相关的关键的看,但在芯片手册里根本找不到关于缓存的初始化和详细的介绍。在u-boot里有打开指令缓存和数据缓存的函数,但都只是一个接口。
Yaoming Qin:
赞,写的很清楚