Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105164
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 337
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-09 23:49
文章分类
文章存档

2016年(4)

2015年(2)

2014年(30)

2013年(4)

我的朋友

分类: LINUX

2014-04-23 23:23:22

.globl lowlevel_init
lowlevel_init:
 
 
 
 ldr     r0, =SMRDATA
 ldr r1, _TEXT_BASE
 sub r0, r0, r1
 ldr r1, =BWSCON 
 add     r2, r0, #13*4
0:
 ldr     r3, [r0], #4
 str     r3, [r1], #4
 cmp     r2, r0
 bne     0b

 
 mov pc, lr

 .ltorg

 

这段代码主要是用来设置BWSCON寄存器的值的,至于比较难理解的是为什么要执行sub r0,r0,r1,也就是为什么要用SMRDATA的地址减去TEXT_BASE,原因是链接时TEXT_BASE和SMRDATA是一个虚拟地址,而实际这段代码是运行在FLASH里的,也即是相对0x00000000的物理地址,故它们相减得到的地址为13个寄存器的参数的实际地址。

至于为什么这13个寄存器的参数的实际地址存放在这个相对0x0的地址,我还不 是很理解。后面的.ltorg也不知道是什么。

接下来的代码如下

 

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

这个就是设置13个寄存器的值的,还没详细看过这几个寄存器的值 的含义,有空再去了解。

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