⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_nand.c

📁 嵌入式试验箱S3C2410的bootloader源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
                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 + -