1.1 介绍
1.1.1 bootloader 的作用
bootloader 的终极功能就是为了启动内核。
从上面可以知道最简单的 uboot 编写的步骤:
初始化硬件:关看门狗、设置时钟、设置 SDRAM、初始化 nandflash
如果bootloadre 比较大,要把它重定位到 SDRAM
把内核从 nandflash 读到 SDRAM
设置内核启动参数
跳转执行内核
1.1.2 norflash 启动
norflash 可以像内存那样读,但是不能像内存那样写。
1.1.3 nandflash 启动
1.2 看门狗及时钟设置
1.2.1 看门狗设置
2440 必须在启动的时候关闭看门狗,不然就会隔一段时间重启芯片。
看门狗定时器控制(WTCON)寄存器允许用户使能或禁止看门狗定时器、从 4 个不同源选择时钟信号、使能或禁止中断和使能或禁止看门狗定时器输出。看门狗定时器是用于恢复 S3C2440 上电后若有故障重时新启动;如果不希望控制器重新启动,则应该禁止看门狗定时器。
如果用户希望使用看门狗定时器作为普通定时器,则应使能中断并且禁止看门狗定时器。
+ View Code
1.2.2 时钟设置
S3C2440 中的时钟控制逻辑可以产生必须的时钟信号,包括 CPU 的 FCLK,AHB 总线外设的 HCLK 以及 APB 总线外设的 PCLK。S3C2440A 包含两个锁相环(PLL):一个提供给 FCLK、HCLK 和 PCLK,另一个专用于 USB 模块(48MHz)。、
时钟控制逻辑可以不使用 PLL 来减慢时钟,并且可以由软件连接或断开各外设模块的时钟,以降低功耗。
时钟源的选择与启动模式有关,引导启动时,时钟源的选择如下:
FCLK,HCLK 和 PCLK
FCLK 是提供给 ARM920T 的时钟。
HCLK 是提供给用于 ARM920T,存储器控制器,中断控制器,LCD 控制器,DMA 和 USB 主机模块的 AHB 总线的时钟。
PCLK 是提供给用于外设如 WDT,IIS,I2C,PWM 定时器,MMC/SD 接口,ADC,UART,GPIO,RTC 和 SPI 的 APB 总线的时钟。
S3C2440 支持对 FCLK、HCLK 和 PCLK 之间分频比例的选择。该比例由 CLKDIVN 控制寄存器中的 HDIVN 和 PDIVN 所决定。
对于 S3C2440,芯片手册有这一段需要注意的:
我们必须将 CPU 总线模式改变为 异步总线模式。
前面已经说明,S3C2440A 包含两个锁相环(PLL):一个提供给 FCLK、HCLK 和 PCLK,另一个专用于 USB 模块(48MHz)。
所以还必须要设置锁相环,来给 FCLK、HCLK 和 PCLK 来提供时钟源:
UPLL 是提供给 USB 使用的,我们需要设置 MPLL,对于 MPLLCON,可以对应芯片手册提供的表进行设置:
input frequence:输入时钟源,外部 12M 的晶振,原理图设计的
output Frequence:输出时钟源,也就是 MDIV,选择 400M,则 MDIV 值是 0x5c
1 #define CLKDIVN 0x4C000014 /** 时钟分频控制寄存器 */
2 #define MPLLCON 0x4c000004
3 #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01)) /** 400M 时钟源 */
4
5 /** 3. 芯片手册上要求:
6 * 如果 HDIVN 非0, CPU 的总线模式应该从 fast bus mode 变为 asynchronous bus mode */
7 mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */
8 orr r1, r1, #0xc0000000 /* 设置为 asynchronous bus mode */
9 mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */
10
11 /** 4. 设置时钟频率 */
12 ldr r0, =MPLLCON
13 ldr r1, =S3C2440_MPLL_400MHZ
14 str r1, [r0]
15
16 /** 5. 初始化 SDRAM */
17 mov ip, lr /** 保存当前程序地址到 ip 寄存器 */
18 bl sdram_init /** 执行 SDRAM 的初始化 */
19 mov lr, ip