218 mov pc, lr
219
220
12、串口初始化的执行代码
221 #ifndef CONFIG_NAND_SPL
222 /*
223 * uart_asm_init: Initialize UART's pins
224 */
225 uart_asm_init:
226 /* set GPIO to enable UART */
227 ldr r0, =ELFIN_GPIO_BASE
228 ldr r1, =0x220022
229 str r1, [r0, #GPACON_OFFSET]
230 mov pc, lr
231 #endif
232
13、NAND flash的初始化
后面有详细分析,这里不重复粘贴了。
14、MMU的初始化
同上。
这篇比较偷懒,但是想把主要精力放在start.S的分析上。
其实这也是分析方法的一种,看代码的时候先了解模块的代码区,若想深入了解某个模块的实现,则再深入到每一行代码中理解。
总结一下 lowlevl_init 的总体实现内容:
1、点亮LED;
2、关闭看门狗;
3、禁用中断;
4、初始化时钟;
5、初始化串口;
6、初始化NAND FLASH;
7、初始化MMU(根据宏声明而定)。
这里补上两段代码的分析:
NAND flash的初始化 与 MMU 的初始化,因为在 kernel 的启动过程中还会有类似的代码段,现在分析了,到后面分析 kernel 初始化的时候可以做一个对比。
1、首先是 NAND FLASH 的初始化
233 #ifdef CONFIG_BOOT_NAND
234 /*
235 * NAND Interface init for SMDK6400
236 */
237 nand_asm_init:
238 ldr r0, =ELFIN_NAND_BASE
239 ldr r1, [r0, #NFCONF_OFFSET]
240 orr r1, r1, #0x70
241 orr r1, r1, #0x7700
242 str r1, [r0, #NFCONF_OFFSET]
243
244 ldr r1, [r0, #NFCONT_OFFSET]
245 orr r1, r1, #0x07
246 str r1, [r0, #NFCONT_OFFSET]
247
248 mov pc, lr
249 #endif
250
1)确认成立条件 CONFIG_BOOT_NAND
这个条件声明在/include/configs/smdk6400.h中,所以下面的执行代码是有效的。
接着深入分析
238 ldr r0, =ELFIN_NAND_BASE
//在/include/asm-arm/arch-s3c64xx/s3c6400.h中声明了
#define ELFIN_NAND_BASE 0x70200000
//这里采用的是伪汇编指令,即将其值放入 r0 中
2)进入s3c6410 UM中检索 ELFIN_NAND_BASE 相关地址信息找到table 2-3 中有相应的地址信息。
Address Description
0x7020_0000 ~ 0x702F_FFFF NFCON SFR
接着在UM中检索0x7020_0000 可以跳转到8.11节。
看了之后发现,这一小篇内容描述的是 NAND FALSH 控制寄存器地图。
其中 base 就是我们的 0x7020_0000。
从UM中,我们先看到 0x7020_0000 代表的意思:
NFCONF (Nand Flash CONFiguration)寄存器功能为 Nand Flash Configuration register。
复位值为 0xX000_100X
相对应的位的信息为
//不同关系的作用位用 ',' 隔开,总体以 4 bit 来分隔, 含同一组作用位的用 '|' 隔开。
[31, 30, 29 28 | 27 26, 25, 24 | 23, 22 21 20 | 19 18 17 16 ]
[15, 14 13 12, | 11, 10 9 8, | 7, 6 5 4, | 3, 2, 1, 0]
//按作用位组来介绍
//1、 X, 0, 0 0 ---> X
31 - Reserved, 30 - [0:系统时钟 > 66MHZ; 1:系统时钟 < 66MHZ], 29 28 - Reserved
//2、 0 0, 0, 0 ---> 0
27 26 - Reserved, 25 - ECC校验长度 [0:512 byte; 1:24 byte ], 24 - 联合23
//3、 0, 0 0 0 ---> 0
24 23 - ECC类型 [00: 1 bit; 10: 4 bit; 01: 8 bit /*注意4 bit 和 8 bit 的类型码*/]
22 : 15 - Reserved
//4、 0 0 0 0 ---> 0
//5、 0, 0 0 1 ---> 1
14 13 12 - CLE & ALE 持续时间设定
//6、 0, 0 0 0 ---> 0
11 - Reserved, 10 9 8 - TWRPH0 持续时间设定
//7、 0, 0 0 0 ---> 0
7 - Reserved, 6 5 4 - TWRPH1 持续时间设定
//8、 X, 0, X, 0 ---> X
4 2 1 - Reserved, 3 - Reserved 但必须为1
3)接着看下面的指令
239 ldr r1, [r0, #NFCONF_OFFSET] //先找到 NFCONF_OFFSET 的定义
//目录为 /include/asm-arm/arch-s3c64xx/s3c6400.h, 则此处 r1 = 0xX000_100X
//在UM中找到相应项目
240 orr r1, r1, #0x70
// r1 = 0xX020_007X
241 orr r1, r1, #0x7700
// r1 = 0xX020_777X
242 str r1, [r0, #NFCONF_OFFSET]
//送回NFCONF寄存器
//对应上面的表可以知道,改变的为 CLE & ALE, TWRPH0/1 的持续时间而已(时间增加了)
243
4)然后是剩下的指令
244 ldr r1, [r0, #NFCONT_OFFSET] //这里是NFCONT_OFFSET了,注意区分
245 orr r1, r1, #0x07 // r1 = 0x0001_00C6 | 0x07
// r1 = 0x0001_00C7
//NFCONT 寄存器的最后一位功能为 [0:禁用NAND Flash 1:使用NADN flash]
//所以这里的功能就很清晰了,就是初始化 NAND flash
246 str r1, [r0, #NFCONT_OFFSET] //回送
247
248 mov pc, lr //程序返回
249 #endif
250
2、MMU的初始化代码
251 #ifdef CONFIG_ENABLE_MMU
252 /*
253 * MMU Table for SMDK6400
254 */
255
256 /* form a first-level section entry */
257 .macro FL_SECTION_ENTRY base,ap,d,c,b
258 .word (base << 20) | (ap << 10) |
259 (d << 5) | (1<<4) | (c << 3) | (b << 2) | (1<<1)
260 .endm
261
262 .section .mmudata, 'a'
263 .align 14
264 /* the following alignment creates the mmu table at address 0x4000. */
265 .globl mmu_table
266 mmu_table:
267 .set __base, 0
268 /* 1:1 mapping for debugging */
269 .rept 0xA00
270 FL_SECTION_ENTRY __base, 3, 0, 0, 0
271 .set __base, __base + 1
272 .endr
273
274 /* access is not allowed. */
275 .rept 0xC00 - 0xA00
276 .word 0x00000000
277 .endr
278
279 /* 128MB for SDRAM 0xC0000000 -> 0x50000000 */
280 .set __base, 0x500
281 .rept 0xC80 - 0xC00
282 FL_SECTION_ENTRY __base, 3, 0, 1, 1
283 .set __base, __base + 1
284 .endr
285
286 /* access is not allowed. */
287 .rept 0x1000 - 0xc80
288 .word 0x00000000
289 .endr
290 #endif
1)确认成立条件
#if !defined(CONFIG_NAND_SPL) && (TEXT_BASE >= 0xc0000000)
#define CONFIG_ENABLE_MMU
#endif
此处的TEXT_BASE是 0x0000_0000显然是不成立的。
但是我们还是继续往下分析。
2).macro
252 /*
253 * MMU Table for SMDK6400
254 */
255
256 /* form a first-level section entry */
257 .macro FL_SECTION_ENTRY base, ap, d, c, b
258 .word (base << 20) | (ap << 10) |
259 (d << 5) | (1<<4) | (c << 3) | (b << 2) | (1<<1)
260 .endm //结束宏定义
261
先来看看伪指令的格式
MACRO{$label} macroname {$parameter1} {$parameter2} ...
//label宏展开时可以替换的符号
//macroname 宏名
//parameter n 宏指令的参数
这里宏的名字为 FL_SECTION_ENTRY,其实可以看成C语言的 #define
3)制作映射表
262 .section .mmudata, 'a'
263 .align 14 //按照 2^14 = 16384 对齐,即 0x4000
264 /* the following alignment creates the mmu table at address 0x4000. */
265 .globl mmu_table
266 mmu_table:
267 .set __base, 0 //赋值为 0
268 /* 1:1 mapping for debugging */
269 .rept 0xA00 //重复次数 0xA00 = 2560
270 FL_SECTION_ENTRY __base, 3, 0, 0, 0
//代入公式得 FL_SECTION_ENTRY(起始) = (0b11 << 10) | (0b1 << 4) | (0b1 << 1)
= 0x0000_4000(对齐后)
271 .set __base, __base + 1
//每一次 __base + 1 之后, FL_SECTION_ENTRY + 0x0010_0000 ,即 1MB
//所以此次制表范围是 2560MB
//从 0x0000_4000 ~ 0x9FF0_4000
272 .endr
273
不可访问的区域,全部置为 0
274 /* access is not allowed. */
275 .rept 0xC00 - 0xA00 //重复次数 0x200 = 512
276 .word 0x00000000 //从0x9FF0_4000 ~ 0xBFF0_4000
277 .endr
278
映射SDRAM
279 /* 128MB for SDRAM 0xC0000000 -> 0x50000000 */
//这里为128MB,在实际使用中应该为256MB
280 .set __base, 0x500
281 .rept 0xC80 - 0xC00 //重复次数 0x80 = 128
//为256MB时应更改为 0xD00 - 0xC00
282 FL_SECTION_ENTRY __base, 3, 0, 1, 1
//代入公式得 FL_SECTION_ENTRY(起始) = 0xBFF0_4000
//此次制表范围 128MB
//从 0xBFF0_4000 ~ 0xC7F0_4000
283 .set __base, __base + 1
284 .endr
285
不可访问区域,置为0
286 /* access is not allowed. */
287 .rept 0x1000 - 0xc80 //重复次数 0x380 = 896
288 .word 0x00000000 //从0xC7F04000 ~ 0xFFF0_4000
289 .endr
290#endif
分析方法就是这样,虽然计算的地址可能有错,但是大概意思已经讲清楚了。
今天就写到这里了。
上一篇:S3C6410之uboot回炉再造(4)使能MMU
下一篇:S3C6410之uboot回炉再造(1)start.S - SVC模式设置
推荐阅读最新更新时间:2024-11-02 19:11
设计资源 培训 开发板 精华推荐
- EVAL-RS485HDEBZ,用于 ADM3483E 半双工 RS-485 收发器的评估板,采用 8 引脚 SOIC 封装
- LM399 10V 缓冲电压基准的典型应用电路
- OP495GPZ直接接入排列运算放大器的典型应用
- 使用数字电位器优化精密单电源光电检测电路
- MIC29201-3.3YM 400mA低压降稳压器典型应用
- 使用 IRS27951 的 IRAC27951-220W、220W 双输出谐振半桥电源
- STEVAL-IHM023V3,基于 L6390 驱动器,STGP10H60DF IGBT 的 1 kW 三相电机控制评估板
- EVAL-ADIN1200FMCZ,用于评估 ADIN1200 稳健、工业、低功耗、10 Mbps 和 100 Mbps 以太网 PHY 的评估套件
- dc12v电源降压5v 3.3v模块
- 使用 Diodes Incorporated 的 AP1512T5 的参考设计