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秒的黑屏或花屏,有没办法加快复制程序呢控制在几秒内最好。?