Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3182
  • 博文数量: 6
  • 博客积分: 165
  • 博客等级: 入伍新兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-15 22:26
文章分类

全部博文(6)

文章存档

2011年(6)

我的朋友
最近访客

分类: 嵌入式

2011-10-23 02:25:05

   u-boot-1.1.6源码学习主要讲述和总结了本人在学习u-boot中的每个步骤,由于水平有限,难免有误,欢迎指正。
 
 
7. u-boot源码分析——第一阶段之lowlevel_init.S
   
    lowlevel_init就完成了内存初始化的工作,由于内存初始化是依赖于开发板的,因此lowlevel_init的代码一般放在board下面相应的目录中。对于smdk2410lowlevel_initboard/smdk2410/lowlevel_init.S中定义如下:
 
 

#include

#include

  

#define BWSCON     0x48000000              /* 13个存储控制器的开始地址 */

 

                                   /* BWSCON */

#define DW8                    (0x0)

#define DW16                  (0x1)

#define DW32                  (0x2)

#define WAIT                   (0x1<<2)

#define UBLB                   (0x1<<3)

 

#define B1_BWSCON              (DW32)

#define B2_BWSCON              (DW16)

#define B3_BWSCON              (DW16 + WAIT + UBLB)

#define B4_BWSCON              (DW16)

#define B5_BWSCON              (DW16)

#define B6_BWSCON              (DW32)

#define B7_BWSCON              (DW32)

 

                                 /* BANK0CON */

#define B0_Tacs                       0x0             /*  0clk */

#define B0_Tcos                       0x0             /*  0clk */

#define B0_Tacc                       0x7            /* 14clk */

#define B0_Tcoh                       0x0            /*  0clk */

#define B0_Tah                         0x0            /*  0clk */

#define B0_Tacp                       0x0

#define B0_PMC                      0x0          /* normal */

 

                                /* BANK1CON */

#define B1_Tacs                       0x0            /*  0clk */

#define B1_Tcos                       0x0            /*  0clk */

#define B1_Tacc                       0x7            /* 14clk */

#define B1_Tcoh                       0x0            /*  0clk */

#define B1_Tah                         0x0            /*  0clk */

#define B1_Tacp                       0x0

#define B1_PMC                      0x0

 

#define B2_Tacs                       0x0

#define B2_Tcos                       0x0

#define B2_Tacc                       0x7

#define B2_Tcoh                       0x0

#define B2_Tah                         0x0

#define B2_Tacp                       0x0

#define B2_PMC                      0x0

 

#define B3_Tacs                       0x0          /*  0clk */

#define B3_Tcos                       0x3          /*  4clk */

#define B3_Tacc                       0x7           /* 14clk */

#define B3_Tcoh                       0x1          /*  1clk */

#define B3_Tah                         0x0         /*  0clk */

#define B3_Tacp                       0x3          /*  6clk */

#define B3_PMC                      0x0          /* normal */

 

#define B4_Tacs                       0x0            /*  0clk */

#define B4_Tcos                       0x0            /*  0clk */

#define B4_Tacc                       0x7            /* 14clk */

#define B4_Tcoh                       0x0            /*  0clk */

#define B4_Tah                         0x0             /*  0clk */

#define B4_Tacp                       0x0

#define B4_PMC                      0x0             /* normal */

 

#define B5_Tacs                       0x0               /*  0clk */

#define B5_Tcos                       0x0               /*  0clk */

#define B5_Tacc                       0x7              /* 14clk */

#define B5_Tcoh                       0x0              /*  0clk */

#define B5_Tah                         0x0                /*  0clk */

#define B5_Tacp                       0x0

#define B5_PMC                      0x0               /* normal */

 

#define B6_MT                         0x3                  /* SDRAM */

#define B6_Trcd                      0x1

#define B6_SCAN                     0x1               /* 9bit */

 

#define B7_MT                         0x3                 /* SDRAM */

#define B7_Trcd                       0x1                       /* 3clk */

#define B7_SCAN                     0x1                /* 9bit */

 

                                 /* REFRESH parameter */

#define REFEN                 0x1                 /* Refresh enable */

#define TREFMD                      0x0               /* CBR(CAS before RAS)/Auto refresh */

#define Trp                       0x0                 /* 2clk */

#define Trc                        0x3                /* 7clk */

#define Tchr                     0x2                   /* 3clk */

#define REFCNT                        1113         /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */

/**************************************/

 

_TEXT_BASE:

         .word        TEXT_BASE

 

.globl lowlevel_init

lowlevel_init:

         /* memory control configuration */

         /* make r0 relative the current location so that it */

         /* reads SMRDATA out of FLASH rather than memory ! */

         ldr     r0, =SMRDATA

         ldr    r1, _TEXT_BASE

         sub   r0, r0, r1                    /* SMRDATA _TEXT_BASE就是13个寄存器的偏移地址 */

         ldr    r1, =BWSCON                   /* Bus Width Status Controller */

         add     r2, r0, #13*4

0:

         ldr     r3, [r0], #4

         str     r3, [r1], #4      // 置内存配置寄存器,可以对着datasheet来看这里的设置,包括时

                                          //  序位宽等等, 使用一个循环来配置所有的寄存器

         cmp     r2, r0

         bne     0b

 

         /* everything is fine now */

         mov pc, lr

 

         .ltorg

                            /* the literal pools origin */

 

SMRDATA:

    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))

    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))

    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))

    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))

    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))

    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))

    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))

    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))

    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

    .word 0x32

    .word 0x30

    .word 0x30

 

        lowlevel_init初始化了13个寄存器来实现RAM时钟的初始化,现在就可以使用内存了,lowlevel_init函数对于U-BootNAND FlashNOR Flash启动的情况都是有效的。

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