[Linux]简易BootLoader
[Linux]简易BootLoader
艾恩凝
2021/5/25
Introduction
最简单的BootLoader,说白了就是裸机程序,用来启动内核。
BootLoader相当于windows中的bios,引导windows
Code
start.S
1
2.text
3.global _start
4_start:
5
6/* 1. 关闭看门狗 */
7 ldr r0, =0x53000000
8 mov r1, #0
9 str r1, [r0]
10/* 2. 设置时钟 */
11 /* CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8 */
12 ldr r0, =0x4C000014
13 ldr r1, =0x5
14 str r1, [r0]
15
16 /* 设置CPU工作于异步模式 */
17 mrc p15,0,r0,c1,c0,0
18 orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
19 mcr p15,0,r0,c1,c0,0
20
21 /* 设置MPLLCON(0x4C000004) = (92<<12)|(1<<4)|(1<<0)
22 * m = MDIV+8 = 92+8=100
23 * p = PDIV+2 = 1+2 = 3
24 * s = SDIV = 1
25 * FCLK = 2*m*Fin/(p*2^s) = 2*100*12/(3*2^1)=400M
26 */
27 ldr r0, =0x4C000004
28 ldr r1, =(92<<12)|(1<<4)|(1<<0)
29 str r1, [r0]
30
31 /* 启动ICACHE */
32 mrc p15, 0, r0, c1, c0, 0 @ read control reg
33 orr r0, r0, #(1<<12)
34 mcr p15, 0, r0, c1, c0, 0 @ write it back
35/* 3. 初始化SDRAM*/
36 ldr r0, =0x48000000
37 adr r1, sdram_config
38 add r3, r0, #52
391:
40 ldr r2, [r1], #4
41 str r2, [r0], #4
42 cmp r0, r3
43 bne 1b
44/* 4. 重定位*/
45 ldr sp, =0x34000000
46
47 bl nand_init
48
49 mov r0, #0
50 ldr r1, =_start
51 ldr r2, =__bss_start
52 sub r2, r2, r1
53
54 bl copy_code_to_sdram
55 bl clean_bss
56/* 5. 执行main*/
57 ldr lr, =halt
58 ldr pc, =main
59
60halt:
61 b halt
62sdram_config:
63 .long 0x22111110 //BWSCON
64 .long 0x00000700 //BANKCON0
65 .long 0x00000700 //BANKCON1
66 .long 0x00000700 //BANKCON2
67 .long 0x00000700 //BANKCON3
68 .long 0x00000700 //BANKCON4
69 .long 0x00000700 //BANKCON5
70 .long 0x00018005 //BANKCON6
71 .long 0x00018005 //BANKCON7
72 .long 0x008e07a3 //REFRESH,HCLK=12MHz:0x008e07a3,HCLK=100MHz:0x008e04f4
73 .long 0x000000b2 //BANKSIZE
74 .long 0x00000030 //MRSRB6
75 .long 0x00000030 //MRSRB7
76
77
Conclusion
BootLoader需要学习的地方有很多,主要部分明白了,uboot学习的地方有很多。
BootLoader下载链接 这是学习写的BootLoader
吾心信其可行,
则移山填海之难,
终有成功之日!
——孙文
则移山填海之难,
终有成功之日!
——孙文
评论
0 评论