ngswfx

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx  发布于  2016-07-03 19:17:02
采纳率 0%
55个问答
6606

flash USB升级包制作工具mkRecoveryBin,海思方案应该都能用

 
本帖最后由 ngswfx 于 2016-7-27 11:18 编辑

/////////按照自己的理解写的,还在实际使用优化中.......
/////////目前使用很不错,发上来,大家参考一下。已经利用这个工具,成功自动升级了8M flash的3520D以及32M flash的3520D
我先描述一下我自己的flash上几个部分情况:
uboot 一般从0x0--------0x20000
ENV    从0x20000 -------0x30000
kernel 从0x30000------  0x180000
rootfs 采用squashfs文件格式,支持压缩,我把比较大的文件,以及调试中不会变的放到这里了,例如QT的库等等,然后采用XZ方式压缩,效果还不错。16Mflash有点吃紧,但基本源码工程,也能装下了。
APP,名字叫APP,其实里面也有etc目录,这么做的目的主要为了,支持可读写问题。APP采用Jffs2文件系统,由于可能中途修改程序,替换某些文件或者修改某些文件。所以这里放的基本是随时要变化的程序以及库。
Config,固定512K,jffs2就是用来放配置的。如果升级时这部分不升级,配置就在。
logo,64K,纯二进制,没有文件系统,开机画面
/////////////cfg例子中,除了logo没升级,都配置升级了,而且由于config文件很小,APP文件也很小,需要指定结束位置外,其他的模块是根据实际文件大小,紧接着排列的,代码中以及考虑了flash的block问题。

/////////////

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
以前,通过USB在uboot升级,采用的是每种数据包一个文件的方式,海思的例子也是这么写的,如果中途需要调整,要改uboot源码中的相应地址,或者修改env中几个升级包的地址。

前期看了相关文章,可以把几个文件打包在一块升级,前几天也和论坛上的朋友交流了一下,思路是比较清晰的,只是感觉自己还没到需要做的时候,这几天自己弄产品,如果还按照以前做法,升级各个模块,的确感觉有些繁琐,哎,还是合并到一起升级吧。

/////于是干脆自己写一个相关的打包工具吧。附件中的源码是一个打包工具,配置文件格式下面有。uboot里面实现方法,见2层。



写完之后,感觉方法还比较简单:
1、通过ini文件格式,自己写一个cfg配置文件。mkRecoveryBin工具读取相关配置。之所以采用这种ini方法,是因为容易随时修改,每个芯片,采用的DDR容量以及Flash容量可能有些差异,肯定要支持自定义才行,为此这个cfg文件肯定经常变。但基本思路是,配置变,工具尽量不变。当然因为有源码,一旦发现某些功能实现不了,到时再来改源码。
2、打包工具mkRecoveryBin按照配置文件cfg的内容,分别读取uboot,kernel,rootfs,app,config等几个模块。按照写入flash的位置要求,进行组合,最终产生一个.bin文件。
3、Uboot端,前期代码不变,还是支持各个模块升级,只是在子模块升级前,先查看有没有recovery.bin全局升级文件,如果有,先尝试读取配置头(程序中,这个大小是832字节,随着结构变化可能有改变),然后简单检查环境和Uboot当前环境是否一致,例如芯片型号,flash,ddr等,也就是
判断出,能否在当前板子上升级。
4、如果可以升级,就把整个文件recovery.bin读取到内存中,先升级uboot,然后跳过flash上的ENV部分,擦除其他部分,读取内存中相应部分,然后写入flash。
5、按照配置头结构中保留的CONFIG_BOOTARGS以及CONFIG_BOOTCOMMAND,写入环境变量,重新计算CRC,保存ENV到flash,升级结束。
////我的做法目前还不够智能化:每种升级包,需要仔细检查CFG配置是否合适。CONFIG_BOOTARGS以及CONFIG_BOOTCOMMAND两个命令需要和实际配合。目前没有实现自动适配,你可以加强一下这方面,我这里由于总体方法还在调整,所以暂没有自动生成


