Chinaunix首页 | 论坛 | 博客
  • 博客访问: 70672
  • 博文数量: 72
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 12
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-04 23:21
文章分类
文章存档

2015年(72)

我的朋友

分类: 嵌入式

2015-04-15 10:49:18

移植U-Boot-2010.03到友善之臂mini2440(二)

2.1 修改cpu/arm920t/start.S

(1)删除AT91RM9200使用的LED代码,117118行,关闭LED代码。

 

start_code:

    /*

     * set the cpu to SVC32 mode

     */

    mrs r0,cpsr

    bic r0,r0,#0x1f

    orr r0,r0,#0xd3

    msr cpsr,r0

    //bl coloured_LED_init

    //bl red_LED_on

 

(2)修改编译条件支持s3c2440,修改寄存器地址定义,修改 CPU频率初始化设置

 

#ifdef  (CONFIG_S3C24X0)

        /* turn off the watchdog */

# if defined(CONFIG_S3C2400)

#  define pWTCON           0x15300000

#  define INTMSK           0x14400008      /* Interupt-Controller base addresses */

#  define CLKDIVN          0x14800014      /* clock divisor register */

#else

#  define pWTCON           0x53000000

#  define INTMSK           0x4A000008      /* Interupt-Controller base addresses */

#  define INTSUBMSK        0x4A00001C

#  define CLKDIVN           0x4C000014      /* clock divisor register */

# endif

修改 CPU频率初始化设置147

//xujun

#define CLK_CTL_BASE 0x4C000000

#define MDIV_405 0x7f << 12

#define PSDIV_405 0x21

#define MDIV_200 0xa1 <<12

#define PSDIV_200 0x31

 

(3)修改中断禁止部分

165行修改0x3ff0x7ff

#if defined(CONFIG_S3C2410)

    ldr r1, =0x7ff /*根据2410芯片手册,INTSUBMSK11位可用*/

    ldr r0, =INTSUBMSK

    str r1, [r0]

#endif

170行添加

#if defined(CONFIG_S3C2440)

    ldr r1, =0x7fff

    ldr r0, =INTSUBMSK

    str r1, [r0]

#endif

(4)修改时钟设置(2440的主频为405MHz。)175

 

//xujun

#if defined(CONFIG_S3C2440)

     /* FCLK:HCLK:PCLK = 1:4:8 */

ldr r0,=CLKDIVN

    mov r1,#5

    str r1,[r0]

 

    mrc p15,0,r1,c1,c0,0

    orr r1,r1,#0xc0000000

    mcr p15,0,r1,c1,c0,0

 

    mov r1,#CLK_CTL_BASE

    mov r2,#MDIV_405

    add r2,r2,#PSDIV_405

    str r2,[r1,#0x04]

#else

 

        /* FCLK:HCLK:PCLK = 1:2:4 */

        /* default FCLK is 120 MHz ! */

        ldr     r0, =CLKDIVN

        mov     r1, #3

        str     r1, [r0]

//xujun

    mrc p15,0,r1,c1,c0,0

    orr r1,r1,#0xc0000000

    mcr p15,0,r1,c1,c0,0

 

    mov r1,#CLK_CTL_BASE

    mov r2,#MDIV_200

    add r2,r2,#PSDIV_200

    str r2,[r2,#0x04]

#endif

#endif /* CONFIG_S3C24X0 */

(5)将从自动识别从NAND Flash启动还是从Nor flash启动

代码原理:在启动的时候,用程序将0x400000000x40001000中的某些位置清零,如果回读0x000000000x00001000中的相应位置后为零,说明是Nand boot,如果是原来的数据(一定要选非零的位置)就是Nor boot。判断完后如果是nand boot,还要恢复被改动的数据,再进入自拷贝阶段。
   只要检测的位置合理,这方法是可行的。现在的关键是选什么位置的数据最好呢?经过查看源码,我选择了在start.S文件开头,全局中断向量之后的:

    .balignl 16,0xdeadbeef

选这个数据作为检测位置的理由如下:
1)他是非零数,而且数据是确定的:0xdeadbeef
2)他的位置是固定的:0x0000003c0x4000003c);
3)他在检测程序之前,不会影响程序的向下运行;
4)他不属于程序,他是一个程序中的魔数(Magic Number),用魔数来检测也比较合理
所以最后的检测步骤是:
在启动的时候,将0x4000003c位置开始的四个字节清零,然后读取0x0000003c位置开始的四个字节。如果回读的结果为零,说明是nand boot,否则就是Nor boot(为了保险还可以判断是否为0xdeadbeef,不是的话就说明有未知错误,死循环!)。但是最后有一点很重要:如果是Nand boot,必须要复原清零的数据。原因是:在nand boot过后,会核对内部SRAM中的4K程序,和从Nand中拷贝到SDRAM的前4K程序是否一致,如果不一致会进入死循

 

218行将原来转移nor  flash启动的代码修改为:

1)判断当前代码位置,如果在内存,直接跳到<%

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