Eboot之函数BootloaderMain函数分析

WinCE6.0的EBOOT概要 在开发的过程中使用EBOOT,可以提高开发效率。前一篇介绍NBOOT加载EBOOT的方法时提到,NBOOT必须将EBOOT放在内存中指定的位置,这个位置是由EBOOT的来决定的。本文粗略的介绍了WinCE6、0下EBOOT的内容,但没有涉及具体的代码实现,相关代码可以参考目录C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT。EBOOT在实现必备功能的前提下,我们还可以扩展其功能,譬如说初始化LCD,并显示特定的启动画面,显示加载映像的进度等。 阅读详情

Eboot的整个实现框架是通过实现BootloaderMain这个函数来实现的.现在通过分析源码分析一下BootloaderMain这个函数,就可以知道Eboot的整个框架是如何实现的.

该函数的地址位于:C:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLCOMMON文件夹下面的Blcommon.c文件中,另外在另外一个文件夹也包含一个BootloaderMain函数,其地址位于:C:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON文件夹下面的Blcommon.c文件中.但是通过串口调试输出跟踪,发现Eboot的main函数中调用的是在PLATFORM这个文件夹下面的BootloaderMain函数.

    

if (!KernelRelocate (pTOC))
    {
        // spin forever
        HALT (BLERR_KERNELRELOCATE);
    }

调用KernelRelocate这个函数主要是实现内核中变量的重定位,但为什么要实现变量的重定位呢?原因是:内核的镜像为RAMIMAGE,一般是放在物理RAM 中,但只能读不能写
也就是相当于ROM ,在程序运行的时候,需要对变量实现写的话,就只能把全局变量进行重定位。

 

 

if (!OEMDebugInit ())
    {
        // spin forever
        HALT (BLERR_DBGINIT);
    }

OEMDebugInit这个函数主要是初始化串口,以便在内核启动,下载内核时输出调试信息,该函数是在文件夹
C:\WINCE600\PLATFORM\QT210\SRC\BOOTLOADER_FMD\EBOOT目录下面的Main.c实现的,关于这个函数的具体实现,将会在下一个博文中讨论

 

 

KITLOutputDebugString (NKSignon, CURRENT_VERSION_MAJOR, CURRENT_VERSION_MINOR);
KITLOutputDebugString ("BootloaderMain!The file locate in Public\r\n");

第一个KITLOutputDebugString是输出版本号,其中CURRENT_VERSION_MAJOR,CURRENT_VERSION_MINOR定义为一个常量,其定义如下:
      #define CURRENT_VERSION_MAJOR       1
     #define CURRENT_VERSION_MINOR       4
这二个常量也是定义在当前文件Blcommon.c中

 

 

if (!OEMPlatformInit ())
    {
        // spin forever
        HALT (BLERR_PLATINIT);
    }

 OEMPlatformInit这个函数很重要,主要功能是初始化开发板的CPU的时钟,USB,LCD等,在s5pv210中还在该函数中实现下载BootImage.nb0和把BootImage.nb0
  写入Flash中,实现下载NK.BIN到RAM中,但是并没有实现写NK.BIN到Flash中,在三星公司的Eboot中写NK.bin到Flash是在函数DownloadImage实现的。 该函数的位置: C:\WINCE600\PLATFORM\QT210\SRC\BOOTLOADER_FMD\EBOOT目录下面的Main.c文件中, 这个函数将会在下面的博文中重点分析,这是s5pv210的一个十分重要的函数。

 

 

switch (dwAction = OEMPreDownload ())
    {
    case BL_DOWNLOAD:
        // (5) download image
        if (!DownloadImage (&dwImageStart, &dwImageLength, &dwLaunchAddr))
        {
            // error already reported in DownloadImage
            SPIN_FOREVER;
        }
        bDownloaded = TRUE;

        // Check for pTOC signature ("CECE") here, after image in place
        if (*(LPDWORD) OEMMapMemAddr (dwImageStart, dwImageStart + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE)
        {
            dwpToc = *(LPDWORD) OEMMapMemAddr (dwImageStart, dwImageStart + ROM_SIGNATURE_OFFSET + sizeof(ULONG));
            // need to map the content again since the pointer is going to be in a fixup address
            dwpToc = (DWORD) OEMMapMemAddr (dwImageStart, dwpToc + g_dwROMOffset);

            KITLOutputDebugString ("ROMHDR at Address %Xh\r\n", dwImageStart + ROM_SIGNATURE_OFFSET + sizeof (DWORD)); // right after signature
        }

        // fall through
    case BL_JUMP:
        // Before jumping to the image, optionally check the image signature.
        // NOTE: if we haven't downloaded the image by now, we assume that it'll be loaded from local storage in OEMLaunch (or it
        // already resides in RAM from an earlier download), and in this case, the image start address might be 0.  This means 
        // that the image signature routine will need to find the image in storage or in RAM to validate it.  Since the OEM"s 
        // OEMLaunch function will need to do this anyways, we trust that it's within their abilities to do it here.
        //
        if (g_bBINDownload && g_pOEMCheckSignature)
        {
            if (!g_pOEMCheckSignature(dwImageStart, g_dwROMOffset, dwLaunchAddr, bDownloaded))
                HALT(BLERR_CAT_SIGNATURE);
        }
        // (5) final call to launch the image. never returned
        OEMLaunch (dwImageStart, dwImageLength, dwLaunchAddr, (const ROMHDR *)dwpToc);
        // should never return
        // fall through
    default:
        // ERROR! spin forever
        HALT (BLERR_INVALIDCMD);
    }


 OEMPreDownload这个函数一般功能是提供给用户在下载之前做的一些准备,但是在s5pv210中实现却很简单,主要是根据一些变量来决定 返回值的类型为BL_DOWNLOAD,还是BL_JUMP。 该函数的位置:C:\WINCE600\PLATFORM\QT210\SRC\BOOTLOADER_FMD\EBOOT目录下面的Main.c.该函数将会在下面的博文中分析

 

如果OEMPreDownload返回的值为BL_DOWNLOAD,则要调用函数DownloadImage来对镜像进行下载,但s5pv210中Eboot实现并不是在DownloadImage中下载镜像的,而是在OEMPlatformInit下载镜像到ram缓存区中,但是在DownloadImage中来把镜像写入Flash中的。其中这个函数有三个参数,用来获取操作系统镜像的起始地址,镜像的长度,以及Eboot跳转到操作系统的跳转地址。

bDownloaded 这个变量是在函数中BootloaderMain函数中定义的一个局部变量,在此处将它赋值为TRUE,将会在下面的函数g_pOEMCheckSignature使用,但是我用SouceInsight并没有找到该函数的实现,所以在s5pv210的Eboot中可能还没有用到,等下一次我把整个Eboot,OAL代码整个联系在一起的时候,再看一个这个变量的作用。
该函数的位置:C:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLCOMMON文件夹下面的Blcommon.c文件中, 该函数将在以后的博文中分析。

 在这里需要注意的一点是:在case BL_DOWNLOAD:的后面并没有break语句,如果是BL_DOWNLOAD类型的话,还会接着执行BL_JUMP的代码来实现从Eboot到操作系统内核的跳转。

g_bBINDownload 是个静态全局变量,其初始值为TRUE,定义在当前文件Blcommon.c文件中。static BOOLEAN g_bBINDownload = TRUE;
 当下载Bin 镜像文件时会在函数中DownloadBin 中赋值为TRUE,其中DownloadBin函数是在DownloadImage函数中调用的,以后在分析DownloadImage函数时将会介绍其功能。g_pOEMCheckSignature 并是一个函数指针,但在这个Eboot中并没有实现函数OEMCheckSignature,所以下面这个if 将不会执行。

OEMLaunch是用户需要自己实现的函数,凡是函数带OEM的函数,都是需要由用户实现的。该函数实现的功能是离开Eboot跳转到操作系统中去执行,该函数的四个变量dwImageStart:操作系统镜像的起始地址,dwImageLength:镜像的长度
dwLaunchAddr:Eboot的跳转地址,也就是Wince系统内核开始执行代码的起始地址。
dwpToc:指向ROMHDR的指针,关于这个结构体ROMHDR将会在以后的博文中详细介绍

 

「API取数」FDL获取金蝶云星空的单据数据 本文介绍了如何使用FDL实现金蝶云API取数以及如何有效应对复杂的API数据处理场景。 阅读详情

相关推荐

ANSYS WB 网格划分详解与技巧

本文详细介绍了网格操作中的关键设置与功能选项。主要内容包括:1)网格显示风格与物理偏好设置;2)单元阶次选择对精度的影响;3)单元尺寸控制方法;4)尺寸调整功能,重点讲解了自适应尺寸调整、增长率控制和捕获曲率等选项;5)网格质量评估标准;6)四种主要划分方法(四面体、六面体主导、扫掠、多区域)的特点与适用场景;7)三种尺寸调整方式(直接调整、边缘尺寸调整、影响范围调整)的具体应用。文章强调在实际建模中需要根据模型特点合理选择网格参数,平衡计算精度与效率。

2403_87939837的博客 1698

Bootloader 的主控函数bootloadermain函数分析

startup.s对底层进行初始化后,调用main()此函数一般位于main.c下面   main函数调用BLCOMMON.c下的BootloaderMain()函数,bootloader的主控权丧失。   学习何老师书的内容摘抄如下:   //目录是%/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/ETHDBG/BLCOMM ON下的BLCOMMON.c文件中的内容   void BootloaderMain (void)   {   DWORD dwAction;   DWORD

zmq5411的专栏 2513

Android13 AudioFlinger混音流程全解析:从prepareTracks_l到threadLoop_write的底层实现

本文深入解析Android13 AudioFlinger混音流程,从prepareTracks_l到threadLoop_write的底层实现。详细剖析MixerThread的核心工作循环,包括音轨预处理、混音算法执行及硬件写入机制,帮助开发者优化音频性能并处理多音轨场景。

tea88的博客 1132

WinCE Eboot中的BLCOMMON

作者:ARM-WinCE 在EBOOT中,从Startup.s跳转到C程序入口以后,程序就可以用C语言来编写了,这样感觉就好多了。一般C语言的入口就是一个Main函数,也可能叫其他的名字。在这个Main函数中会掉用BootloaderMain函数,该函数在BLCOMMON模块中被定义的。一般Main函数的写法如下: void (void){    // Common boo

唐勉的ARM/Linux/WinCE专栏 5796

Calibre提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文详细解析了Calibre提参过程中hcell和xcell文件的应用技巧,帮助工程师精准屏蔽模块以优化寄生参数提取。通过对比hcell与xcell的核心差异、图形界面与命令行操作指南,以及常见问题排查方法,提升芯片后端设计效率。附避坑指南,解决EETOP论坛热议的模块丢失问题。

weixin_26795617的博客 440

【光子AI / Photon.AI】manus 通用 Agent 的实现核心技术原理与应用

摘要 Manus是一款由国内团队开发的通用AI Agent,其核心技术原理基于多智能体协作架构、云端全能沙箱、规划-执行-反思循环等系统工程方法。与传统的对话式AI不同,Manus能够在独立的Linux虚拟机环境中自主规划并执行复杂任务,通过编写和运行代码来解决问题,具备强大的纠错能力和工具使用能力。 核心应用场景包括深度行业研究、自动化办公、生活助理、辅助编程和跨平台信息整合等。Manus的工程化落地优势体现在沙箱环境、多智能体调度和容错机制等方面,使其能够完成需要多步骤操作和多种工具调用的复杂任务,将A

AI天才研究院 667

Eboot代码流程

  首先通常都是汇编代码:启动时由系统复位导致PC为0为触发条件:以2440代码为例直接进入fw.s文件。主要执行的操作为设置处理器频率(PLL),设置内存参数,须注意的是在该部分代码虽然在形式上实现了诸多中断向量,但是这些代码根本上不会得到执行。(参考“Eboot 编译编译器决定中断向量及其实现单一性的原因”)而在后面会有一些其他手段用于实现中断向量的功能。由于和hal复用该部分文件,所以调

未必的优快云博客 676

lammps教程:官方自带eam_database程序拟合EAM势方法介绍

使用lammps模拟金属体系,最常用的势函数为eam、meam势。 对于大多数金属或者合金来说,可以从网上下载相对应的eam或meam势力场文件。 而对于一些新的合金材料,可能就找不到相对应的力场文件。 解决的方法有两种,一是采用混合势(pair_style hybrid),第二种方法是自己拟合势函数文件。 混合势的写法在前面文章中已经介绍过,本文介绍一种拟合EAM势的方法。 该方法是运行Xiaowang Zhou编写的一个拟合程序,该程序可自动生成所需要的合金势。 这个程序能够拟合的合金元素有: Cu,

lammps_jiayou的博客 4616

【转载】WinCE Eboot中的BLCOMMON

转载自:http://blog.youkuaiyun.com/nanjianhui/archive/2008/10/20/3111422.aspx 在EBOOT中,从Startup.s跳转到C程序入口以后,程序就可以用C语言来编写了,这样感觉就好多了。一般C语言的入口就是一个Main函数,也可能叫其他的名字。在这个Main函数中会掉用BootloaderMain函数,该函数在BLCOMMON模块中被定义...

weixin_33785108的博客 102

FPGA入门200例(17):如何阅读RTL原理图(Schematic)?将Verilog代码与门级电路对应

本文针对FPGA开发新手常见误区,重点讲解了RTL原理图的重要性和阅读方法。文章指出,仅通过仿真验证代码会导致板级测试异常,而RTL原理图能直观呈现Verilog代码对应的硬件结构(门电路、寄存器、多路选择器等)。通过"识别基础元件→跟踪信号路径→验证逻辑关系"的三步法,新手可以建立代码与硬件的映射思维,排查冗余逻辑、意外锁存器等错误。文章还结合Vivado/Quartus工具操作指南和典型代码案例,帮助读者掌握从代码到硬件实现的转换过程,避免混淆RTL与门级原理图、忽略信号位宽等常见误

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 201

DBC中如何实现报文传输类型属性的配置

AUTOSAR中CAN报文的传输类型主要有三种,周期型,事件型和混合型。周期型:按固定时间间隔自动发送,无需额外的触发条件。事件型:当信号值变化或满足内部条件时立即发送。混合型:默认按周期发送,但事件触发时可提前发送。

sunchengl的博客 304

bootload启动流程(二)----Eboot的主要流程

 当跳转到main()函数之后,开始执行下面的c函数。void main (void){    BootloaderMain ();    SPIN_FOREVER;}我们不难发现,实际上main()函数里面只有一个函数执行。而这个BootloaderMain ()是由微软提供的,一般放在public下面:void BootloaderMain (void){    ROMHDR *pRomHdr = NULL;  // pTOC for NK image. MUST COPY IT OR CLEANBOO

jianwen01的专栏 1716

【深度学习新浪潮】OpenClaw跟机器人行业有哪些很好的研究结合点?

OpenClaw正通过"AI大脑+机器人肢体"的深度融合,重新定义机器人与人类的交互方式和自主操作能力。近期ROSClaw框架发布、人形机器人集成和空间计算试验等进展,标志着OpenClaw已从概念验证阶段进入实际应用落地期,为机器人行业带来了自然语言控制普及化具身智能平民化和跨平台开发标准化三大变革机遇。

专注:太空算力、AI infra、异构调度、大模型成本工程 229

S3C2450 Bootloader调试总结

S3C2450的整个Bootloader包括四个部分: 1):Eboot.Whimory 2):NBL1.IROM_SD 3):NBL1.LSB 4):NBL2 实现功能:生成三个有用的文件:block0img.nb0,Eboot.nb0/Eboot.bin,以及IROM_SD_EBOOT.nb0。其中前两个文件用于烧到NAND的前几个block,用于初始化整个系统的环境,以及引导NK。

smart_qiang的专栏 999

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

EBOOT架构及流程

EBOOT

kathyzju的专栏 1476

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WinCE6.0 EBOOT概要

为一个新的硬件设备定制WinCE6、0操作系统的主要步骤如下: 1、针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须包括BOOTLOADER、OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动。 2、利用创建的BSP,定制一个系统设计(OS Design)。即通过VS2005创建一个Platform

DriverMonkey的专栏 1116

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SMDK2440A 5 0BSP之eboot流程(作者 wogoyixikexie gliet)

                SMDK2440A 5.0BSP之eboot流程(作者:wogoyixikexie@gliet)      这两天为了搞明白bootloader的binfs分区功能,看...

qq_44884287的博客 195
上一篇: 十大注释技巧教你如何书写容易阅读的代码
下一篇: wince6.0启动
马中马
博客等级 码龄18年 112粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值