S3c2410/2440的Eboot流程介绍

发布者:独行侠客最新更新时间:2016-12-05 来源: eefocus关键字:S3c2410  Eboot  流程介绍 手机看文章 扫描二维码
随时随地手机看文章

对于嵌入式系统来说,一般都需要一个bootloader来下载和引导操作系统,常用的bootloader有eboot,uboot以及vivi等,对于windows ce来说最理想的bootloader当然是eboot(我也做了利用uboot下载和引导ce,以后我会介绍)。下面我就把自己开发eboot的过程和大家分享。eboot的流程可以如下图所示:

S3c2410/2440的Eboot流程介绍  - liuxing521lan@126 - 嵌入式入门

1)eboot和nk公用一段起始代码fw.s,所以我们会在eboot文件夹下的arm子文件夹找到fw.s,里面就一句话:    INCLUDE ..\\..\\kernel\\hal\\arm\\fw.s,对于这段起始代码我就不详细分析,无非是建立好中断向量表,设置好系统的工作频率,设置MMU等,然后就跳转到eboot的main函数

2)eboot的main函数在eboot文件夹的main.c里面,代码如下:

void main (void)

{

BootloaderMain ();

SPIN_FOREVER;

}

是不是觉得很简单,好像什么也没有做,但是注意这个BootloaderMain函数,这个就是eboot真正的main函数,这个函数在

$(_WINCEROOT)\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON\blcommon.c里面,这个函数是微软的ce对eboot的通用函数,它会调用在eboot文件夹里面由OEM商或者自己写的一些函数。那既然我们知道了真正的main函数在哪里,那么下面我们跟着BootloaderMain走吧。

3)在BootloaderMain 函数里面首先执行KernelRelocate,这是把一些全局变量存放到ram里面去,这个函数不是很重要。

4)下面就是执行OEMDebugInit,看到OEM三个字母了没有,这就说明这个函数是OEM商,或者我们自己需要实现的,在eboot下的main函数里面可以找到这个函数,这主要是提供给blcommon一些回调函数如下所示:

BOOL OEMDebugInit()

{

    // Assign callback functions to be usec by blcommon.

    g_pOEMReportError    = OEMReportError;//错误报告函数

    g_pOEMVerifyMemory   = OEMVerifyMemory;// 下载映象时检测内存是否正常

    g_pOEMMultiBINNotify = OEMMultiBINNotify;   //通知需要下载的所有bin文件

    OEMInitDebugSerial();//初始化串口调试输出

    return TRUE;

}

这些被调用的函数也是OEM商或者我们自己编写的。前面三个函数都可以在main.c里面找到,代码比较罗唆,而且基本上和硬件没有太大关系,我们看看最后一个初始化串口调试输出的函数,这个文件在D:\WINCE420\PLATFORM\smdk2410eboot+rtc\KERNEL\HAL\debug.c里面,我这里是设置串口0为调试输出口,三星自带的用的是串口1,并且把波特率设置为115200,大家如果需要用串口0作为调试输出口可以参考我的修改:

#define     UART0BaudRate      115200

void OEMInitDebugSerial(void)

{

    volatile UART1reg   *s2410UART0    = (UART0reg *)UART0_BASE;

    volatile IOPreg     *s2410IOP   = (IOPreg *)IOP_BASE;   

       s2410IOP->rGPHCON &= ~((3 << 8) | (3 << 10));   

       s2410IOP->rGPHCON |=  ((2 << 4) | (2 << 6));       //

       s2410IOP->rGPHUP  |=   (1 << 2) | (1 << 3);              

       s2410UART0->rUFCON  = 0x0;        // Disable the FIFO

       s2410UART0->rUMCON  = 0x0;              // Disable AFC.

       s2410UART0->rULCON  = 0x3;        // Normal mode, N81.

       s2410UART0->rUCON   = 0x245;    

       s2410UART0->rUBRDIV = ( (int)(S2410PCLK/16.0/UART0BaudRate + 0.5) -1 );  

}

调用完这个调试输出初始化函数以后,eboot的调试信息就会从串口0出来(当然nk的调试信息也会从这个串口出来了,因为这一部分是和nk复用的^_^)

5)BootloaderMain调用完OEMDebugInit后就调用下一个函数了-OEMPlatformInit,这个函数也在eboot的main.c里面可以找到,主要是初始化你的硬件平台,包括设置RTC时钟,初始化一下你的NANDflash,然后就是读TOC (table of contents),一般TOC都会烧到nand的block1里面,如果读TOC失败,就会用默认的参数重写TOC,读TOC这段代码比较简单,在fmd.cpp里面,大家可以自己研究。然后就是进入倒计时,如果在你设置的延迟时间内按键盘的话就会进入BootMonitor这个函数,这个函数主要是输出eboot的选择菜单,根据你的选择进行操作,如果在延迟时间结束你没有按键盘的话就会根据你设置的是Download new(下载新的映象)还是Launch existing(加载在nand中的映象)来进行下一步操作,我们先看看BootMonitor这个函数,这个函数虽然代码很多,但是其实非常简单,就是根据你的输入来设置改变一些全局变量,eboot在后面会根据这些变量来进行相应的操作。

如果选择了下载映象,在OEMPlatformInit函数里会调用InitEthDevice初始化网卡,然后返回true,InitEthDevice函数在ether.c里面,具体需要根据你使用的网卡,把一些接口提供给eboot,下面是我的InitEthDevice函数,我使用的是DM9000网卡:

BOOL InitEthDevice(PBOOT_CFG  pBootCfg)

{

       USHORT wMAC[3];

       PBYTE  pBaseIOAddress = NULL;

       DWORD  dwMultiplier = 0;

        

       // Boot CS8900.

       //

       if (!pBaseIOAddress)

       {

              // Use the MAC address programmed into flash by the user.

              //

              memcpy(wMAC, pBootCfg->EdbgAddr.wMAC, 6);

                                    

           pfnEDbgInit      = DM9000DBG_Init;

           pfnEDbgGetFrame  = DM9000DBG_GetFrame;

           pfnEDbgSendFrame = DM9000DBG_SendFrame;

 

              pBaseIOAddress  = (PBYTE)CS8900DBG_IOBASE;

              dwMultiplier    = CS8900DBG_MEMBASE;

 

              memcpy(pDriverGlobals->eth.TargetAddr.wMAC, pBootCfg->EdbgAddr.wMAC, 6);

              pDriverGlobals->misc.EbootDevice = (UCHAR)DOWNLOAD_DEVICE_CS8900;

       }

    // Initialize the built-in Ethenet controller.

    //

    if (!pfnEDbgInit((PBYTE)pBaseIOAddress, dwMultiplier, wMAC))

    {

        EdbgOutputDebugString("ERROR: InitEthDevice: Failed to initialize Ethernet controller.\r\n");

        return(FALSE);

    }

 

    // Make sure MAC address has been programmed.

       //

    if (!wMAC[0] && !wMAC[1] && !wMAC[2])

       {

        EdbgOutputDebugString("ERROR: InitEthDevice: Invalid MAC address read from NIC.\r\n");

        return(FALSE);    }

 

    memcpy(&pDriverGlobals->eth.TargetAddr.wMAC, &wMAC, (3 * sizeof(USHORT)));

       return(TRUE);

}

DM9000DBG_Init; DM9000DBG_GetFrame; DM9000DBG_SendFrame;这几个函数都需要在你的网卡驱动里面实现,这里只需要把这几个函数提供给eboot就行了。

6)BootloaderMain下面就调用OEMPreDownload进行一些下载前的准备工作,之后就会调用DownloadImage下载内核,下载完了后就调用OEMLaunch启动RAM里面的内核,注意OEMLaunch里面会需要和PB建立连接,如果我们要绕过PB下载nk(我在以前的文章里面已经介绍过实现的方法了)我们就需要屏蔽这段代码(在#ifndef SIMULATOR #endif之间)。

7)如果我们选择了Launch existing image,在eboot的OEMPlatformInit里就会利用ReadRamImageFromBootMedia或者ReadKernelRegionFromBootMedia函数把nk从nand中读到ram里面,然后再启动内核。第一个函数是直接把内核从nand中拷贝到RAM里面,第二个函数必须要选择了支持binfs文件格式,它会把nand进行格式化成binfs,这些对nand操作的函数都再fmd.cpp里面,具体实现可以参考里面的代码。

8)以上介绍的都是eboot中比较重要的部分,其实在eboot的选择菜单里你还可以选择格式化nand,设置ip,mac地址等,总的来说,eboot的功能还是很强大的,但是和uboot比起来还是差了很多,因为它在人机交互上面做的不好,不如uboot那样强大。


关键字:S3c2410  Eboot  流程介绍 引用地址:S3c2410/2440的Eboot流程介绍

上一篇:解析mini2440的LED驱动
下一篇:在s3c2410板上移植2.6 kernel

推荐阅读最新更新时间:2024-03-16 15:23

