SAMSUNG S3C2440的简易BootLoader ㈢
2010年06月05日
  [b]SAMSUNG S3C2440的简易BootLoader ㈢[/b]
  [b][/b]
  [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协议下载内核的功能,前文没有对这部分代码作分析,有时间再补上。下面附一张截图:
  
  
  

SAMSUNG S3C2440的简易BootLoader ㈢相关推荐

  1. Samsung原版44B0X的Bootloader分析

    原作者:BCbbs 1.中断向量表 AREA    Init,CODE,READONLY 说明: 1.从代码看Init段就是要写入0x00地址的原始中断向量,因此把这个文件编译生成的44binit.O ...

  2. linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建

    1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 1,环境搭建 我的系统版本 root@ubuntu:~# lsb_release -a No ...

  3. s32k144 isystem linux,S32k144 简易 Bootloader

    TOPS 原创版权,转载请注明出处! 内容目录 一.理论 1. 复位流程 在离开复位状态后,Cortex-M 做的第一件事就是读取下列两个 32 位整数的值: 1.从地址 0x0000,0000 处取 ...

  4. 单片机简易bootloader设计

    1.设计原则: bootloader方便移植,且足够轻量化. 2.方案设计 从内存角度来看,芯片的内部flash空间可以进行如下规划: flag为升级标志位,当升级标志位使能时,程序进入boot,当升 ...

  5. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boo ...

  6. s3c2440存储控制器和地址以及启动的理解

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来. NAND ...

  7. bootloader搞定,1.67秒!

    简易bootloader,直接引导linux,其他什么都不做~!

  8. 移植U-Boot.1.3.1到S3C2440和S3C2410

    原文链接:[url]http://blog.chinaunix.net/u1/34474/showart.php?id=487416[/url] 首先,U-Boot1.3.1还没有支持s3c2440, ...

  9. uboot在s3c2440上的移植(1)

    一.移植环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-b ...

最新文章

  1. java基础---System类
  2. quarkus_Quarkus入门
  3. 1至9填入九个方框内_防水涂料和施工堵漏的“五大技巧”和“九个细节”
  4. linux扩展磁盘空间命令_在Linux上监视磁盘空间– SQL Server DBA的有用命令
  5. oracle怎么定义参数函数返回值,Oracle自定义函数记录
  6. 软件测试的艺术读书笔记
  7. c4d语言包英文,Win版本MAXON Cinema 4D R21.027 C4D中文与英文版下载安装
  8. 递推DP UVA 473 Raucous Rockers
  9. Java 使用OpenCV进行颜色识别
  10. 单片机蓝牙烧录_实现蓝牙HC-05、06与单片机的连接及与手机通信
  11. 苹果和虫子c语言编程题,虫子吃苹果:每天10分钟,锻炼少儿编程计算思维
  12. JSP中用List list = new ArrayList();报错, List cannot be resolved to a type
  13. 【AE-MG动画全套学习教程】After Effects CC MG动画高效学习视频全套
  14. 【Rust日报】 2019-03-04
  15. 东方博宜OJ 1043 - 【入门】行李托运价格
  16. 企业微信开发:获取 access_token(二)
  17. Algorithm——常用拉式变换表
  18. 原生JS八(Math对象,随机色)
  19. 小米米兔机器人的发展史_小米米兔机器人体验:童年的记忆汹涌而来
  20. 更深入理解 Python 中的迭代

热门文章

  1. 华为Ascend昇腾计算产业介绍
  2. CC2640R2F BLE5.0 蓝牙协议栈GATTServApp模块
  3. 通过USGS批量下载Sentinel2数据
  4. MATLAB数字图像处理系统——边缘检测
  5. 对未来的工作态度期许
  6. Bug: Safari浏览器input框placeholder和内容都不显示
  7. rainbow与freda染旗
  8. 如何添加Burp Suite添加https证书
  9. win7安全模式计算机管理在哪里,Win7怎么进入安全模式 3种方法轻松进入Win7安全模式...
  10. 1024是什么节日 (中国程序员节)