`
uro494zq
  • 浏览: 16365 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

SAMSUNG S3C2440的简易BootLoader ㈢

 
阅读更多

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协议下载内核的功能,前文没有对这部分代码作分析,有时间再补上。下面附一张截图:
  
  
  
分享到:
评论

相关推荐

    S3C2440 mini bootloader

    S3C2440是一款由Samsung公司推出的基于ARM920T内核的微处理器,广泛应用在嵌入式系统中,尤其在开发板和小型设备上。"S3C2440 mini bootloader"是一个针对该处理器的轻量级引导加载程序,它在系统启动时负责初始化...

    S3C2440_bootloader.rar

    S3C2440是一款由Samsung公司设计的ARM920T内核处理器,广泛应用于各种嵌入式设备,如开发板、工业控制设备等。本文将深入探讨S3C2440的Bootloader设计与实现。 首先,我们要理解Bootloader的基本结构和功能。...

    s3c2440 bootloader

    【S3C2440 Bootloader详解】 在嵌入式系统领域,Bootloader是系统启动的第一部分软件,它负责加载操作系统到内存中并初始化必要的硬件。本文将深入探讨S3C2440处理器的Bootloader,帮助你理解其启动流程。 S3C2440...

    基于嵌入式S3C2440系统Bootloader设计与实现.pdf

    Bootloader的设计需要考虑到具体的硬件平台,例如S3C2440系统,需要根据该系统的硬件组成设计 Bootloader。 Bootloader的设计需要分为两个阶段:第一个阶段是用汇编语言编写与具体硬件平台相关的操作等,第二阶段是...

    基于三星S3C2440BootLoader的研究

    ### 基于三星S3C2440 BootLoader的研究 #### 引言 BootLoader作为系统开机后运行的第一个软件代码,对于整个系统的启动至关重要。它的主要职责是在硬件自检后,正确加载操作系统内核至指定内存位置,并将控制权...

    基于S3C2440的Bootloader的设计与实现

    本文聚焦于基于三星S3C2440微处理器的Bootloader设计与实现,深入探讨了U-boot这一强大工具的运行原理及其实现过程。 #### Bootloader的角色与功能 Bootloader是系统启动的首个程序,负责硬件初始化、内存管理、...

    mini2440简易bootloader源码

    对于Mini2440这样的S3C2440 ARM9开发板,编写一个简易的Bootloader是理解其工作原理、进行系统调试和定制化操作的有效途径。本文将围绕"Mini2440简易Bootloader源码"这一主题,深入探讨相关知识点。 1. **Mini2440...

    s3c2440上的bootloader移植代码

    总的来说,对于S3C2440的Bootloader移植,开发者需要具备一定的嵌入式系统知识,了解ARM体系结构,熟悉汇编语言和C语言编程,以及掌握交叉编译工具的使用。通过这份移植成功的代码和相关文档,开发者可以快速入门,...

    三星S3C2440参考设计!

    三星S3C2440是一款基于ARM920T内核的微处理器,由韩国三星电子公司开发,广泛应用于嵌入式系统设计,尤其是在早期的智能手机、PDA以及各种工业控制设备中。这款处理器以其高效能、低功耗的特点受到了业界的欢迎。...

    s3c2440的bootloader

    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启动代码的实现

    本文将详细解析S3C2440启动代码的实现过程,帮助理解Bootloader的工作原理和重要性。 启动代码,也称为引导加载程序(Bootloader),是嵌入式系统启动时首先执行的一段程序。它负责初始化硬件,如CPU、内存、外设,...

    基于S3C2440的bootloader移植

    详细的介绍了基于S3C2440的u-boot的移植,及其添加的对Nor Flash 和Nand Flash的支持,Yaff2文件系统的支持,以及引导启动内核。对初学者是很好的一篇文章,对高手也是一种挑战,本文用源码依次讲解,忘能帮助大家。

    CPU三星S3C2440A芯片手册.rar_CPU三星S3C2440A芯片手册_s3c2440a处理器

    《CPU三星S3C2440A芯片手册》是一份详尽的用户指南,针对的是三星公司的32位CMOS微控制器S3C2440A。这份手册是开发者、硬件工程师以及嵌入式系统设计者的重要参考资料,帮助他们理解和应用这款处理器。S3C2440A是一...

    自己编译mini2440开发板bootloader

    mini2440开发板是一款基于Samsung S3C2440处理器的嵌入式开发平台,广泛应用于教学和产品研发。S3C2440是一款高性能、低功耗的ARM9微处理器,支持多种存储器接口和外围设备,使其成为构建嵌入式系统的理想选择。 ...

    三星S3C2440参考设计 (PDF格式)

    三星S3C2440是一款经典的ARM9处理器,广泛应用于嵌入式系统设计中,如消费电子、工业控制和移动设备等领域。本参考资料详细介绍了S3C2440的架构、特性以及如何进行系统级的设计。以下是该处理器及与其相关的嵌入式...

    S3C2440完全开发流程

    S3C2440是一款由Samsung公司推出的基于ARM920T内核的微处理器,常用于嵌入式系统设计。它具备高性能、低功耗的特点,广泛应用于各种嵌入式设备,如移动通信、数字媒体和工业控制等领域。开发S3C2440通常涉及硬件接口...

    基于三星S3C2440+Boot+Loader的研究

    本研究分析的对象是基于三星S3C2440处理器的BootLoader。所使用的BootLoader是U-Boot,这是一种开源的、功能丰富且开发活跃的通用BootLoader。 ##### 1.2 从Nand Flash启动BootLoader BootLoader被放置在开发板的...

    S3C2440 LINUX BootLoder

    S3C2440 Linux BootLoader的设计和实现对于理解整个系统的启动流程至关重要。 在嵌入式系统中,BootLoader通常分为两个阶段:第一阶段和第二阶段。第一阶段BootLoader(如U-Boot的Stage1)通常用汇编语言编写,用于...

    ucos移植到s3c2440

    S3C2440是Samsung公司推出的一款基于ARM920T内核的微处理器,适用于各种嵌入式应用,如手持设备和工业控制系统。将uCOS-II移植到S3C2440上是一项重要的工作,本文将详细介绍这一过程,以便于初学者理解和实践。 ...

Global site tag (gtag.js) - Google Analytics