深入研究S3C2440 bootloader
来源:互联网 发布:淘宝账户被冻结多久 编辑:程序博客网 时间:2024/05/16 10:46
bootloader的实现方法:
先从全局对整个工程有个大体的了解很重要,这样局部一条条的看更容易懂。
由于程序实在太长,这里分几个部分逐步说明。
一:串口配置。
整个bootloader的交互环境全部是通过串口显示的,那么怎么样才能准确无误的显示出想要的字符呢?
首先要知道的是:串口的CLK是挂在PCLK上的。波特率与PCLK有着密切的关系,因此正确设置PCLK,是和正确设置波特率有着千丝万缕的联系的。
S3C2440内置两个PLL电路,即MPLL和UPLL。MPLL给FCLK,HCLK,PCLK提供时钟,UPLL给USB提供时钟。
MPLL=FCLK=(2*m*Fin)/(p*2^s);
m=M+8;
p=P+2;
M,P由寄存器MPLLCON设置。
确定了FCLK后,HCLK和PCLK由寄存器CLKDIVN确定。
详细设置请参考S3C2440的SPEC。
这里设置mdiv=92,pdiv=1,s=1,计算得FCLK=400MHz.
相应的设置CLKDIVN,使得FCLK:HCLK:PCLK=1:4:8,
这样PCLK=400/8=50MHz.
再通过PCLK设置波特率为115200,这样串口配置就完成了。
二:TIMER4的设置
从上面的流程图可以看出,TIMER4用于倒计时,当在规定时间内没有响应键盘后,自动装载系统并运行。
TIMER4的时钟也是以PCLK为基准的。具体输入的时钟频率为:
Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}
其中prescaler value由寄存器rTCFG0确定,divider value由寄存器rTCFG1确定。
这里设置输入的频率Fin=PCLK/(3+1)/4=312500Hz.
然后设置定时器装载的初始值,由寄存器rTCNTB4确定。
这里设置rTCNTB4=3125.
由此可以算出,定时器产生一次中断所花的时间为:T=N/F=3125/312500=0.01S。
具体代码如下:
static void init_autorun_timer(int sec)
{
U32 val = (PCLK>>4)/100-1;
autorun_10ms = sec*100;
pISR_TIMER4 = (U32)autorun_proc;
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= 3<<8; //prescaler 1 = 3+1 ,for Timer 2,3,4
rTCFG1 &= ~(0xf<<16);
rTCFG1 |= 1<<16; //mux = 1/4 ,for Timer 4
rTCNTB4 = val; //val = (PCLK>>4)/100-1
rTCON &= ~(0xf<<20);
rTCON |= 7<<20; //interval, inv-off, update TCNTB4&TCMPB4[占空比], start timer 4
rTCON &= ~(2<<20); //clear manual update bit
EnableIrq(BIT_TIMER4); //清0对应位,使能对应中断
}
static __irq void autorun_proc(void)
{
ClearPending(BIT_TIMER4);
if(autorun_ds) //自动运行标识位,为1时禁止自动运行;系统启动时有按键按下时为1
autorun_10ms--;
if(!autorun_10ms) //当中断一百次时执行下面的程序
{
}
}
中断程序中有个变量EnRunWINCE,默认为0.当autorun_10ms值减到0后,即定时的时间已到,这EnRunWINCE=1,后面的程序通过该变量判断时间到了,然后执行自动加载NK的代码。
具体代码如下:
if(EnRunWINCE)
三:LCD设置
bootloader运行时可以附加显示开机图片,这就需要对LCD控制器的相关寄存器进行设置。
由于寄存器较多,这里不一一列举,仅给LCD显示的函数如下:
void LCD_Play()
{
U32 i,j,k;
U32* palette;
Lcd_Init();
LcdBkLtSet( 70 ) ;//背光PWM设置
Lcd_PowerEnable(0, 1);
}
四:USB,MMU,ISR,DMA等寄存器的设置
这里尤其是USB和DMA的寄存器设置,由于下载BIN文件是通过USB走的DMA下载的,因此设置这些寄存器至关重要。相关寄存器实在太多,这里不一一列举。
五:EBOOT
核心代码如下:
while(1)
{
}
前面各寄存器初始化完成后,进入这个死循环,默认menuUsed=0,这时将执行函数WaitDownload()。
在WaitDownload()中,如果没有点击DNW的下载,这时没有检测到下载的BIN文件的大小,此时
downloadFileSize=0,这时执行下面的代码:
while(downloadFileSize==0)
{
}
通过程序可以看到,此时LED会不停闪烁。
一旦通过DNW下载点击后,downloadFileSize将被赋值为下载的BIN文件或nb0文件的大小,不再为0,这个while循环将结束,程序继续往后运行,USB通过DMA将PC上的BIN或nb0文件下载到DRAM中。
在下载BIN或nb0文件时,开启定时器,用于计算下载整个文件所花的时间,并打印出来。
开始下载时,执行如下两个函数:
Timer_InitEx();
Timer_StartEx();
下载完后,执行如下函数:
time=Timer_StopEx();
下载一次所花的时间被保存在变量time中,并通过串口打印出来。
下载完后将执行数据校验,确保数据无误。
校验无误后,将根据前面是否选择下载并运行,如果下载时选择的下载并运行,这时将运行下载的程序。这里指下载到DRAM中才有这种功能。具体代码如下:
if(download_run==1)
{
run();
}
如果选择的下载到NAND,bootloader先将下载的BIN文件下载进DRAM,再将DRAM的数据拷到NAND中。拷备完后,执行引导系统的程序。
- 深入研究S3C2440 bootloader
- 深入研究S3C2440 bootloader
- 基于S3C2440 bootloader 编写
- BootLoader —— S3C2440
- S3C2440 BootLoader启动流程分析
- S3C2440启动方式研究
- S3C2440 clock研究
- S3C2440 clock研究
- S3C2440启动方式研究
- s3c2440 ADC驱动研究
- 基于S3C2440的bootloader移植详解
- s3c2440学习系列5(bootloader)
- S3C2440 BootLoader启动流程分析--startup
- S3C2440 BootLoader启动流程分析--startup
- S3C2440 BootLoader启动流程分析--startup
- 基于S3C2440的bootloader详细分析
- 基于S3C2440的bootloader详细分析(2)
- 基于s3c2440的简易bootloader实现
- JS读取XML文件
- 背包问题
- Object-C 宏定义
- android虚拟机的上下左右方向键显示不可点击状态,如何配置让可用
- 插入排序
- 深入研究S3C2440 bootloader
- 内存分页概念
- Ajax跨域访问解决方案(httpclient、JSONP深入剖析)
- 快速排序
- Struts2中的ModelDriven机制及其运用
- Linux常见命令(head,tail)
- Clover使用笔记(持续更新)
- struts2 的文件上传
- Caused by: java.lang.ClassNotFoundException:javax.wsdl.xml.WSDLLocator