static int flash_str_to_val(char * str, __u32 * val, char *unit) { int len; char *p = str; len = strlen(str); if (len > 5 && 0 == strncmp(p + len - 5, "block", 5)) { *unit = 'b'; // block p[len - 5] = '\0'; } else if (len > 4 && 0 == strncmp(p + len - 4, "page", 4)) { *unit = 'p'; // page p[len - 4] = '\0'; } else if (len > 1 && strchr("kKmMgG", str[len - 1])) { return hr_str_to_val(str, (unsigned long *)val); } return str_to_val(str, (unsigned long *)val); }
static int __INIT__ flash_parse_part(struct flash_chip *host, struct part_attr *part, const char *part_def) { int i, ret = -EINVAL, index = 0; __u32 curr_base = 0; char buff[128]; const char *p; p = strchr(part_def, ':'); if (!p) goto error; p++; while (*p && *p != ';') { if (curr_base >= host->chip_size) goto error; while (' ' == *p) p++; // part size if (*p == '-') { part->size = host->chip_size - curr_base; p++; } else { for (i = 0; *p; i++, p++) { if (*p == '@' || *p == '(' || *p == 'r' || *p == ',') break; buff[i] = *p; } buff[i] = '\0'; ret = hr_str_to_val(buff, (unsigned long *)&part->size); if (ret < 0) goto error; ALIGN_UP(part->size, host->erase_size); } // part base if (*p == '@') { for (i = 0, p++; *p; i++, p++) { if (*p == '(' || *p == 'r' || *p == ',') break; buff[i] = *p; } buff[i] = '\0'; ret = hr_str_to_val(buff, (unsigned long *)&part->base); if (ret < 0) goto error; ALIGN_UP(part->base, host->erase_size); curr_base = part->base; } else { part->base = curr_base; } // part label and image i = 0; if (*p == '(') { for (p++; *p && *p != ')'; i++, p++) part->label[i] = *p; p++; } if (*p == 'r') { p++; if (*p != 'o') { return -EINVAL; } part->flags |= BDF_RDONLY; p++; } if (',' == *p) p++; part->label[i] = '\0'; curr_base += part->size; index++; part++; } return index; error: printf("%s(): invalid part definition \"%s\"\n", __func__, part_def); return ret; }