uboot 移植遇到的问题及解决方法(转)

http://blog.sina.com.cn/s/blog_988ec60801017iy3.html

一  在commond

env_nand.c: In function ‘saveenv‘:

env_nand.c:196: error: stray ‘#‘ in program

env_nand.c:196: error: expected ‘)‘ before ‘define‘

env_nand.c:196: error: too few arguments to function ‘nand_erase‘

env_nand.c:201: error: stray ‘#‘ in program

env_nand.c:201: error: expected ‘)‘ before ‘define‘

env_nand.c:201: error: too few arguments to function ‘nand_write‘

env_nand.c: In function ‘env_relocate_spec‘:

env_nand.c:276: error: stray ‘#‘ in program

env_nand.c:276: error: expected ‘)‘ before ‘define‘

env_nand.c:276: error: too few arguments to function ‘nand_read‘

make[1]: *** [env_nand.o] 错误 1

make[1]:正在离开目录 `/home/cgc/yangshanjin/u-boot-1.1.6_3/common

make: *** [common/libcommon.a] 错误 2

因此 我就把有错误的语句注释掉,即196 201 276

二  上面问题搞定,我用注释的办法

现在 又有问题如下

/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_udivdi3.o) has EABI version

5, but target u-boot has EABI version 0

arm-linux-ld: failed to merge target specific data of file

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_udivdi3.o)

arm-linux-ld: error: Source object

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_udivsi3.o)

has EABI version 5, but target u-boot has EABI version 0

arm-linux-ld: failed to merge target specific data of file

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_udivsi3.o)

arm-linux-ld: error: Source object

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_dvmd_lnx.o)

has EABI version 5, but target u-boot has EABI version 0

arm-linux-ld: failed to merge target specific data of file

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_dvmd_lnx.o)

arm-linux-ld: error: Source object

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_clz.o)

has EABI version 5, but target u-boot has EABI version 0

arm-linux-ld: failed to merge target specific data of file

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_clz.o)

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_udivdi3.o):(.ARM.exidx+0x0):

undefined reference to `__aeabi_unwind_cpp_pr0‘

/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a(_dvmd_lnx.o):

In function `__aeabi_ldiv0‘:

(.text+0x8): undefined reference to `raise‘

make: *** [u-boot] 错误1

解决办法 我修改办法

修改cpu/arm920t/config.mk文件中的

PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common

-ffixed-r8 \

-msoft-float

改为

PLATFORM_RELFLAGS += -fno-strict-aliasing

-fno-common -ffixed-r8

还是一样的错误

我的参考网站http://bbs.chinaunix.net/forum.php?mod=viewthread&action=printable&tid=1938330

解决办法(成功)在顶层Makefile

把CROSS_COMPILE=…………(你的交叉编译器),改为:CROSS_COMPILE=/opt/EmbedSky /crosstools_3.4.5_softloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-

就可正常编译成功。

无打印信息。参考网站http://www.armbbs.net/forum.php?mod=viewthread&tid=6442

我的修改一

在include/configs/YSJ2440.h里修改#define CONFIG_SMDK2440 1

#define  CONFIG_S3C2440  1 我已经改回来了

要不的话就会报错

修改二 在include/s3c2410.h 中添加了 #include <s3c2440.h>

我把s3c2440.h删除掉了,因为其作用是跟s3c24x0.h是一样的

今天发现configs/YSJ2440.h是应该许多预编译中变量的定义,还有s3c2410.h里包含了s3c24x0.h

我把YSJ2440.C board_init函数中对于s3c2410的时钟设置消去,用if(0)

我把cpu/arm920t/s3c24x0/nand_flash.c有关2410的nand_flash都注释掉

出现错误

nand_flash.c: In function `board_nand_init‘:

nand_flash.c:140: error: `s3c2410_nand_hwcontrol‘ undeclared (first use in this

function)

nand_flash.c:140: error: (Each undeclared identifier is reported only once

nand_flash.c:140: error: for each function it appears in.)

nand_flash.c:141: error: `s3c2410_nand_devready‘ undeclared (first use in this

function)

nand_flash.c:142: error: `s3c2410_nand_select_chip‘ undeclared (first use in

this function)

