--- u-boot-orig/common/cmd_flash.c 2004-12-31 01:32:50.000000000 -0800 +++ u-boot-1.1.2/common/cmd_flash.c 2005-09-13 23:00:14.000000000 -0700 @@ -36,6 +36,11 @@ extern flash_info_t flash_info[]; /* info for FLASH chips */ +static const unsigned int JFFS2_CLEAN_HEADER[] = { 0x20031985, + 0x0000000c, + 0xe41eb0b1 + }; + /* * The user interface starts numbering for Flash banks with 1 * for historical reasons. @@ -206,29 +211,46 @@ flash_print_info (&flash_info[bank-1]); return 0; } +void jffs2_write_header(flash_info_t *info, unsigned int first, unsigned int last) +{ + unsigned int i; + for(i=first; i<=last; i++) + { + flash_write(JFFS2_CLEAN_HEADER, info->start[i], 12); + } +} + int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { flash_info_t *info; ulong bank, addr_first, addr_last; int n, sect_first, sect_last; #if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE) struct mtd_device *dev; struct part_info *part; u8 dev_type, dev_num, pnum; #endif int rcode = 0; + int jffs2erase = 0; if (argc < 2) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } + // Special JFFS2 erase which will write a JFFS2 "clean" header after the erase + if('j' == argv[0][0]) + { + jffs2erase = 1; + } + if (strcmp(argv[1], "all") == 0) { for (bank=1; bank<=CFG_MAX_FLASH_BANKS; ++bank) { printf ("Erase Flash Bank # %ld ", bank); info = &flash_info[bank-1]; rcode = flash_erase (info, 0, info->sector_count-1); + if(jffs2erase) jffs2_write_header(info, 0, info->sector_count-1); } return rcode; } @@ -235,6 +257,7 @@ printf ("Erase Flash Sectors %d-%d in Bank # %d ", sect_first, sect_last, (info-flash_info)+1); rcode = flash_erase(info, sect_first, sect_last); + if(jffs2erase) jffs2_write_header(info, sect_first, sect_last); return rcode; } @@ -253,6 +276,7 @@ printf ("Erase Flash Bank # %ld ", bank); info = &flash_info[bank-1]; rcode = flash_erase (info, 0, info->sector_count-1); + if(jffs2erase) jffs2_write_header(info, 0, info->sector_count-1); return rcode; } @@ -264,6 +288,12 @@ return 1; } + if (jffs2erase) + { + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } + rcode = flash_sect_erase(addr_first, addr_last); return rcode; } @@ -517,6 +547,16 @@ ); U_BOOT_CMD( + jerase, 3, 1, do_flerase, + "jerase - erase FLASH memory for JFFS2\n", + "jerase N:SF[-SL]\n - erase sectors SF-SL in FLASH bank # N\n" + "jerase bank N\n - erase FLASH bank # N\n" + "jerase all\n - erase all FLASH banks\n" + " in each case, after erasing a flash sector, that sector\n" + " has a JFFS2 'clean' marker written to it\n" +); + +U_BOOT_CMD( protect, 4, 1, do_protect, "protect - enable or disable FLASH write protection\n", "on start end\n"