////好处还是显而易见的:支持从kernel到APP,各种包的组合,以及哪个包采用什么文件系统,其实都没关系。我这里文件系统使用了2个包,主要的rootfs采用squashfs,主要是压缩率高,这部分是按照文件大小来定的flash上的空间占用。为了使系统正常,APP包里面还包括了etc等内容,采用了jffs2格式,
空间会按照配置的结尾,也就是实际空间大于APP程序本身,通过mount,将系统需要读写的目录,都放倒了APP包当中。






///配置文件cfg:
[setting]
SPI_NAND_BLOCK_SIZE=64            //实际是64K 内部做计算吧
OUT_FILE_NAME=recovery3520D_8M.bin             //输出文件名称,可以自定义
MEM_SIZE=256                                                     //板子内存大小,作为能否升级的一个依据
FLASH_SIZE=8                                                      //不同的flash不同,也可以作为升级依据
UBOOT_START_POS=0
UBOOT_END_POS=20000                                                 //16进制地址
UBOOT_ENV_SIZE=10000                                            //16进制地址
RECOVERY_START_POS=30000                                                 //16进制地址
RECOVERY_END_POS=7f0000                                                 //16进制地址
CONFIG_BOOTARGS=mem=64M lpj=5996544 console=ttyAMA0,115200 root=/dev/mtdblock3 rootfstype=squashfs  mtdparts=hi_sfc:128K(boot),64K(UB_ENV),1344K(kernel),3008K(rootfs),3072K(APP),512K(Config),64K(LOGO)
CONFIG_BOOTCOMMAND=sf probe 0;sf read 0x81000000 0x30000 0x180000;sf read 0x817F0000 0x7F0000 0x10000;decjpg;setvobg 0 0x0;startvo 0 36 14;startgx 0 0x84fe0000 2048 0 0 1024 768;bootm 0x81000000
MAX_LOAD_SUB_FILE_NUM=5   
//////////其实就是Uboot
SUB_FILE_0=mini-boot_256M_8M.bin
//////////kernel
SUB_FILE_1=3520D_uImage_mini.bin
////////rootfs
SUB_FILE_2=squashfs_NGS-root_256_MINI.img
/////////APP
SUB_FILE_3=APP_3520D_MINI.img
SUB_FILE_END_3=770000
/////////config
SUB_FILE_4=Config.img
SUB_FILE_END_4=7f0000
////////对于不可读写的部分,按照blocksize紧密排列即可,对于可读写有固定大小的分区,不是按照文件,而是按照最大值
////////主要是可读写的APP以及config部分 logo部分
IS_PART_MAX_SIZE_3=1
////////////////////////////////////////////////////////////////////////////////////////





//////////2016_7_27 通过读取另外一个bootarg方式,自动产生env部分,并且计算crc,不写入或者写入开始的头,这样可以产生2种类型的bin包,一种用来升级,还有一种用来直接生产使用。
//实现命令:
sudo -S  ./mkRecoveryBin  recovery3520D_QT_OUT.cfg

//////程序内部会按照recovery3520D_QT_OUT.cfg里面的配置要求,是否去读取bootEnv3520D_256_16M.Cfg,以便生成符合要求的ENV环境变量,并且产生CRC,替换ENV板块,开头的4个字节。

///经过实际使用测试,通过修改recovery3520D_QT_OUT.cfg里面,使FOR_PRODUCTION=1,产生的recovery.bin其实就是整个flash的镜像包,直接一对一全部刷入,系统运行正常,加载uboot时,也没有提示env错误,说明crc部分也正常。


