1985|2

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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,一定是程序里面的结构体和指针之类的程序有误,请教高手帮排除疑难杂症,或给予相应提示,感激不尽!

最新回复

学习了,俺最近想把优龙的bootloader改成适合友善之臂mini2440的bootloader,可是不知道要改哪些方面,自己不能完全想到,求教各位大侠.  详情 回复 发表于 2009-11-20 20:09
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
晕死,没人回答啊,我只能自己给自己结贴了!
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习了,俺最近想把优龙的bootloader改成适合友善之臂mini2440的bootloader,可是不知道要改哪些方面,自己不能完全想到,求教各位大侠.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表