make[1]: *** [nand_flash.o] 错误 1

make[1]:正在离开目录 `/home/cgc/yangshanjin/u-boot-1.1.6_3/cpu/arm920t/s3c24x0‘

现在复原

我修改了cpu/arm920t/start.S中的160行 把bl cpu_init_crit注释掉

接着修改/board/YSJ2440/config.mk中TEXT_BASE 值为0x33000000

还是搞回来

修改

relocate:

adrr0, _start

ldrr1, _TEXT_BASE

cmp     r0, r1

beq     clear_bss

@ldr r2, _armboot_start

ldr   r1,_armboot_start

ldrr3, _bss_start

subr2, r3, r2

#if 1

bl CopyCode2Ram

#else

addr2, r0, r2

copy_loop:

ldmiar0!, {r3-r10}

stmiar1!, {r3-r10}

cmpr0, r2

ble copy_loop

#endif

#endif

我把上面的ldr r1, r1,_armboot_start     修改为mov r1,#0x33f80000  但是报错 start.S:181: Error: invalid constant -- `mov r1,#0x33f80000‘ 原来是精简指令问题

我改成ldr r1,=0x33f80000,就可以了 ,但是还是启动不了内核,

start.S 设置完中断向量表后 , 加上这句是什么意思

.balignl 16,0xdeadbeef

#if 1 //HJ_add_start

int getc_errno = 0;

__u8 do_getc(unsigned long timeout, int *statp)

{

__u8 c, rxstat;

int do_timeout = timeout != 0;

S3C24X0_UART * const uart = S3C24X0_GetBase_UART(UART_NR);

getc_errno = 0;

while(!(uart->UTRSTAT & 0x1)) {

if (do_timeout) {

if (!timeout)

break;

timeout--;

}

}

if (do_timeout && timeout == 0) {

c = 0;

rxstat = -1;

} else {

c = (uart->URXH & 0xff);

rxstat = (uart->UERSTAT & 0xf);

}

if (rxstat) {

getc_errno = rxstat;

if (statp)

*statp = rxstat;

}

return (c);

}

char awaitkey2(unsigned long delay, int* error_p)

{

return (do_getc(delay, error_p));

}

#endif //HJ_add_end

在天嵌的uboot里serial.c里多出了这两个函数,待查

我在u-boot-1.1.6_3的cpu/arm920t/speed.c中把函数应该返回的值都用自己认为的值代替,结果可以了。我查了一些,好像MPLLCON在speed.c中没有赋值,是在boot_init中有赋值。具体的自己查查。

这里可以支持nand flash.

1.修改include/configs/Prodigal.h文件

增加NAND 命令:CFG_CMD_NAND | \

#define CFG_ENV_IS_IN_NAND                1

#define CFG_ENV_OFFSET 0x40000

#define CFG_ENV_SIZE                        0x20000

#define CFG_NAND_BASE                        0

#define CFG_MAX_NAND_DEVICE                1

#define NAND_MAX_CHIPS                        1

2.添加nand_flash.c文件到cpu/arm920t/s3c24x0/目录

(建议直接拷贝TQ做好的nand_flash.c文件)

同时修改该目录下的 Makefile:

COBJS = i2c.o interrupts.o serial.o speed.o usb_ohci.o nand_flash.o

3.修改include/s3c24x0.h文件,增加S3C2440_NAND结构体

(在nand_flash.c文件中有用到)

typedef struct {

S3C24X0_REG32 NFCONF;

S3C24X0_REG32 NFCONT;

S3C24X0_REG32 NFCMD;

S3C24X0_REG32 NFADDR;

S3C24X0_REG32 NFDATA;

S3C24X0_REG32 NFMECCD0;

S3C24X0_REG32 NFMECCD1;

S3C24X0_REG32 NFSECCD;

S3C24X0_REG32 NFSTAT;

S3C24X0_REG32 NFESTAT0;

S3C24X0_REG32 NFESTAT1;

S3C24X0_REG32 NFMECC0;

S3C24X0_REG32 NFMECC1;

S3C24X0_REG32 NFSECC;

S3C24X0_REG32 NFSBLK;

S3C24X0_REG32 NFEBLK;

} S3C2440_NAND;