///////////////////////////////////////////////
///////bootEnv3520D_256_16M.Cfg 内容如下:
[code]bootdelay=1
baudrate=115200
ethaddr=10:20:33:34:45:66
bootfile="uImage"
filesize=458
fileaddr=82F70000
netmask=255.255.255.0
ipaddr=192.168.2.10
gatewayip=192.168.2.1
serverip=192.168.2.245
IVHI_VERSION=1469476386
bootcmd=sf probe 0;sf read 0x81000000 0x30000 0x180000;sf read 0x82FF0000 0xFF0000 0x10000;decjpg;setvobg 0 0x0;startvo 0 36 14;startgx 0 0x86fe0000 2048 0 0 1024 768;bootm 0x81000000
bootargs=mem=96M lpj=5996544 console=ttyAMA0,115200 root=/dev/mtdblock3 rootfstype=squashfs  mtdparts=hi_sfc:128K(boot),64K(UB_ENV),1280K(kernel),11840K(rootfs),2496K(APP),512K(Config),64K(LOGO)
jpeg_addr=0x82FF0000
jpeg_size=0x10000
vobuf=0x86fe0000
stdin=serial
stdout=serial
stderr=serial
verify=n
ver=U-Boot 2010.06 (Jul 26 2016 - 03:52:41)[/code]

/////////////////////////////////////////
//////////////总配置:recovery3520D_QT_OUT.cfg,内容如下:
[code][setting]
///////////////////生产使用,没有头,会处理ENV内容,直接从0刷写即可
FOR_PRODUCTION=1
OS_MEM_SIZE=96
ROOTFS_MTD_NUM=3
ROOTFS_TYPE=squashfs
SPI_NAND_BLOCK_SIZE=64
OUT_FILE_NAME=recovery3520D_256_16M_.bin
bootEnv_input=bootEnv3520D_256_16M.Cfg
jpeg_addr=82FF0000
jpeg_size=10000
vobuf=86fe0000
MEM_SIZE=256
FLASH_SIZE=16
UBOOT_START_POS=0
UBOOT_END_POS=20000
UBOOT_ENV_SIZE=10000
RECOVERY_START_POS=30000
RECOVERY_END_POS=1000000
CONFIG_BOOTARGS=mem=96M lpj=5996544 console=ttyAMA0,115200 root=/dev/mtdblock3 rootfstype=squashfs  mtdparts=hi_sfc:128K(boot),64K(UB_ENV),1280K(kernel),11840K(rootfs),2496K(APP),512K(Config),64K(LOGO)
CONFIG_BOOTCOMMAND=sf probe 0;sf read 0x81000000 0x30000 0x180000;sf read 0x82FF0000 0xFF0000 0x10000;decjpg;setvobg 0 0x0;startvo 0 36 14;startgx 0 0x86fe0000 2048 0 0 1024 768;bootm 0x81000000
updateCMD=setenv jpeg_addr 0x82FF0000;setenv jpeg_size 0x10000;setenv vobuf 0x86fe0000;  
MAX_LOAD_SUB_FILE_NUM=6
//////////其实就是Uboot
SUB_FILE_0=mini-boot_256M_16M.bin
//////////kernel
SUB_FILE_1=3520D_uImage_mini.bin
////////rootfs
SUB_FILE_2=squashfs_NGS-root_256_QT_OUT.img
/////////APP
SUB_FILE_3=APP_3520D_QT_OUT.img
SUB_FILE_END_3=f70000
/////////config
SUB_FILE_4=Config.img
SUB_FILE_END_4=ff0000
/////////logo
SUB_FILE_5=TV_BK_1024.jpg
SUB_FILE_END_5=1000000
////////对于不可读写的部分,按照blocksize紧密排列即可,对于可读写有固定大小的分区,不是按照文件,而是按照最大值
////////主要是可读写的APP以及config部分 logo部分[/code]
易百纳技术社区文件: mkRecoveryBin.tar.gz
下载
易百纳技术社区文件: mkRecoveryBin.tar.gz
下载
易百纳技术社区文件: bootEnv3520D_256_16M.Cfg.tar.gz
下载
易百纳技术社区文件: recovery3520D_QT_OUT.cfg.tar.gz
下载
我来回答
回答20个
时间排序
认可量排序

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-03 19:28:11
认可0
本帖最后由 ngswfx 于 2016-7-4 09:19 编辑

Uboot当中:
nCurMem,nFlashSize对于某个uboot版本来说,都是提前define的固定值,这里用来做基本判断,你可以自己加入芯片型号,板子型号等判断。


[code]///////////////////整体恢复升级,检查有没有符合条件的升级文件,如果有,读取文件头,由于Uboot在前,config以及logo在最後面
#pragma pack(1)
typedef struct IVHI_RECOVERYEx
{
        int   _nVersion;    //32349209348
        int   _MEM_SIZE;   //256
        int   _FLASH_SIZE; //8
        int   _UBOOT_START_POS; //0x0
        int   _UBOOT_END_POS;  //0x20000
        int   _UBOOT_ENV_SIZE; //0x10000
        int   _RECOVERY_START_POS; //0x30000
        int   _RECOVERY_END_POS;//0x770000
        char  _CONFIG_BOOTARGS[400];
        char  _CONFIG_BOOTCOMMAND[400];
}IVHI_RECOVERY;
#pragma pack()
///为了确保config不被覆盖,仅仅需要指定升级的范围即可,升级写入完毕后,需要将文件头内部的env配置导入保存重启即可,这里无需区分uboot,kernel,rootfs,app几个分区,仅仅需要在文件头里面定义uboot开始位置0,结束位置,以及kernel开始位置 app结束位置即可,中间绕开env环境内存以及config部分。
//至于中间有多少个分区,各个分区的位置等,都无需涉及,仅仅在制作这类升级包时将配置放到CONFIG_BOOTARGS里面即可。
//这里需要区分spi以及Nand的blocksize 问题,仅仅在制作升级包时需要通过配置选定。
//考虑到生产过程方便性减少后续麻烦,需要编写一个支持ini文件配置的打包制作工具,直接在linux环境下使用的一个工具,
static int checkStartRecovery(int nCurMem,int nFlashSize)
{       
        printf("checkStartRecovery nCurMem:%d nFlashSize:%d sizeof(IVHI_RECOVERY):%d\n", nCurMem,nFlashSize,sizeof(IVHI_RECOVERY));
        //U盘根目录查找recovery.bin文件,读取1K文件头。
        long sz;
        char strFileName[64];
        sprintf(strFileName,"recovery.bin");
        sz = file_fat_read(strFileName, LOAD_ADDR,sizeof(IVHI_RECOVERY));
        if (sz <= 0 || sz < sizeof(image_header_t)) {
                watchdog_reset();
                printf("%s not found\n", strFileName);
                return 0;//返回失败,没有发现recovery.bin文件,或者读取头失败
        }
        ////////////////////////////////检查这个文件是不是符合相应的硬件
        IVHI_RECOVERY *_ivhiRecovery= (IVHI_RECOVERY *)LOAD_ADDR;
        if(_ivhiRecovery->_MEM_SIZE!=nCurMem){
                printf("_MEM_SIZE:%d!=nCurMem:%d\n", _ivhiRecovery->_MEM_SIZE,nCurMem);               
                return 0;
        }
#ifdef SPECIAL_UPDATE_FLASH_SIZE
        if(_ivhiRecovery->_FLASH_SIZE!=nFlashSize){
                printf("_FLASH_SIZE:%d!=nFlashSize:%d\n", _ivhiRecovery->_FLASH_SIZE,nFlashSize);
                return 0;
        }
#endif
        printf("_ivhiRecovery->_UBOOT_ENV_SIZE :%lu \n",_ivhiRecovery->_UBOOT_ENV_SIZE);
        ////////////////////版本验证
        /////////////////已经通过验证 //全部读取到内存中
        long nTotalSize=(_ivhiRecovery->_RECOVERY_END_POS+sizeof(IVHI_RECOVERY));
        printf("recovery nTotalSize:%d!\n", nTotalSize);
        sz = file_fat_read(strFileName, LOAD_ADDR,nTotalSize);
        if(sz<=0||sz                 printf("nTotalSize:%d!=read sz:%d\n", nTotalSize,sz);       
                return 0;
        }
        ////////////////////////////////////////写入uboot
        unsigned long start, len;
        unsigned long write_len;
        int rc;
        void *buf;
        char *pbuf;
        watchdog_reset();
        printf("\n");
        start=0;
        len=_ivhiRecovery->_UBOOT_END_POS-0;
        printf("flash recovery erase...\n");
        rc = flash->erase(flash, start, len);
        if (rc) {
                printf("SPI flash recovery sector erase uboot failed\n");
                return 0;
        }
        watchdog_reset();
        buf = map_physmem((unsigned long)LOAD_ADDR, nTotalSize, MAP_WRBACK);
        if (!buf) {
                printf("recovery Failed to map physical memory nTotalSize:%lu\n",nTotalSize);
                return 0;
        }
        pbuf=buf+sizeof(IVHI_RECOVERY);
        write_len=len;
        watchdog_reset();
        printf("flash recovery write uboot...\n");
        rc = flash->write(flash, start, write_len, pbuf);
        if (rc) {
                watchdog_reset();
                printf("SPI flash write recovery uboot failed, return %d\n", rc);
                return 0;
        }
        ////////////////////////////////////////写入后面的recovery数据
        start=_ivhiRecovery->_UBOOT_END_POS+_ivhiRecovery->_UBOOT_ENV_SIZE;
        len=_ivhiRecovery->_RECOVERY_END_POS-_ivhiRecovery->_RECOVERY_START_POS;
        printf("flash recovery erase start:%lu.len:%lu..\n",start,len); //art:196608.len:7602176.
        rc = flash->erase(flash, start, len);
        write_len=len;
        pbuf=buf+sizeof(IVHI_RECOVERY)+start;
        printf("flash recovery write start:%lu.len:%lu..\n",start,write_len);
        rc = flash->write(flash, start, write_len, pbuf);
        if (rc) {
                watchdog_reset();
                printf("SPI flash write recovery 2  failed, return %d\n", rc);
                return 0;
        }
        ///////////////////////////////////////写入环境
        //已经升级成功,保存版本号
        printf("flash recovery updata version:%lu..\n",_ivhiRecovery->_nVersion);
        char strVersion[16];
        sprintf(strVersion,"%lu",_ivhiRecovery->_nVersion);
        setenv("IVHI_VERSION", strVersion);
        //////////////////写入启动环境变量
        setenv("bootargs", _ivhiRecovery->_CONFIG_BOOTARGS);
        setenv("bootcmd", _ivhiRecovery->_CONFIG_BOOTCOMMAND);
        ///////////////////////
        env_crc_update();
        saveenv();
////////////////////////////
        unmap_physmem(buf, len);
        watchdog_reset();
        ////////////////////////////////////////////////////////////////
        //返回1会写入env 已经写过了,这里就不再写了
        return 2;
}[/code]

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-03 21:47:39
认可0
本帖最后由 ngswfx 于 2016-7-3 22:28 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=33080&ptid=11833]ngswfx 发表于 2016-7-3 19:28[/url]
Uboot当中:
nCurMem,nFlashSize对于某个uboot版本来说,都是提前define的固定值,这里用来做基本判断, ...[/quote]

总的来说就是打包产生总包:

升级时先升级uboot部分,跳过env部分后,后面的部分作为一个整体升级。

最后由于kernel,rootfs,app,config,logo等分区情况变化较多,最重要的2个环境变量,在升级后,单独写入env的。

这2个变量,是制作升级包的时候,提前规划好的。

也就是:
CONFIG_BOOTARGS=mem=64M lpj=5996544 console=ttyAMA0,115200 root=/dev/mtdblock3 rootfstype=squashfs  mtdparts=hi_sfc:128K(boot),64K(UB_ENV),1344K(kernel),3008K(rootfs),3072K(APP),512K(Config),64K(LOGO)
CONFIG_BOOTCOMMAND=sf probe 0;sf read 0x81000000 0x30000 0x180000;sf read 0x817F0000 0x7F0000 0x10000;decjpg;setvobg 0 0x0;startvo 0 36 14;startgx 0 0x84fe0000 2048 0 0 1024 768;bootm 0x81000000

///////////////////不同的rootfs格式等。以及各个包的大小位置。

由于kernel,以及squashfs格式的rootfs部分,没有必要弄得更大,所以可以直接按照实际文件大小,直接紧接这写。只要符合spi flash的block要求即可。对于需要支持读写的分区,例如APP以及config,就需要根据地址配置来写入了。我这里Config部分固定是512K,APP部分是按要求走的。

