/* * initial mtd device */ static __init void mtd_device_init(void) { /* * probe all nand flash device */ nand_flash_probe(); }
static int probe(int argc, char ** argv) { s32_t i; if(argc < 2) { usage(); return -1; } for(i=1; i<argc; i++) { if( !strcmp((const char *)argv[i], "nor")) { } else if( !strcmp((const char *)argv[i], "nand")) { nand_flash_probe(); list_nand_flash(); } else if( !strcmp((const char *)argv[i], "mmc")) { mmc_card_probe(); list_mmc_card(); } else { printk("do not probe device with the type of '%s'\r\n", argv[i]); } } return 0; }
static int nand(int argc, char ** argv) { struct nand_device * nand; u32_t off = 0; u32_t size = 0; u32_t addr = 0; u32_t o, l, len = 0; char * filename; u8_t * buf; s32_t fd; s32_t n; if(argc < 2) { list_nand_device(); return 0; } if( !strcmp((const char *)argv[1], "list")) { list_nand_device(); return 0; } else if( !strcmp((const char *)argv[1], "probe")) { nand_flash_probe(); list_nand_device(); return 0; } else if( !strcmp((const char *)argv[1], "read") ) { if(argc != 7) { usage(); return -1; } nand = search_nand_device((const char *)argv[2]); if(!nand) { printk(" not found nand device \"%s\"\r\n", argv[2]); printk(" try 'nand list' for list all of nand devices\r\n"); return -1; } off = strtoul((const char *)argv[3], NULL, 0); size = strtoul((const char *)argv[4], NULL, 0); if( !strcmp((const char *)argv[5], "-r") ) { addr = strtoul((const char *)argv[6], NULL, 0); if(nand_read(nand, (u8_t *)addr, off, size) != 0) return -1; printk("read %s 0x%08lx ~ 0x%08lx to ram 0x%08lx.\r\n", nand->name, off, off + size, addr); } else if( !strcmp((const char *)argv[5], "-f") ) { filename = (char *)argv[6]; buf = malloc(SZ_64K); if(!buf) return -1; fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)); if(fd < 0) { free(buf); return -1; } o = off; while(len < size) { if(len + SZ_64K > size) l = size - len; else l = SZ_64K; if(nand_read(nand, buf, o, l) != 0) { close(fd); unlink(filename); free(buf); return -1; } n = write(fd, (void *)buf, l); if( n != l ) { close(fd); unlink(filename); free(buf); return -1; } o += l; len += l; } close(fd); free(buf); printk("read %s 0x%08lx ~ 0x%08lx to file %s.\r\n", nand->name, off, off + size, filename); } else { usage(); return -1; } } else if( !strcmp((const char *)argv[1], "write") ) { } else if( !strcmp((const char *)argv[1], "erase") ) { } else if( !strcmp((const char *)argv[1], "bad") ) { } else { usage(); return -1; } return 0; }