4、同时在 include/s3c2410.h 中添加(在nand_flash.c文件中有用到)

static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)

{

return (S3C2440_NAND * const)S3C2410_NAND_BASE;

}

把配置文件configs/YSJ2440.h的分区改为天嵌的uboot 暂时不改

之前添加了天嵌的boot_zImage.c文件,我在command/main.c

400行中调用了do_boot_zImage() 里面的参数都被我删除了

,本想用这个来启动内核,现在改回原型,包括Makefile

参考网站http http://blog.csdn.net/ce123/article/details/7336810 把cmd_bootm.c中的第175行开始删除linux的头部校验;

printf ("## Booting image at lx ...\n", addr);

#ifdef CONFIG_HAS_DATAFLASH

if (addr_dataflash(addr)){

read_dataflash(addr, sizeof(image_header_t), (char *)&header);

} else

#endif

memmove (&header, (char *)addr, sizeof(image_header_t));

if (ntohl(hdr->ih_magic) != IH_MAGIC) {

#ifdef __I386__

if (fake_header(hdr, (void*)addr, -1) != NULL) {

addr -= sizeof(image_header_t);

verify = 0;

} else

#endif

{

puts ("Bad Magic Number\n");

SHOW_BOOT_PROGRESS (-1);

return 1;

}

}

SHOW_BOOT_PROGRESS (2);

data = (ulong)&header;

len  = sizeof(image_header_t);

checksum = ntohl(hdr->ih_hcrc);

hdr->ih_hcrc = 0;

if (crc32 (0, (uchar *)data, len) != checksum) {

puts ("Bad Header Checksum\n");

SHOW_BOOT_PROGRESS (-2);

return 1;

}

SHOW_BOOT_PROGRESS (3);

#ifdef CONFIG_HAS_DATAFLASH

if (addr_dataflash(addr)){

len  = ntohl(hdr->ih_size) + sizeof(image_header_t);

read_dataflash(addr, len, (char *)CFG_LOAD_ADDR);

addr = CFG_LOAD_ADDR;

}

#endif

print_image_hdr ((image_header_t *)addr);

data = addr + sizeof(image_header_t);

len  = ntohl(hdr->ih_size);

if (verify) {

puts ("   Verifying Checksum ... ");

if (crc32 (0, (uchar *)data, len) != ntohl(hdr->ih_dcrc)) {

printf ("Bad Data CRC\n");

SHOW_BOOT_PROGRESS (-3);

return 1;

}

puts ("OK\n");

}

SHOW_BOOT_PROGRESS (4);

len_ptr = (ulong *)data;

#if defined(__PPC__)

if (hdr->ih_arch != IH_CPU_PPC)

#elif defined(__ARM__)

if (hdr->ih_arch != IH_CPU_ARM)

#elif defined(__I386__)

if (hdr->ih_arch != IH_CPU_I386)

#elif defined(__mips__)

if (hdr->ih_arch != IH_CPU_MIPS)

#elif defined(__nios__)

if (hdr->ih_arch != IH_CPU_NIOS)

#elif defined(__M68K__)

if (hdr->ih_arch != IH_CPU_M68K)

#elif defined(__microblaze__)

if (hdr->ih_arch != IH_CPU_MICROBLAZE)

#elif defined(__nios2__)

if (hdr->ih_arch != IH_CPU_NIOS2)

#elif defined(__blackfin__)

if (hdr->ih_arch != IH_CPU_BLACKFIN)

#elif defined(__avr32__)

if (hdr->ih_arch != IH_CPU_AVR32)

#else

# error Unknown CPU type

#endif

{

printf ("Unsupported Architecture 0x%x\n", hdr->ih_arch);

SHOW_BOOT_PROGRESS (-4);

return 1;

}

SHOW_BOOT_PROGRESS (5);

