AM335x NorFlash NonMux boot设计
---记录一段曲折的bootloader
1、开始...
am335x的启动部分,貌似被不少人吐槽过。因为初次接触这个片子,硬件设计上有些小白处理,导致了一段曲折的boot过程。
2、开发环境及硬件连接
硬件平台:AM3354
软件:基于StarterWare_02_00_01_01
NORFlash型号:S29GL01GS-90TFI010-TSOP56
硬件连接:从上面可以看出,硬件连接上没有采用复用设计。这也为这段曲折的脑筋急转弯埋下了伏笔。。。
3、am335x的boot过程
am335x启动时,分为以下过程
4、设计
这么一看第三部分,满简单的。选择从NORflash启动,由于norflash是xip设备,代码可以直接在其内运行。
(但是xip设备也是只能读取(读取无需特别指令),不能写入的。因此,code部分在norflash内(包括const),data等可变的部分在ram内,这些需要在cmd文件中指定。)
那我们就分步进行吧。
1)选择sysboot_config
这里我们的设置包括
10b--->25Mhz时钟
00b
00b---->non-muxed device
0 ----->8bit-device (这里为什么选择8bit呢,因为16位的norflash没有错开最低位,所以只能作为8位用,测试程序也是这么做的,正常接法的可以无视)
0 ------>CLKOUT1-disableed
11010b xip(MUX2)----->选择xip启动,MUX2可以参见datasheet.
2)spl设计1
启动方式选择后,进行spl设计,normux下,只能使用12根地址线....所以spl代码必须在4k以内.感觉到d疼了么.
图3
下载starterware,导入bootloader程序,开始删删删,终于删除到了4K以内,得到了boot.bin...
这里,烧写boot.bin文件时,我应该烧写到0x00000000,也就是norflash的0地址,可是,由于没有将boot和地址线做隔离处理,高位地址A12-A25 并非我们想象的也是0.
查看am3359的datasheet的PIN RESET STATE可以看到,MMC0_CLK-MMC0_DAT3这6跟地址线是上拉的.还有我们最开始选择的25M时钟选择位也是上拉的。因此
虽然访问的是0x00000000,但实际访问的地址是0x03F80000.所以烧写boot程序时,不要烧写到0x00000000,而是0x03F80000.不然肯定是启动失败.
3)SPL设计2
SPL代码内,我们是不是可以pinmux所有管脚,将程序加载到ddr3运行了呢?这里还有一个问题.因为我们把程序烧写到了0x03F80000,高位地址是内部拉高的。我们如果初始化后,arm在访问0x08000000时,管脚已经可以将高位地址下拉了.这是就是真正的0x08000000了.所以,我做了下测试,直接pinmux所有管脚是不可行的.so.我们只初始化以下没有拉高的几个管脚a12-a15.这样就扩大了我们的寻址范围。这时再将另外一段代码拷贝到ddr内运行.这段代码我们叫他spl2。。。在spl2内,我们就可以pinmux所有管脚了.因为代码是在ddr内运行的。跟norflash没有关系了。
5、总结
如果是硬件常规的接法,boot设计上会简单许多。推荐norflash做启动时使用pinmux方式。另外,高位地址与sysconfig冲突时,采用bus transceiver进行隔离。这部分的说明在下面的链接内有详细的解释。
另外,烧写norflash的程序在最新的sdk里面的tools里面有。至此结束,其中可能有理解不到位的地方,欢迎拍砖。
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/30869.aspx