大家好:
我现在的需求是:产品通过SD烧录或升级code到Nand中,reset后从Nand启动,无OS。查看了网站资料
http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide#SPI
http://processors.wiki.ti.com/index.php/AM335X_StarterWare_Booting_And_Flashing#Booting_Via_NAND
根据网站资料了解,想分两步走:
一:先分别实现并了解SD和Nand的启动。SD card 启动,需要MLO和app;Nand启动,借助CCS例程NAND_Flashing_Tool将Nand_boot和code写入Nand中。
二:先从SD启动,执行app,app的功能是将Nand_boot和code写入Nand中,然后reset,设置。这样自己修改并生成app才行。
不知第二步的想法是否可行?
目前的状态是卡在第一步,生成的app无法正确执行,详细步骤如下:
1.通过CCS编译boot(eMMC)例程生成boot_ti.bin,改名为MLO
2.导入gpio例程,编译生成gpio_ti.bin,改名为app。
使用SD-Format工具将两个文件copy到SD中,reset,串口打印信息如下:
CCCCCCCCStarterWare AM335x Boot Loader
Copying application image from MMC/SD card to RAM
……………………………………..
Jumping to StarterWare Application…
但是app并没有执行,因为led始终是off的。(CCS debug gpi0.out可以正常执行,LED闪烁)
通过打印的信息来看,MLO已执行且copy app完成,然后PC指针跳转,应该到DDR中执行app,不知问题出在哪里?
xx_ti.bin文件是否需要特殊处理?我查看其Header.Add=0x80000_0000 没错啊!
哪位大侠指点一下,谢谢!
Gary Wu:
1,ccs编译的是时候应该选择MMCSD吧
2. 你是在什么平台上实验的?是自己的硬件板还是EVM?
如果是自己的硬件板,有无在bootloader的程序中修改针对板子的相关配置,如DDR3,PLL?
STONE:
回复 Gary Wu:
谢谢Gary的回复。
1.选的是MMCSD
2.板子是Devikit8600,随板资料里的bootloader+gpio_ti.bin通过SD卡boot正常。所以bootloader里的DDR,PLL等没有问题。
我只是把gpio_ti.bin文件的来源改了,改成我自己导入staerware的例程后,重新编译所得到的binary下的xx_ti.bin文件,然后就出现了上述问题。
所以问题应该集中在xx_ti.bin文件。
想请问:
xx_ti.bin文件直接通过CCS编译生成,然后拿来boot的使用方法是否正确?如若可以CCS的设置有哪些?
谢谢!
Gary Wu:
回复 STONE:
xx_ti.bin文件直接通过CCS编译生成,然后拿来boot的使用方法是否正确?
答:正确,将其更名为app即可。
请问starterware用的是什么版本?是其开发板里自带的吗?
STONE:
回复 Gary Wu:
开发板自带的是06版的starterware。我有试过以下动作(均使用开发板自带的MLO):
1. 将06版本的gpio例程导入CCS编译后生成的xx_ti.bin文件,改名后,SD boot也不行。
2. 将自己使用的 01_01版本的gpio例程导入CCS编译后的xx_ti.bin,改名后,SD boot同样不行。
但是开发板资料中自带的gpio_ti.bin文件是可以的,所以说MLO应该没有问题。于是就开始怀疑app生成方法问题。
按说app应该是跟平台没关系的啊,不知为何CCS编译后的xx_ti.bin不行?
Jian Zhou:
回复 STONE:
MLO可以正常启动,但是APP不行?
你有按照TI wiki的guide整个完整烧写过SD卡吗?
STONE:
回复 Jian Zhou:
更新内容如下:
在app添加串口打印信息,以便在boot时看到底有没有跳入执行。如下:
int main()
{
UARTPuts("\r\nStone test…\r\n", -1);//添加此行
GPIO1ModuleClkConfig();
GPIOModuleEnable(GPIO_INSTANCE_ADDRESS);
GPIOModuleReset(GPIO_INSTANCE_ADDRESS);
GPIODirModeSet(SOC_GPIO_1_REGS,26,0); //0:output;1:input
while(1)
{
GPIOPinWrite(GPIO_INSTANCE_ADDRESS,26,GPIO_PIN_HIGH);
Delay(0x3FFFF);
GPIOPinWrite(GPIO_INSTANCE_ADDRESS,26,GPIO_PIN_LOW);
Delay(0x3FFFF);
}
}
然后SD boot时发现串口打印信息正确,但是后面的gpio没有动作。之前一直认为没有跳入执行,但现在来看问题出在gpio为何没有动作?