iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >S3c2410/2440的Eboot流程
  • 888
分享到

S3c2410/2440的Eboot流程

流程Eboot 2023-01-31 03:01:52 888人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

对于嵌入式系统来说,一般都需要一个bootloader来下载和引导操作系统,常用的bootloader有eboot,uboot以及vivi等,对于windows ce来说最理想的bootloader当然是eboot(我也做了利用ub

对于嵌入式系统来说,一般都需要一个bootloader来下载和引导操作系统,常用的bootloader有eboot,uboot以及vivi等,对于windows ce来说最理想的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()
{
    // 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 p_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那样强大。^_^!

--结束END--

本文标题: S3c2410/2440的Eboot流程

本文链接: https://www.lsjlt.com/news/187634.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • S3c2410/2440的Eboot流程
    对于嵌入式系统来说,一般都需要一个bootloader来下载和引导操作系统,常用的bootloader有eboot,uboot以及vivi等,对于windows ce来说最理想的bootloader当然是eboot(我也做了利用ub...
    99+
    2023-01-31
    流程 Eboot
  • Vue3中的执行流程思路分析-流程图
    目录一. 前言二. Vue3 思路分析1. createRender(options)2. createApp3. app.mount(‘#app’)4. r...
    99+
    2022-12-03
    Vue3执行流程 Vue3流程图 Vue3执行流程思路
  • python程序的开发流程
    python 程序开发流程包括以下步骤:需求分析:明确业务需求和项目目标。设计:确定架构和数据结构,绘制流程图或使用设计模式。编写代码:使用 python 编程,遵循编码规范和文档注释。...
    99+
    2024-04-20
    python 重构代码 python程序
  • SpringBoot 的启动流程
    SpringBoot 的启动流程 一、 生成SpringApplication对象 1. webApplicationType = 推测web应用的类型(NODE(普通项目)、SERVLET(Serv...
    99+
    2023-09-28
    spring boot spring java
  • springboot+camunda实现工作流的流程分析
    1.在camunda modeler工具里面写流程,任务执行指明Java类 2.保存文件放在resources目录下,并建立一个processes.xml的空文件 3.依赖配置 ...
    99+
    2024-04-02
  • Spring Boot的启动流程
    文章目录 Spring BootSpring Boot概念Spring Boot的启动流程1. 构造SpringApplection的实例2. 调用实例的run方法 Spring Boot启动流程总结: Spring ...
    99+
    2023-08-16
    spring boot spring java
  • 黑客攻击的流程
    常规攻击流程: 明确目标→信息收集→漏洞探测→漏洞验证→信息分析→获取所需 1、明确目标: 确认范围:测试目标的范围,IP,域名,内外网。确认规则:能渗透到什么程度,时间,能否提权等。确认需求:WEB应用的漏洞(新上线程序)?业务逻辑漏洞(...
    99+
    2023-10-06
    网络 安全 web安全 网络安全 服务器
  • DataWorks2.0的“业务流程”与1.0的“工作流”的对比
    DatwWorks终于升级2.0了,心情万分激动之余,又有一丝担忧。因为,没法再创建新的旧版工作流了。。。新版抛弃了“工作流”这个概念,引入了“业务流程”和“解决方案”两个新的概念。于是,作为团队Leader,我花了很大的精力去钻研这两个概...
    99+
    2023-06-03
  • 财务系统的流程
    简介 财务系统是指企业或组织用于管理财务信息和流程的软件系统。它涵盖了会计、财务报告、预算编制、费用管理和现金流量等方面。在现代企业中,财务系统扮演着至关重要的角色,能够帮助企业实现财务目标、提高效率和减少风险。流程一:会计会计是财务系统的...
    99+
    2024-01-15
    流程 财务 系统
  • Shuffle流程是怎样的
    本篇内容介绍了“Shuffle流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在MapReduce框架中,shuffle是连接Ma...
    99+
    2023-06-04
  • windows8系统重装的流程教程
    实际上关键或是取决于如今重装win8系统的客户较为少,在网上如今所具有的如何重装win8系统教程都写的很模棱两可,一般的客户还不知道怎么操作,下边大家一起来看看windows8系统重装的教程.windows8系统重装的教程打开桌面后,我们在...
    99+
    2023-07-18
  • 微信小程序的登录流程
    一、背景 传统的web开发实现登陆功能,一般的做法是输入账号密码、或者输入手机号及短信验证码进行登录。 服务端校验用户信息通过之后,下发一个代表登录态的 token 给客户端,以便进行后续的交互,每当token过期,用户都需要重新登录。 而...
    99+
    2023-09-10
    微信小程序 小程序 微信
  • Python控制流程:编程的基石
    条件语句 if-else 语句:用于根据条件执行不同的代码块。如果条件为真,执行 if 块;否则,执行 else 块。 elif 语句:用于为 if 语句添加额外的条件分支。 nested if 语句:用于在 if 块内创建其他 if ...
    99+
    2024-03-13
    控制流程
  • 详解Redux的工作流程
    目录Redux理解redux是什么什么情况下需要使用redux?redux工作流程图actionreducerstore求和案例——纯react版求和案例&m...
    99+
    2024-04-02
  • 完整的python项目流程
        最近看了python项目的打包,有点小感触。感觉自己还不是一个真正的pythoner。没有在开源项目网站留下什么,而又到处宣扬python的简洁与强大,有点小讽刺。于是乎,我想理清自己的思路,不怕迷茫,懂得坚持自己的目标才好!   ...
    99+
    2023-01-31
    流程 完整 项目
  • Linux的启动流程介绍
    这篇文章主要讲解了“Linux的启动流程介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux的启动流程介绍”吧!第一步、加载内核操作系统接管硬件以后,首先读入 /boot 目录下的内...
    99+
    2023-06-06
  • Shell的流程控制介绍
    这篇文章将为大家详细讲解有关Shell的流程控制介绍,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。和Java、PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法):&l...
    99+
    2023-06-09
  • MySQL5.5源码安装的流程
    这篇文章主要讲解了“MySQL5.5源码安装的流程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL5.5源码安装的流程”吧! ...
    99+
    2024-04-02
  • 浅析 GitHub 的使用流程
    GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。GitHub 提供了完整的大型企业级应用程序所需的工具,完整协议支持,免费与收费的账户,以及全球最大的开源社区,而这...
    99+
    2023-10-22
  • 基于springboot的flowable工作流实战流程分析
    目录背景一、flowable-ui部署运行二、绘制流程图三、后台项目搭建四、数据库五、流程引擎API与服务五、参考资料背景 使用flowable自带的flowable-ui制作流程...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作