int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { size_t size = 0; ulong addr = 0; int err = 0; size_t vol_offset = 0; if (argc < 2) { printf("Usage:\n%s\n", cmdtp->usage); return 1; } if (mtdparts_init() != 0) { printf("Error initializing mtdparts!\n"); return 1; } if (strcmp(argv[1], "part") == 0) { char mtd_dev[16]; struct mtd_device *dev; struct part_info *part; const char *vid_header_offset = NULL; u8 pnum; /* Print current partition */ if (argc == 2) { if (!ubi_dev.selected) { printf("Error, no UBI device/partition selected!\n"); return 1; } printf("Device %d: %s, partition %s\n", ubi_dev.nr, ubi_dev.mtd_info->name, ubi_dev.part_name); return 0; } if (argc < 3) { printf("Usage:\n%s\n", cmdtp->usage); return 1; } /* todo: get dev number for NAND... */ ubi_dev.nr = 0; /* * Call ubi_exit() before re-initializing the UBI subsystem */ if (ubi_initialized) { ubi_exit(); del_mtd_partitions(ubi_dev.mtd_info); } /* * Search the mtd device number where this partition * is located */ if (find_dev_and_part(argv[2], &dev, &pnum, &part)) { printf("Partition %s not found!\n", argv[2]); return 1; } sprintf(mtd_dev, "%s%d", MTD_DEV_TYPE(dev->id->type), dev->id->num); ubi_dev.mtd_info = get_mtd_device_nm(mtd_dev); if (IS_ERR(ubi_dev.mtd_info)) { printf("Partition %s not found on device %s!\n", argv[2], mtd_dev); return 1; } ubi_dev.selected = 1; if (argc > 3) vid_header_offset = argv[3]; strcpy(ubi_dev.part_name, argv[2]); err = ubi_dev_scan(ubi_dev.mtd_info, ubi_dev.part_name, vid_header_offset); if (err) { printf("UBI init error %d\n", err); ubi_dev.selected = 0; return err; } ubi = ubi_devices[0]; return 0; } if (strcmp(argv[1], "detach") == 0) { if (ubi_initialized) { ubi_exit(); del_mtd_partitions(ubi_dev.mtd_info); ubi_initialized = 0; ubi_dev.selected = 0; if (ubi) memset(ubi, 0, sizeof(*ubi)); } return 0; } if ((strcmp(argv[1], "part") != 0) && (!ubi_dev.selected)) { printf("Error, no UBI device/partition selected!\n"); return 1; } if (strcmp(argv[1], "info") == 0) { int layout = 0; if (argc > 2 && !strncmp(argv[2], "l", 1)) layout = 1; if (argc > 2 && !strncmp(argv[2], "w", 1)) layout = 2; return ubi_info(layout); } if (strncmp(argv[1], "create", 6) == 0) { int dynamic = 1; /* default: dynamic volume */ /* Use maximum available size */ size = 0; /* E.g., create volume size type */ if (argc == 5) { if (strncmp(argv[4], "s", 1) == 0) dynamic = 0; else if (strncmp(argv[4], "d", 1) != 0) { printf("Incorrect type\n"); return 1; } argc--; } /* E.g., create volume size */ if (argc == 4) { size = simple_strtoul(argv[3], NULL, 16); argc--; } /* Use maximum available size */ if (!size) { if (ubi->avail_pebs < MIN_AVAILABLE_PEB) { ubi_err("available_pebs %d < MIN_AVAILABLE_PEB %d\n", ubi->avail_pebs, MIN_AVAILABLE_PEB); return 1; } size = (ubi->avail_pebs - MIN_AVAILABLE_PEB) * ubi->leb_size; printf("No size specified -> Using max size (0x%x)\n", size); } /* E.g., create volume */ if (argc == 3) return ubi_create_vol(argv[2], size, dynamic); } if (strncmp(argv[1], "remove", 6) == 0) { /* E.g., remove volume */ if (argc == 3) return ubi_remove_vol(argv[2]); } if (strncmp(argv[1], "write", 5) == 0) { if (argc < 5) { printf("Please see usage\n"); return 1; } addr = simple_strtoul(argv[2], NULL, 16); size = simple_strtoul(argv[4], NULL, 16); return ubi_volume_write(argv[3], (void *)addr, size); } if (strncmp(argv[1], "read", 4) == 0) { size = 0; vol_offset = 0; /* E.g., offset in volume */ if (argc == 6) { vol_offset = simple_strtoul(argv[5], NULL, 16); argc--; } /* E.g., read volume size */ if (argc == 5) { size = simple_strtoul(argv[4], NULL, 16); argc--; } /* E.g., read volume */ if (argc == 4) { addr = simple_strtoul(argv[2], NULL, 16); argc--; } if (argc == 3) return ubi_volume_read(argv[3], (char *)addr, size, vol_offset); } printf("Please see usage\n"); return 1; }
static int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { size_t size = 0; ulong addr = 0; int err = 0; if (argc < 2) { cmd_usage(cmdtp); return 1; } if (strcmp(argv[1], "part") == 0) { /* Print current partition */ if (argc == 2) { if (ubi_dev.type == DEV_TYPE_NONE) { printf("Error, no UBI device/partition selected!\n"); return 1; } printf("%s Device %d: %s, partition %s\n", ubi_dev.dev_name, ubi_dev.nr, ubi_dev.mtd_info->name, ubi_dev.part_name); return 0; } if (argc < 4) { cmd_usage(cmdtp); return 1; } /* todo: get dev number for NAND... */ ubi_dev.nr = 0; /* * Call ubi_exit() before re-initializing the UBI subsystem */ if (ubi_initialized) { ubi_exit(); del_mtd_partitions(ubi_dev.mtd_info); } /* * Check for nand|onenand selection */ #if defined(CONFIG_CMD_NAND) if (strcmp(argv[2], "nand") == 0) { strcpy(ubi_dev.dev_name, "NAND"); ubi_dev.type = DEV_TYPE_NAND; ubi_dev.mtd_info = &nand_info[ubi_dev.nr]; } #endif #if defined(CONFIG_FLASH_CFI_MTD) if (strcmp(argv[2], "nor") == 0) { strcpy(ubi_dev.dev_name, "NOR"); ubi_dev.type = DEV_TYPE_NOR; ubi_dev.mtd_info = get_mtd_device_nm(CFI_MTD_DEV_NAME); } #endif #if defined(CONFIG_CMD_ONENAND) if (strcmp(argv[2], "onenand") == 0) { strcpy(ubi_dev.dev_name, "OneNAND"); ubi_dev.type = DEV_TYPE_ONENAND; ubi_dev.mtd_info = &onenand_mtd; } #endif if (ubi_dev.type == DEV_TYPE_NONE) { printf("Error, no UBI device/partition selected!\n"); return 1; } strcpy(ubi_dev.part_name, argv[3]); err = ubi_dev_scan(ubi_dev.mtd_info, ubi_dev.part_name); if (err) { printf("UBI init error %d\n", err); ubi_dev.type = DEV_TYPE_NONE; return err; } ubi = ubi_devices[0]; return 0; } if ((strcmp(argv[1], "part") != 0) && (ubi_dev.type == DEV_TYPE_NONE)) { printf("Error, no UBI device/partition selected!\n"); return 1; } if (strcmp(argv[1], "info") == 0) { int layout = 0; if (argc > 2 && !strncmp(argv[2], "l", 1)) layout = 1; return ubi_info(layout); } if (strncmp(argv[1], "create", 6) == 0) { int dynamic = 1; /* default: dynamic volume */ /* Use maximum available size */ size = 0; /* E.g., create volume size type */ if (argc == 5) { if (strncmp(argv[4], "s", 1) == 0) dynamic = 0; else if (strncmp(argv[4], "d", 1) != 0) { printf("Incorrect type\n"); return 1; } argc--; } /* E.g., create volume size */ if (argc == 4) { size = simple_strtoul(argv[3], NULL, 16); argc--; } /* Use maximum available size */ if (!size) size = ubi->avail_pebs * ubi->leb_size; /* E.g., create volume */ if (argc == 3) return ubi_create_vol(argv[2], size, dynamic); } if (strncmp(argv[1], "remove", 6) == 0) { /* E.g., remove volume */ if (argc == 3) return ubi_remove_vol(argv[2]); } if (strncmp(argv[1], "write", 5) == 0) { if (argc < 5) { printf("Please see usage\n"); return 1; } addr = simple_strtoul(argv[2], NULL, 16); size = simple_strtoul(argv[4], NULL, 16); return ubi_volume_write(argv[3], (void *)addr, size); } if (strncmp(argv[1], "read", 4) == 0) { size = 0; /* E.g., read volume size */ if (argc == 5) { size = simple_strtoul(argv[4], NULL, 16); argc--; } /* E.g., read volume */ if (argc == 4) { addr = simple_strtoul(argv[2], NULL, 16); argc--; } if (argc == 3) return ubi_volume_read(argv[3], (char *)addr, size); } printf("Please see usage\n"); return -1; }
static int do_ubi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int64_t size = 0; ulong addr = 0; if (argc < 2) return CMD_RET_USAGE; if (strcmp(argv[1], "detach") == 0) return ubi_detach(); if (strcmp(argv[1], "part") == 0) { const char *vid_header_offset = NULL; /* Print current partition */ if (argc == 2) { if (!ubi) { printf("Error, no UBI device selected!\n"); return 1; } printf("Device %d: %s, MTD partition %s\n", ubi->ubi_num, ubi->ubi_name, ubi->mtd->name); return 0; } if (argc < 3) return CMD_RET_USAGE; if (argc > 3) vid_header_offset = argv[3]; return ubi_part(argv[2], vid_header_offset); } if ((strcmp(argv[1], "part") != 0) && !ubi) { printf("Error, no UBI device selected!\n"); return 1; } if (strcmp(argv[1], "info") == 0) { int layout = 0; if (argc > 2 && !strncmp(argv[2], "l", 1)) layout = 1; return ubi_info(layout); } if (strcmp(argv[1], "check") == 0) { if (argc > 2) return ubi_check(argv[2]); printf("Error, no volume name passed\n"); return 1; } if (strncmp(argv[1], "create", 6) == 0) { int dynamic = 1; /* default: dynamic volume */ int id = UBI_VOL_NUM_AUTO; /* Use maximum available size */ size = 0; /* E.g., create volume size type vol_id */ if (argc == 6) { id = simple_strtoull(argv[5], NULL, 16); argc--; } /* E.g., create volume size type */ if (argc == 5) { if (strncmp(argv[4], "s", 1) == 0) dynamic = 0; else if (strncmp(argv[4], "d", 1) != 0) { printf("Incorrect type\n"); return 1; } argc--; } /* E.g., create volume size */ if (argc == 4) { if (argv[3][0] != '-') size = simple_strtoull(argv[3], NULL, 16); argc--; } /* Use maximum available size */ if (!size) { size = (int64_t)ubi->avail_pebs * ubi->leb_size; printf("No size specified -> Using max size (%lld)\n", size); } /* E.g., create volume */ if (argc == 3) return ubi_create_vol(argv[2], size, dynamic, id); } if (strncmp(argv[1], "remove", 6) == 0) { /* E.g., remove volume */ if (argc == 3) return ubi_remove_vol(argv[2]); } if (strncmp(argv[1], "write", 5) == 0) { int ret; if (argc < 5) { printf("Please see usage\n"); return 1; } addr = simple_strtoul(argv[2], NULL, 16); size = simple_strtoul(argv[4], NULL, 16); if (strlen(argv[1]) == 10 && strncmp(argv[1] + 5, ".part", 5) == 0) { if (argc < 6) { ret = ubi_volume_continue_write(argv[3], (void *)addr, size); } else { size_t full_size; full_size = simple_strtoul(argv[5], NULL, 16); ret = ubi_volume_begin_write(argv[3], (void *)addr, size, full_size); } } else { ret = ubi_volume_write(argv[3], (void *)addr, size); } if (!ret) { printf("%lld bytes written to volume %s\n", size, argv[3]); } return ret; } if (strncmp(argv[1], "read", 4) == 0) { size = 0; /* E.g., read volume size */ if (argc == 5) { size = simple_strtoul(argv[4], NULL, 16); argc--; } /* E.g., read volume */ if (argc == 4) { addr = simple_strtoul(argv[2], NULL, 16); argc--; } if (argc == 3) { return ubi_volume_read(argv[3], (char *)addr, size); } } printf("Please see usage\n"); return 1; }
static int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) { size_t size = 0; ulong addr = 0; int err = 0; if (argc < 2) return CMD_RET_USAGE; if (mtdparts_init() != 0) { printf("Error initializing mtdparts!\n"); return 1; } if (strcmp(argv[1], "part") == 0) { char mtd_dev[16]; struct mtd_device *dev; struct part_info *part; const char *vid_header_offset = NULL; u8 pnum; /* Print current partition */ if (argc == 2) { if (!ubi_dev.selected) { printf("Error, no UBI device/partition selected!\n"); return 1; } printf("Device %d: %s, partition %s\n", ubi_dev.nr, ubi_dev.mtd_info->name, ubi_dev.part_name); return 0; } if (argc < 3) return CMD_RET_USAGE; #ifdef CONFIG_CMD_UBIFS /* * Automatically unmount UBIFS partition when user * changes the UBI device. Otherwise the following * UBIFS commands will crash. */ if (ubifs_is_mounted()) cmd_ubifs_umount(); #endif /* todo: get dev number for NAND... */ ubi_dev.nr = 0; /* * Call ubi_exit() before re-initializing the UBI subsystem */ if (ubi_initialized) { ubi_exit(); del_mtd_partitions(ubi_dev.mtd_info); } /* * Search the mtd device number where this partition * is located */ if (find_dev_and_part(argv[2], &dev, &pnum, &part)) { printf("Partition %s not found!\n", argv[2]); return 1; } sprintf(mtd_dev, "%s%d", MTD_DEV_TYPE(dev->id->type), dev->id->num); ubi_dev.mtd_info = get_mtd_device_nm(mtd_dev); if (IS_ERR(ubi_dev.mtd_info)) { printf("Partition %s not found on device %s!\n", argv[2], mtd_dev); return 1; } ubi_dev.selected = 1; if (argc > 3) vid_header_offset = argv[3]; strcpy(ubi_dev.part_name, argv[2]); err = ubi_dev_scan(ubi_dev.mtd_info, ubi_dev.part_name, vid_header_offset); if (err) { printf("UBI init error %d\n", err); ubi_dev.selected = 0; return err; } ubi = ubi_devices[0]; return 0; } if ((strcmp(argv[1], "part") != 0) && (!ubi_dev.selected)) { printf("Error, no UBI device/partition selected!\n"); return 1; } if (strcmp(argv[1], "info") == 0) { int layout = 0; if (argc > 2 && !strncmp(argv[2], "l", 1)) layout = 1; return ubi_info(layout); } if (strncmp(argv[1], "create", 6) == 0) { int dynamic = 1; /* default: dynamic volume */ /* Use maximum available size */ size = 0; /* E.g., create volume size type */ if (argc == 5) { if (strncmp(argv[4], "s", 1) == 0) dynamic = 0; else if (strncmp(argv[4], "d", 1) != 0) { printf("Incorrect type\n"); return 1; } argc--; } /* E.g., create volume size */ if (argc == 4) { size = simple_strtoul(argv[3], NULL, 16); argc--; } /* Use maximum available size */ if (!size) { size = ubi->avail_pebs * ubi->leb_size; printf("No size specified -> Using max size (%u)\n", size); } /* E.g., create volume */ if (argc == 3) return ubi_create_vol(argv[2], size, dynamic); } if (strncmp(argv[1], "remove", 6) == 0) { /* E.g., remove volume */ if (argc == 3) return ubi_remove_vol(argv[2]); } if (strncmp(argv[1], "write", 5) == 0) { if (argc < 5) { printf("Please see usage\n"); return 1; } addr = simple_strtoul(argv[2], NULL, 16); size = simple_strtoul(argv[4], NULL, 16); return ubi_volume_write(argv[3], (void *)addr, size); } if (strncmp(argv[1], "read", 4) == 0) { size = 0; /* E.g., read volume size */ if (argc == 5) { size = simple_strtoul(argv[4], NULL, 16); argc--; } /* E.g., read volume */ if (argc == 4) { addr = simple_strtoul(argv[2], NULL, 16); argc--; } if (argc == 3) return ubi_volume_read(argv[3], (char *)addr, size); } printf("Please see usage\n"); return 1; }
void env_relocate_spec (void) { #if defined(CONFIG_CMD_UBI) #if !defined(ENV_IS_EMBEDDED) int ret, i, readfrombackup; char cmd_buf[30]; struct mtd_device *dev; struct part_info *part; uint32_t crc; size_t size; env_t *ep; u8 pnum; #if defined(CONFIG_ENV_OFFSET_OOB) ret = get_nand_env_oob(&nand_info[0], &nand_env_oob_offset); /* * If unable to read environment offset from NAND OOB then fall through * to the normal environment reading code below */ if (!ret) { printf("Found Environment offset in OOB..\n"); } else { set_default_env("!no env offset in OOB"); return; } #endif //get mtdpart string from pni set_default_env("!set default for mtdparts"); #if (ENABLE_MODULE_NAND_FLASH == 1) drvNAND_GetMtdParts(mtdstr); #endif #if (ENABLE_MODULE_SPI_NAND_FLASH == 1) MDrv_SPINAND_GetMtdParts(mtdstr); #endif setenv("mtdparts", mtdstr); setenv("mtdids", IdsStr); mtdparts_init(); if(find_dev_and_part(env_partition, &dev, &pnum, &part)) { printf("Partition %s not found!\n", env_partition); printf("read env fail\n"); return; } if(!ubi_find_volume(ENV_VOL_NAME)) { sprintf(cmd_buf, "ubi part %s", env_partition); if(run_command(cmd_buf, 0) == -1) return; } if(!ubi_leb_sz) ubi_leb_sz = ubi_get_leb_size(); if(!env_vol_sz) env_vol_sz = (ubi_get_avai_peb() - 1) * ubi_leb_sz; if(cfg_env_offset == 0) { MsApiChunkHeader_GetValue(CH_UBOOT_ENVIRONMENT_ROM_OFFSET,&cfg_env_offset); ubi_get_volume_size(ENV_VOL_NAME, &size); cfg_env_offset = size - (cfg_env_offset*ubi_leb_sz); } //find ENV volume readfrombackup = 0; if(ubi_find_volume(ENV_VOL_NAME)) { for(i = 0 ;i < CONFIG_ENV_BLOCK_NUM; i ++) { ret = readenv(CONFIG_ENV_OFFSET + i * ubi_leb_sz, (u_char *)gbuf); if (ret) { if(i < (CONFIG_ENV_BLOCK_NUM - 1)) { printf("Read ENV fail, Read Backup ENV\n"); readfrombackup = 1; continue; } else { printf("Read Backup ENV Failed\n"); return; } } ep = (env_t*) gbuf; memcpy(&crc, &ep->crc, sizeof(crc)); // printf("Calc crc %X, Read crc %X\n", crc32(0, ep->data, ENV_SIZE), crc); if(crc32_env_ubi(0, ep->data, ENV_SIZE) == crc) { env_import(gbuf, 0); break; } else { if(i < (CONFIG_ENV_BLOCK_NUM - 1)) { printf("Read ENV crc error, Read Backup ENV\n"); readfrombackup = 1; } else { printf("Read Backup ENV crc error\n"); return; } } } } else { printf("Found no %s Volume\n Create %s volume\n", ENV_VOL_NAME, ENV_VOL_NAME); ret = ubi_create_vol(ENV_VOL_NAME, env_vol_sz, 1); if(ret) printf("create %s volume in %s partition fail with size = 0x%X\n", ENV_VOL_NAME, env_partition, env_vol_sz); ubi_leb_sz = ubi_get_leb_size(); ubi_get_volume_size(ENV_VOL_NAME, &size); MsApiChunkHeader_GetValue(CH_UBOOT_ENVIRONMENT_ROM_OFFSET,&cfg_env_offset); cfg_env_offset = size - (cfg_env_offset*ubi_leb_sz); } //restore data from backup if(readfrombackup == 1) { ret = saveenv(); if(ret) printf("restore data fail\n"); } #endif /* ! ENV_IS_EMBEDDED */ #else set_default_env("!set default for NAND program"); #endif /* ! CONFIG_CMD_UBI*/ }
int saveenv(void) { #if defined(CONFIG_CMD_UBI) int ret; char cmd_buf[30]; ssize_t len; size_t size; char *res; struct mtd_device *dev; struct part_info *part; char last_ubi_partname[32]; char last_sb_name[32]; u8 pnum; memset(last_ubi_partname, 0, 32); memset(last_sb_name, 0, 32); ubi_get_part_name(last_ubi_partname); ubifs_get_sb_name(last_sb_name); if(find_dev_and_part(env_partition, &dev, &pnum, &part)) { printf("Partition %s not found!\n", env_partition); printf("save env fail\n"); return 1; } if(!ubi_find_volume(ENV_VOL_NAME)) { sprintf(cmd_buf, "ubi part %s", env_partition); if(run_command(cmd_buf, 0) == -1) return 1; } if(!ubi_leb_sz) ubi_leb_sz = ubi_get_leb_size(); res = (char *)&env_new.data; len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); if (len < 0) { printf("Cannot export environment\n"); return 1; } env_new.crc = crc32_env_ubi(0, env_new.data, ENV_SIZE); //printf("saveenv crc = %X\n", env_new.crc); if(ubi_find_volume(ENV_VOL_NAME)) { printf("Write Env to %X...\n", CONFIG_ENV_OFFSET); ret = writeenv(CONFIG_ENV_OFFSET, (u_char *)&env_new); if (ret) { puts("Failed\n"); return ret; } printf("Write Backup Env to %X...\n", CONFIG_ENV_OFFSET + ubi_leb_sz); ret = writeenv(CONFIG_ENV_OFFSET + ubi_leb_sz, (u_char *) &env_new); if (ret) { puts("Backup Failed\n"); return ret; } } else { printf("Found no %s Volume\n Create %s volume\n", ENV_VOL_NAME, ENV_VOL_NAME); ret = ubi_create_vol(ENV_VOL_NAME, env_vol_sz, 1); if(ret) { printf("create %s volume in %s partition fail with size = %0xX\n", ENV_VOL_NAME, env_partition, env_vol_sz); return ret; } ubi_leb_sz = ubi_get_leb_size(); MsApiChunkHeader_GetValue(CH_UBOOT_ENVIRONMENT_ROM_OFFSET,&cfg_env_offset); ubi_get_volume_size(ENV_VOL_NAME, &size); cfg_env_offset = size - (cfg_env_offset*ubi_leb_sz); ret = writeenv(CONFIG_ENV_OFFSET, (u_char *)&env_new); if (ret) { puts("Failed\n"); return ret; } ret = writeenv(CONFIG_ENV_OFFSET + ubi_leb_sz, (u_char *) &env_new); if (ret) { puts("Backup Failed\n"); return ret; } } if(last_ubi_partname[0]){ sprintf(cmd_buf, "ubi part %s", last_ubi_partname); if(run_command(cmd_buf, 0) == -1){ printf("restore ubi part %s failed\n", last_ubi_partname); return -1; } } if(last_sb_name[0]){ sprintf(cmd_buf, "ubifsmount %s", last_sb_name); if(run_command(cmd_buf, 0) == -1){ printf("remount volume %s failed\n", last_sb_name); return -1; } } puts("done\n"); return ret; #else return 0; #endif }
static int do_ubi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { size_t size = 0; ulong addr = 0; if (argc < 2) return CMD_RET_USAGE; if (strcmp(argv[1], "part") == 0) { const char *vid_header_offset = NULL; /* Print current partition */ if (argc == 2) { if (!ubi_dev.selected) { printf("Error, no UBI device/partition selected!\n"); return 1; } printf("Device %d: %s, partition %s\n", ubi_dev.nr, ubi_dev.mtd_info->name, ubi_dev.part_name); return 0; } if (argc < 3) return CMD_RET_USAGE; if (argc > 3) vid_header_offset = argv[3]; return ubi_part(argv[2], vid_header_offset); } if ((strcmp(argv[1], "part") != 0) && (!ubi_dev.selected)) { printf("Error, no UBI device/partition selected!\n"); return 1; } if (strcmp(argv[1], "info") == 0) { int layout = 0; if (argc > 2 && !strncmp(argv[2], "l", 1)) layout = 1; return ubi_info(layout); } if (strncmp(argv[1], "create", 6) == 0) { int dynamic = 1; /* default: dynamic volume */ /* Use maximum available size */ size = 0; /* E.g., create volume size type */ if (argc == 5) { if (strncmp(argv[4], "s", 1) == 0) dynamic = 0; else if (strncmp(argv[4], "d", 1) != 0) { printf("Incorrect type\n"); return 1; } argc--; } /* E.g., create volume size */ if (argc == 4) { size = simple_strtoul(argv[3], NULL, 16); argc--; } /* Use maximum available size */ if (!size) { size = ubi->avail_pebs * ubi->leb_size; printf("No size specified -> Using max size (%u)\n", size); } /* E.g., create volume */ if (argc == 3) return ubi_create_vol(argv[2], size, dynamic); } if (strncmp(argv[1], "remove", 6) == 0) { /* E.g., remove volume */ if (argc == 3) return ubi_remove_vol(argv[2]); } if (strncmp(argv[1], "write", 5) == 0) { int ret; if (argc < 5) { printf("Please see usage\n"); return 1; } addr = simple_strtoul(argv[2], NULL, 16); size = simple_strtoul(argv[4], NULL, 16); ret = ubi_volume_write(argv[3], (void *)addr, size); if (!ret) { printf("%d bytes written to volume %s\n", size, argv[3]); } return ret; } if (strncmp(argv[1], "read", 4) == 0) { size = 0; /* E.g., read volume size */ if (argc == 5) { size = simple_strtoul(argv[4], NULL, 16); argc--; } /* E.g., read volume */ if (argc == 4) { addr = simple_strtoul(argv[2], NULL, 16); argc--; } if (argc == 3) { printf("Read %d bytes from volume %s to %lx\n", size, argv[3], addr); return ubi_volume_read(argv[3], (char *)addr, size); } } printf("Please see usage\n"); return 1; }