专栏首页python3S3c2410/2440的Eboot流程

S3c2410/2440的Eboot流程

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

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()

{

    // Assigncallback functions to be usec by blcommon.

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

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

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

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

    returnTRUE;

}

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

#define    UART0BaudRate     115200

void OEMInitDebugSerial(void)

{

    volatileUART1reg  *s2410UART0    =(UART0reg *)UART0_BASE;

    volatileIOPreg    *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 ofcontents),一般TOC都会烧到nand的block1里面,如果读TOC失败,就会用默认的参数重写TOC,读TOC这段代码比较简单,在fmd.cpp里面,大家可以自己研究。然后就是进入倒计时,如果在你设置的延迟时间内按键盘的话就会进入BootMonitor这个函数,这个函数主要是输出eboot的选择菜单,根据你的选择进行操作,如果在延迟时间结束你没有按键盘的话就会根据你设置的是Downloadnew(下载新的映象)还是Launchexisting(加载在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 initializeEthernet controller.\r\n");

       return(FALSE);

    }

    // Makesure MAC address has been programmed.

      //

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

      {

       EdbgOutputDebugString("ERROR: InitEthDevice: Invalid MAC addressread 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(我在以前的文章里面已经介绍过实现的方法了)我们就需要屏蔽这段代码(在#ifndefSIMULATOR #endif之间)。

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MVC3+Entity Framewor

    因为本程序只是教程例子,所以没有复杂的表结构,只是为了方便大家学习创建。数据库为Vote,其中只有一张表Users,表中字段分别为id(主键自动增涨列)、Usr...

    用户2398817
  • python多线程paramiko

    初学python,网上找发些关于paramiko实现python多线程的功能,发现相互抄袭占多.别人的总归是别人的,也同时为了练习技术,就自己写了一个基于par...

    用户2398817
  • Python 3 之 装饰器详解

    ------------ 装饰器 -----------------------------------------------------

    用户2398817
  • python包urllib名称

    经查询,在python3.5版本中是使用urllib.request,而在python2.7中则是urllib2

    努力在北京混出人样
  • 抓取全站图片的几个思路

    好久没更新文章,最近确实忙,今天抽点时间写写我最近忙着优化网站图片的事。由于本站使用的图床SM.MS,近期不少使用电信和联通运营商的朋友说图片加载慢,网站加载完...

    神无月
  • Nature(2019)-地球系统科学领域的深度学习及其理解

    Machine learning approaches are increasingly used to extract patterns and insigh...

    zhangqibot
  • 靠默契保证的私有制:Python 中的私有

    人类文明开化以来,私有制似乎是人类历史的主流在西方国家,“私有财产神圣不可侵犯” 是很多资本主义国家的立国原则之一。在我国,“私有财产不可侵犯” 也...

    AlgorithmDog
  • 循序渐进理解Paxos

    单独去理解Paxos有些困难,本人刚开始的时候直接去看Paxos觉得很复杂。 然后一边阅读《从Paxos到Zookeeper分布式一致性原理与实践》一边去理解P...

    zunhuahu
  • 机器学习入门数据集--5.皮马人糖尿病预测数据集

    在本项目的前期训练中,数据最后的结果都不理想。因此在代码中引入了多种数据模型:逻辑回归、高斯朴素贝叶斯、K近邻分类、决策树分类、支持向量机分类、xgboost。...

    birdskyws
  • (翻译)LearnVSXNow!-#3 创建一个带有简单命令的Package

    为了演示如何给我们的package增加功能,本篇将创建一个带有简单菜单(命令)的VS Package。和上一篇一样,我们新建一个Visual Studi...

    明年我18

扫码关注云+社区

领取腾讯云代金券