6410不同于2440,在uboot中需要对外设基地址进行初始化。
关于为何要对外设基地址进行初始化,这篇文章有详细说明
设置外设基地址
这个操作是告诉CPU外设的基地址是多少
不同的芯片,即使使用的是ARM11的内核,那外设地址也有可能不一样。所以ARM11就加了一个告诉CPU外设基地址这个东西,当地址属于外设地址,CPU就使用外设总线去访问
在arm核手册中,如下图,对外设基地址进行初始化
基地址为0x7000000
设置其大小为256MB,也就是0B10011 0x13
将值写入cp15中
set_peri_port:
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4
mov pc, lr
@****************************
@name: start.S
@by : stone
@time: 2016.6.24
@function: 外设基地址初始化
@****************************
.text
.global _start @将_start声明为全局变量
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
undefined_instruction: @处理未定义指令异常
nop
software_interrupt: @软中断
nop
prefetch_abort: @预取指令异常
nop
data_abort: @数据访问异常
nop
not_used: @空位
nop
irq: @中断
nop
fiq: @快速中断
nop
reset: @reset
bl set_svc @设置为SVC模式
bl set_peri_port @外设基地址初始化
bl disable_watchdog @关闭看门狗
bl disable_interrupt @关闭中断
bl disable_mmu @关闭mmu
set_svc:
mrs r0, cpsr @将值取出cpsr寄存器
bic r0, r0, #0x1f @将后5位 即M[4:0]清零
orr r0, r0, #0xd3 @0b10011 转化为16进制为0x13 同时为了屏蔽irq和fiq,可以将其设置为0b11010011即0xd3
msr cpsr, r0 @将值送回cpsr寄存器
mov pc, lr @返回
set_peri_port:
ldr r0, =0x70000000 @基地址
orr r0, r0, #0x13 @256MB
mcr p15,0,r0,c15,c2,4 @写入cp15
mov pc, lr
#define pwTCON 0x7E004000 @WTCON寄存器
disable_watchdog:
ldr r0, =pwTCON @把地址装载到R0
mov r1, #0x0 @置0,关闭看门狗
str r1,[r0]
mov pc,lr
disable_interrupt:
mvn r1,#0x0 @0x0 取反,给r1
ldr r0,=0x71200014 @VIC0
str r1,[r0]
ldr r0,=0x71300014 @VIC1
str r1,[r0]
mov pc,lr
disable_mmu:
mcr p15,0,r0,c7,c7,0 @使ICACHE 和DCACHE 无效
mrc p15,0,r0,c1,c0,0 @read control register
bic r0,r0,#0x00000007 @mmu 和 dcache置零
mcr p15,0,r0,c1,c0,0 @write control register
mov pc,lr
菜鸟一枚,如有错误,多多指教。。。