////////你也可以根据自己项目的情况,来自动填写产生CONFIG_BOOTARGS以及CONFIG_BOOTCOMMAND这2个参数。然后在升级成功后,写入env就可以了。这样,就算升级失败了,只要前面的uboot没问题,还是可以再次按照cfg再次升级。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-07-08 14:00:55
认可0
简要地看了一下,是个不错的好东西,但是具体的一些做法还是没太看明白

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-08 15:02:27
认可0
本帖最后由 ngswfx 于 2016-7-8 15:08 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=33511&ptid=11833]药导 发表于 2016-7-8 14:00[/url]
简要地看了一下,是个不错的好东西,但是具体的一些做法还是没太看明白[/quote]

说白了就是把以前的各种包组合成一个bin。

升级的时候,uboot里面处理这个bin.进行升级。

////////////由于整体bin前面有个文件头,这里面的内容,其实被打包前的cfg文件控制。

//这样就可以让升级动作自定义了。也就是说,升级的动作的细节过程其实被升级文件自己控制。如果需要不同的升级方式,修改cfg文件配置即可,而这个打包工具一般不变。

/////我的做法是:直接通过编写sh,从编译uboot 到制作rootfs,中间拷贝应用程序(甚至编译),产生APP包,通过cfg以及mkRecoverBin产生总包bin。全都一个流水线执行。最终结果会产生一个最新版本的总包,直接U盘考文件即可。


//////////估计市场常见的整体升级包,也都是采用类似策略做的总升级包。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-07-08 15:30:55
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33524&ptid=11833]ngswfx 发表于 2016-7-8 15:02[/url]
说白了就是把以前的各种包组合成一个bin。

升级的时候,uboot里面处理这个bin.进行升级。
[/quote]

那这样就是非常好用了,不过像我之前的需求,强制升级,强制升级一次的,用您这样的也不好做吧?uboot下能改ini文件?

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-08 15:41:59
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33531&ptid=11833]药导 发表于 2016-7-8 15:30[/url]
那这样就是非常好用了,不过像我之前的需求,强制升级,强制升级一次的,用您这样的也不好做吧?uboot下 ...[/quote]

uboot下,当然没法改ini cfg文件了。

///这种方法首先要确保uboot本身已经支持这种类型的组合包升级。

如果不支持,就需要先升级uboot。海思默认给的uboot文件肯定不行,需要按照2楼代码修改,使其支持。

////如果当前板子上的uboot已经支持这种组合包了,那升级动作就基本上自定义了,是否升级uboot等,都可控了。

///////我现在一般给用户提供2个文件,一个就是uboot,另外就是recovery.bin。只要通过fastboot把新板子的uboot升级完。把recovery.bin放到u盘里面升级就可以了。

////出厂的板子一般uboot肯定支持了,所以给用户就一个文件recovery.bin即可。

///生产用的方式和这个有些区别。不过稍微修改就可以做生产用的打包工具,主要难度是uboot后面,ENV那64K的内容。其他部分已经基本就位,和现在的方式一样,只需要把前面文件头832字节去掉即可。

////////有空了我研究一下,直接做一个生产flash的打包工具。

goodman

2个粉丝

30

问答

18

专栏

17

资料

goodman 2016-07-08 15:56:50
认可0
目前看你的代码,是支持spi falsh, nand flash yaffs2 或者UBIFS系统就不好弄了吧。

