免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 964 | 回复: 0

转载一篇移植u-boot,内核问题总结 [复制链接]

论坛徽章:
0
发表于 2011-12-21 08:41 |显示全部楼层
Uboot输出,无内核信息输出

## Booting kernel from Legacy Image at 32000000 ...

Image Name: Linux-2.6.13-utulinux2440

Starting kernel ...


不能确定是linux内核没有跑起来,还是已经跑起来了而没有串口打印信息,基本上有三种情况:

1> U-boot中的参数(console)没有传到内核。
2> U-boot的时钟设置不在405MHz,与Kernel的不一致。
3> U-boot中的Machine ID设置的与Kernel不一致。

逐个检查,其中第一项参数传递要求U-boot中有如下宏即可,该情况排除。

u-boot-2009.03/include/configs/mini2440.h

## Booting kernel from Legacy Image at 32000000 ...

Image Name: Linux-2.6.13-utulinux2440

Starting kernel ...




第二项时钟设置查看U-boot中的配置,也没有问题。
u-boot-2009.03/board/xxx/mini2440/mini2440.c
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG

#



再查下 Machine ID 。zwolf 提到方法,打开内核的Debug选项

make menuconfig



编译运行得到如下提示:

Starting kernel ... Uncompressing Linux................................................................................................................................... done, booting the kernel. Error: unrecognized/unsupported machine ID (r1 = 0x0000016a). Available machine support: ID (hex) NAME 000007cf FriendlyARM Mini2440 development board Please check your kernel config and/or bootloader.



用bdinfo命令查看u-boot端的ID :
bdinfo
[u-boot@MINI2440]# bdinfo
arch_number = 0x0000016A
env_t       = 0x00000000
boot_params = 0x30000100
DRAM bank   = 0x00000000
-> start     = 0x30000000
-> size     = 0x04000000
ethaddr     = 08:08:11:18:12:27
ip_addr     = 192.168.10.172
baudrate     = 115200 bps

基本上可以确定从U-boot得到的ID为 362 (0x0000016a), 而内核中的ID为 1999 (000007cf)。分别查找。

内核中的 Machine ID 为:
linux-2.6.29/include/asm-arm/mach-types.h
#define MACH_TYPE_MINI2440             1999

U-boot中对应也有该定义:
u-boot-2009.03/include/asm-arm/mach-types.h
#define MACH_TYPE_MINI2440             1999

二者是一致的,再查找一下ID为362的Machine是 MACH_TYPE_S3C2440,看来是u-boot没有传递正确的ID。grep一下MACH_TYPE_S3C2440,在如下位置找到原因:
u-boot-2009.03/board/xxx/mini2440/mini2440.c
#if defined(CONFIG_S3C2440)
/* arch number of S3C2440-Board */
     gd->bd->bi_arch_number = MACH_TYPE_S3C2440 ;
#endif
把这里的 MACH_TYPE_S3C2440 改为 MACH_TYPE_MINI2440 就OK了。

另外如果不动U-boot端,在Linux端临时试验的话,可以在Linux启动代码中手动加入该参数,使其与mach-types.h中的值统一起来,方法参考 这个帖子,注意mov指令操作数的要求。
linux-2.6.29/arch/arm/kernel/head.S
ENTRY(stext)
/*---------add begin----------/
     mov     r0, #0
     mov     r1, #0xc1
     ldr     r2, =0x30000100
/*---------add end-----------*/
     msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2021中国系统架构师大会

【数字转型 架构重塑】2021年5月20日-22日第十三届中国系统架构师大会将在云端进行网络直播。

大会为期3天的议程,涉及20+专场,近120个主题,完整迁移到线上进行网络直播对会议组织来说绝非易事;但考虑到云端会议的直播形式可以实现全国各地技术爱好者的参与,也使ITPUB作为技术共享交流平台得到更好的普及,我们决定迎难而上。
http://sacc.it168.com/


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP