2440机器码

来源:互联网 发布:中国市场数据研究院 编辑:程序博客网 时间:2024/05/17 07:10

一、uboot 启动linux 内核时,无法识别机器码
           shuai2440# tftp 0x32000000 192.168.220.3:uImage.img
           dm9000 i/o: 0x20000300, id: 0x90000a46
           DM9000: running in 16 bit mode
           MAC: 08:00:3e:26:0a:5b
           operating at unknown: 0 mode
           Using dm9000 device
           TFTP from server 192.168.220.3; our IP address is 192.168.220.10
           Filename 'uImage.img'.
           Load address: 0x32000000
           Loading:
           #########################################

           #########################################
           done
           Bytes transferred = 1950540 (1dc34c hex)
           shuai2440# go 0x32000000
           ## Starting application at 0x32000000 ...
           Uncompressing Linux... done, booting the kernel.
           Error: unrecognized/unsupported machine ID (r1 = 0x32fbdeec).
(1)uboot 只能用于启动uImage,不能启动zImage.
(2)出错原因是go 启动内核时,uboot 不会传machiine ID 给内核,因为go 只是执行普通的应用程序,不考虑到传递参数给内核的问题.为了使命令go 能够启动内核,需要修改下面两方面:
            1.修改u-boot 的common/cmd_boot.c 的do_go()函数.
               /*#if defined(CONFIG_I386)*/ <==注释掉
               DECLARE_GLOBAL_DATA_PTR;
               /*#endif*/ <==注释掉
               ....
               #if !defined(CONFIG_NIOS)
               /**************add here*********************/
               if(argc==2)
               rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
               else
              /*****************add end ********************/
               rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
            2.修改内核的arch/arm/kernel/head.S,直接将s3c2410 的参数赋给内核.
               __INIT
               .type stext, %function
               ENTRY(stext)
               /****************add here*****************/
               mov r0, #0
               mov r1, #0xc1
               ldr r2, =0x30000100
               /***************end add******************/
               msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode
               @ and irqs disabled
(3)也可以直接使用bootm 命令启动内核,该命令可以将uboot 的machine ID传递给内核,正常启动.不过需要用uboot 的mkimage 工具生成uImage 镜像.

二、2440 机器码
     使用uboot 启动linux 内核时,必须使uboot 与kernel 中机器码一致,这样才能正确启动kernel.
(1)uboot 中机器码的设置
     在文件include/asm/mach-types.h 有两处关于2440 机器码的设定.
          #define MACH_TYPE_S3C2440 362
          #define MACH_TYPE_SMDK2440 1008
(2)uboot 中机器码的使用
     在文件board/samsung/lss2440/lss2440.c 中使用了2440 机器码.
           gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
      可以看出,uboot 中使用的机器码为362,因此在kernel 中机器码也必须为362.
(3)kernel 中机器码的使用
      在文件arch/arm/mach-s3c2440 中MACHINE_START 使用了2440 的机器码.
           MACHINE_START(S3C2440, "SMDK2440")
      第一个参数S3C2440 决定了kernel 使用哪个机器码,可以看出kernel使用了S3C2440 的机器码.
(4)kernel 中机器码的设置
      在文件arch/arm/tools 中有两处设置2440 的机器码.
            s3c2440 ARCH_S3C2440 S3C2440 362
            smdk2440 MACH_SMDK2440 SMDK2440 1008
      由于在文件arch/arm/mach-s3c2440 中使用的机器码是"S3C2440",因此可以看出kernel 使用的机器码为362,而不是1008.
【attention】
      在实际移植过程中,或改变uboot 中机器码的设置,或改变kernel 中机器码的设置,但必须使两者保持一致.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 6岁儿童睡眠不好怎么办 8岁儿童睡眠不好怎么办 1个月婴儿睡眠少怎么办 三岁宝宝心跳快怎么办 宝宝右心房稍大怎么办 胎儿右心房偏大怎么办 胎心监测波动小怎么办 怀孕6个月不想要了怎么办 高敏肌钙蛋白t高怎么办 龟头沟槽里长疙瘩怎么办 肝郁气滞的体质怎么办 手指甲长在肉里怎么办 甲床与指甲脱离怎么办 指甲往肉里面长怎么办 指甲和肉分离是怎么办 大脚趾指甲空了怎么办 脚趾甲长在肉里怎么办 脚趾甲又厚又硬怎么办 小孩子咳嗽有痰怎么办%3f 支气扩张咳血怎么办小 背部第8块脊椎疼怎么办 坐时间长了背疼怎么办 新生儿总哭怎么办吐奶 婴儿吃饱了还哭怎么办 宝宝喉咙哭哑了怎么办 婴儿哭哑了嗓子怎么办 婴儿胖子哭哑了怎么办 孩子声音哭哑了怎么办 喝咖啡手抖心慌怎么办 累了就心慌发抖怎么办 经常头晕心慌胸闷乏力怎么办 在末地迷路了怎么办 在森林里迷路了怎么办 电热宝充电不热怎么办 保温壶按钮坏了怎么办 热水壶盖子坏了怎么办 充电暖宝宝不热怎么办 刚怀孕孕酮低该怎么办 小三怀孕了该怎么办 15学生怀孕了该怎么办 学东西慢悟性差怎么办