int ubi_part(char *part_name, const char *vid_header_offset) { struct mtd_info *mtd; int err = 0; ubi_detach(); mtd_probe_devices(); mtd = get_mtd_device_nm(part_name); if (IS_ERR(mtd)) { printf("Partition %s not found!\n", part_name); return 1; } put_mtd_device(mtd); err = ubi_dev_scan(mtd, vid_header_offset); if (err) { printf("UBI init error %d\n", err); printf("Please check, if the correct MTD partition is used (size big enough?)\n"); return err; } ubi = ubi_devices[0]; return 0; }
BAREBOX_CMD_END static int do_ubidetach(int argc, char *argv[]) { int fd, ret; struct mtd_info_user user; if (argc != 2) return COMMAND_ERROR_USAGE; fd = open(argv[optind], O_RDWR); if (fd < 0) { int ubi_num = simple_strtoul(argv[1], NULL, 0); ret = ubi_detach(ubi_num); goto out; } ret = ioctl(fd, MEMGETINFO, &user); if (!ret) { int ubi_num = ubi_num_get_by_mtd(user.mtd); if (ubi_num < 0) { ret = ubi_num; goto out; } ret = ubi_detach(ubi_num); if (!ret) goto out_close; } out_close: close(fd); out: if (ret) printf("failed to detach: %s\n", strerror(-ret)); return ret; }
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; }