📄 cmd_nand.c
字号:
opts.quiet = quiet; ret = nand_write_opts(nand, &opts); } }else if ( s != NULL && !strcmp(s, ".yaffs")){ if (read) { /* read */ nand_read_options_t opts; memset(&opts, 0, sizeof(opts)); opts.buffer = (u_char*) addr; opts.length = size; opts.offset = off; opts.readoob = 1; opts.quiet = quiet; ret = nand_read_opts(nand, &opts); } else { /* write */ nand_write_options_t opts; memset(&opts, 0, sizeof(opts)); opts.buffer = (u_char*) addr; opts.length = size; opts.offset = off; /* opts.forceyaffs = 1; */ opts.noecc = 1; opts.writeoob = 1; opts.blockalign = 1; opts.quiet = quiet; opts.skipfirstblk = 1; ret = nand_write_opts(nand, &opts); } }else if ( s != NULL && !strcmp(s, ".raw")){ if (read) { /* read */ nand_read_options_t opts; memset(&opts, 0, sizeof(opts)); opts.buffer = (u_char*) addr; opts.length = size; opts.offset = off; opts.readoob = 0; opts.quiet = quiet; opts.noecc = 1; opts.nocheckbadblk = 1; ret = nand_read_opts(nand, &opts); } else { /* write */ nand_write_options_t opts; memset(&opts, 0, sizeof(opts)); opts.buffer = (u_char*) addr; opts.length = size; opts.offset = off; /* opts.forceyaffs = 1; */ opts.noecc = 1; opts.writeoob = 0; opts.blockalign = 1; opts.quiet = quiet; opts.skipfirstblk = 0; opts.nocheckbadblk = 1; ret = nand_write_opts(nand, &opts); } } else { if (read) ret = nand_read(nand, off, &size, (u_char *)addr); else ret = nand_write(nand, off, &size, (u_char *)addr); } printf(" %d bytes %s: %s\n", size, read ? "read" : "written", ret ? "ERROR" : "OK"); return ret == 0 ? 0 : 1; } if (strcmp(cmd, "markbad") == 0) { addr = (ulong)simple_strtoul(argv[2], NULL, 16); int ret = nand->block_markbad(nand, addr); if (ret == 0) { printf("block 0x%08lx successfully marked as bad\n", (ulong) addr); return 0; } else { printf("block 0x%08lx NOT marked as bad! ERROR %d\n", (ulong) addr, ret); } return 1; } if (strcmp(cmd, "biterr") == 0) { /* todo */ return 1; } if (strcmp(cmd, "lock") == 0) { int tight = 0; int status = 0; if (argc == 3) { if (!strcmp("tight", argv[2])) tight = 1; if (!strcmp("status", argv[2])) status = 1; } if (status) { ulong block_start = 0; ulong off; int last_status = -1; struct nand_chip *nand_chip = nand->priv; /* check the WP bit */ nand_chip->cmdfunc (nand, NAND_CMD_STATUS, -1, -1); printf("device is %swrite protected\n", (nand_chip->read_byte(nand) & 0x80 ? "NOT " : "" ) ); for (off = 0; off < nand->size; off += nand->oobblock) { int s = nand_get_lock_status(nand, off); /* print message only if status has changed * or at end of chip */ if (off == nand->size - nand->oobblock || (s != last_status && off != 0)) { printf("%08x - %08x: %8d pages %s%s%s\n", block_start, off-1, (off-block_start)/nand->oobblock, ((last_status & NAND_LOCK_STATUS_TIGHT) ? "TIGHT " : ""), ((last_status & NAND_LOCK_STATUS_LOCK) ? "LOCK " : ""), ((last_status & NAND_LOCK_STATUS_UNLOCK) ? "UNLOCK " : "")); } last_status = s; } } else { if (!nand_lock(nand, tight)) { puts("NAND flash successfully locked\n"); } else { puts("Error locking NAND flash\n"); return 1; } } return 0; } if (strcmp(cmd, "unlock") == 0) { if (arg_off_size(argc - 2, argv + 2, nand, &off, &size) < 0) return 1; if (!nand_unlock(nand, off, size)) { puts("NAND flash successfully unlocked\n"); } else { puts("Error unlocking NAND flash, " "write and erase will probably fail\n"); return 1; } return 0; }usage: printf("Usage:\n%s\n", cmdtp->usage); return 1;}U_BOOT_CMD(nand, 5, 1, do_nand, "nand - NAND sub-system\n", "info - show available NAND devices\n" "nand device [dev] - show or set current device\n" "nand read[.jffs2] - addr off|partition size\n" "nand write[.jffs2] - addr off|partiton size - read/write `size' bytes starting\n" " at offset `off' to/from memory address `addr'\n" "nand read.yaffs addr off size - read the `size' byte yaffs image starting\n" " at offset `off' to memory address `addr'\n" "nand write.yaffs addr off size - write the `size' byte yaffs image starting\n" " at offset `off' from memory address `addr'\n" "nand read.raw addr off size - read the `size' bytes starting\n" " at offset `off' to memory address `addr', without oob and ecc\n" "nand write.raw addr off size - write the `size' bytes starting\n" " at offset `off' from memory address `addr', without oob and ecc\n" "nand erase [clean] [off size] - erase `size' bytes from\n" " offset `off' (entire device if not specified)\n" "nand bad - show bad blocks\n" "nand dump[.oob] off - dump page\n" "nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n" "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");static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand, ulong offset, ulong addr, char *cmd){ int r; char *ep; ulong cnt; image_header_t *hdr; printf("\nLoading from %s, offset 0x%lx\n", nand->name, offset); cnt = nand->oobblock; r = nand_read(nand, offset, &cnt, (u_char *) addr); if (r) { puts("** Read error\n"); SHOW_BOOT_PROGRESS(-1); return 1; } hdr = (image_header_t *) addr; if (ntohl(hdr->ih_magic) != IH_MAGIC) { printf("\n** Bad Magic Number 0x%x **\n", hdr->ih_magic); SHOW_BOOT_PROGRESS(-1); return 1; } print_image_hdr(hdr); cnt = (ntohl(hdr->ih_size) + sizeof (image_header_t)); r = nand_read(nand, offset, &cnt, (u_char *) addr); if (r) { puts("** Read error\n"); SHOW_BOOT_PROGRESS(-1); return 1; } /* Loading ok, update default load address */ load_addr = addr; /* Check if we should attempt an auto-start */ if (((ep = getenv("autostart")) != NULL) && (strcmp(ep, "yes") == 0)) { char *local_args[2]; extern int do_bootm(cmd_tbl_t *, int, int, char *[]); local_args[0] = cmd; local_args[1] = NULL; printf("Automatic boot of image at addr 0x%08lx ...\n", addr); do_bootm(cmdtp, 0, 1, local_args); return 1; } return 0;}int do_nandboot(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){ char *boot_device = NULL; int idx; ulong addr, offset = 0;#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE) struct mtd_device *dev; struct part_info *part; u8 pnum; if (argc >= 2) { char *p = (argc == 2) ? argv[1] : argv[2]; if (!(str2long(p, &addr)) && (mtdparts_init() == 0) && (find_dev_and_part(p, &dev, &pnum, &part) == 0)) { if (dev->id->type != MTD_DEV_TYPE_NAND) { puts("Not a NAND device\n"); return 1; } if (argc > 3) goto usage; if (argc == 3) addr = simple_strtoul(argv[1], NULL, 16); else addr = CFG_LOAD_ADDR; return nand_load_image(cmdtp, &nand_info[dev->id->num], part->offset, addr, argv[0]); } }#endif switch (argc) { case 1: addr = CFG_LOAD_ADDR; boot_device = getenv("bootdevice"); break; case 2: addr = simple_strtoul(argv[1], NULL, 16); boot_device = getenv("bootdevice"); break; case 3: addr = simple_strtoul(argv[1], NULL, 16); boot_device = argv[2]; break; case 4: addr = simple_strtoul(argv[1], NULL, 16); boot_device = argv[2]; offset = simple_strtoul(argv[3], NULL, 16); break; default:#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE)usage:#endif printf("Usage:\n%s\n", cmdtp->usage); SHOW_BOOT_PROGRESS(-1); return 1; } if (!boot_device) { puts("\n** No boot device **\n"); SHOW_BOOT_PROGRESS(-1); return 1; } idx = simple_strtoul(boot_device, NULL, 16); if (idx < 0 || idx >= CFG_MAX_NAND_DEVICE || !nand_info[idx].name) { printf("\n** Device %d not available\n", idx); SHOW_BOOT_PROGRESS(-1); return 1; } return nand_load_image(cmdtp, &nand_info[idx], offset, addr, argv[0]);}U_BOOT_CMD(nboot, 4, 1, do_nandboot, "nboot - boot from NAND device\n", "[[loadAddr] partition] | [[[loadAddr] dev] offset]\n");#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */#else /* CFG_NAND_LEGACY *//* * * Legacy NAND support - to be phased out * */#include <command.h>#include <malloc.h>#include <asm/io.h>#include <watchdog.h>#ifdef CONFIG_SHOW_BOOT_PROGRESS# include <status_led.h># define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg)#else# define SHOW_BOOT_PROGRESS(arg)#endif#if (CONFIG_COMMANDS & CFG_CMD_NAND)#include <linux/mtd/nand_legacy.h>#if 0#include <linux/mtd/nand_ids.h>#include <jffs2/jffs2.h>#endif#ifdef CONFIG_OMAP1510
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -