历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2021年08月26日 | uboot 替代 eboot 烧写、启动 wince

2021-08-26 来源:eefocus

一、wince 启动过程分析

我用的是utu2440的开发板,板子自带的启动文件包括NBOOT1、NBOOT2、EBOOT、wince内核,各个文件作用是:

NBOOT1:S3C2440对于NAND FLash,最大加载4K的代码运行,可以直接运行这个程序,NBOOT1启动后会从FLASH中加载NBOOT2


NBOOT2:主要实现从FLASH中读取wince内核、加载eboot、显示启动画面


EBOOT:实现对FLASH进行分区、格式化和烧写WINCE内核镜像文件,这里要注意的是EBOOT在烧写 wince内核镜像的过程中会把NK.bin解压为NB.nb0再写入到flash中。


二、分析UBOOT启动wince的可能性

对于NBOOT1、NBOOT2的功能完全可以用UBOOT代替,本身UBOOT已经实现NAND falsh 启动,再就是wince内核文件 NK.nb0 可以直接加载到内存的 0x30200000,然后使用 uboot的 go 指令直接运行wince内核文件。

比较难办的就是eboot功能的uboot实现,eboot的分区功能在flash中创建了一个binfs的分区用于存放wince内核镜像文件,在 wince中可以直接支持binfs分区,可以看到镜像文件。如果要在uboot中实现这个功能,则必须为uboot添加对flash分区的功能,为了测 试实现的可能性花了两天做了不少实现,发现要想做好这个功能实在是太花时间、精力了,只好作罢(如果哪位兄弟能提供帮助就太好了)。


在去掉binfs支持后,uboot可以实现将NK.nb0烧写到flash中,然后启动时读取到0x30200000位置,最后用go命令加载启动 wince,这么来看应该是很简单的事了(后来证明此时的想法太。。。。。。)


三、测试可能性

使用uboot将nk.nb0加载到0x3020000中,然后go 0x30200000,等了一会果真看到了wince的界面,这一步成功了,下一步就可以直接烧写了。但是很快发现,使用这种方法启动一次wince后就 无法再启动uboot,通过读取flash的内容发现,wince把uboot的flash块给格式化了。是什么原因呢?


原来是因为这个wince内核有自动分区格式化功能,上面已经说了uboot中不实现分区格式化的功能,所以在wince中就必须添加这个功能。但是这样 一来wince就会格式化uboot,通过阅读eboot发现,eboot在格式化的时候会把eboot区标记为坏块,这样wince就不会进行格式化 了,看来必须首先解决这个问题。


四、FLASH 管理区域划分

我的FLASH大小是64M,wince 内核文件加上uboot不超过32M,这样就定义FLASH的前32M由uboot进行管理,这32M对wince来说是不存在的,后32M归于 wince进行存储,在wince中进行管理。


如果要阻止wicne格式化前32M,可以再uboot中对前32M全部标记为坏块,但是这样一来uboot本身对flash所有操作也会首先做坏块检 测。如果这么做的话,每次uboot对flash读写时取消坏块标记,操作完成后在标记为坏块。思路应该是可行的,但是感觉这么做太麻烦了。当然条条大路 通罗马,我们可以逆向思维一下,为何不能修改wince内核来屏蔽前32M flash空间呢?


通过阅读wince的bsp,发现有个很重要的宏定义


loader.h中

 

// NAND Boot (loads into SteppingStone) @ Block 0

 

#define NBOOT_BLOCK 0

#define NBOOT_BLOCK_SIZE 1

#define NBOOT_SECTOR BLOCK_TO_SECTOR(NBOOT_BLOCK)

 

// TOC @ Block 1

 

#define TOC_BLOCK 1

#define TOC_BLOCK_SIZE 1

#define TOC_SECTOR BLOCK_TO_SECTOR(TOC_BLOCK)

 

// Eboot @ Block 2

 

#define EBOOT_BLOCK 2

#define EBOOT_SECTOR_SIZE FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)

#define EBOOT_BLOCK_SIZE SECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)

#define EBOOT_SECTOR BLOCK_TO_SECTOR(EBOOT_BLOCK)

 

//#define RESERVED_BOOT_BLOCKS (NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)/*这个参数是定义预览 block 的数量,默认是NBOOT + TOC + EBOOT,我为了屏蔽前面32M空间,需要修改此定义*/

 

#define RESERVED_BOOT_BLOCKS SECTOR_TO_BLOCK(FILE_TO_SECTOR_SIZE(0x2000000))

 

// Images start after OEM Reserved Blocks

 

#define IMAGE_START_BLOCK RESERVED_BOOT_BLOCKS

#define IMAGE_START_SECTOR BLOCK_TO_SECTOR(IMAGE_START_BLOCK)


修改RESERVED_BOOT_BLOCKS 后重新编译wince(由于我用的是win7,不支持wince5的编译,只好用虚拟机来编译,速度真是 太折磨人了),希望能够一次成功,重烧uboot,下载wince内核文件NK.nb0,启动wince,失望,还是失望,uboot依旧被擦除了。


为了搞清楚问题的原因,打开wince的调试信息, 特别是NAND FLash驱动的所有调试信息。重新编译、下载运行。发现wince开始擦除的位置是正确的,在擦除未完时此时我复位了开发板,uboot可以正常启动。 重来,等擦除操作完成了以后我再复位,发现uboot不能启动了,这可真是奇怪了,开始擦除的位置是正确的,每次block会递增,怎么会擦除前面的 block 呢?再来一遍,发现问题了,wince的整个擦除起始位置是正确的,但是结束 block 是错误的,我的FLASH整个 block 是4096个,wince从正确的起始位置开始,擦除了 4096 个块,估计就是这个原因导致把 uboot 给擦除了。


阅读了一下wince的fmd驱动,这里初始化flash,发现有一句很不可理解


// pFlashInfo->dwNumBlocks            = NUM_BLOCKS ;/*这是原来的定义,修改为下面的值*/

 

pFlashInfo->dwNumBlocks            = NUM_BLOCKS - IMAGE_START_BLOCK 


按照道理来讲,初始化flash block数量时至少应该屏蔽nbot eboot两部分,但是这个bsp中未屏蔽,在网上查询了一下,的确有的bsp是定义为

NUM_BLOCKS - IMAGE_START_BLOCK,我觉得这样定义更合理。也许是bsp从三星出来到我手上中间经过不少人修改,留下了这个bug吧。


重新编译,加载,一切正常,wince可正常启动。


最后把wince内核文件烧写到flash中,uboot启动时自动加载,一切正常。


经过这样修改以后,wince启动时如果没有检测到有效的mbr,则会自动分区格式化,第二次再启动时就不会再格式化了,剩余的32M空间可以存储用户文 件。在wince的存储管理中可以看到flash大小为32M,的确已经成功屏蔽了前面的32M空间。


至此,该工作告一段落,uboot可以正常烧写、加载wince了。

推荐阅读

史海拾趣

Deutron Electronics Corp公司的发展小趣事

在技术优势的基础上,Deutron Electronics Corp开始了积极的市场拓展和品牌建设工作。公司参加了多个国际电子展会,展示了其创新产品和技术实力,成功吸引了众多潜在客户的关注。同时,公司还加大了对品牌宣传的投入,通过广告、公关等手段提升了品牌知名度和美誉度。这些努力使得Deutron Electronics Corp的产品逐渐在市场上占据了一席之地。

Agere System(LSI Logic)公司的发展小趣事

随着环保意识的日益提高,Deutron Electronics Corp也积极响应环保号召,致力于实现绿色生产和可持续发展。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还加大了对节能减排的投入,提高了资源利用效率。这些努力使得Deutron Electronics Corp在行业内树立了良好的环保形象,也为公司的长期发展奠定了坚实基础。

EiKO Global LLC公司的发展小趣事

EiKO Global LLC,简称EiKO,成立于XXXX年,由一群热衷于照明科技的先驱者共同创立。公司初期专注于照明产品的研发与生产,致力于为全球用户提供高质量的照明解决方案。EiKO凭借对市场的敏锐洞察力和技术创新,迅速在北美市场崭露头角。

在创立初期,EiKO便确立了以“质量第一、客户至上”为经营理念的方针。通过引进先进的生产设备和技术,严格把控产品质量,EiKO的照明产品逐渐赢得了消费者的信赖。同时,EiKO还积极拓展市场,与多家知名企业和零售商建立了合作关系,产品销售网络遍布全球。

C.K TOOLS公司的发展小趣事

进入21世纪,C.K TOOLS不满足于现有的技术成果,开始与冶金和设计工程师合作,探索新材料在工具制造中的应用。他们发现了一种新型合金材料,具有出色的硬度和耐磨性,非常适合用于制造电子制造中使用的切割和剥线工具。经过多次试验和改进,C.K TOOLS成功推出了这一系列新型工具,并在电子制造领域取得了显著的市场份额。

振宝佳(DMBJ)公司的发展小趣事

随着电子产业的不断发展,SMT贴片技术逐渐成为电子信息产业的支柱技术之一。振宝佳公司紧跟时代步伐,在网络、通信、军事、工业控制以及汽车电子、家电等所有电子领域里全部采用了SMT贴片技术。这一技术的应用不仅提高了产品的集成度和可靠性,也为客户提供了更加优质的产品和服务。

Andigilog公司的发展小趣事

振宝佳(DMBJ)公司自成立之初,就专注于贴片铝电解电容的研发与生产。在1998年之前,公司一直在台湾深耕细作,积累了丰富的技术实力和市场资源。进入21世纪,随着电子产业的快速发展,振宝佳意识到技术突破的重要性。于是,公司投入大量资源,研发出多项专利技术,这些技术不仅提升了产品的性能,也增强了公司的市场竞争力。

问答坊 | AI 解惑

半导体型号命名方法

、 中国半导体器件型号命名方法     半导体器件型号由五部分(场效应器件、半导体特殊器件、复合管、PIN型管、激光器件的型号命名只有第三、四、五部分)组 成。五个部分意义如下:     第一部分:用 ...…

查看全部问答>

我是新注册的。先来报个到。

我是新注册的。先来报个到。…

查看全部问答>

RS232串口(COM口)控制(10位)A/D模数转换控制板

本串口控制A/D模数转换控制板具有6路10位(精度±1LSB)高速A/D转换通道,可同时对外部输入的6路模拟量(直流0-5V)进行模数转换,转换后的结果(每通道转换后的结果为2字节数据)通过串口快速输出(默认波特率9600,可定做其它波特率),供电脑上位机 ...…

查看全部问答>

请问谁有高通(qualcomm)的技术网站https://support.cdmatech.com的账号或者是高通的Organization number

请问谁有高通(qualcomm)的技术网站https://support.cdmatech.com的账号或者是高通的Organization number. 我想在这个网站里面下载一些芯片的资料.但是没有\"组织号\"就注册不了. 那位有这个网站的账号或者组织号,可不可以共享给我用一下..我的邮 ...…

查看全部问答>

opengl es eglswapbuffers函数运行报错

[code]while (1)     {         // If there is a message waiting, handle it         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))       &n ...…

查看全部问答>

XF-S3011

请问有谁使用过XF-S3011语音芯片?有没有MCU为51系列芯片的相关C语言程序?让我参考一下。…

查看全部问答>

大家谈谈SHT21应该怎么焊接?

最近做数字湿度计时,发现大家对焊接SHT21感到困惑,数据手册上说用回流焊焊接。但是我们是DIY,不可能有回流焊,而且也不方便啊。那么应该怎么焊接呢?大家谈谈。。。统计下SHT21焊接情况?https://bbs.eeworld.com.cn/thread-153603-1-1.html…

查看全部问答>

德州仪器最新高精度设计库助力简化模拟设计

德州仪器 (TI) 宣布推出一款高精度模拟设计库,其提供完整的板级及系统级精确设计,不但可帮助工程师快速评估和定制系统,同时还可为其扩展模拟知识面。该 TI 高精度设计库包含参考、验证及认证设计等类别,可为客户提供快速评估和定制系统所需的所 ...…

查看全部问答>

电压转换芯片的选择

今天老师突然又给了任务,真。。。。。。 因为处理器要控制几个光电开关,光电开关必须要接10V-30V的电源,而我板子上芯片又必须得有3.3V的供电。系统用开关电源供电,输入电压25V。 小弟想问哪位前辈能推荐一款电压转换芯片,可以得到两路输出 ...…

查看全部问答>

Wifi MCU,求最简单的wifi传输数据方案!

老板给了个任务,通过wifi传送数据给Ipad2,要求传输速度达到1.2M字节/秒,尽量少的外围器件及低成本。 随便一个ARM11或Cotex-A8以上的ARM+USB无线网卡都能实现,但是这样太浪费了(硬件成本及体积太大)。 TI官网上有CC3100(M3内核),CC3200(M4内 ...…

查看全部问答>