switch (hdr->ih_type) {

case IH_TYPE_STANDALONE:

name = "Standalone Application";

if (argc > 2) {

hdr->ih_load = htonl(simple_strtoul(argv[2], NULL, 16));

}

break;

case IH_TYPE_KERNEL:

name = "Kernel Image";

break;

case IH_TYPE_MULTI:

name = "Multi-File Image";

len  = ntohl(len_ptr[0]);

data += 8;

for (i=1; len_ptr[i]; ++i)

data += 4;

break;

default: printf ("Wrong Image Type for %s command\n", cmdtp->name);

SHOW_BOOT_PROGRESS (-5);

return 1;

}

SHOW_BOOT_PROGRESS (6);

iflag = disable_interrupts();

#ifdef CONFIG_AMIGAONEG3SE

icache_disable();

invalidate_l1_instruction_cache();

flush_data_cache();

dcache_disable();

#endif

switch (hdr->ih_comp) {

case IH_COMP_NONE:

if(ntohl(hdr->ih_load) == addr) {

printf ("   XIP %s ... ", name);

} else {

#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)

size_t l = len;

void *to = (void *)ntohl(hdr->ih_load);

void *from = (void *)data;

printf ("   Loading %s ... ", name);

while (l > 0) {

size_t tail = (l > CHUNKSZ) ? CHUNKSZ : l;

WATCHDOG_RESET();

memmove (to, from, tail);

to += tail;

from += tail;

l -= tail;

}

#else

memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len);

#endif

}

break;

case IH_COMP_GZIP:

printf ("   Uncompressing %s ... ", name);

if (gunzip ((void *)ntohl(hdr->ih_load), unc_len,

(uchar *)data, &len) != 0) {

puts ("GUNZIP ERROR - must RESET board to recover\n");

SHOW_BOOT_PROGRESS (-6);

do_reset (cmdtp, flag, argc, argv);

}

break;

#ifdef CONFIG_BZIP2

case IH_COMP_BZIP2:

printf ("   Uncompressing %s ... ", name);

i = BZ2_bzBuffToBuffDecompress ((char*)ntohl(hdr->ih_load),

&unc_len, (char *)data, len,

CFG_MALLOC_LEN < (4096 * 1024), 0);

if (i != BZ_OK) {

printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i);

SHOW_BOOT_PROGRESS (-6);

udelay(100000);

do_reset (cmdtp, flag, argc, argv);

}

break;

#endif

default:

if (iflag)

enable_interrupts();

printf ("Unimplemented compression type %d\n", hdr->ih_comp);

SHOW_BOOT_PROGRESS (-7);

return 1;

}

puts ("OK\n");

SHOW_BOOT_PROGRESS (7);

switch (hdr->ih_type) {

case IH_TYPE_STANDALONE:

if (iflag)

enable_interrupts();

if (((s = getenv("autostart")) != NULL) && (strcmp(s,"no") == 0)) {

char buf[32];

sprintf(buf, "%lX", len);

setenv("filesize", buf);

return 0;

}

appl = (int (*)(int, char *[]))ntohl(hdr->ih_ep);

(*appl)(argc-1, &argv[1]);

return 0;

case IH_TYPE_KERNEL:

case IH_TYPE_MULTI:

break;

default:

if (iflag)

enable_interrupts();

printf ("Can‘t boot image type %d\n", hdr->ih_type);

SHOW_BOOT_PROGRESS (-8);

return 1;

}

SHOW_BOOT_PROGRESS (8);

在lib_arm/armlinux.c中修改内核启动地址,在第93列改为theKernel = (void (*)(int,int,uint))addr;

可以正常启动linux了,

时间: 2024-07-29 17:31:47

uboot 移植遇到的问题及解决方法(转)的相关文章

编译U-Boot时command not found的解决方法

