📄 nandbootloader.s
字号:
GBLA LOOP
INIT_EMI EQU 1
REMAP EQU 0
INIT_PMU EQU 0
TESTPC EQU 0
AREA ONE, CODE, READONLY
ENTRY
;;;;;;;;;;;;;;;;;;;;;;;;;配置EMI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF INIT_EMI <> 0
mov r0,#0x11000000 ; 设置EMI寄存器基址0x11000000
mov r1,#0x8c000000
add r1,r1,#0x00ff0000
add r1,r1,#0x0000ff00
add r1,r1,#0x000000f1
str r1,[r0,#0x10] ; EMI_CSECONF:0x8cfffff1
mov r1,#0x1d000000
add r1,r1,#0x00004100
add r1,r1,#0x00000077
str r1,[r0,#0x18] ; EMI_SDCONF1:0x1d004177
mov r1,#0x80000000
add r1,r1,#0x00001800
add r1,r1,#0x00000060
str r1,[r0,#0x1c] ; EMI_SDCONF2:0x80001860
IF REMAP<>0
mov r1,#0x0000000b
str r1,[r0,#0x20] ; EMI_REMAPCONF:0x0000000b
ELSE
nop
nop
ENDIF
ELSE
LOOP SETA 16
WHILE LOOP >0
LOOP SETA LOOP-1
nop
WEND
ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;配置DMA控制器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r1,#0x11000000 ; 设置DMA寄存器基址
mov r0,#0x1000
add r0,r1,r0
; 基址 0x11001000
mov r2,#0x200
add r1,r2,r1 ; DMA源地址寄存器地址
str r1,[r0] ; DMA源地址0x11000200 ->0x11001000
mov r1,#0x30000000
mov r2,#0x1000
nop
add r1,r1,r2
str r1,[r0,#0x4] ; DMA目标地址 0x30001000 ->0x11001004
mov r1,#0x210000
mov r2,#0x2400
nop
add r1,r1,r2
add r1,r1,#0x9b
str r1,[r0,#0xc] ; DMA控制寄存器0x0021249b ->1100100c 0x4??
mov r1,#0x310
add r1,r1,#0xd
nop
str r1,[r0,#0x10] ; 配置DMA通道使能寄存器0x305 ->11001010
; DMA 控制器配置结束
;;;;;;;;;;;;;;;;;;;;;;;;;;;;配置Nand Flash控制器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r0,#0x11000000
add r0,r0,#0x100 ; r0 地址0x11000100
nop
mov r1,#0x100
str r1,[r0] ; 首页地址0x100 ->11000100
mov r1,#0x6300000
mov r2,#0x2800
nop
add r1,r1,r2
add r1,r1,#0x57
str r1,[r0,#0x18] ; 配时序寄存器1 0x06202857 ->11000118
mov r1,#0x110000
mov r2,#0x4300
nop
add r1,r1,r2
add r1,r1,#0x53
str r1,[r0,#0x28] ; 配时序寄存器2 0x00514353 ->11000128
; Nand Flash控制器配置结束
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;将起始的4条指令写到0x30000000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF TESTPC <> 0
;测试mov pc #0x30000000
mov r10,#0x10000000 ;r10:0x10001014
add r10,r10,#0x1000 ;r11:0x00000001
add r10,r10,#0x14 ;切换CPU到Normal模式
mov r11,#0x1
nop
nop
ELSE
mov r10,#0x11000000 ; 启动NAND的DMA传输
mov r11,#0x100
nop
add r10,r10,r11
add r10,r10,#0x4 ; r10 中0x11000104
mov r11,#0x80000000 ; r11 中 0x80000000
ENDIF
mov r0, #0x30000000 ; 写到CSF中的指令
mov r12,#0xe5000000
mov r13,#0x8a0000
add r12,r12,r13
mov r13,#0xb000
add r12,r12,r13
str r12,[r0],#0x4 ; 0x30000000 0xe58ab000( str r11,[r10])
mov r9,#0x100000 ; 用于产生一个延时时间
mov r1,#0xe2000000
nop
mov r2,#0x590000
add r1,r1,r2
mov r2,#0x9000
add r1,r1,r2
add r1,r1,#0x1
str r1,[r0],#0x4 ; 0x30000004 0xe2599001(a sub r9,r9,#0x1)
mov r1,#0x1a000000
mov r2,#0xff0000
nop
add r1,r1,r2
mov r2,#0xff00
add r1,r1,r2
add r1,r1,#0xfd
str r1,[r0],#0x4 ; 0x30000008 0x1afffffd(bne a)
mov r8,#0x30000000
add r8,r8,#0x1000 ; R8=0x30001000
mov r1,#0xe1000000
mov r2,#0xa00000
add r1,r1,r2
mov r2,#0xf000
add r1,r2,r1
add r1,r1,#0x8
str r1,[r0],#0x4 ; 0x3000000c 0xe1a0f008(mov pc,r8)
;;;;;;;;;;;;;;;;;;;;;;;;;配置PMU,在此处作测试用;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF INIT_PMU <> 0
mov r0,#0x10000000 ; 设置PMU寄存器基址0x10001000
add r0,r0,#0x1000
mov r1,#0x4000
add r1,r1,#0x00000008
str r1,[r0,#0x4] ; PMCR:0x4008,64M
mov r1,#0x00000001
str r1,[r0,#0x14] ; PMDR:0x1,normal
mov r1,#0xc000
add r1,r1,#0x00000008
str r1,[r0,#0x04] ; PMCR:0xc008,64M
ELSE
LOOP SETA 10
WHILE LOOP >0
LOOP SETA LOOP-1
nop
WEND
ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;测试0x30000000处指令是否可以被执行;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF TESTPC <> 0
mov r0,#0x10000000 ; 设置PMU寄存器基址0x10001000
add r0,r0,#0x1000
mov r1,#0x4000
add r1,r1,#0x00000009
str r1,[r0,#0x4] ; PMCR:0x4009,72M
mov r1,#0x00000000
str r1,[r0,#0x14] ; PMDR:0x0,slow (0x30000000处指令进入normal)
ELSE
LOOP SETA 7
WHILE LOOP >0
LOOP SETA LOOP-1
nop
WEND
ENDIF
nop
nop
nop
nop
nop
nop
nop
nop ; 插入nop 指令填满一页
nop
nop
nop
nop
mov r0,#0x30000000
mov pc,r0
nop
nop
nop
nop
END
; r8 0x30001000,最后要跳转过去的地址
; r9 0x100 表示page读延时
; r10 中 0x11000104
; r11 中 0x80000000
;0x30000000 str r11,[r10,#0]
;0x30000004 subs r9,r9,#1
;0x30000008 bne 0x4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -