73

帖子

0

TA的资源

一粒金砂(初级)

21
 
你可以参考你的BSP中,如何写文件到flash中的相关代码,不同的BSP可能实现方式不同的。

回复

67

帖子

0

TA的资源

一粒金砂(初级)

22
 
typedef struct _TOC {
    DWORD               dwSignature;
    // How to boot the images in this TOC.
    // This could be moved into the image descriptor if desired,
    // but I prefer to conserve space.
    BOOT_CFG            BootCfg;

    // Array of Image Descriptors.
    IMAGE_DESCRIPTOR    id[MAX_TOC_DESCRIPTORS];

    CHAININFO           chainInfo;
} TOC, *PTOC;           // 512 bytes
这个数组很关键我觉得,因为NandFlash的第1个block就是放了它,我现在怀疑,Eboot就是靠它区分出是Nboot.bin、Eboot.bin还是NK.bin的。继续看代码……
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

23
 
MARK,刚开始没看清楚~~~~~第2中方法,貌似以前我也问过~呵呵~学习学习了!
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

24
 
引用 21 楼 haiou_arm 的回复:
typedef struct _TOC {
? ? DWORD? ? ? ? ? ? ? dwSignature;
? ? // How to boot the images in this TOC.
? ? // This could be moved into the image descriptor if desired,
? ? // but I prefer to conserve space.
? ? BOOT_CFG? ? ? ? ? ? BootCfg;

? ? // Array of Image Descriptors.
? ? IMAGE_DESCRIPTOR? ? id[MAX_TOC_DESCRIPTORS];

? ? CHAININFO? ? ? ? ? chainInfo;
} TOC, *PTOC;? ? ? ? ? // 512 bytes
这个数组很关键我觉得,因为NandFlash的第1个block就是放了它,我现在怀疑,Eboot就是靠它区分出是Nboot.bin、Eboot.bin还是NK.bin的。继续看代码……

如果你用的S3C2440的话,nboot.bin应该通过ADS编译出来的,直接烧写到block0的。
有一点你要知道:ADS编译出来的.bin跟在PB下编译的.bin是不一样的,前者可以直接拷贝到RAM中运行,后者需进行相应的解压,才能在RAM中运行的,其中解压过程,eboot肯定是有的,你仔细的研究下代码才行。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

25
 
确实是这样的,刚在老前辈:'shuiyang'以前的帖子里发现这个:
nk.bin的开始是文件标识,7个字节,一旦读到这连续的标志字节,就说明是微软的bin文件。
接着是“有效数据块存储开始的虚拟地址”、“有效数据块的大小”和校验和。有耐心可以用UE打开nk.nb0和nk.bin对照着看,nk.nb0是0x0开始,而nk.bin存储开始就作为0x0,后面的地址都算偏移量就行。

再用UltraEdit打开Eboot.bin看了下,果然是这样,各位战友打开一看就廓然开朗——不要笑话我啊,以前就稍微用过ADS下的bin。
也就是说现在不管要下砸的是Nboot.bin?Eboot.bin?还是NK.bin?,这些都不用你操心了,现在要做的就是如何才能生成PB下相应的logo.bin就是最关键的了……(刚开始的logo.bin是用Image2Lcd转换得来的,什么都没有加,还浪费我好多时间)

继续看代码……

引用 23 楼 hao507 的回复:
引用 21 楼 haiou_arm 的回复:
typedef struct _TOC {
? ? DWORD? ? ? ? ? ? ? dwSignature;
? ? // How to boot the images in this TOC.
? ? // This could be moved into the image descriptor if desired,
? ? // but I prefer to conserve space.
? ? BOOT_CFG? ? ? ? ? ? BootCfg;

? ? // Array of Image Descriptors.
? ? IMAGE_DESCRIPTOR? ? id[MAX_TOC_DESCRIPTORS];

? ? CHAININFO? ? ? ? ? chainInfo;
} TOC, *PTOC;? ? ? ? ? // 512 bytes
这个数组很关键我觉得,因为NandFlash的第1个block就是放了它,我现在怀疑,Eboot就是靠它区分出是Nboot.bin、Eboot.bin还是NK.bin的。继续看代码……

如果你用的S3C2440的话,nboot.bin应该通过ADS编译出来的,直接烧写到block0的。
有一点你要知道:ADS编译出来的.bin跟在PB下编译的.bin是不一样的,前者可以直接拷贝到RAM中运行,后者需进行相应的解压,才能在RAM中运行的,其中解压过程,eboot肯定是有的,你仔细的研究下代码才行。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

26
 
不一定要是.bin文件的啊,直接烧写bmp就是了,显示的时候解析下就行了啊,没有必要再转化成.BIN啊
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

27
 
用Eboot烧.bmp是不支持啊,怎么烧呢?
将.bmp打包进NK?

引用 25 楼 hao507 的回复:
不一定要是.bin文件的啊,直接烧写bmp就是了,显示的时候解析下就行了啊,没有必要再转化成.BIN啊
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

28
 
引用 26 楼 haiou_arm 的回复:
用Eboot烧.bmp是不支持啊,怎么烧呢?
将.bmp打包进NK?

引用 25 楼 hao507 的回复:
不一定要是.bin文件的啊,直接烧写bmp就是了,显示的时候解析下就行了啊,没有必要再转化成.BIN啊


我的图片是放在SD卡上的,然后从SD卡把图像数据读出来,写到flash里,你只要写到flash里的是二进制数据就行了啊,没有必要转化成.bin再烧写进去啊
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

29
 
这个问题一直关注中。学习!
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

30
 
引用 26 楼 haiou_arm 的回复:
用Eboot烧.bmp是不支持啊,怎么烧呢?
将.bmp打包进NK?

引用 25 楼 hao507 的回复:
不一定要是.bin文件的啊,直接烧写bmp就是了,显示的时候解析下就行了啊,没有必要再转化成.BIN啊


不打包,可以在原来判断bin文件标识那7个字节的地方,加判断是否bmp的文件头"BM",然后就可以直接跳去烧bmp文件。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

31
 
引用 29 楼 seemknow 的回复:
引用 26 楼 haiou_arm 的回复:
用Eboot烧.bmp是不支持啊,怎么烧呢?
将.bmp打包进NK?

引用 25 楼 hao507 的回复:
不一定要是.bin文件的啊,直接烧写bmp就是了,显示的时候解析下就行了啊,没有必要再转化成.BIN啊


不打包,可以在原来判断bin文件标识那7个字节的地方,加判断是否bmp的文件头"BM",然后就可以直接跳去烧bmp文件。

是的
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

32
 
感谢楼上两位仁兄的建议,但目前我烧写有以下几个前提:
1、我的烧写工具是Eboot,它仅支持.bin和nb0两种格式,并且想利用它下面的‘static BOOL DownloadImage (LPDWORD pdwImageStart, LPDWORD pdwImageLength, LPDWORD pdwLaunchAddr)’的函数进行烧写,不想从新写支持其它的烧写函数;
2、大家也看到了,在‘DownloadImage ’这个函数中,有要烧写的起始地址和长度,还包括跳转地址,这几个数据从那来的呢,就包含了在PB生成的.bin文件的开始字节里面。而它包含进去的根据是什么呢?这在“loader.h”需要我们去定义;
3、Eboot在烧写时不支持我们输入地址,只能将.bin通过USB写入缓冲后,Eboot通过读.bin的头字节会自动判断出要烧写的起始地址和长度;

所以,我还是得生成PB下特有的.bin再说
目前的进展是:我将//LX_logo @ Block 6~10    added by haiou
#define LOGO_BLOCK                  6
#define LOGO_BLOCK_SIZE             5
#define LOGO_SECTOR                 BLOCK_TO_SECTOR(LOGO_BLOCK)
这块区域留给了logo,将后面的区域格式化为binfs烧写了NK.bin并运行了。

兄弟们,我还是想利用EBOOT,烧.bin。现在就剩下这个了,兄弟们帮忙加油啊!
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

33
 
谁能帮我搞清楚在PB下生成除了 Nboot.bin\Eboot.bin\Nk.bin的方法,主要应该是配置文件的事。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

34
 
mark
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

35
 
引用 8 楼 haiou_arm 的回复:
我们做的每个产品都有开机Logo,甚至产品序列号、PCB版本号等等。都是以二进制形式存储在Nand Flash中的,至于存在哪里?怎么写入?怎么读?你自己完全可以在代码中自己控制啊!

我就是向实现这个,可不会啊……


楼主,看来你还是没入门的。

你自己可以改Eboot的代码,想做什么都可以啊!

你看的Eboot.bib是Platform Builder编译Eboot时用的。Config.bib是编译Nk.bin用的。虽然内容不一样,但都分配的是同一个RAM。因此你在Config.bib中应该能看到前面1MB是保留的。而Eboot.bib中能看到Eboot只用了前面不超过1MB的内容,

我觉得楼主很多基本的东西,甚至概念都不清楚,。建议你先找几本书看看吧。现在WinCE的书很多的。遇到疑难再上来问。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

36
 
mark 好东西!!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

37
 
感谢‘yangcuncunzhang’,哈哈,真被你说对了,我以前就是各画线路板的^_^
MEMORY

IF IMGMULTIXIP !

#define    NKNAME       NK
#define    NKSTART      80100000
;gao0129
#define    NKLEN        03F00000    ; 63MB (Max size, to match image_cfg.* files. This will be auto-sized)
;#define    NKLEN        02800000    ; 40MB

#define    RAMNAME      RAM
;gao0129
#define    RAMSTART     84000000
#define    RAMLEN       01D00000    ; 29MB (Will be auto-sized from the end of NK)
;#define    RAMSTART     82900000
;#define    RAMLEN       03600000    ; 54MB

;-----------------------------------------------------
;   NAME        ADDRESS     SIZE            TYPE
;-----------------------------------------------------
    $(NKNAME)   $(NKSTART)  $(NKLEN)        RAMIMAGE
    $(RAMNAME)  $(RAMSTART) $(RAMLEN)       RAM

ENDIF

IF IMGMULTIXIP

#define    CHAIN_ADDRESS    823FC000
#define    CHAIN_LENGTH     00004000
;-----------------------------------------------------
;   NAME        ADDRESS         SIZE            TYPE
;-----------------------------------------------------
    XIPKERNEL   80100000        00300000        RAMIMAGE
    NK          80400000        01FFC000        NANDIMAGE
    CHAIN       $(CHAIN_ADDRESS)    $(CHAIN_LENGTH)    RESERVED
    RAM         80400000        06400000        RAM

ENDIF

; Common RAM areas

    AUD_DMA     80002000    00002000        RESERVED
    TEMPS       80010000    00010000        RESERVED
    DBGSER_DMA  80022000    00002000        RESERVED
    ARGS        80020800    00000800        RESERVED
    SER_DMA     80024000    00002000        RESERVED
    IR_DMA      80026000    00002000        RESERVED
    SLEEP       80028000    00002000        RESERVED
    EDBG        80030000    00020000        RESERVED
    CMM         85D00000    00300000        RESERVED
    FIMG_BUF    86000000    00800000        RESERVED
    JPEG        86800000    00800000        RESERVED  ;add by fusq for JPEG
    DISPLAY     87000000    00800000        RESERVED  ;modify by fusq
    MFC         87800000    00800000        RESERVED  ;modify by fusq
;    DISPLAY     86800000    00C00000        RESERVED
;    MFC_JPEG    87400000    00C00000        RESERVED
;gao0129
    ETHNET      94000000    00100000        RESERVED
CONFIG

    COMPRESSION=ON
    KERNELFIXUPS=ON
    AUTOSIZE=ON

IF IMGMULTIXIP
    RAM_AUTOSIZE=OFF
    ROM_AUTOSIZE=OFF
    DLLADDR_AUTOSIZE=ON

    XIPSCHAIN=$(CHAIN_ADDRESS)

    AUTOSIZE_ROMGAP=10000
    AUTOSIZE_DLLADDRGAP=0
    AUTOSIZE_DLLDATAADDRGAP=0
    AUTOSIZE_DLLCODEADDRGAP=0

    ROMFLAGS=0
ENDIF

IF IMGPROFILER
    PROFILE=ON
ELSE
    PROFILE=OFF
ENDIF

;
; ROMFLAGS is a bitmask of options for the kernel
;   ROMFLAGS    0x0001      Disallow Paging
;   ROMFLAGS    0x0010      Trust Module only
;
IF IMGMULTIXIP !

IF IMGTRUSTROMONLY
    ROMFLAGS=10
ELSE
    ROMFLAGS=00
ENDIF

    FSRAMPERCENT = 0x0D0D0D0D

    ROMSTART = $(NKSTART)
    ROMWIDTH = 32
    ROMSIZE = $(NKLEN)

ENDIF
你是说#define    NKSTART      80100000的前1M吗?80000000~80100000
还有一个地方不明白,我现在在“loader.h”中对NandFlash进行了下面的分配:
// NAND Boot (loads into SteppingStone) @ Block 0
#define NBOOT_BLOCK                 0
#define NBOOT_BLOCK_SIZE            1
#define NBOOT_SECTOR                BLOCK_TO_SECTOR(NBOOT_BLOCK)      //0pages~64pages

// TOC @ Block 1
#define TOC_BLOCK                   1
#define TOC_BLOCK_SIZE              1
#define TOC_SECTOR                  BLOCK_TO_SECTOR(TOC_BLOCK)        //64pages~128pages

// Eboot @ Block 2~5
#define EBOOT_BLOCK                 2
#define EBOOT_SECTOR_SIZE           FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)     //256pages
#define EBOOT_BLOCK_SIZE            SECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)            //4blocks(2block~5block)
#define EBOOT_SECTOR                BLOCK_TO_SECTOR(EBOOT_BLOCK)                  //128pages~384pages

//LX_logo @ Block 6~    added by haiou
#define LOGO_BLOCK                  6
#define LOGO_BLOCK_SIZE             25
#define LOGO_SECTOR                 BLOCK_TO_SECTOR(LOGO_BLOCK)



#define RESERVED_BOOT_BLOCKS        (NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE + LOGO_BLOCK_SIZE)

// Images start after OEM Reserved Blocks
#define IMAGE_START_BLOCK           RESERVED_BOOT_BLOCKS                              
#define IMAGE_START_SECTOR          BLOCK_TO_SECTOR(IMAGE_START_BLOCK)

现在这样做后,从新sysgen,烧写系统后。在DNW烧写NK时当选项F)和9)时可以看到被RESERVED就是现在按照‘loader.h’下设定的地址进行的。系统也正常运行起来了。
现在可以肯定的是:NK烧在了 RESERVED_BOOT_BLOCKS 之后的block,也就是说经过MMU之后,还是在原来的80100000中。那么我是不是也要该这个‘80100000’地址呢?
我觉得不需要,因为NK运行起来后对Mememery的分配是靠config.bib。而启动过程中用的是‘eboot.bib’,我只需要在eboot.bin中为logo开辟一块5M的空间就行了(不要说我浪费啊),如
    LOGO        89000000    00500000    RESERVED        ; LOGO   

小弟初来匝道,脑袋里好多东西都模模糊糊的,说错的地方请指正。
特别是心里七上八下的问题,真的希望能得到一个确定的回复。
就上上面这个问题,请问‘yangcuncunzhang’前辈,这样理解对吗?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

38
 
引用 17 楼 hao507 的回复:
引用 16 楼 wolfmvp 的回复:
哈哈,在BootLoader中实现很简单的,这个我已经实现;但是,在应用程序中如何实现我不懂,如果咱俩能中和一下就好了,嘻嘻…

在应用程序中实现就是要修改flash驱动,在fmd的iocontrol里添加case就行了,跟BootLoader里的差不多,只不过如果你要是采用multi-bin的话,打开flash的时候跟非multi-bin不太一样,注意下就行了。。
感谢回答,真的非常感谢,呵呵…
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

39
 
    从周一到周五、整整五天,这个帖子可以结了^_^

    特别感谢大家的关注和帮助,开机后Eboot通过读取NandFlash上的logo.bin,顺利显示并引导系统。
在这个过程中,大家给我提了很多建议,因为我确实入门太浅,有的建议一开始不能理解,特别是有时候因为自己理解错了还和提建议的朋友叫汁,哈哈,真对不起,感谢大家!

     这个过程大致如下:
     周一:
            1)跟踪分析bootloader源码,通过添加.h文件的方式修改启动界面,但Eboot.bin却烧不进去

        了。
            2)从技术支持得知,是因为从新编译的Eboot.bin太大——这就有矛盾,要将logo打包在
        Eboot.bin中,必然增大Eboot,怎么办呢?继续分析Eboot代码。
     周二:
            1)从各方面了解,要将大些的logo(750K)加载在启动界面中,一般的做法是将该logo烧写在
        NandFlash的某个固定位置,然后Eboot启动时从NandFlash读出并加载进显示缓冲区实现。
            2)顺着这个思路,开始研究分析Eboot的NandFlash分区和文件系统。
     周三:
            1)通过分析源码得知:NandFlash的0block放置Nboot,1block放置TOC,2~5block放置
        Eboot,而后被格式化BinFs文件系统放置NK镜像;
            2)思路很清楚,如何将logo.bin烧进6~13block(1M)的位置,而将Binfs文件系统后移,继续
        分析代码。
     周四:
            1)有两个结构体TOC、_IMAGE_DESCRIPTOR成为问题的难点,伴随整个Eboot的执行;其围
        绕.bin文件的生成、烧写位置、NandFlash分区、启动加速;
            2)特别是其特有的.bin文件,前几个字节不仅包含了接收地址、长度、校验和;还包括了要下载
        的地址和长度。
            3)通过修改PB下配置文件,成功将NandFlash分区,专门预留6~13block给logo;
           4)思路很清楚,只要能将logo生成Eboot支持的.bin文件,就能实现下载,通过寻找合适的工
        具、企图利用TOC、_IMAGE_DESCRIPTOR修改PB配置文件实现,但均以失败告终。
     周五:
            1)生成Eboot支持的.bin文件不可以,那修改Eboot来支持自己的.bin文件可以吗?答案是肯定
        的——到这时候才理解了好多前辈对我的建议;
            2)对Eboot修改主要有三处:1)添加自定义下载logo命令;2)修改NandFlash烧写函数;3)添
        加NandFlash读函数。
            3)当然还有相应修改image_cfg.h、loader.h、eboot.bin。
     然后就可以了…………………………………………………………………………………………………………

最后想说的是:一定要认真分析Eboot代码,代码看不明白,即使有清晰的思路也无从下手。


     
   
 
 
 

回复

110

帖子

0

TA的资源

一粒金砂(初级)

40
 
引用 38 楼 haiou_arm 的回复:
从周一到周五、整整五天,这个帖子可以结了^_^

? ? 特别感谢大家的关注和帮助,开机后Eboot通过读取NandFlash上的logo.bin,顺利显示并引导系统。
在这个过程中,大家给我提了很多建议,因为我确实入门太浅,有的建议一开始不能理解,特别是有时候因为自己理解错了还和提建议的朋友叫汁,哈哈,真对不起,感谢大家!

? ?  这个过程大致如下:
? ?  周一:
? ? ? ? ? ? 1)跟踪分析bootloader源码,通过添加.h文件的方式修改启动界面,但Eboot.bin却烧不进去

? ? ? ? 了。
? ? ? ? ? ? 2)从技术支持得知,是因为从新编译的Eboot.bin太大——这就有矛盾,要将logo打包在
? ? ? ? Eboot.bin中,必然增大Eboot,怎么办呢?继续分析Eboot代码。
? ?  周二:
? ? ? ? ? ? 1)从各方面了解,要将大些的logo(750K)加载在启动界面中,一般的做法是将该logo烧写在
? ? ? ? NandFlash的某个固定位置,然后Eboot启动时从NandFlash读出并加载进显示缓冲区实现。
? ? ? ? ? ? 2)顺着这个思路,开始研究分析Eboot的NandFlash分区和文件系统。
? ?  周三:
? ? ? ? ? ? 1)通过分析源码得知:NandFlash的0block放置Nboot,1block放置TOC,2~5block放置
? ? ? ? Eboot,而后被格式化BinFs文件系统放置NK镜像;
? ? ? ? ? ? 2)思路很清楚,如何将logo.bin烧进6~13block(1M)的位置,而将Binfs文件系统后移,继续
? ? ? ? 分析代码。
? ?  周四:
? ? ? ? ? ? 1)有两个结构体TOC、_IMAGE_DESCRIPTOR成为问题的难点,伴随整个Eboot的执行;其围
? ? ? ? 绕.bin文件的生成、烧写位置、NandFlash分区、启动加速;
? ? ? ? ? ? 2)特别是其特有的.bin文件,前几个字节不仅包含了接收地址、长度、校验和;还包括了要下载
? ? ? ? 的地址和长度。
? ? ? ? ? ? 3)通过修改PB下配置文件,成功将NandFlash分区,专门预留6~13block给logo;
? ? ? ? ?  4)思路很清楚,只要能将logo生成Eboot支持的.bin文件,就能实现下载,通过寻找合适的工
? ? ? ? 具、企图利用TOC、_IMAGE_DESCRIPTOR修改PB配置文件实现,但均以失败告终。
? ?  周五:
? ? ? ? ? ? 1)生成Eboot支持的.bin文件不可以,那修改Eboot来支持自己的.bin文件可以吗?答案是肯定
? ? ? ? 的——到这时候才理解了好多前辈对我的建议;
? ? ? ? ? ? 2)对Eboot修改主要有三处:1)添加自定义下载logo命令;2)修改NandFlash烧写函数;3)添
? ? ? ? 加NandFlash读函数。
? ? ? ? ? ? 3)当然还有相应修改image_cfg.h、loader.h、eboot.bin。
? ?  然后就可以了…………………………………………………………………………………………………………

最后想说的是:一定要认真分析Eboot代码,代码看不明白,即使有清晰的思路也无从下手。

楼主的学习精神很值得偶学习,受教了…
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表