首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

BootLoader —— S3C2440

BootLoader —— S3C2440

先来看看扬创的bootloader的实现方法:

  首先:在汇编中初始化堆栈,中断向量表,MMU,时钟,串口等,然后跳到C语言的Main函数。这部分代码小于4K,放在block0。这个Main函数用来将第二段代码拷备到DRAM中并执行。

  其次:进入第二段代码。第二段代码也是先在汇编中初始化堆栈,中断向量表等,然后跳到C语言的Main函数。这部分代码就不用有4K限制了,具体大小由第一段代码决定,因为它本身由第一段代码来搬运。这个Main函数用来显示开机图片以及进度条。然后视串口接收信息运行带有USB下载NK的Eboot或是读取NK映像,启动WINCE系统。

  最后:进入第三段代码。这段代码用于通过USB将PC上的NK.nb0或NK.bin文件下载进NANDFLASH并运行。

  可见,扬创公司光bootloader就分成了三个部分,即3个bin文件组成。然后分别将这三段二进制代码下载进分别从 block0,block2,block8(block12)开始的三块。具体烧写手段采用老掉牙的giveio烧写,就是曾经大名鼎鼎的SJF2440 了,相信不少嵌入式高手都用过,哈哈。如果不小心将bootloader弄丢了,再重烧一片,得等上好几分钟,足够你到外面跑上几千米再回来这么长了。尽管如此,我们的扬创公司仍然拿他们的代码当宝,死活不肯开源。要知道对于买你们板子的人,都是来学习的呀!学习嵌入式系统,bootloader是最基础也是进入嵌入式行业的敲门砖,没有了代码,无疑给学习添加了很大的麻烦,而扬创官方回答却是:用户开发产品用不着修改bootloader.我看扬创没开发过东西,不了解行情。

  不说这么多废话了,说多了无益,让我们一起来揭开bootloader的神秘的面纱吧!

  先说下我移植的bootloader的功能,以及烧录时间,和扬创的做下对比。

  第一次下载bootloader到NANDFLASH的方法:

  方法一:通过扬创的老掉牙的方法,先在ADS1.2里面生成bootloader.bin文件,然后用SJF2440烧写工具,配合giveio将BIN文件烧写进从block0开始的块。大概要花上十分钟左右的样子吧!BIN文件有点大。

  方法二:在ADS1.2环境下,通过AXD将程序映像到DRAM的地址并运行,然后通过运行着的bootloader将本身bootloader的BIN 文件下载至NANDFLASH。很神奇吗?哈哈!本身bootloader运行的地方是ADS可配的,视文件大小可以选配在SRAM,SDRAM下运行,运行之后就可以拿程序本身来烧写代码至NAND了,弄懂原理了也就不足为奇了。这里暂时通过并口 + H-JTAG + WIGGLER的方式。

  方法三:采用multiICE等仿真器下载BIN文件到NAND。

  方法四:将ADS1.2的代码移植到MDK,通过ULINK2仿真,让程序运行在DRAM,然后通过bootloader程序将BIN文件烧写进NAND。

  方法五:还有更多的方法留着你去做呢,哈哈.................

  对比扬创的bootloader,至少有如下好处大家是看得到的吧:

  其一:下载速度至少是扬创的50倍以上。大概以扬创下载整个文件需要3分钟计算,实际用USB下载bootloader仅需1秒,那就是180倍。

  其二:如果手上没有USB的仿真器,那么也仅仅是用并口烧写过一次bootloader就不用了,除非NAND的bootloader被格掉了。如果手上有USB的仿真器,那就彻底不用并口了,这不正是广大笔记本开发者头痛之处么?

  其三:整个bootloader文件只需一个工程文件,即只用一个BIN文件,而且是直接烧写至以block0开始的块。继续神奇?哈哈,2440手册上不是说第一段代码不能大于4K吗?这不是与手册冲突了?再觉得神奇就看代码吧!

  先将整个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。
具体代码如下:
继承事业,薪火相传
返回列表