作者:王劲男,华清远见嵌入式培训中心讲师。
s5pc100是三星公司推出的基于Cortax-A8核心的一款专门针对应用、消费类电子产品而设计的芯片,针对它的介绍网上有很多了,我们就不专门介绍这款芯片了。
今天是针对U-boot的移植。我们先来看看u-boot的特点,u-boot是Boot-loader的一种可以负责板子上电后硬件初始化工作,以及内核引导。它可以为用户提供一个可交互的界面,使开机过程可控,可调,方便开发人员调试。
今天我们移植的版本是u-boot1.3.1这是一个比较成熟的版本,我们先来看看要移植一个u-boot需要注意哪些问题。
首先我们应该先拿到一个u-boot源码,应该是如下图:
《源码》
其中比较重要的、有针对性的目录是board, cpu, include等。我们要修改的大部分内容将集中在这些目录里面。
由于,篇幅有限这次只介绍CPU中针对内存控制器的初始化部分的内容:
ldr r0, =0xE6000000
ldr r1, =0xE0000000
ldr r2, [r1]
bic r2, #0xfffffdff
mov r2, r2, lsr #9
cmp r2, #0x1
beq onenand_pop
这部分内容是用汇编语言写的看起来比较清爽,没有太多的复杂的逻辑。
上面的代码是用来判断我们处理器的封装形式的,其中r1中存放着芯片ID寄存器的地址,这是一个32位寄存器,其中记录了芯片的型号如果是s5pc100的话,这个寄存器的前20位应该是“0x43100”。其中,第9位是用来判断芯片的封装形式的,如果为1,表示是POP形式就是。为0,表示是分立元件。我们一般使用分立式元件。
ldr r1, =0x6a101000
str r1, [r0, #0x18]
ldr r1, =0x000084f4
str r1, [r0, #0x1c]
ldr r1, =0x0
str r1, [r0, #0x20]
这部分是真对,DDR内存而设置的,DLL(delay locked loop)参数。
ldr r1, =0x6a101002
str r1, [r0,#0x18]
ldr r1, =0x6a101003
str r1, [r0,#0x18]
这是开启DLL工作。
ldr r2, =0xe6000040
loop1:
ldr r1,[r2]
ands r1,r1,#4
beq loop1
检查DLL锁,是否已经锁上。
ldr r1,[r2]
mov r1,r1, LSR #(0x6)
ldr r2, =0xE6000018
ldr r3,[r2]
bic r3,r3,#(0xff000000)
orr r1,r3,r2
str r1,[r2]
ldr r1, =0x6a101003
str r1, [r0, #0x18]
ldr r1, =0x6a101009
str r1, [r0, #0x18]
完成必要的设置,暂停DLL。
ldr r1, =0x20f01313
str r1, [r0, #0x08]
ldr r1, =0x40f01313
str r1, [r0, #0x0c]
配置256MB内存AXI设置地址。
ldr r1, =0x20000000
str r1, [r0, #0x14]
ldr r1, =0x00100004
str r1, [r0, #0x28]
设置自刷新周期
ldr r1, =0x0000050E
str r1,[r0, #0x30]
ldr r1, =0x16233297
str r1, [r0,#0x34]
ldr r1, =0x23230000
str r1, [r0,#0x38]
ldr r1, =0x07c80232
str r1, [r0, #]
这个地方是设置内存芯片的交流(AC)参数时序信息包括TimingAref, TimingRow, TimingData 和 TimingPower
ldr r1, =0x07000000
str r1, [r0, #0x10]
ldr r1, =0x01000000
str r1, [r0, #0x10]
ldr r1, =0x00020000
str r1, [r0, #0x10]
ldr r1, =0x00030000
str r1, [r0, #0x10]
ldr r1, =0x00010400
str r1, [r0, #0x10]
ldr r1, =0x00000532
str r1, [r0, #0x10]
ldr r1, =0x01000000
str r1, [r0, #0x10]
ldr r1, =0x05000000
str r1, [r0, #0x10]
ldr r1, =0x00000432
str r1, [r0, #0x10]
ldr r1, =0x00010780
str r1, [r0, #0x10]
ldr r1, =0x00010402
str r1, [r0, #0x10]
首先是唤醒chip0,然后所有模块预充电(这是为读取操作做准备),对bank2-3发msr/emsr命令(模式设定),设定内存进入自动刷新模式。最后是对EMRS寄存器进行设设置。
ldr r1, =0x00ff20b0
str r1, [r0, #0x0]
ldr r1, =0x00212413
str r1, [r0, #0x4]
b exit_cpu_init
打开自动刷新,设定读数据的取周期,设定内存的类型为DDR2和32位位宽。芯片数是2片,BL(burst length)=4。
文章评论(0条评论)
登录后参与讨论