s3c2440裸机开发环境的搭建
用于arm裸机程序开发的IDE基本有MDK,IAR,还有ADS,也可以选择在linux下安装交叉编译链来进行开发。笔者选择的是MDK作为我进行开发的IDE。下面介绍笔者搭建开发环境的过程。 笔者主要参考了两篇博文来进行开发环境的搭建的,分别是: http://blog.csdn.net/mybelief321/article/details/8910528 http://blog.csdn.net/shengnan_wu/article/details/8116815 笔者搭建后的相关环境如下: 开发板:mini2440 操作系统:Windows 8.1 64位 开发环境:MDK 4.6版本 仿真器
[单片机]
s3c<font color='red'>2440</font>裸机开发环境的搭建
JZ2440点亮LED电路图设计案例
在JZ2440中,点亮LED就是给LED的控制位设置为输出,数据位设置为低电平,而通过按键点亮LED,就需要将按键对应的控制位设置为输出。 下面是JZ2440的3个LED电路图: 下面是JZ2440的3个按键的电路图 通过查找nLED_1,nLED_2,nLED_4对应的引脚,发现它们分别对应GPF4,GPF5,GPF6,如图: 通过查找EINT0,EINT2,EINT11对应的引脚,发现它们分别对应GPF0,GPF2,GPG3,如图: 由此,我们再去看2440的Datasheet,查看它们的控制位和数据位的信息,首先是GPF4,GPF5,GPF6的控制位信息,如图: 我们发现,当GPFCON 寄存器 的GP
[单片机]
JZ<font color='red'>2440</font>点亮LED电路图设计案例
s3c2440的FCLK、HCLK、PCLK
1、系统工作时钟频率 在对系统时钟进行提速之前,让我们先来了解下S3C2440上的工作时钟频率,FCLK,HCLK,PCLK,其中FCLK主要为ARM920T内核提供工作频率,如图2-44所示: 图2-44 ARM920T内核结构 HCLK主要为S3C2440 AHB总线(Advanced High performance Bus)上挂接硬件提供工作频率,AHB总线主要挂接有内存,NAND,LCD控制器等硬件,如图2-45所示: 图2-45 S3C2440 AHB总线上挂接硬件 PCLK主要为APB总线提供工作频率,由图2-46所示,APB总线主要挂接UART串口,Watchdog等硬件控制器。
[单片机]
s3c<font color='red'>2440</font>的FCLK、HCLK、PCLK
s3c2410/s3c2440串口波特率的计算
要正确计算串口波特率,首先要搞清楚芯片的时钟工作原理,这部分在s3c2410/s3c2440datasheet上写的比较详细,但对新手来说结合thisway同志“s3c2410完全开发流程”中的TIMER和CLOCK两个实验,边做实验边看资料,更容易理解。 我这里只根据我的失败经验谈一下设置波特率寄存器UBRDIVn的值的计算要注意的一个问题。 datasheet上UBRDIVn寄存器部分写着: UART BAUD RATE DIVISOR REGISTER There are three UART baud rate divisor registers including UBRDIV0, UBRDIV1 and U
[单片机]
TQ2440 学习笔记—— 22、系统时钟和定时器
系统时钟和定时器 启动MPLL 需要设置的寄存器: LOCKTIME (LOCK TIME COUNT)、MPLLCON(Main PLL Control)、CLKDIVN(clock divider control) 若Fout = 200MHz则, Fout = 2 *m * Fin / (p * 2 ^ s) = 2 * (92 + 8) * 12MHz / (3 * 2 ^ 2) = 200MHz m = 100, MDIV = 92 p = 3, PDIV = 2 s = 2, SDIV = 2 #define S3C2440_MPLL_200MHZ ((0x5c 12) | (0
[单片机]
TQ<font color='red'>2440</font> 学习笔记—— 22、系统时钟和定时器
JZ2440--linux下给u-boot打补丁并编译
解压缩 book@book-desktop:~/zhangbing$ tar xjf u-boot-1.1.6.tar.bz2 2.打补丁 进入u-boot-1.1.6并且打补丁 book@book-desktop:~/zhangbing$ cd u-boot-1.1.6/ book@book-desktop:~/zhangbing/u-boot-1.1.6$ patch -p1 ../u-boot-1.1.6_jz2440.patch 3.配置 book@book-desktop:~/zhangbing/u-boot-1.1.6$ make 100ask24x0_config 4.编译 book@boo
[单片机]
S3C2440的RAM和启动过程!
2440自带的RAM是:16K Instruction cache + 16K data cache + 4K Boot Internal SRAM。但是我们能用到的只有4K Boot Internal SRAM;2440不自带ROM。 2440的启动方式有两种,norflash和nandflash,怎么选择? OM = 01,10为norflash启动,分别对应16bit和32bit,OM = 00为nandflash启动。 两种启动方式:先贴张图。 可以观察到,s3c2440总共有8个内存banks,6个内存bank可以当作ROM或者SRAM来使用,留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM
[单片机]
S3C<font color='red'>2440</font>的RAM和启动过程!
采用S3C2410和Linux系统的指纹识别管理系统
作者Email: newtonian@263.net 摘要:随着ARM系列处理器性能的不断提高,过去一些专属于DSP领域的运算密集型的应用,例如指纹识别等,也能够在ARM处理器上得以很好的实现。并且由于MCU的强大控制功能,以及操作系统的巨大灵活性,使得这种系统有DSP平台不可比拟的优势。本文着重介绍了基于S3C2410和Linux操作系统的指纹识别管理系统的实现方法,以及这种实现方法与传统DSP系统的异同。 指纹识别技术在金融、交通、安全等领域以及日常工作和生活中被越来越广泛地应用。指纹识别的算法中通常有大量的矩阵运算,域变换,三角函数运算等等,属于典型的运算密集型的应用,因此通常采用DSP来实现嵌入式应用。不过近期情
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved