|
S3C2440 bootloader加载nk.bin出错
[复制链接]
我用的飞凌的Uboot下载NK.bin,提示出错,提示错误如下:
real entry is 0x%00000000, physical address is 0x%00000000
指示检查了程序,是在读取NK.bin里面的记录时出的错。
NK.bin文件头,即7个字节的头文件读取正确,代码如下:
if(strncmp("B000FF\x0a", (char *)img_src, 7))
{
char *c = (char *)img_src;
printf("Invalid BIN file signature!\n");//打印信息提示下载的并非NK.bin文件。
printf("%x,%x,%x,%x,%x,%x,%x\n", c[0],c[1],c[2],c[3],c[4],c[5],c[6]);//打印NK的前7bytes
return -1;
}
NK.bin的映像起始地址读取正确,代码如下:
img_src += 7;
img_start = GetU32Num((char *)img_src);
NK.bin映像数据长度读取正确,代码如下:
img_src += sizeof(U32); //sizeof(U32)=4bytes
img_length = GetU32Num((char *)img_src);
但是当读取NK.bin的一条条记录时,读取的记录的起始地址和长度竟然都是0!
这里是读取记录的部分代码:
pCtxRecord = (CtxRecord *)img_src; //下面三句是不是有问题?
start = GetU32Num((char *)&pCtxRecord->start);
//added by lqm for test!
//printf("start is 0x%8x!\n",start);
//while(1);
length = GetU32Num((char *)&pCtxRecord->length);
chksum = GetU32Num((char *)&pCtxRecord->chksum);
img_src += sizeof(CtxRecord);
这是为什么?
整个加载NK.bin的函数如下:
int RelocateNKBIN(U32 img_src, U32 *pStart, U32 *pLength, U32 *pLaunch)
{
U32 img_start, img_length;
CtxRecord *pCtxRecord;
//B000FF\x0a是NK.bin的头文件,即头7个字节,用于判断是否为NK.bin文件。
//strncmp函数用于确认源文件是否为NK.bin,如果不是打印括号里面的信息。
if(strncmp("B000FF\x0a", (char *)img_src, 7))
{
char *c = (char *)img_src;
printf("Invalid BIN file signature!\n");//打印信息提示下载的并非NK.bin文件。
printf("%x,%x,%x,%x,%x,%x,%x\n", c[0],c[1],c[2],c[3],c[4],c[5],c[6]);//打印NK的前7bytes
return -1;
}
printf("Found single BIN signature.\n");//执行到这里表示下载的文件是NK.bin文件。
img_src += 7;
img_start = GetU32Num((char *)img_src); //nk.bin的内部结构组成,映像数据的起始地址
img_src += sizeof(U32); //sizeof(U32)=4bytes
img_length = GetU32Num((char *)img_src);//nk.bin的内部结构组成,映像数据的长度
printf("Image start is 0x%08x, length is 0x%08x\n", img_start, img_length);
memset((char *)mem_convert(img_start), 0, 0x1000); //clear 4K
img_src += sizeof(U32);
while(1)
{
U32 start, length, chksum;
//下面几句中,得到的start和length都为0!问题在哪?对照NK.bin的二进制代码找原因!
pCtxRecord = (CtxRecord *)img_src; //下面三句是不是有问题?
start = GetU32Num((char *)&pCtxRecord->start);
//added by lqm for test!
//printf("start is 0x%8x!\n",start);
//while(1);
length = GetU32Num((char *)&pCtxRecord->length);
chksum = GetU32Num((char *)&pCtxRecord->chksum);
img_src += sizeof(CtxRecord);
if(!start&&!chksum) //下载NK.bin时程序执行到这里面了,看来又出错了!!!!!!!!!!!!!!!!!!!!!!!!!!
{
*pLaunch = mem_convert(length);
printf("real entry is 0x%08x, physical address is 0x%08x\n", length, *pLaunch);
break;
}
printf("REC start 0x%08x, length 0x%x\n", start, length);
memcpy((char *)mem_convert(start), (char *)img_src, length);
img_src += length;
if(CalChkSum((U8 *)mem_convert(start), length, chksum))
{
printf("Checksum fail!\n");
return -1;
}
if(length==sizeof(ROMHDR)&&
*(U32 *)mem_convert(img_start+ROM_SIGNATURE_OFFSET)==ROM_SIGNATURE&&
*(U32 *)mem_convert(img_start+ROM_SIGNATURE_OFFSET+4)==start)
{
ROMHDR *pRomHdr = (ROMHDR *)mem_convert(start);
printf(" ROMHDR 0x%08x, 0x%08x\n", start, *(U32 *)mem_convert(img_start+ROM_SIGNATURE_OFFSET+4));
printf(" dllfirst 0x%08x, dlllast 0x%08x\n", pRomHdr->dllfirst, pRomHdr->dlllast);
printf(" physfirst 0x%08x, physlast 0x%08x\n", pRomHdr->physfirst, pRomHdr->physlast);
}
}
printf("do you want to run it? [y/n]\n");
while(1)
{
U8 c = getch();
if(c=='y'||c=='Y')
call_linux(0, 0, *pLaunch);
if(c=='n'||c=='N')
break;
}
*pStart = mem_convert(img_start);
*pLength = img_length;
return 0;
}
上面的每一条记录的特征都对应有一个结构体,如下:
typedef struct {
U32 start;
U32 length;
U32 chksum;
} CtxRecord;
用于记录每一条记录的起始地址,长度和校验和。但是读出来的start和length都是0,这是为什么?
我比较了所加载的nk.bin,对应的start和length都不是0,一定是程序里面的结构体和指针之类的程序有误,请教高手帮排除疑难杂症,或给予相应提示,感激不尽!
|
|