📄 nand-createbbt.patch
字号:
This patch adds user-requested BBT creation. It includes the following changes:- common/cmd_nand.c: move yes/no decision to separate function- do_nand: ask for confirmation for "nand erase"- do_nand: add command "nand createbbt" to erase NAND and create a new BBTExperimental.- Werner Almesberger <werner@openmoko.org>Index: u-boot/common/cmd_nand.c===================================================================--- u-boot.orig/common/cmd_nand.c+++ u-boot/common/cmd_nand.c@@ -162,6 +162,17 @@ return 0; } +static int yes(void)+{+ char c;++ c = getc();+ if (c != 'y' && c != 'Y')+ return 0;+ c = getc();+ return c == '\r' || c == '\n';+}+ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { int i, dev, ret;@@ -227,7 +238,8 @@ strncmp(cmd, "read", 4) != 0 && strncmp(cmd, "write", 5) != 0 && strcmp(cmd, "scrub") != 0 && strcmp(cmd, "markbad") != 0 && strcmp(cmd, "biterr") != 0 &&- strcmp(cmd, "lock") != 0 && strcmp(cmd, "unlock") != 0 )+ strcmp(cmd, "lock") != 0 && strcmp(cmd, "unlock") != 0 &&+ strcmp(cmd, "createbbt") != 0 ) goto usage; /* the following commands operate on the current device */@@ -282,13 +294,23 @@ "are sure of what you are doing!\n" "\nReally scrub this NAND flash? <y/N>\n"); - if (getc() == 'y' && getc() == '\r') {+ if (yes()) { opts.scrub = 1; } else { puts("scrub aborted\n"); return -1; } }+ else {+ if (opts.length == nand->size) {+ puts("Really erase everything ? <y/N>\n");+ if (!yes()) {+ puts("erase aborted\n");+ return -1;+ }+ }+ }+ ret = nand_erase_opts(nand, &opts); printf("%s\n", ret ? "ERROR" : "OK"); @@ -457,6 +479,33 @@ return 0; } + if (strcmp(cmd, "createbbt") == 0) {+ struct nand_chip *nand_chip = nand->priv;+ nand_erase_options_t opts;++ puts("Create BBT and erase everything ? <y/N>\n");+ if (!yes()) {+ puts("createbbt aborted\n");+ return -1;+ }+ memset(&opts, 0, sizeof(opts));+ opts.length = nand->size;+ if (nand_erase_opts(nand, &opts)) {+ puts("Erase failed\n");+ return 1;+ }+ nand_chip->options &= ~NAND_DONT_CREATE_BBT;+ puts("Creating BBT. Please wait ...");+ if (nand_default_bbt(nand)) {+ puts("\nFailed\n");+ return 1;+ }+ else {+ puts("\n");+ return 0;+ }+ }+ usage: printf("Usage:\n%s\n", cmdtp->usage); return 1;@@ -477,7 +526,8 @@ "nand markbad off - mark bad block at offset (UNSAFE)\n" "nand biterr off - make a bit error at offset (UNSAFE)\n" "nand lock [tight] [status] - bring nand to lock state or display locked pages\n"- "nand unlock [offset] [size] - unlock section\n");+ "nand unlock [offset] [size] - unlock section\n"+ "nand createbbt - create bad block table\n"); static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand, ulong offset, ulong addr, char *cmd)Index: u-boot/drivers/mtd/nand/nand_bbt.c===================================================================--- u-boot.orig/drivers/mtd/nand/nand_bbt.c+++ u-boot/drivers/mtd/nand/nand_bbt.c@@ -795,7 +795,8 @@ len = mtd->size >> (this->bbt_erase_shift + 2); /* Allocate memory (2bit per block) */- this->bbt = kmalloc (len, GFP_KERNEL);+ if (!this->bbt)+ this->bbt = kmalloc (len, GFP_KERNEL); if (!this->bbt) { printk (KERN_ERR "nand_scan_bbt: Out of memory\n"); return -ENOMEM;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -