MINI2440从SD卡更新NK及nboot(二)

发布者:美好梦想最新更新时间:2024-08-02 来源: cnblogs关键字:MINI2440  SD卡  nboot 手机看文章 扫描二维码
随时随地手机看文章

在上一篇文章中,实现应用程序操作FLASH及更新Nboot。这篇讨论应用程序更新NK,这个比更新Nboot要复杂一些。由于MINI2440不使用EBOOT,系统从SD卡系统后,Flash是没有分区的,理论上NK.nb0不一定需要BINFS,但如果不使用BINFS,系统是启动不了的,这让我百思不得其解。。。


分区可使用BP_OpenPartition(),这个只能在驱动中使用,因此在FMD_OEMIoControl()加多一个Case, BP_OpenPartition()需要指定超始地址,长度,分区类型等。MINI2440第2块写TOC,第3块到第19块是BootLogo,第20块开始才是BINFS。SuperVivi烧入NK时可看到分区的一些信息,如下:

  

Enter your selection: w


Clear the free memory


Please send the Image through USB.


Download Address=0x80200000  Length=0x1a338e0


........................Done.


Low Level Format: Start = 0x1300(19 块), Num = 0x7ed00(2029 块)


.............................................................................................................................................................................................................Done.


Create Partition: Start = 0x1400(20 块), Num = 0xd200(210 块).


................................................Done.


Create Partition: Start = 0xe600(230 块), Num = 0x6fd00(1789 块).


...Done.


Start Windows CE...;


从上面得知,分了两个区,第一个区为BINFS ,第二区为FAT 。


在调用BP_OpenPartition() 之前需调用BP_LowLevelFormat(),因为BP_OpenPartition 会检测MBR 。


1 case 0xFF44:   

2 BP_Init(…);   

3 BP_LowLevelFormat(…);   

4 BP_OpenPartition(…);   

5 BP_OpenPartition(…);   

6 break;   


BINFS 从第20 开始的,但友善烧NK 却从第39 块开始,想不明白?


第2 块写TOC ,可查看NBOOT 相关代码


 1 TOC *pToc = NULL;   

 2 pToc=(TOC *)malloc(512);//512字节   

 3 volatile unsigned int dwSector, dwLength;         // Start Sector & Length   

 4 void (*run)(void)=(void (*)(void))(DOWNLOAD_ADDRESS);   

 5 int dwEntry = 1;    

 6 pToc->id[dwEntry].dwTtlSectors = dwSectorsNeeded; //这个根据NK.NB0大小,计算出需要多少块   

 7 pToc->id[dwEntry].dwImageType = 0x2;   

 8 dwRAM  = 0x30200000;   

 9 pToc->id[dwEntry].dwLoadAddress = 0x80200000;   

10 dwSector = 39*256;//NK从第块开始写   

11 dwLength = dwSectorsNeeded;    

12 pToc->id[dwEntry].sgList[0].dwSector = dwSector;   

13 pToc->id[dwEntry].sgList[0].dwLength = dwLength;   

14 pToc->dwSignature = TOC_SIGNATURE;   

15 pToc->id[dwEntry].dwJumpAddress = 0x8  


将TOC 写在第2 块,接下来就把NK.nb0 从第39 块开始写,NK文件太大,不能一次性将其读入内存,可参考如何实现从SD卡更新NK ?  提到的分段读写NK 。


在写NK 时,若遇到坏块,需跳过,检测是否为坏块可调用驱动中的IsBlockBad()


关键代码:

 1 DWORD ReadSize = 30*1024;   //每次读取30K文件   

 2 DWORD startSectorAdd = 39*256;  //起始页   

 3 LONG  lFileToMove=0;   

 4 for (int j=0; j

 5 {   

 6     DWORD actlen = 0;   

 7     PCHAR pBuff=NULL;     

 8     pBuff=(char *)malloc(ReadSize);   

 9     memset(pBuff,0xFF,ReadSize);   

10     SetFilePointer(hFile, lFileToMove, NULL, FILE_BEGIN); //移动文件指针   

11     iRet = ReadFile(hFile, pBuff, ReadSize, &actlen, NULL);   

12     if (iRet == FALSE)   

13     {   

14         RETAILMSG(1,(TEXT('Read NB0 File Failed.')));    

15         return;   

16     }   

17     //将数据写入FLash中,每页写512字节   

18     int i = 0;   

19     while (i < ReadSize/512)   

20     {   

21         if (startSectorAdd % PAGES_PER_BLOCK == 0)   

22         {   

23             if (IsBadBlock(hFirm,startSectorAdd/PAGES_PER_BLOCK))   

24             {   

25                 RETAILMSG(1,(TEXT('***** Bad Block %d.nr'),startSectorAdd/PAGES_PER_BLOCK));   

26                 startSectorAdd += PAGES_PER_BLOCK;   

27                 continue;   

28             }      

29         }   

30            

31         iRet = WriteSector(hFirm,startSectorAdd,&pBuff[i*512]);   

32         if (iRet == FALSE)   

33         {   

34             RETAILMSG(1,(TEXT(''Write NB0 File Failed.')));   

35             return;   

36         }   

37         startSectorAdd++;   

38         i++;   

39     }   

40     if(pBuff)   

41     {   

42         free(pBuff);   

43         pBuff = NULL;   

44     }   

45     lFileToMove += ReadSize;//文件指纹后移   

46     if (ReadSize > actlen)   

47     {   

48         RETAILMSG(1,(TEXT('Break! ')));   

49         break;   

50     }   

51 }  


关键字:MINI2440  SD卡  nboot 引用地址:MINI2440从SD卡更新NK及nboot(二)

上一篇:WINCE6开机进度条
下一篇:MINI2440从SD卡更新NK及nboot(一)

推荐阅读最新更新时间:2024-11-13 07:45

MINI2440 QEMU 的 eCos 启动分析
1.总览一下eCos的启动方式 eCos目前默认的启动方式有三种,RAM,ROM,ROMRAM。 RAM启动的意思就是直接在RAM中运行,这种方式一般用于调试,不做必要的硬件初始化。 ROM启动方式的意思是在ROM中直接运行,当然一定要支持XIP的NORFLASH才可以。 ROMRAM的启动方式的意思是,ROM中开始运行然后把所有的代码复制到RAM中继续运行。 2.Mini2440 QEMU的启动方式的选择 MINI2440中目前还没有实现NOR和NAND Flash,(虽然NAND的代码加了,但是里面注名工作不是很正常,我姑且认为不能用吧) 所以,我们必须在RAM中运行eCos,并且还要完成硬件的初始化任务,这也就有了接下
[单片机]
STM32+SDIO+FATFS文件系统 直读SD卡 (含程序)
网上关于小型嵌入式的文件系统有好多~当然要数 FATFS 很是出名 一来小巧,二来免费。当然了国产的振南的znFAT 一样开源好用而且极其的省资源~!非常适合51单片。更重要的是国语的支持,呵呵!这次在STM32上为SD卡移植文件系统还是非常简单顺利的,这多亏了ST 官方提供的驱动,而我自己不用动手编写SD卡的命令省了很多时间而且官方做的驱动虽然效率一般但是极其严谨我很是佩服。 FATFS的官方网站是 http://elm-chan.org/fsw/ff/00index_e.html znFAT的官方网站是 http://www.znmcu.cn/softshow.asp?id=47 SD卡以用SPI驱动 也可
[单片机]
LPCXpresso LPC1114 SSP多扇区读写SD卡
为了更加清楚的说明多扇区与单扇区读写的不同,单独开一贴进行详细的说明。 在FatFs文件系统时,发现为了提高SD卡的读写速度,需要一个多扇区读写的函数。当然很多人都会第一反应为,用循环调用单扇区读写函数不就能实现吗?如: uint8 i; for (i=0; i count; i++) { MMCWriteSingleBlock(); // 单扇区写 MMCReadSingleBolck(); // 单扇区读 } 事实上的确可以这样实现,但是,如果是按照这样的方式实现就没有多扇区读写的优势了。速度是没有任何提升的。于是我们查阅SD卡技术可以得到如下时序: 先看看SD卡的单
[单片机]
LPCXpresso LPC1114 SSP多扇区读写<font color='red'>SD卡</font>
mini2440硬件篇之DMA
1. 硬件原理 计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换。但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率。直接存储器存取(DMA)就是为解决这个问题提出的,采用DMA方式,在一定时间段内,由DMA控制器取代CPU,获得总线控制权,来实现内存与外设或者内存的不同区域之间大量数据的快速传送。 SC2440支持位于系统总线与外围总线之间的四通道DMA控制。每一通道的DMA都可以处理一下四种情况: 1.源和目的器件均可以在系统总线 2.源器件在系统总线而目的器件在外围总线
[单片机]
SD卡接口的完整规范(一)
特性: ◎  兼容 规范版本1.01      ◎卡上错误校正        ◎支持CPRM ◎两个可选的通信协议:SD模式和SPI模式 ◎可变时钟频率0-25MHz ◎通信电压范围:2.0-3.6V 工作电压范围:2.0-3.6V ◎低电压消耗:自动断电及自动睡醒,智能电源管理 ◎无需额外编程电压       ◎卡片带电插拔保护 ◎正向兼容MMC卡               ◎高速串行接口带随即存取 ---支持双通道闪存交叉存取 ---快写技术:一个低成本的方案,能够超高速闪存访问和高可靠数据存储 ---最大读写速率:10Mbyte/s ◎最大10个堆叠的卡(20MHz,Vcc=2.7-3.6V) ◎数据寿命:10万次编程/擦除
[嵌入式]
玩转mini2440开发板之【在Ubuntu 14.04下编译安装tslib 1.4版本】
今天在研究mini2440的QT程序时,发现缺少tslib,于是想办法安装。 一开始想直接去tslib官网上下载最新版本的,但是编译时发现无法通过,于是只好按照大多数网友的做法,取了一个最成熟最稳定的版本(1.4版)来使用。步骤记录如下: 1、准备工作 首先执行以下命令,确认tslib所需的各个库都已正常安装。 # apt-get install autoconf # apt-get install automake # apt-get install libtool 2、下载源码 这里我使用的是CSDN网友上传的版本,经测试在我本人的开发环境下(64位Ubuntu 14.04)是可用的,大家自行下载即可(http
[单片机]
友善之臂Mini2440之嵌入式Linux下Nand Flash驱动分析
一、Nand Flash驱动源码文件含义 在Linux内核中,MTD源代码放在/driver/mtd目录下,该目录中包含chips、devices、maps、nand、onenand和ubi六个子目录。其中只有nand和onenand目录中的代码才与Nand驱动有关,nand目录中的代码比较通用,而onenand目录中的代码相对于nand中的代码而言简化了许多,是三星公司开发的另类nand Flash。市场占有率不是很高。所以,开发基于MTD的nand驱动程序,基本上只需要关注nand目录了,包括Kconfig、Makefile以及如下重要文件: 1、nand_base.c 定义了Nand驱动中对nand芯片最基本的操
[单片机]
SD卡和FAT文件系统示例
1. 初始化SD卡。 我现在用的多是SPI模式,所以在这里只讨论SPI模式。在SPI模式中,所有的指令都要求先将CS脚置0。所以这点,我在后面就不再强调了。 CMD0,使SD卡从SD模式转到SPI模式。判断返回值R0,如果不是CARD IS NOT READY,说明硬件上有问题。 CMD8,参数是0x000001AA,判断SD卡符合哪个标准。如果返回ILLEGAL COMMAND,说明是ver1.x的卡,否则就是ver2.0的卡。 CMD1,如果是ver2.0的卡,参数是1 30,否则就是0,读取SD卡的状态,反复,直到CARD IS READY或者超时。这里有一个问题,Spec上建议使用ACMD1,说是通用性比CMD1好,而且
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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