可以将mkRecoveryBin用Qt写个GUI。:lol:lol

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-08 16:02:08
认可0
本帖最后由 ngswfx 于 2016-7-8 16:24 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=33538&ptid=11833]goodman 发表于 2016-7-8 15:56[/url]
目前看你的代码,是支持spi falsh, nand flash yaffs2 或者UBIFS系统就不好弄了吧。

可以将mkRecoveryBi ...[/quote]

对,nand我还没测试,2楼的代码仅仅针对SPI,如果是NAND,估计到时候,有些地方需要调整一下。不过估计问题不大,仅仅修改block大小以及修改那2个命令即可,也就是说包本身改动会比较小。因为具体写的时候,由uboot内部去动作,如果对于yaffs UBIFS等格式命令不太一样,估计需要针对性做一些写入时的差异化处理。

////////////弄个GUI,有些难度了,呵呵。:lol  

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-07-08 18:58:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33540&ptid=11833]ngswfx 发表于 2016-7-8 16:02[/url]
对,nand我还没测试,2楼的代码仅仅针对SPI,如果是NAND,估计到时候,有些地方需要调整一下。不过估计 ...[/quote]

弄个GUI是好主意

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-08 19:50:36
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33553&ptid=11833]药导 发表于 2016-7-8 18:58[/url]
弄个GUI是好主意[/quote]

GUI仅仅去配置CFG了,每次还要打开界面去配置,太折腾,即便做出来,我也用不上,所以没有动力去做呀。:lol

不同芯片,不同的板子,弄不同的cfg文件,放到目录里,直接批处理就执行了。

//不过GUI倒是比较直观,容易理解。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-07-09 11:06:44
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33558&ptid=11833]ngswfx 发表于 2016-7-8 19:50[/url]
GUI仅仅去配置CFG了,每次还要打开界面去配置,太折腾,即便做出来,我也用不上,所以没有动力去做呀。 ...[/quote]

CFG是方便别人用嘛~

david

33个粉丝

368

问答

253

专栏

229

资料

david 2016-07-09 11:57:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33538&ptid=11833]goodman 发表于 2016-7-8 15:56[/url]
目前看你的代码,是支持spi falsh, nand flash yaffs2 或者UBIFS系统就不好弄了吧。

可以将mkRecoveryBi ...[/quote]

好男人可以配套个QT界面 ;P

david

33个粉丝

368

问答

253

专栏

229

资料

david 2016-07-09 12:00:11
认可0
其次LZ忘记了 ,linux下强大工具 dd ,一行shell脚本胜过百行代码。  dd就几句话 ;P

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-09 14:20:21
认可0
本帖最后由 ngswfx 于 2016-7-9 14:45 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=33583&ptid=11833]david 发表于 2016-7-9 12:00[/url]
其次LZ忘记了 ,linux下强大工具 dd ,一行shell脚本胜过百行代码。  dd就几句话[/quote]

主要还是DD命令不熟悉,以前用过几次,后来就没用了。

其实DD用来干这个事,的确容易多了,还不用专门写程序了,直接弄个批处理SH就搞定了。

//制作不同的镜像,修改这个批处理SH即可。

////////////////////////////////
考虑了一下,如果尝试用DD来做这个升级包,主要难度应该在:
1、前面文件头处理部分。可能麻烦些,自己暂时还不知道咋弄。(估计主要还是echo等命令不熟悉)
2、填充可读文件系统后面的oxff(也就是APP实际包大小是3M,但需要写个4M的出来,后面有1M的0xff),这个应该可用替代手段,自己先造一个8M或者16M,全是0xff的文件,然后用DD拷贝特定大小即可。
/////////////////////
//还是某些命令工具,自己用的少,没能达到炉火纯青的地步,思考问题解决手段时,产生限制了。

///////////////////////////////////////////////////////////////////

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-09 15:11:02
认可0
本帖最后由 ngswfx 于 2016-7-9 15:28 编辑

