ARM裸机开发bootloader内存初始化
区:这个区域的作用正如它的名字所述,是用来启动ARM系统的。但是这个区域并没有固定的存储介质与之对应。而是通过修改启动选项,把不同的启动介质映射到
该区域。比如说选择了IROM启动方式后,就把IROM映射到该区域。
内部存储区:这个区域对应着内部的内存地址,iROM和SRAM都是分布在这个区间。0x08000000-0x0bffffff对应着内部ROM,但是IROM实际只有32KB,选择从IROM启动的时候,首先运行就是这里面的程序BL0,这部分代码由三星固化。0x0c000000-ox0fffffff对应内部SRAM,实际就是8KB的Steppingstone。
静态存储区:这个区域用于访问挂在外部总线上的设备,比如说NOR flash、oneNand等。这个区域被分割为6个bank,每个bank为128MB,数据宽度最大支持16bit,每个bank由片选Xm0CS[0]-Xm0CS[5]选中。
动态存储区:该区域从0x50000000-0x6fffffff,又分为2个区间,分别占256MB,可以片选Xm1CS[0]-Xm1CS[1]来进行着2个区间的选择。我们6410开发板上256MB的DDR内存就安排在这个区域,这也就是为什么6410的内存地址是从0x50000000开始的原因。
2、内存芯片的连接可以参考2440
3、代码编写:
由于这部分代码量比较大,所以我把这部分单独放在了一个文件下并命名为
mem.S,并要在makefile中做相应的修改
.text.global mem_initmem_init:@set data pin;ldr r0, =0x7e00f120 mov r1, #0x0str r1, [r0]@program memc_cmd to b100,which makes DRAM Controller enter Configstate. ldr r0, =0x7e001004 mov r1, #0x4 str r1, [r0]ldr r0, =0x7e001010 ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) ) str r1, [r0]ldr r0, =0x7e001014 mov r1, #(3 < 1)str r1, [r0]ldr r0, =0x7e001018 mov r1, #0x1str r1, [r0]ldr r0, =0x7e00101c mov r1, #0x2str r1, [r0]ldr r0, =0x7e001020 ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001024 ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001028 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00102c ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001030 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001034 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001038 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )@ ldr r2, [r0]str r1, [r0]ldr r0, =0x7e00103c mov r1, #0x07str r1, [r0]ldr r0, =0x7e001040 mov r1, #0x02str r1, [r0]ldr r0, =0x7e001044 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001048 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00100c ldr r1, =0x00010012 str r1, [r0]ldr r0, =0x7e00104c ldr r1, =0x0b45str r1, [r0]ldr r0, =0x7e001200 ldr r1, =0x150f8str r1, [r0]ldr r0, =0x7e001304 mov r1, #0x0str r1, [r0]@Issue NOPldr r0, =0x7e001008 ldr r1, =0x000c0000str r1, [r0]@prechargeallldr r1, =0x00000000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@mrsldr r1, =0x000a0000str r1, [r0]@mrsldr r1, =0x00080032str r1, [r0]ldr r0, =0x7e001004mov r1, #0x0str r1, [r0]check_dmc1_ready:ldr r0, =0x7e001000 ldr r1, [r0]mov r2, #0x3and r1, r1, r2cmp r1, #0x1bne check_dmc1_readynopmov pc, lr
210:
1、地址空间
1、210有4G的寻址空间,内存地址从0x20000000开始,0地址处为映射区,系统从此开始。
2、210采用的芯片是8bit的4个内存芯片(128M)。
其中DRAM0为512M
DRAM1为1G。
警告:当编写代码时,如果可以保持默认值不变,就把寄存器设置为默认值。
4、代码的编写部分可以参考210的芯片手册或U-Boot中的代码。
ARM裸机开发bootloader内存初始 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)