2440执行程序的第一件事请就是执行start.S文件,所以这里来学习下最基本的启动文件。
顺便说下,在U-boot里有专门对应各种芯片的start.S文件,在开发手册中的ARM章节可以看到S3X2440的ARM型号为ARM920,所以本文章讲解部分比较重要的启动程序(能够保证能够正常启动),在以后的博客中我会详细对他进行分析。
一个最简单的start.S文件因该包括看门狗部分、时钟初始化部分以及程序代码定位部分。
目录
1、看门狗部分
废话不多说,直接开始配置,首先就是要关闭暂时不使用的看门狗,找到看门狗的寄存器:WTCON,将其第0位置0,即禁用看门狗,即:
# define pWTCON 0x53000000 //WTCON地址
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0] //关闭看门狗
2、时钟部分
在S3C2440中有三种时钟频率,分别为FCLK, HCLK, PCLK,分别控制不同种类的外设,在时钟树中可以进行查找,这里不做过多赘述,在以后的博客中有应用。
从芯片手册中查找FCLK, HCLK, PCLK 的最高频率,在范围内我们选择设置FCLK = 400MHZ, HCLK = 100MHZ, PCLK = 50MHZ (TF : TH : TP = 1 : 4 : 8)为例进行设置初始化时钟,看芯片手册的时钟树如下图所示:
OSC可以理解为我们的晶振频率,从开发板的原理图上可以看出为12MHZ。
时钟信号通过OM[3 : 2]( 外接引脚 GND )进行时钟源选择,即设置OM[3, 2] = [0, 0],此时刚上电时FCLK频率等于晶振频率,然后进入lock time,此时,CPU暂停工作,在lock time (该段时间是为稳定输出新的FCLK)过后CPU继续工作,CPU时钟的主频率为设置的FCLK。
为保证CPU能够在启动后一定能发送设置的FCLK信号,所以将FCLK设置为最大值:
# define LOCKTIME 0x4C000000
ldr r0, =LOCKTIME
ldr r1, =0xffffffff
str r1, [r0]
先不看控制USB部分(UPLL)直接看MPLL部分。时钟树中时间信号通过锁相环(PLL)生成400MHZ的FCLK。其中关于MPLL寄存器设置方法如下:
然后通过查找数值表(也可以手算,在手册中有公式),由Input Frequency = 12MHZ,Output Frequency = 400MHZ得到MDIV, PDIV, SDIV的参数值,并写入寄存器中:
# define MPLLCON 0x4C000004 //MPLLCON地址
ldr r0, =MPLLCON
ldr r1, = ((92 << 12) | (1 << 4) | (1 << 0)) // MDIV = 92 PDIV =1 SDIV = 1
str r1, [r0] //写入寄存器
时钟树通过参数HDIVN, PDIVN对FCLK进行分频操作得到可操作进行外设操作的时钟HCLK, PCLK,设置分频系数的寄存器为CLKDIVN:
# define CLKDIVN 0x4C000014
ldr r0, =CLKDIVN
ldr r1, =((10 << 1) | (1 << 0)) // HCLK = FCLK / 4
// PCLK = HCLK / 2
最后一步由于设置的HDIVN寄存器不等于0,所以需要设置CPU处于异步状态,这里涉及到协处理器的命令(我也不懂哈哈哈),就按照手册中的来编(chao)写就行了。
3、代码重定位
这里先要讲一讲,由于nor flash在运行程序时,是可读不可写的,所以如果程序中有变量储存在 .bin文件中时,该变量不可被改变,即使在程序中对其进行修改。所以我们需要对代码进行重定位到SDRAM中,然后才能对其全局变量进行修改。所以首先应该讲下关于SDRAM的初始化配置:
3.1. SDRAM
由于在start,S程序中只要对SDRAM进行初始化配置,这样就能够对代码进行重定位,所以本章节博客只对SDRANM的初始化程序进行编写以及一些基本操作。