下一步,有空了,准备着手:
CONFIG_BOOTARGS=mem=64M lpj=5996544 console=ttyAMA0,115200 root=/dev/mtdblock3 rootfstype=squashfs  mtdparts=hi_sfc:128K(boot),64K(UB_ENV),1344K(kernel),3008K(rootfs),3072K(APP),512K(Config),64K(LOGO)
这部分内容,添加几个CFG项
OS_MEM_SIZE=64
ROOTFS_MTD_NUM=3
ROOTFS_TYPE=squashfs
然后让程序读取这些配置项,根据实际的kernel rootfs app大小,直接修改产生这个CONFIG_BOOTARGS

/////////这主要由于,在实际使用过程中,rootfs中可能随时加入一些功能库。rootfs分区大小会发生变化,需要做到自适应。这样就不用在命令结束后,根据log信息,检查比对,如果不相同,再来修改CONFIG_BOOTARGS了。

程序运行后的log:
_______start______sizeof(IVHI_RECOVERY):832_argc:2__argv:./mkRecoveryBin recovery3520D_QT.cfg
SPI_NAND_BLOCK_SIZE:64K  //所有分区写入需要64K对齐,由不同的SPI片子block决定
MEM_SIZE:256M
FLASH_SIZE:32M
UBOOT_START_POS:0
UBOOT_END_POS:128K
UBOOT_ENV_SIZE:64K
RECOVERY_START_POS:192K
RECOVERY_END_POS:32704K
CONFIG_BOOTARGS:mem=96M lpj=5996544 console=ttyAMA0,115200 root=/dev/mtdblock3 rootfstype=squashfs  mtdparts=hi_sfc:128K(boot),64K(UB_ENV),1280K(kernel),8320K(rootfs),22400K(APP),512K(Config),64K(LOGO)
CONFIG_BOOTCOMMAND:sf probe 0;sf read 0x81000000 0x30000 0x180000;sf read 0x82FF0000 0x1FF0000 0x10000;decjpg;setvobg 0 0x0;startvo 0 36 14;startgx 0 0x84fe0000 2048 0 0 1024 768;bootm 0x81000000
strOutPutFileName:recovery3520D_256_32M.bin
MAX_LOAD_SUB_FILE_NUM:5
filename 0 :mini-boot_256M_32M.bin size:97032   //uboot实际文件大小
filename 1 :3520D_uImage_mini.bin size:1305260 //kernel实际文件大小
filename 2 :squashfs_NGS-root_256_QT.img size:8454144 //rootfs实际文件大小
filename 3 :APP_3520D_QT.img size:5505424 //APP实际文件大小 5M多
filename 4 :Config.img size:1112 //Config实际文件大小
version :1468047884
file:./3520D_uImage_mini.bin size:1305260 miniblockWriteSize:1280K            //kernel写入分区大小
file:./squashfs_NGS-root_256_QT.img size:8454144 miniblockWriteSize:8320K     //rootfs写入分区大小
file:./APP_3520D_QT.img size:5505424 miniblockWriteSize:22400K                    //App写入分区大小 可读写分区,jffs2格式,所以实际写入大小22M多远大于文件大小5M         
file:./Config.img size:1112 miniblockWriteSize:512K                                  //Config 写入分区大小,可读写分区
________end___________

pichen

0个粉丝

0

问答

0

专栏

0

资料

pichen 2016-07-09 15:48:01
认可0
ZHICHIYIXIA

wu0

0个粉丝

7

问答

0

专栏

1

资料

wu0 2017-10-16 18:11:20
认可0
mark 好帖子!!后面参考看看

helphel

0个粉丝

4

问答

0

专栏

0

资料

helphel 2017-10-16 18:48:02
认可0

mark 好帖子!!后面参考看看

qn1551937081

0个粉丝

12

问答

0

专栏

0

资料

qn1551937081 2019-03-27 16:13:28
认可0
没有EBC,咋都这么势力呀

anlmb

0个粉丝

1

问答

0

专栏

0

资料

anlmb 2017-10-13 02:07:17
认可0
mark:@:):o
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区