我使用的U-Boot版本是u-boot-2012.10,编译的步骤为 cd u-boot-2012.10 make s5p_goni_config sudo make 然后,就会看到错误提示 /bin/bash: arm-linux-gcc: command not found dirname: missing operand Try 'dirname --help' for more information. 在arm-linux-gcc确认安装无误的前提下(可以参照 https://www.

移植SDL2.2问题及解决方法

项目需要ffmpeg+SDL播放视频,所以不得不移植SDL 根据 <移植SDL最新版本>http://blog.csdn.net/flyyang123456789/article/details/17223485,下载源码并准备移植到am335x JP5G开发板上,但在编译libmad库的过程中一直报 /tmp/ccf2FxyW.s:1299: Error: selected processor does not support Thumb mode `rsc r0,r0,#0'的错误. 1.

编译uboot提示libasm-offsets.c10 error bad value (armv5)解决方法

编译uboot-2016.09提示如下错误: lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch 解决方法: 1.在命令行指定编译工具链 make ARCH=arm CROSS_COMPILE=arm-linux- 2.修改u-boot的顶层Makefile中定义的CROSS_COMPILE和ARCH变量为CROSS_COMPILE=arm-linux- ,ARCH=arm,这样可以在命令行直接敲入make命令编译

将实朴主流程移植到九安的过程中遇到的问题及解决方法

经过一个星期的努力,已完成将实朴主流程移植到九安的工作任务,期间遇到了不少问题.由于是新入职的新手,遇到的问题都是第一次接触到的,通过向老同事虚心讨教,基本上都找到了解决的方法.现将我遇到的问题及解决的方法大致罗列如下: 一.进入StarLims时报错 ① 报错信息:ORA-01033:Oracle initialization or shutdown in progress 报错原因:Oracle实例没有启动 解决方法: <1> 进入SQL Plus,执行命令:sqlplus/nolog &

uboot移植之前的工作

1.1计算机系统的主要部件:计算机系统是有cpu来做核心进行运行的系统.典型的计算机系统有:pc机,嵌入式设备(手机.平板电脑.游戏机),单片机(家用电器). 1.2计算机系统组件部件非常多,不同的计算机系统组成部件也不同.但是所有的计算机系统运行时需要的主要核心部件都是3个东西:cpu+外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM). 1.3pc机的启动过程:(1)典型的pc部署:BIOS程序部署在pc机主板上(随主板出厂时已经预制了),操作系统部署

uboot移植准备工作二

第一部分 2.3.1uboot配置编译实践 1)源头的源代码时uboot官网下载的.这个下载的源代码可能没有你当前使用的开发板的移植,甚至找不到当前开发板使用的SoC对应的移植版本. 2)SoC厂商在退出一款SoC后,厂商的工程师会去uboot官网下载一个uboot,根据自己Soc进行第一步移植,移植的目标是厂商推出的开发板.(譬如三星的S5PV210芯片厂商出的开发板就叫SMDKV210),所以三星的工程师移植的uboot是根据他们自己的SMDKV210开发板移植的. 3)具体的开发板提供商(

Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法

java.lang.OutOfMemoryError: Java heap space 的解决方法 关键字: tomcat outofmemoryerror permgen space java heap space 最近在熟悉一个开发了有几年的项目,需要把数据库从mysql移植到oracle,首先把jdbc的连接指向mysql,打包放到tomcat里面,可以跑起来,没有问题,可是当把jdbc连接指向oracle的时候,tomcat就连续抛java.lang.OutOfMemoryError的错

Android Configuration change引发的问题及解决方法(转)

之前在学习Fragment和总结Android异步操作的时候会在很多blog中看到对Configuration Change的讨论,以前做的项目都是固定竖屏的,所以对横竖屏切换以及横竖屏切换对程序有什么影响都没什么了解.见到的次数多了,总是掠过去心理总觉得不踏实,最终还是好好看了些介绍Congifuration Change的blog,在此做个梳理也不枉花了那么多时间.有疏漏和描述不准确的地方恳请指正. 前言 在研究Configuration Change之前我主要的疑问: 横竖屏切换对布局有影

检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(转)

我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 为什么会出现以上错误? 在IIS7的应用程序池有两种模式,一种是“集成模式”,一种是“经典模式”. 经典模式 则是我们以前习惯的IIS 6 的方式. 如果使用集成模式,那么对自定义的httpModules 和 httpHandlers 就要修改配置文件,需要将他们转移到<modules