TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320C6455: 自己制作的emifa nor flash刷机工具烧录bin文件后,系统起不来。

Part Number:TMS320C6455

ccs5.2 post-build生成的的bin文件,用自制的emifa nor flash烧录工具刷机后系统起不来。

工程cmd,map,tcf文件见附件。

刷机源码如下

#define E_PASS 0
#define E_FAIL -1
static Uint8 tx[550];
static Uint8 rx[550];
void write_flash()
{
Int16 i;
Uint8* p8; ;
FILE *fPtr;
Int32 fileSize = 0;
Int32 no_of_pages; Int32 no_of_sectors; Int8 fileName[256], itype[20];
Int32 sector_size;
sector_size = 0x020000;
printf("Enter the File Name\n"); scanf("%s", fileName);
fflush(stdin);
fPtr = fopen(fileName, "rb");
if(fPtr == NULL)
{
printf("File %s Open failed\n", fileName);
return E_FAIL;
}

printf("Reading file…");
printf("This may take sometime depending on the size of the file…\n");
fflush(stdout);
// Initialize the pointer
fileSize = 0;

// Read file size
fseek(fPtr,0,SEEK_END);
fileSize = ftell(fPtr);

if(fileSize == 0)
{
printf("File read failed.. Closing APP\n");
fclose (fPtr);
return E_FAIL;
}
fseek(fPtr,0,SEEK_SET);
no_of_sectors = (fileSize/sector_size + ((fileSize % sector_size) ? 1 : 0));
FlashErase(0xb0000000,no_of_sectors*sector_size);
printf("Writing flash number of pages: %d\n", no_of_pages);
i = 0;
while(!feof(fPtr))
{
p8 = (Uint8*) tx;
if(!feof(fPtr)) {
fread(p8, 1, 512, fPtr);
}
FlashWrite(0xb0000000 + i * 512, ( Uint8 *)tx, 512);
i++;
}

fseek(fPtr,0,SEEK_SET);

printf("Reading verifying the file.. ");
fflush(stdout);

i = 0;

while(!feof(fPtr))
{
unsigned int nbytes;

if(!feof(fPtr)) {
nbytes = fread(tx, 1, 512, fPtr);
} tx[nbytes] = '\0';

FlashRead (0xb0000000 + i * 512, (Uint8 *)rx, 512 );
rx[nbytes] = '\0'; if(strcmp((const char *)rx,(const char *)tx)!= 0) {
printf("Files did not match @ %d\n", ftell(fPtr));
goto finish;
}
i++;
}

printf("Files matched \n");

finish:
fclose(fPtr);
}

Nancy Wang:

附件补充:

4667.pic-map-cmd.zip

,

wang yanping:

1.编译出来的的.out直接仿真器load program加载是能跑到main函数的。

2. 生成bin命令 "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin.bat" "${BuildArtifactFileName}" "${BuildArtifactFileName}.bin" "${CG_TOOL_ROOT}/bin/ofd6x.exe" "${CG_TOOL_ROOT}/bin/hex6x.exe" "${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin.exe"

3.我们工程有二级boot代码,但是我不确定有没有使用,二级boot汇编代码见附件。

4.这个烧录代码我试过只写4个字节和擦除4个字节是ok的。

5.另外我在tcf文件的配置工具里的BIOS Code选项卡里把.sysinit配置成nor flash首地址0xb0000000后编译出来的bin有2MB,没这样设置以前bin只有700KB,然后再在Load Address选项卡里把.sysinit配置成nor flash首地址0xb0000000后编译出来的bin有4GB,我们的.out只有2MB。

6.只把BIOS Code选项卡里把.sysinit配置成nor flash首地址0xb0000000后,重新load symbols后,单步执行直接进入.sysinit的dsk6455cfg.c文件。

最新具体调试情况就是这样,现在就不确定是刷机工具、cmd文件、tcf文件、启动入口地址等其他问题,请帮忙看看谢谢了。

,

wang yanping:

看出啥问题没有呢?

,

wang yanping:

关键是现在改成加载和运行都放在flash地址,编译出来的有4GB,没法烧写。

,

Shine:

建议先不要用二次bootloader,先从一个最简单的helloworld程序开始,先把boot流程跑通。

,

wang yanping:

1.不用二级bootloader的话,就是直接把c_int00放在0xb0000000吗?

2.如何调试才能说明flash烧录到flash成功且能运行呢,是不是load symbols后能 跑进main就说明成功了?

,

wang yanping:

1.需要把所有的段都放进flash里面吗?

2.目前是所有的段都放在IRAM里面一切都ok,但是只要把段改成放进flash里面生成的bin就有4GB。

,

wang yanping:

能不能把代码给你帮忙调试下呢

,

Shine:

建议参考一下下面C6713的二次bootloader例程,原理一样的。https://www.ti.com/lit/an/spra999a/spra999a.pdf

