void cmd_yaffs_dev_ls(void) { struct yaffs_dev *dev; int flash_dev; int free_space; yaffs_dev_rewind(); while (1) { dev = yaffs_next_dev(); if (!dev) return; flash_dev = ((unsigned) dev->driver_context - (unsigned) nand_info)/ sizeof(nand_info[0]); printf("%-10s %5d 0x%05x 0x%05x %s", dev->param.name, flash_dev, dev->param.start_block, dev->param.end_block, dev->param.inband_tags ? "using inband tags, " : ""); free_space = yaffs_freespace(dev->param.name); if (free_space < 0) printf("not mounted\n"); else printf("free 0x%x\n", free_space); } }
static void *bg_gc_func(void *dummy) { struct yaffs_dev *dev; int urgent = 0; int result; int next_urgent; /* Sleep for a bit to allow start up */ sleep(2); while (1) { /* Iterate through devices, do bg gc updating ungency */ yaffs_dev_rewind(); next_urgent = 0; while ((dev = yaffs_next_dev()) != NULL) { result = yaffs_do_background_gc_reldev(dev, urgent); if (result > 0) { next_urgent = 1; } } urgent = next_urgent; if (next_urgent) { sleep(1); } else { sleep(5); } } /* Don't ever return. */ return NULL; }
void cmd_yaffs_devconfig(char *_mp, int flash_dev, int start_block, int end_block) { struct mtd_info *mtd = NULL; struct yaffs_dev *dev = NULL; struct yaffs_dev *chk; char *mp = NULL; struct nand_chip *chip; dev = calloc(1, sizeof(*dev)); mp = strdup(_mp); mtd = &nand_info[flash_dev]; if (!dev || !mp) { /* Alloc error */ printf("Failed to allocate memory\n"); goto err; } if (flash_dev >= CONFIG_SYS_MAX_NAND_DEVICE) { printf("Flash device invalid\n"); goto err; } if (end_block == 0) end_block = mtd->size / mtd->erasesize - 1; if (end_block < start_block) { printf("Bad start/end\n"); goto err; } chip = mtd->priv; /* Check for any conflicts */ yaffs_dev_rewind(); while (1) { chk = yaffs_next_dev(); if (!chk) break; if (strcmp(chk->param.name, mp) == 0) { printf("Mount point name already used\n"); goto err; } if (chk->driver_context == mtd && yaffs_regions_overlap( chk->param.start_block, chk->param.end_block, start_block, end_block)) { printf("Region overlaps with partition %s\n", chk->param.name); goto err; } } /* Seems sane, so configure */ memset(dev, 0, sizeof(*dev)); dev->param.name = mp; dev->driver_context = mtd; dev->param.start_block = start_block; dev->param.end_block = end_block; dev->param.chunks_per_block = mtd->erasesize / mtd->writesize; dev->param.total_bytes_per_chunk = mtd->writesize; dev->param.is_yaffs2 = 1; dev->param.use_nand_ecc = 1; dev->param.n_reserved_blocks = 5; if (chip->ecc.layout->oobavail < sizeof(struct yaffs_packed_tags2)) dev->param.inband_tags = 1; dev->param.n_caches = 10; dev->param.write_chunk_tags_fn = nandmtd2_write_chunk_tags; dev->param.read_chunk_tags_fn = nandmtd2_read_chunk_tags; dev->param.erase_fn = nandmtd_EraseBlockInNAND; dev->param.initialise_flash_fn = nandmtd_InitialiseNAND; dev->param.bad_block_fn = nandmtd2_MarkNANDBlockBad; dev->param.query_block_fn = nandmtd2_QueryNANDBlock; yaffs_add_device(dev); printf("Configures yaffs mount %s: dev %d start block %d, end block %d %s\n", mp, flash_dev, start_block, end_block, dev->param.inband_tags ? "using inband tags" : ""); return; err: free(dev); free(mp); }