怎样让google收录网站,网站建设费计入 科目,桐庐城乡建设局网站,应用软件设计过程这边文章讲述的是坏快检测功能
思路#xff1a;
1.第一次烧录固件会实现跳坏块#xff0c;但是后续使用会导致坏块的产生#xff1b;
于是我在uboot环境变量添加了两个变量来控制坏快
lb_badnum //坏块个数
lb_badoff //坏块所在位置 2.第一次开机会根据lb_badnum是否…这边文章讲述的是坏快检测功能
思路
1.第一次烧录固件会实现跳坏块但是后续使用会导致坏块的产生
于是我在uboot环境变量添加了两个变量来控制坏快
lb_badnum //坏块个数
lb_badoff //坏块所在位置 2.第一次开机会根据lb_badnum是否存在判断,如果不存在则保存上面坏块信息,跳过坏块功能
3.第二次开机之后会获取环境变量lb_badnum和lb_badoff;
3.1.然后检测实际坏块数,进行对比,如果有新增坏块, 则判断新坏块产生的所在分区;
3.2.然后判断所在分区坏块大小加上固件大小后是否超出划分的分区空间;
3.3.执行对应的分区还原; commit 0ae66e0a3d1366aa90b4661b86203345f4ae02bd (HEAD - master)
Author: longmin 1938049502qq.com
Date: Tue Dec 10 16:44:44 2024 0800add cmd_lbbad.c support bad block detection functiondiff --git a/boot/common/Kconfig b/boot/common/Kconfig
index 516a279af..11cb2c30a 100755
--- a/boot/common/Kconfigb/boot/common/Kconfig-365,4 365,10 config XZconfig MZbool MZconfig SILENT_CONSOLE
- bool SILENT_CONSOLE
\ No newline at end of filebool SILENT_CONSOLEconfig CMD_LBBADbool LBBADhelpThis enables the command CONFIG_CMD_LBBAD power on detection of badblocks.
\ No newline at end of file
diff --git a/boot/common/Makefile b/boot/common/Makefile
index 85ba0bffd..0d54285f5 100755
--- a/boot/common/Makefileb/boot/common/Makefile-344,4 344,5 endifobj-$(CONFIG_CMD_LBCHK) cmd_lbchk.oobj-$(CONFIG_CMD_LBFDT) cmd_lbfdt.o
obj-$(CONFIG_CMD_LBBAD) cmd_lbbad.oobj-y cmd_sar.o
diff --git a/boot/common/autoboot.c b/boot/common/autoboot.c
index 60f7b2291..927dcd18a 100755
--- a/boot/common/autoboot.cb/boot/common/autoboot.c-585,6 585,10 void autoboot_command(const char *s)boot:debug(### main_loop: bootcmd\%s\\n, s ? s : UNDEFINED);
#if defined (CONFIG_CMD_LBBAD)extern int run_lbbadblock(void);run_lbbadblock(); /* bad block inspection */
#endif#if defined (CONFIG_CMD_LBCHK) defined (LONBON_CHECK_RUNCMD)extern int run_lbcheck(int cmd);run_lbcheck(LONBON_CHECK_RUNCMD);
diff --git a/boot/common/cmd_lbbad.c b/boot/common/cmd_lbbad.c
new file mode 100755
index 000000000..5bfa4890c
--- /dev/nullb/boot/common/cmd_lbbad.c-0,0 1,503
#include common.h^M
#include command.h^M
#include malloc.h^M
#include nand.h^M
#include u-boot/md5.h^M
#include asm/io.h^M
#include spi.h^M
#include spi_flash.h^M
#if (1 CONFIG_LONBON_LED) || (1 LONBON_CMD_CHECK_2BTN_FOR_RESTORE)^M
#include ../drivers/mstar/gpio/infinity2m/gpio.h^M
#include ../drivers/mstar/gpio/drvGPIO.h^M
#endif^M
^M
//#define LB_DEBUG^M
^M
#ifdef LB_DEBUG^M
#define LBCHK_DEBUG(msg...) printf(msg)^M
#else^M
#define LBCHK_DEBUG(msg...) do{}while(0)^M
#endif^M
^M
typedef int BOOL;^M
^M
#ifndef FALSE^M
#define FALSE 0^M
#endif^M
^M
#ifndef TRUE^M
#define TRUE 1^M
#endif^M
^M
#ifdef CONFIG_YAFFS2^M
extern void cmd_yaffs_devconfig(char *mp, int flash_dev, int start_block, int end_block);^M
extern void cmd_yaffs_mount(char *mp);^M
extern void cmd_yaffs_umount(char *mp);^M
extern void cmd_yaffs_mread_file(char *fn, char *addr);^M
#endif^M
^M
#define BADBLOCK_MAX 200^M
^M
extern int lb_nand_get_badblock_number(ulong *badblock_list);^M
extern int lbcmd_get_imagename_by_cmd(char* imgname, unsigned char cmd);^M
extern int lonbon_get_partitions(const char *part_name, uint *part_offset, uint *part_size);^M
extern int lonbon_get_partitions_name(uint *off, char *part_name, uint *part_offset, uint *part_size);^M
extern int lb_nand_flash_partition_baseAddr(const char *part_name, uint *part_offset, uint *part_size);^M
^M
typedef struct {^Mint uboot;^Mint kernel;^Mint rootfs;^Mint backup;^Mint ro;^Mint rw;^Mint ipl;^Mint ipl_cust;^Mint logo;^Mint factory;^Mint lbcmd;^Mint lbflash;^Mint lbcfg;^Mint env;^Mint key_cust;^M
} lb_bad_partition_t;^M
^M
int lonbon_set_badnum(int number)^M
{^Munsigned char badnum[2];^Mif(number 0) {^Mmemset(badnum,0,2);^Mbadnum[0] number 0x30;^Msetenv(lb_badnum, (const char *)badnum);^Mrun_command(saveenv, 0);^Mreturn 0;^M}^Mreturn -1;^M
}^M
^M
int lonbon_get_badnum(void)^M
{^Mchar * lb_badnum getenv(lb_badnum);^Munsigned char badnum[2];^M
^Mif(lb_badnum) {^Mbadnum[0] *lb_badnum - 0x30;^Mprintf(old bad_block number %d\n,badnum[0]);^Mreturn badnum[0];^M}else{^Mprintf(%s lb_badnumnull\n, __func__);^Mreturn -1;^M}^Mreturn 0;^M
}^M
^M
int lonbon_number_exist(int all_number, ulong *badblock_list, ulong number){^Mint i;^Mfor(i0; i all_number; i)^M{^Mif(*(badblock_listi) number)^M{^Mreturn i;^M}^M}^Mreturn -1;^M
}^M
^M
int lonbon_new_badblock(int all_number, ulong *badblock_list, int env_number, ulong *old_badblock_list,ulong *add_badblock_list)^M
{^Mint i, j, k 0;^Mbool flag;^Mfor (i0; i all_number; i){^Mflag false;^Mfor (j0; j all_number; j){^Mif( badblock_list[i] old_badblock_list[j] )^Mflag true;^M}^M
^Mif(flag false){^M*(add_badblock_list k) badblock_list[i];^Mk;^M}^M
^M}^M
^Mreturn 0;^M
}^M
^M
^M
int lonbon_get_bad_offset(int all_number, ulong *badblock_list, int number)^M
{^Mint i;^Mchar *lb_badoff getenv(lb_badoff);^Mchar badb_offset[1024] {0};^Mulong old_badb_list[all_number];^Mulong *old_badblock_list old_badb_list[0];^Mulong add_badb_list[all_number];^Mulong *add_badblock_list add_badb_list[0];^Mchar *lb_bad_off;^Mulong num;^M
^Mif(all_number 0){^Mprintf(%s not badblock_list\n, __func__);^Mreturn 0;^M}^M
^Mif(lb_badoff){^Mstrcpy(badb_offset,lb_badoff);^Mlb_bad_off strtok(badb_offset, -);^Mnum simple_strtol(lb_bad_off, NULL, 16);^Mold_badb_list[0] num;^Mfor(i1; i all_number;i ){^Mlb_bad_off strtok(NULL ,-);^Mnum simple_strtol(lb_bad_off, NULL, 16);^Mold_badb_list[i] num;^M}^M}^M/* determine the partition location of the new bad block */^Mlonbon_new_badblock(all_number, badblock_list, number, old_badblock_list, add_badblock_list);^Mfor(i0; i all_number; i){^M*(badblock_list i) 0;^M}^Mfor(i0; inumber;i){^M*(badblock_list i) add_badb_list[i];^M}^M
^Mreturn 1;^M
}^M
^M
int lonbon_set_bad_offset(int number, ulong *badblock_list)^M
{^Mint i;^Mchar commandline[10] {0};^Mchar badb_addr[1024] {0};^Mif(number 0) {^Mif(number 0) {^Mfor(i0;inumber;i){^Msprintf(commandline,%08lx-, *(badblock_listi));^Mstrcat(badb_addr,commandline);^M}^M}^Mprintf(lonbon_set_bad_offset badblock_list:%s\n,badb_addr);^Msetenv(lb_badoff, (const char *)badb_addr);^Mrun_command(saveenv, 0);^Mreturn number;^M}^Mreturn 0;^M
}^M
^M
int lonbon_set_partitions(lb_bad_partition_t *lb_part, char *part_name)^M
{^M//printf(%s %s \n,__func__,part_name);^Mif(strcmp(part_name, UBOOT0) 0||strcmp(part_name, UBOOT1) 0){^Mlb_part-uboot 1;^M}else if(strcmp(part_name, rootfs) 0){^Mlb_part-rootfs 1;^M}else if(strcmp(part_name, KERNEL) 0||strcmp(part_name, RECOVERY) 0){^Mlb_part-kernel 1;^M}else if(strcmp(part_name, backup) 0){^Mlb_part-backup 1;^M}else if(strcmp(part_name, ro) 0){^Mlb_part-ro 1;^M}else if(strcmp(part_name, rw) 0){^Mlb_part-rw 1;^M}else if(strcmp(part_name, IPL0) 0||strcmp(part_name, IPL1) 0){^Mlb_part-ipl 1;^M}else if(strcmp(part_name, IPL_CUST0) 0||strcmp(part_name, IPL_CUST1) 0){^Mlb_part-ipl_cust 1;^M}else if(strcmp(part_name, LOGO) 0){^Mlb_part-logo 1;^M}else if(strcmp(part_name, factory) 0){^Mlb_part-factory 1;^M}else if(strcmp(part_name, lbcmd) 0){^Mlb_part-lbcmd 1;;^M}else if(strcmp(part_name, lbflash) 0||strcmp(part_name, lbflash2) 0){^Mlb_part-lbflash 1;^M}else if(strcmp(part_name, lbcfg) 0||strcmp(part_name, lbcfg2) 0){^Mlb_part-lbcfg 1;^M}else if(strcmp(part_name, ENV) 0||strcmp(part_name, ENV1) 0){^Mlb_part-env 1;^M}else if(strcmp(part_name, KEY_CUST) 0){^Mlb_part-key_cust 1;^M}else{^Mreturn -1;^M}^M
^Mreturn 0;^M
}^M
^M
void lonbon_printf_bad(int num){^M
^Mswitch (num)^M{^Mcase 0: printf(\n);^Mprintf(##############################################################################\n);^Mprintf(##############################################################################\n);^Mprintf(############################ bad block list:##################################\n);^Mbreak;^Mcase 1: printf(\nstart all bad block list:\n);^Mbreak;^Mcase 2: printf(\n);^Mprintf(add bad block:\n);^Mprintf(\n);^Mbreak;^Mcase 3: printf(\n);^Mprintf(##############################################################################\n);^Mprintf(##############################################################################\n);^Mprintf(\n);^Mbreak;^M}^M
^M
}^M
^M
uint lonbon_get_pattition_firmware_size(char *fileName){^Mchar *mntpoint /factory;^Muint part_offset;^Muint part_size;^Mint start_block;^Mint end_block;^M
^Mchar filename[100] {0};^Munsigned long addr 0x21000000;^Mlb_nand_flash_partition_baseAddr(factory, part_offset, part_size);^Mif(!part_offset || !part_size) {^Mprintf(#ERROR: No factory partition is found\n);^Mreturn -1;^M}^M
^Mstart_block part_offset/(128*1024); /* Nand flash block size is 128 KB */^Mend_block (part_offsetpart_size)/(128*1024)-1;^M
^Mcmd_yaffs_devconfig(mntpoint,0,start_block,end_block);^Mcmd_yaffs_mount(mntpoint);^Msprintf(filename, %s/%s, mntpoint, fileName);^Mcmd_yaffs_mread_file(filename, (char *)addr);^Mchar *str_env getenv(filesize);^Mulong filesize simple_strtoul(str_env, NULL, 16);^Msize_t blocksize nand_info[0].erasesize;^Mulong wsize(filesize/blocksize1)*blocksize;^Mcmd_yaffs_umount(mntpoint);^Mprintf(longbon filename%s str_env%s filesize%lx wsize%lx \n,filename,str_env,filesize,wsize);^Mreturn wsize;^M
^M
}^M
^M
int lonbon_pattition_firmware_size(unsigned char cmd, char *part_name, int bad_number)^M
{^Mchar firmware_name[32] {0};^Mchar *firmware_part_name firmware_name[0];^Muint part_offset, part_size;^Mulong firmware_size, firmware_size_bad;^Msize_t blocksize nand_info[0].erasesize;^M
^M/* get firmware name */^Mlbcmd_get_imagename_by_cmd(firmware_part_name, cmd);^M/* get firmware size */^Mfirmware_size lonbon_get_pattition_firmware_size(firmware_part_name);^M/* the size after adding the bad block */^Mfirmware_size_bad firmware_size ( blocksize * bad_number);^M/* get partitions total size */^Mlonbon_get_partitions(part_name, part_offset, part_size);^M
^M/* partitions total size firmware size add bad block size */^Mif( part_size firmware_size_bad)^M{^Mprintf(\nlonbon %s is OK! part_size%x firmware_size_bad%lx \n,__func__,part_size,firmware_size_bad);^Mreturn 1;^M}^Melse {^Mprintf(\nlonbon %s error!! part_size%x firmware_size_bad%lx \n,__func__,part_size,firmware_size_bad);^Mreturn -1;^M}^Mreturn 0;^M
}^M
^M
void lonbon_printf_bad_block(lb_bad_partition_t *lb_bad_partition, int number, ulong *bad_list, int new_number, ulong *new_bad_list){^M
^Mint i, ret, flags 0;^Mchar write[20] { };^Mchar *write_t write[0];^Mchar part_name[10] {0};^Mchar *part_name_t part_name[0];^Mulong *badblock_list bad_list;^Mchar commandline[30] {0};^Muint lbflash_offset 0,lbflash_size 0;^M
^Mif(new_number 0){^Mlonbon_printf_bad(1);^M}^Mfor(i0; i number; i){^Mmemset(part_name,0,sizeof(part_name));^Mlonbon_get_partitions_name((uint *) *(badblock_listi), part_name_t, lbflash_offset, lbflash_size);^Mprintf(bad[%d]0x%08lx name%s off0x%08x size0x%08x end0x%08x \n,^Mi, *(badblock_listi), part_name_t, lbflash_offset, lbflash_size ,(lbflash_offset lbflash_size -1) );^M}^Mif(new_number 0){^Mlonbon_printf_bad(2);^Mfor(i0; i new_number; i){^Mprintf( 0x%08lx \n, *(new_bad_list i));^M}^M}^Mif(lb_bad_partition-factory 0){^Mprintf(\n warn factory partition are bad blocks !!!\n\n);^M}^Mif(lb_bad_partition-uboot 0){^Mprintf(\n warn uboot partition are bad blocks !!!\n\n);^Mret lonbon_pattition_firmware_size(1,uboot,lb_bad_partition-uboot);^Mif(ret 0){^Mstrcat(write,1 );^Mflags;^M}else{^Mprintf(\n%s error!!!uboot insufficient partition space !!!\n,__func__ );^M}^M}^Mif(lb_bad_partition-kernel 0){^Mprintf(\n warn kernel partition are bad blocks !!!\n\n);^Mret lonbon_pattition_firmware_size(2,kernel,lb_bad_partition-kernel);^Mif(ret 0){^Mstrcat(write,2 );^Mflags;^M}else{^Mprintf(\n%s error!!!kernel insufficient partition space !!!\n,__func__ );^M}^M}^Mif(lb_bad_partition-rootfs 0){^Mprintf(\n warn rootfs partition are bad blocks !!!\n\n);^Mret lonbon_pattition_firmware_size(3,rootfs,lb_bad_partition-rootfs);^Mif(ret 0){^Mstrcat(write,3 );^Mflags;^M}else{^Mprintf(\n%s error!!!rootfs insufficient partition space !!!\n,__func__ );^M}^M}^Mif(lb_bad_partition-backup 0){^Mprintf(\n warn backup partition are bad blocks !!!\n\n);^M}^Mif(lb_bad_partition-ro 0){^Mprintf(\n warn ro partition are bad blocks !!!\n\n);^M}^Mif(lb_bad_partition-rw 0){^Mprintf(\n warn rw partition are bad blocks !!!\n\n);^M}^Mif(lb_bad_partition-ipl 0){^Mprintf(\n warn ipl partition are bad blocks !!!\n\n);^Mret lonbon_pattition_firmware_size(6,ipl,lb_bad_partition-ipl);^Mif(ret 0){^Mstrcat(write,6 );^Mflags;^M}else{^Mprintf(\n%s error!!!ipl insufficient partition space !!!\n,__func__ );^M}^M}^Mif(lb_bad_partition-ipl_cust 0){^Mprintf(\n warn ipl_cust partition are bad blocks !!!\n\n);^Mret lonbon_pattition_firmware_size(7,ipl,lb_bad_partition-ipl_cust);^Mif(ret 0){^Mstrcat(write,7 );^Mflags;^M}else{^Mprintf(\n%s error!!!ipl_cust insufficient partition space !!!\n,__func__ );^M}^M}^Mif(lb_bad_partition-logo 0){^Mprintf(\n warn logo partition are bad blocks !!!\n\n);^Mret lonbon_pattition_firmware_size(8,logo,lb_bad_partition-logo);^Mif(ret 0){^M//run_command(lbupgrade write 8, 0);^Mstrcat(write,8 );^Mflags;^M}else{^Mprintf(\n%s error!!!logo insufficient partition space !!!\n,__func__ );^M}^M}^M
^Mif (flags 0){^Msprintf(commandline,lbupgrade write %s, write_t);^Mprintf(\nlonbon %s run_command: %s !!!\n, __func__ , commandline);^Mrun_command(commandline, 0);^M}^M
^Mlonbon_printf_bad(3);^M
^M
}^M
^M
/* bad block inspection */^M
int run_lbbadblock(void) ^M
{^Mlb_bad_partition_t lb_bad_partition {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};^Mlb_bad_partition_t *lb_bad_partition_r lb_bad_partition;^Mint ret, i;^Mchar part_name[10] {0};^Mchar *part_name_t part_name[0];^Muint lbflash_offset 0,lbflash_size 0;^Mulong badblock_list[BADBLOCK_MAX];^Mulong *list_badblock badblock_list[0];^Mint badblock_number , lb_badnum;^Mbool new_badblock false;^M
^Mlonbon_printf_bad(0);^Mmemset(badblock_list,0,sizeof(badblock_list));^Mbadblock_number lb_nand_get_badblock_number(list_badblock);^Mulong bad_list[badblock_number];^Mulong *bad_list_t bad_list[0];^M
^Mfor( i 0; i badblock_number; i){^Mbad_list[i] badblock_list[i];^M}^M
^Mif(badblock_number 0){^Mprintf(error! get badblock number failed! :%d\n,badblock_number);^Mreturn badblock_number;^M}else{^Mprintf(bad badblock number: %d\n,badblock_number);^M}^M
^Mlb_badnum lonbon_get_badnum();/* get lb_badnum */^Mif(lb_badnum 0){ /* the first burning is not processed */^M
^Mret lonbon_set_badnum(badblock_number);/* directly save the number of burned blocks */^Mif(ret 0){^Mprintf(error %s badblock_numbernull\n,__func__);^M}^Mprintf(lonbon %s init badblock\n,__func__);^Mret lonbon_set_bad_offset(badblock_number, list_badblock);/* save bad block address*/^Mlonbon_printf_bad(3);^Mreturn 0;^M
^M}else{ /* after the second boot, go here */^Mif(badblock_number lb_badnum){ /* equal means there are no bad blocks */^Mprintf(lonbon %s not new badblock\n,__func__);^M
^M}else{ /* unequal means there are bad blocks */^Mprintf(%s new badblock number %d\n,__func__, badblock_number - lb_badnum);^Mret lonbon_set_badnum(badblock_number);^Mif(ret 0){^Mprintf(error %s badblock_numbernull\n,__func__);^M}else{^Mnew_badblock true; /* mark the newly added bad block symbol */^M}^M}^M}^M
^Mif(new_badblock true ){/* there are new bad blocks added */^M/* Get env bad block address */^Mret lonbon_get_bad_offset(badblock_number, list_badblock ,badblock_number - lb_badnum);^M
^Mfor(i0; i badblock_number - lb_badnum; i){^Mmemset(part_name,0,sizeof(part_name));^Mlonbon_get_partitions_name((uint *) badblock_list[i], part_name_t, lbflash_offset, lbflash_size);^Mret lonbon_set_partitions(lb_bad_partition_r, part_name_t);^M}^Mprintf(%s new_badblocktrue\n,__func__);^M
^M}^M
^Mlonbon_printf_bad_block(lb_bad_partition_r, badblock_number, bad_list_t, badblock_number - lb_badnum, list_badblock);^M
^Mif(new_badblock true){/* if a new bad block is added, restart and enter restore mode */^Mret lonbon_set_bad_offset(badblock_number, bad_list_t);/* save bad block address */^Mnew_badblock false;^Mrun_command(reset, 0);^M}^Mreturn 0;^M
}^M
diff --git a/boot/common/cmd_mtdparts.c b/boot/common/cmd_mtdparts.c
index f6940a6f2..172750152 100755
--- a/boot/common/cmd_mtdparts.cb/boot/common/cmd_mtdparts.c-1331,6 1331,63 int lonbon_get_partitions(const char *part_name, uint *part_offset, uint *part_s}return -1;}int lonbon_strcpy_name(char *part_name,char *name)
{char str[10];int len,i;strcpy(str,name);len strlen(str);for(i0; i len; i){*(part_namei) str[i];}return 0;
}
/**
* obtain the partition name of the address by passing it through.
*/int lonbon_get_partitions_name(uint *off, char *part_name, uint *part_offset, uint *part_size)
{struct list_head *dentry, *pentry;struct part_info *part;struct mtd_device *dev;int part_num;uint *part_offset_closure;if (!part_name) {printf(the part name is empty\n);//return -1;}if (list_empty(devices)) {printf(the partitions list is empty\n);return -1;}if (mtdparts_init() ! 0)return -1;list_for_each(dentry, devices) {dev list_entry(dentry, struct mtd_device, link);part_num 0;list_for_each(pentry, dev-parts) {part list_entry(pentry, struct part_info, link);//printf(%2d:%s 0x%08llx 0x%08llx\n,part_num, part-name, part-size,part-offset);part_offset_closure part-offset part-size;if(part_offset_closure off){lonbon_strcpy_name(part_name,part-name);*part_offset part-offset;*part_size part-size;return 0;}part_num;}}return -1;
}
#endif/*** Format and print out a partition list for each device from global device
diff --git a/boot/common/cmd_nand.c b/boot/common/cmd_nand.c
index 64b0bd26b..022696de3 100755
--- a/boot/common/cmd_nand.cb/boot/common/cmd_nand.c-718,10 718,14 static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])nand nand_info[dev];if (strcmp(cmd, bad) 0) {
- printf(\nDevice %d bad blocks:\n, dev);int j 0;//printf(\nDevice %d bad blocks:\n, dev);for (off 0; off nand-size; off nand-erasesize)
- if (nand_block_isbad(nand, off))if (nand_block_isbad(nand, off)){printf( %08llx\n, (unsigned long long)off);j;}printf(bad number %d blocks:\n, j);return 0;} -1466,6 1470,31 static int lb_nand_erase(uint start_addr, uint part_size, uint length)return 0;}
#define BADBLOCK_MAX 200
int lb_nand_get_badblock_number(ulong *badblock_list)
{int j 0;ulong off,badblock_addr[BADBLOCK_MAX];nand_info_t *nand nand_info[0];char commandline[16];char badb_addr[1024];memset(badblock_addr,0,sizeof(badblock_addr));memset(commandline,0,sizeof(commandline));memset(badb_addr,0,sizeof(badb_addr));printf(\n);for (off 0; off nand-size; off nand-erasesize)if (nand_block_isbad(nand, off)){//printf(lonbon bad blocks %08llx\n, (unsigned long long)off);badblock_addr[j] off;j;}printf(\n);for(int i 0; i j; i){//printf(\nlonbon %08lx\n, badblock_addr[i]);badblock_list[i] badblock_addr[i];}return j;
}int lb_nand_flash_partition_baseAddr(const char *part_name, uint *part_offset, uint *part_size){-1492,7 1521,7 int lb_nand_flash_partition_read(const char *part_name,char* buff,const int lengreturn -1;}- retlb_nand_read(lbflash_offset,lbflash_size, lengthlbflash_size?lbflash_size:len,(void *) buff);ret lb_nand_read(lbflash_offset,lbflash_size, lengthlbflash_size?lbflash_size:len,(void *) buff);//_print_hex_string(buff,length); //TEST ONLYreturn ret;}
diff --git a/boot/include/configs/infinity2m.h b/boot/include/configs/infinity2m.h
index c5d5d8ea1..19a44747b 100755
--- a/boot/include/configs/infinity2m.hb/boot/include/configs/infinity2m.h-39,6 39,7 #define LONBONVOIP#ifdef LONBONVOIP#define CONFIG_CMD_LBCHK
#define CONFIG_CMD_LBBAD#define CONFIG_LB_MD5#define CONFIG_IDENT_STRING LonBon Technology #define LONBONVOIP_REALM voip.lonbon.com 第一次开机 第二次开机 第N次开机后产生新坏块