一、编写 s3c24x0 的 bootloader——介绍、看门狗及时钟设置

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 上电后若有故障重时新启动;如果不希望控制器重新启动,则应该禁止看门狗定时器。

如果用户希望使用看门狗定时器作为普通定时器,则应使能中断并且禁止看门狗定时器。

 

#define pWTCON      0x53000000  /** 看门狗定时器控制寄存器 */

    /** 1. 关看门狗 */
    ldr r0, =pWTCON
    mov r1, #0x0
    str r1, [r0]

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

 

posted @ 2020-05-17 13:27  游戏进行中  阅读(642)  评论(0)    收藏  举报