首页 > 其他 > 详细

uboot——官网下载直接移植(二)

时间:2017-02-28 00:16:22      阅读:530      评论:0      收藏:0      [点我收藏+]

1:做好上一章的准备工作,下面我们开始移植uboot

首先修改交叉编译工具链:在主Makefile文件中的交叉编译工具链修改为:

# set default to nothing for native builds
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
else
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif

下面把烧录文件移植到uboot中;

把三星移植好的uboot中的sd_fusing 复制到新的uboot的根目录中,烧录sd卡

技术分享

输出信息如下,说明校验头失败;

分析sd_fusing目录下的C110-EVT1-mkbl1.c文件

技术分享

这段代码中是把uboot的前8k中的前16个字节的内容当做头来使用,相当于把uboot_inand.bin的前8k复制到SD-bl1-8k.bin,但是这前8k的前16个字节用作一个header 从bit8-bit11用作校验头,以前uboot中前16字节特意设置为0;

我们可以修改这个代码,也修改修改uboot中的前16字节,一下为修改之后的代码:



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    FILE        *fp;
    char        *Buf, *a, *b;
    int        BufLen;
    int        nbytes, fileLen;
    unsigned int    checksum;
    int        i;

//////////////////////////////////////////////////////////////
    if (argc != 4)
    {
        printf("Usage: mkbl1 <source file> <destination file> <size> \n");
        return -1;
    }

//////////////////////////////////////////////////////////////
    BufLen = atoi(argv[3]);
    Buf = (char *)malloc(BufLen + 16);
    memset(Buf, 0x00, BufLen + 16);
    
//////////////////////////////////////////////////////////////
    fp = fopen(argv[1], "rb");
    if( fp == NULL)
    {
        printf("source file open error\n");
        free(Buf);
        return -1;
    }

    fseek(fp, 0L, SEEK_END);
    fileLen = ftell(fp);
    fseek(fp, 0L, SEEK_SET);

    if ( BufLen > fileLen )
    {
        printf("Usage: unsupported size\n");
        free(Buf);
        fclose(fp);
        return -1;
    }

    /*
    **    bhc add
    */
    b = Buf + 16;
    
    nbytes = fread(b, 1, BufLen, fp);

    if ( nbytes != BufLen )
    {
        printf("source file read error\n");
        free(Buf);
        fclose(fp);
        return -1;
    }

    fclose(fp);

//////////////////////////////////////////////////////////////
    a = b;
    for(i = 0, checksum = 0; i < BufLen - 16; i++)
        checksum += (0x000000FF) & *a++;
    
    /*
    **    bhc add
    */
    a = Buf;
    *( (unsigned int *)a ) = 0x2000;
    
    a = Buf + 8;    
    *( (unsigned int *)a ) = checksum;

//////////////////////////////////////////////////////////////
    fp = fopen(argv[2], "wb");
    if (fp == NULL)
    {
        printf("destination file open error\n");
        free(Buf);
        return -1;
    }

    a    = Buf;
    nbytes    = fwrite( a, 1, BufLen, fp);

    if ( nbytes != BufLen )
    {
        printf("destination file write error\n");
        free(Buf);
        fclose(fp);
        return -1;
    }

    free(Buf);
    fclose(fp);

    return 0;
}

技术分享

实验现象同修改uboot前16字节一样,说明校验和对了,通过这个实验我们可以知道,irom除了校验和一致以外,第一字节的值应该为0x2000;

按照三星修改的uboot头文件设置:

技术分享

 

至于第一个为什么是0x2000按照三星irom_application_note中的说法第一个为uboot的大小,但是实际值也不是这样的;

修改以后重新编译如下所示:

技术分享

 

uboot——官网下载直接移植(二)

原文:http://www.cnblogs.com/biaohc/p/6476866.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!