,

wang yanping:

现在把所有的段都放在flash里了,且二级boot汇编放在flash首地址0xb0000000,编译的bin也正常,但是进了二级boot进不了_c_int00,调用的指令是mvkl .S2 _c_int00,B0        mvkh S2 _c_int00,B0

 B .S2 B0

nop 5,帮忙看看什么原因呢谢谢

,

wang yanping:

load symbols后断点已经执行到这几条汇编指令,执行到B .S2 B0就卡住了,无法打断点。

,

wang yanping:

out只有2MB,bin按理说应该小于2MB才对啊,用编辑器打开bin很多0的数据

,

Shine:

您的二次bootloader是用C语言写的?一般是用汇编写的。二次bootloader搬移完应用程序后,最后才会执行跳转到应用程序的_c_int00程序入口地址。

0xb0000000这里应该是二次bootloader的程序入口地址,在编译二次bootloader时,可以用-e 定义程序入口地址。编译后,可以查看map文件,看一下entry point address是否是0xb0000000?

,

wang yanping:

入口地址是对了的,但是进不了main函数。二次boot文件见附件7142.file.zip

,

wang yanping:

有看出什么问题吗?

,

Shine:

main函数是应用程序里的main函数吧?二次bootloader已经运行起来了?

,

wang yanping:

就是应用程序的main。

二次bootloader已经跑起来了,load symbols的时候就跑到了二次bootloader汇编代码并且可以单步执行,但是进不了_c_int00和main

,

wang yanping:

能不能在二次bootloader汇编代码里强制写条绝对地址的汇编指令跳转到c_int00,比如我的map里的c_int00地址是0xb01F25c0,直接跳转到这个地址,知道这个命令怎么写吗?

,

wang yanping:

周末调试了,现在是运行到跳转到c_int00指令后,看_c_int00地址都和map一致,但是pc指针地址没有更新到_c_int00。手动移动到_c_int00单步执行一直在_auto_init里跑,也跑不到main里去。

,

wang yanping:

今天调试发现刷机成功后,load symbols看内存,刷机的地方怎么的都变成80808080了。

,

wang yanping:

运行下unlock指令flash就有数据了,但是数据不对。

,

wang yanping:

现在是跳转到_c_int00的时候,寄存器的地址是对的,但是PC指针没有切到c_int00的地址。

我直接在c_int00出运行也跑不到main函数,一直停留在_auto_init函数,因为这部分没有源码我也分析不了。

麻烦回复一下,谢谢了

,

Shine:

在仿真器模式下,二次bootloader程序能加载应用程序后,跳转到_c_int00吗?

,

wang yanping:

因为现在所有的段都加载到flash地址,直接在flash运行,所以二次bootloader的汇编中直接去调用_c_int00。

目前跑不到c_int00,跳转的时候地址都是对的,但是PC指针没有更新到_c_int00地址。

,

wang yanping:

分别对比了flash和IRAM运行时候的_c_int00地址的16进制值有个别字节不一样,这样是不是说明烧录有问题呢?

,

wang yanping:

现在没用二级bootloader了,所有段运行和加载地址都放在flash里面了,load symbols运行后一直卡在_auto_init里面。

,

Shine:

请看一下编译工程时是否使用了-c ROM runtime选项。

,

wang yanping:

就是使用了和你图片一样的设置

,

Shine:

能否先烧写一个non bios的裸机程序,看能否加载起来。

,

wang yanping:

加载到IRAM之前都需要一个gel文件,这个文件有对emifa接口初始化;刷到flash是不是也需要一个emifa的汇编初始化代码呢?

non bios裸机程序如何制作呢?

,

wang yanping:

因为每次烧录后,查看flash地址经常出现全是80808080字节,怀疑可能emifa没初始化好。

我们以前成功的刷机方法是把二次bootloader存放在0xb0020000后面的1k范围内,0xb0020000前面通过ccs加载放了一个刷机程序代码,第一次刷机的时候先从0xb0000000启动进行刷机,再把编译出来的.out通过串口发送进去烧写。

这种方法太久远了找不到相关资料,所以只有自己做个刷机工具,但是现在又卡在刷机后系统起不来这了。

,

wang yanping:

有没有试过直接保存ok的IRAM机器指令数据,然后烧到flash。

,

wang yanping:

已经搞好了可以关闭问题谢谢了,复制IRAM ok的机器数据,刷到flash,起来的时候复制到内存运行,这样就和IRAM运行一样了。

,

wang yanping:

现在刷机到flash,系统起来后,会复制2M的程序到IRAM,导致有50秒的黑屏或花屏,有没办法加快复制程序呢控制在几秒内最好。?

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6455: 自己制作的emifa nor flash刷机工具烧录bin文件后,系统起不来。
分享到: 更多 (0)