Vivi(Bootloader)源代码分析与移植 - 图文(5)

2019-06-17 17:48

ok_nand_read:

@ verify

mov r0, #0 //r0这里为flash上vivi的起始地址

ldr r1, =0x33f00000 //r1这里为拷贝到sdram上vivi的起始地址 mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes //要比较多少个字节数 go_next:

ldr r3, [r0], #4 //将r0对应地址的值取出来保存到r3中,然后r0自加4个字节 ldr r4, [r1], #4

teq r3, r4 //测试r3和r4是否相等

bne notmatch //若不相等,则跳到notmarch处

subs r2, r2, #4 //将比较总字节数减去4个字节,已经比较了4个字节

beq done_nand_read //若r2为0,则表示已经比较完毕,跳转到done_nand_read处 bne go_next //r2若还不等于0则继续取值比较 notmatch:

# 469 \1: b 1b

done_nand_read:

mov pc, r10 //比较完了 就退出子程序,返回主程序执行

@ clear memory @ r0: start address @ r1: length mem_clear:

mov r2, #0 mov r3, r2 mov r4, r2 mov r5, r2 mov r6, r2 mov r7, r2 mov r8, r2 mov r9, r2

clear_loop:

stmia r0!,{r2-r9} //将r2-r9也就是0赋值给从r0为内存起始地址的连续的8*4个字节中

subs r1, r1, #(8 * 4) //每次清除32个字节 bne clear_loop

mov pc, lr

# 613 \@ Initialize UART @

@ r0 = number of UART port

21

InitUART: //这里也不细讲了,在UART章节中已经详细的讲解了每个寄存器的设置 ldr r1, SerBase mov r2, #0x0 str r2, [r1, #0x08] str r2, [r1, #0x0C] mov r2, #0x3 str r2, [r1, #0x00] ldr r2, =0x245 str r2, [r1, #0x04]

mov r2, #((50000000 / (115200 * 16)) - 1) str r2, [r1, #0x28]

mov r3, #100 mov r2, #0x0 1: sub r3, r3, #0x1 tst r2, r3 bne 1b

# 653 \ mov pc, lr @

@ Exception handling functions @

HandleUndef:

1: b 1b @ infinite loop

HandleSWI:

1: b 1b @ infinite loop

HandlePrefetchAbort: 1: b 1b @ infinite loop

HandleDataAbort: 1: b 1b @ infinite loop

HandleIRQ:

1: b 1b @ infinite loop

HandleFIQ:

1: b 1b @ infinite loop

HandleNotUsed:

1: b 1b @ infinite loop

22

@

@ Low Level Debug @

# 838 \@

@ Data Area @

@ Memory configuration values .align 4

mem_cfg_val: //这些变量都是内存控制寄存器的初始值,因为寄存器比较多,所以将初始值制作成表的形式,然后分别读表来初始化各个寄存器 .long 0x22111110 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00000700 .long 0x00018005 .long 0x00018005 .long 0x008e0459 .long 0xb2 .long 0x30 .long 0x30

@ Processor clock values .align 4

clock_locktime:

.long 0x00ffffff mpll_50mhz:

.long ((0x5c << 12) | (0x4 << 4) | (0x2))

mpll_200mhz:

.long ((0x5c << 12) | (0x4 << 4) | (0x0)) clock_clkcon:

.long 0x0000fff8 clock_clkdivn: .long 0x3

@ initial values for serial uart_ulcon:

.long 0x3 uart_ucon:

.long 0x245 uart_ufcon:

.long 0x0 uart_umcon:

23

.long 0x0

@ inital values for GPIO gpio_con_uart:

.long 0x0016faaa gpio_up_uart:

.long 0x000007ff

.align 2

DW_STACK_START:

.word (((((0x30000000 + 0x04000000 - 0x00100000) - 0x00100000) - 0x00004000) - (0x00004000 + 0x00004000 +

0x00004000)) - 0x00008000)+0x00008000 -4 # 922 \.align 4 SerBase:

.long 0x50000000 # 935 \.align 4

PMCTL0_ADDR:

.long 0x4c00000c PMCTL1_ADDR:

.long 0x56000080 PMST_ADDR:

.long 0x560000B4 PMSR0_ADDR:

.long 0x560000B8 REFR_ADDR:

.long 0x48000024 [root@lqm vivi_myboard]#

2.2.3中断向量表

开始对中断向量表很疑惑。现在的理解比较清晰了,在硬件实现上,会支持中断机制,这个可以参考微机接口原理部分详细理解。现在的中断机制处理的比较智能,对每一类中断会固定一个中断向量,比如说,发生IRQ中断,中断向量地址为0x00000018(当然,这还与ARM9TDMI core有关,其中一个引脚可以把中断向量表配置为高端启动,或者低端启动。你可以通过CP15的register 1的bit 13的V bit来设置,可以查看Datasheet TABLE 2-10来解决。),那么PC要执行的指令就是0x00000018。如果在这个地址放上一个跳转指令(只能使用b或者ldr),那么就可以跳到实际功能代码的实现区了。ARM体系结构规定在上电复位后的起始位置,必须有8条连续的跳转指令,这是bootloader的识别入口,通过硬件实现。看一下vivi的中断向量表:

@ 0x00

24

b Reset @ 0x04

HandleUndef:

b HandleUndef @ 0x08 HandleSWI:

b HandleSWI @ 0x0c

HandlePrefetchAbort:

b HandlePrefetchAbort @ 0x10

HandleDataAbort:

b HandleDataAbort @ 0x14

HandleNotUsed:

b HandleNotUsed @ 0x18 HandleIRQ:

b HandleIRQ @ 0x1c HandleFIQ:

b HandleFIQ

注意,中断向量表可以修改,也可以通过MMU实现地址重映射,来改变对应的物理介质(在MMU一章中我们提到过由于flash介质上执行速度比较慢,所以我们一般利用MMU将0x0开始的一段代码映射到SDRAM从0x30000000开始的区域,这样代码的执行就比较快)。如果不对每种中断进行测试,可以采用下面的书写方式。

@ 0x00

b Reset @ 0x04

HandleUndef: b . @ 0x08 HandleSWI: b . @ 0x0c

HandlePrefetchAbort: b . @ 0x10

HandleDataAbort: b . @ 0x14

HandleNotUsed: b .

25


Vivi(Bootloader)源代码分析与移植 - 图文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:【恒心】【好卷速递】甘肃省张掖市2012届高三4月高考诊断试卷 文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: