Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39362
  • 博文数量: 25
  • 博客积分: 605
  • 博客等级: 中士
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 21:57
文章分类

全部博文(25)

文章存档

2012年(22)

2011年(3)

我的朋友

分类: LINUX

2012-05-01 10:55:45

如果内核不是uImage,用的zImage,则下载后,比如下在0x30008000
,则通过go 0x30008000,但注意这样uboot没有传参数给内核.所以
会有Error: unrecognized/unsupported machine ID (r1 = 0x33f4fca8).这样的错误.

 

可以在u-boot命令行中输入bdinfo

查看板卡信息,我的输出如下:
[ ~ljh@GDLC ]# bdinfo
arch_number = 0x000000C1 
env_t       = 0x00000000
boot_params = 0x30000100
DRAM bank   = 0x00000000
-> start    = 0x30000000
-> size     = 0x04000000
ethaddr     = 08:00:3E:26:0A:5B
ip_addr     = 10.1.8.245
baudrate    = 115200 bps


修改内核的arch/arm/kernel/head.S,直接将s3c2410的参数赋给内核
# cd linux-2.6.19
# vi arch/arm/kernel/head.S +72
----------------------------------------------     
70     __INIT
71     .type       stext, %function
72 ENTRY(stext)
   /********* add here *********/
   mov    r0, #0
   mov    r1, #0xc1 
   ldr    r2, =0x30000100
   /********* end add *********/
 
73     msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
74     @ and irqs disabled
 
注意   mov    r1, #0xc1 我的ID是0x16A,但这么写编译不过mov  r1, #0x16a,原因如下:

mov  r1, #0x16a是立即数方式:每个立即数由一个8位的常数循环右移偶数位得到。这有固定的格式。

= immed_8 循环右移( 2*rotate_imm)



立即数方式,上面不是说的很清楚嘛,呵,每个立即数由一个8位的常数循环右移偶数位得到的,如果不满足

上述的要求,在ARM指令集里面常用LDR register,=expr/laber-expr加载立即数,其中:register目标寄存器

,expr表示32的立即数,laber-expr代表基于PC的地址表达式或外部表达式



所以用 伪指令ldr r1 , =0x16a



kernel的machine ID在arch/arm/tools/mach-types

 















解决方法二 
========================================================
修改u-boot,填写ID;


# vi common/cmd_boot.c
----------------------------------------------
31 #if defined(CONFIG_I386) 
32 DECLARE_GLOBAL_DATA_PTR;
33 #endif 
====>
31 //#if defined(CONFIG_I386) 
32 DECLARE_GLOBAL_DATA_PTR;
33 //#endif 
   ...
60 #if !defined(CONFIG_NIOS)
        /************** add here ******************/
        if(argc==2)
            rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
        else
 
        /*************** add end *****************/ 
61         rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
62 #else
63     /*
64      * Nios function pointers are address >> 1
65      */
66     rc = ((ulong (*)(int, char *[]))(addr>>1)) (--argc, &argv[1]);
67 #endif

 

修改时钟:

打开友善送的linux-2.6.29,观察arch/arm/mach-s3c2440/mach-mini2440.c和我们的2.6.30.4下面的arch/arm/mach-s3c2440/mach-smdk2440.c有什么不同
由于乱码主要是时钟问题,所以我们重点观察UART的设置和基本设置,其它什么NAND LCD的就不看先

修改smdk2440_uartcfgs[]
[2] = {
 .ulcon = 0x03,
}

修改s3c24xx_init_clocks(12000000);

 

 

修改command line

3.

Boot options ---> 
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string 
改成 (noinitrd root=/dev/mtdblock2 console=ttySAC0,115200 init=/linuxrc ) 
可能根据个人板子的设置会不一样,我的是从Nand Flash 中加载文件系统,其中mtdblock

阅读(449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~