- 浏览: 14040 次
最新评论
SAMSUNG S3C2440的简易BootLoader ㈢
2010年06月05日
SAMSUNG S3C2440的简易BootLoader ㈢
[/b]
[b]第三部分:源代码,运行结果
这一部分将对前文没有提到的几段关键代码进行简单说明,介绍一下源代码组织结构和Makefile系统,展示一下实验运行结果,并提供全部源代码下载。
1. 定时器初始化和延时程序
因为在 CS8900A的驱动程序中需要用到延时,因此有必要对S3C2440的计时器进行使能和初始化,并编写延时程序。
S3C2440A共有5个定时器,编号为Timer0 ~ Timer4。其中Timer0 ~ Timer3都有输出引脚,可以通过定时器来控制引脚电平周期性的变化,这称为脉冲宽度调制(PWM:Pulse Width Modulation)功能。而Timer4没有输出引脚,也就没有PWM功能,所以Timer4常被程序里的延时函数使用。
定时器部件的时钟源为PCLK,但是需要经过两级预分频之后才真正供定时器使用。第一级预分频由TCFG0寄存器控制,其位[7:0]设置预分频器0的值,供Timer0和Timer1使用,位[15:8]设置预分频器1的值,供Timer2 ~ Timer4使用。第二级预分频由TCFG1寄存器控制,其每四位控制一个定时器,可以从2分频、4分频、8分频、16分频、外接TCLK0/TCLK1 这五种频率中选择。
我们的延时函数使用Timer4,其它定时器全部关闭。初始化程序中设置:TCFG0 = 0x0f00; 表示Timer4的第一级预分频值为 15+1 = 16。寄存器TCFG1使用默认值全0,表示第二级预分频为2分频。前面已经设置PCLK为50MHz,这样Timer4实际的工作频率为:
50MHz/16/2 = 50000000/32 = 1562500Hz
注意计算时钟频率时的MHz是指10^6,而不是2^20;同理KHz是指1000Hz,而不是1024Hz。
我们在TCON中把Timer4设为”自动加载“。当Timer4启动时,TCNTB4的值将被自动装入内部寄存器TCNT4,然后在工作频率下,TCNT4开始减1计数,当到达0时,TCNTB4的值又被自动装入TCNT4,下一个计数流程开始。我们把TCNTB4设为15625,则一个计数流程的的长度为10毫秒。
假设要延时的时间为msec毫秒,则共需要的计数值为 tmo = msec*15625/10,设一个变量timestamp保存已经过去的时间戳,每次读取TCNT4的值后更新timestamp,直到它大于 tmo 。程序如下:
while( timestamp = thisdec ) /* normal mode */
{
timestamp += lastdec - thisdec;
}
else /* we have an overflow ... */
{
timestamp += lastdec + TIMER_LOAD_VAL - thisdec;
}
lastdec = thisdec;
}
TCNT4的值可由寄存器TCNTO4读出。程序中保存了最近两次读出的TCNTO4值, 如果本次值比上次小,说明在同一个计数流程内;如果本次值比上次大,说明已经进入了下一个计数流程。
2. 串口标准输入输出要想在Bootloader中使用scanf()和print()并不容易,因为不能直接使用C库函数。scanf()要从串口获得输入, print()要向串口进行输出。必须自己实现常用的C库函数, 不仅包括输入输出函数,还包括字符串操作函数如strcmp(), strcpy()等。幸好在《嵌入式Linux应用开发完全手册》这本书的源代码中提供了这样简化的C库,所以就直接拿来用了。
代码中定义了两个全局数组作为输入输出缓冲区:
static unsigned char g_pcOutBuf[ 1024 ];
static unsigned char g_pcInBuf[ 1024 ];
其实我们可以把这两个缓冲区定位在CPU的 SteppingStone 里面,这样可以节省2K的空间。
scanf()的实现里面调用 getc() 函数, printf() 的实现里面调用 putc() 函数。我们自己写getc()函数为从串口读取字符, putc()函数实现为向串口发送字符, 这样标准输入输出就跟串口联系在一起了。
/* 发送一个字符 */
void putc(unsigned char c)
{
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
while (!(UTRSTAT0 & TXD0READY));
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
UTXH0 = c;
}
/* 接收字符 */
unsigned char getc(void)
{
unsigned char ret;
/* 等待,直到接收缓冲区中的有数据 */
while(!(UTRSTAT0 & RXD0READY));
/* 直接读取URXH0寄存器,即可获得接收到的数据 */
ret = URXH0;
if (ret == 0x0d || ret == 0x0a)
{
putc(0x0d);
putc(0x0a);
}
else
{
putc(ret);
}
return ret;
}
3. 源代码组织结构源代码跟目录下只有两个文件, 主Makefile和链接脚本sboot.lds。
文件夹start内有start.S和nand.c,前者是上电后最初运行的汇编代码,后者含有Nand Flash的读函数,负责把S-Boot代码从Nand拷贝到RAM中。
文件夹main内有main.c,是一个死循环,提供若干菜单供用户选择,然后调用相应功能的程序。
文件夹lib内是简化和移植过的C标准库,包括输入输出和字符串操作函数。
文件夹include内是一些头文件。
文件夹app内有boot_linux.c和tftp.c,从名字就能看出它们的功能。
文件夹device内含有设备驱动程序,如串口初始化、定时器初始化和延时函数、网卡驱动、网络协议实现等。
每个文件夹内都有自己的Makefile,根目录下的主Makefile会进入各个子目录并调用各自的Makefile。每个子目录下的Makefile把自己编译的代码链接成一个build-in.o文件, 主Makefile把各个子目录下的build-in.o链接成一个可执行文件。
编译器使用自己制作的 arm-hwlee-linux-gnueabi-gcc. 可以从这里下载。 给gcc增加 -nostdinc 选项, 表示不使用标准C库函数,不到/usr/include目录下寻找包含文件, 只在-I$(INCLUDEDIR)指定的目录寻找包含文件。
//**另外修改顶层目录下的Makefile文件,指定编译器为arm-linux-gcc,也可以编译该bootloader**//
4. 提供全部源代码下载:
文件:S-Boot.tar.gz大小:41KB下载:下载
5. 运行结果截图
图中,首先选择3从TFTP服务器下载内核到RAM中, 然后选择4从RAM成功启动内核。
选择2还有通过串口Kermit协议下载内核的功能,前文没有对这部分代码作分析,有时间再补上。下面附一张截图:
发表评论
-
PHP作为Flex程序的数据源
2012-01-20 01:22 535PHP作为Flex程序的数据源 2010年10月20日 ... -
myeclipse6.5+flex 3 + tomcat6.0 + ds-console.war环境搭建
2012-01-20 01:22 1139myeclipse6.5+flex 3 + tomcat6.0 ... -
flex图表
2012-01-20 01:22 1353flex图表 2010年07月13日 flex 可视化组 ... -
flex笔记--安装与项目建立
2012-01-20 01:22 450flex笔记--安装与项目建立 2011年01月04日 ... -
使用blazeds实现flex和java交互
2012-01-20 01:22 597使用blazeds实现flex和java交互 2010年07 ... -
C#面试题集锦(你值得拥有!)
2012-01-19 09:13 852C#面试题集锦(你值得拥 ... -
ASP.Net考试复习资料
2012-01-19 09:13 1059ASP.Net考试复习资料 2011 ... -
javascript:history.go()和History.back()的区别
2012-01-19 09:12 1093javascript:history.go()和History ... -
多线程
2012-01-17 01:42 739多线程 2011年05月15日 ... -
Java NIO 异步网络构建高性能服务器
2012-01-17 01:42 952Java NIO 异步网络构建高性能服务器 2010年12月 ... -
并行 .net 应用程序的过去、现在和未来
2012-01-17 01:42 538并行 .net 应用程序的过去、现在和未来 2011年08月 ... -
超线程与同步多线程
2012-01-17 01:42 722超线程与同步多线程 20 ... -
43543254325432
2012-01-17 01:42 63043543254325432 2011年06月23日 ... -
关于cgi库
2012-01-15 20:56 799关于cgi库 2009年07月02日 目前Web技术中生 ... -
嵌入式WEB服务器BOA的移植方法(三)
2012-01-15 20:56 719嵌入式WEB服务器BOA的移 ... -
linux C库函数(二)
2012-01-15 20:56 644linux C库函数(二) 2010年01月26日 li ... -
linux C库函数(三)
2012-01-15 20:56 696linux C库函数(三) 2010年0 ...
相关推荐
S3C2440 mini bootloader源代码
基于嵌入式S3C2440系统Bootloader设计与实现.pdf
s3c2440 bootloader源代码,有助于理解s3c2440启动过程
基于S3C2440的Bootloader的设计与实现
基于三星S3C2440BootLoader的研究
韦东山的课程上教的简单的bootloader编写
Boot loader( 引导加载程序) 是嵌入式系统开发的一个重要环节, 它把操作系统和硬件平台...理, 在基于以三星公司S3C2440 微处理器为核心的开发板为背景, 分析、探讨并且实现了基于U- boo t 的系统引导 加载程序的构建。
INCLUDE 2440addr.inc IMPORT Port_Init GBLL NOT_MIN_CODE ;定义全局逻辑变量,数据的大小端 NOT_MIN_CODE SETL {FALSE} BIT_SELFREFRESH EQU (1) ;Pre-defined constants USERMODE EQU 0x10 FIQMODE ...
s3c2440上的bootloader移植代码,已测试成功,可以直接下载运行.rar
详细的介绍了基于S3C2440的u-boot的移植,及其添加的对Nor Flash 和Nand Flash的支持,Yaff2文件系统的支持,以及引导启动内核。对初学者是很好的一篇文章,对高手也是一种挑战,本文用源码依次讲解,忘能帮助大家。
手写简易的bootloader在Mini2440上亲测成功。
基于S3C2440平台的Bootloader移植分析
S3C2440启动代码的实现 ARM裸机——S3C2440启动代码的编写 http://blog.csdn.net/dengpinbo/article/details/9291431
Demo_Test实验 本实验演示了S3C2440 开发板的所有功能。...Demo_Test IN NANDFLASH 运行在NANDFLASH中需下载.bin文件,具体操作过程请查看2440_Run_in_NANDFLASH文件中S3C2440_bootloader及USB下载文档。
S3C2440完全开发流程 一.简介 3 二.建立开发环境 4 1、编译器ARM-LINUX-GCC-3.4.1 4 2、JFLASH-S3C2440:S3C2440芯片的JTAG工具 4 3、安装GDB调试工具 5 4、USB下载工具 6 5、UBUNTU开发环境建立 6 三.S3C2440...
从源代码入手分析目前最为流行的BootLoader,即U-Boot基于三星公司S3C2440处理器的引导过程.着重分析从NandFlash启动的BootLoader的2个运行阶段,在第1阶段用高效的汇编代码实现对NandFlash驱动, 将Boot Loader从...
s3c2440a_embedclub.jflash,mini2440烧写bootloader必备的
三星S3C2440 的vivi 源代码,支持tftp功能。
本文件是基于mini2440开发板写的bootloader,可以实现操作系统的引导,并且在KEIL下编译通过
s3c6410_BOOTLOADER源代码 s3c6410_BOOTLOADER源代码 s3c6410_BOOTLOADER源代码