diff options
author | Albert Chaulk <achaulk@chromium.org> | 2013-03-29 15:02:38 -0700 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-06-21 11:50:39 -0700 |
commit | a75071c25295e392a21b8deddccaf2f3f0d0f041 (patch) | |
tree | bade7b91a1ce8a1fdf881fddab48f71b089cd3c9 /cgpt/cgpt.c | |
parent | 114d54a9e26aad6bfa4564152a3f1daed2e75a9b (diff) | |
download | vboot-a75071c25295e392a21b8deddccaf2f3f0d0f041.tar.gz |
Enables MTD mode via command line option.
Enables MTD mode with a command line option of
-N=<write page bytes>,<write pages per erase block>,
<erase block offset to fts partition>,<erase block size of fts partition>
The problem is that we need to know exactly where the fts store partition is
and what the layout of the flash chip is in order to be able to use it
properly. This will vary per-device however, so for flexibility and testing
purposes, this command line option allows specification of arbitrary layouts.
BUG=chromium:221745
BRANCH=none
TEST=verified during development via prints
Original-Change-Id: I88640e777d5ccd4ffd3b39e1f131dc1d362c6b2c
Reviewed-on: https://gerrit.chromium.org/gerrit/46920
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
Reviewed-by: Albert Chaulk <achaulk@chromium.org>
Tested-by: Albert Chaulk <achaulk@chromium.org>
(cherry picked from commit 2b768f99d246823f3711bbe4cf50ea9ab4588a06)
Change-Id: I35591d4fbec13c3887beef11fdefc84fc90b8e05
Reviewed-on: https://gerrit.chromium.org/gerrit/49792
Reviewed-by: Albert Chaulk <achaulk@chromium.org>
Tested-by: Albert Chaulk <achaulk@chromium.org>
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
Diffstat (limited to 'cgpt/cgpt.c')
-rw-r--r-- | cgpt/cgpt.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/cgpt/cgpt.c b/cgpt/cgpt.c index a3b20d99..2851f7c5 100644 --- a/cgpt/cgpt.c +++ b/cgpt/cgpt.c @@ -18,6 +18,8 @@ const char* progname; const char* command; void (*uuid_generator)(uint8_t* buffer); +extern struct nand_layout nand; + struct { const char *name; int (*fp)(int argc, char *argv[]); @@ -47,7 +49,40 @@ void Usage(void) { printf("\nFor more detailed usage, use %s COMMAND -h\n\n", progname); } +static int is_pow2(size_t v) { + return v && (v & (v - 1)) == 0; +} +static int parse_nand_option(const char *arg) { + if ('=' != arg[0]) + return -1; + + arg++; + nand.bytes_per_page = atoi(arg); + arg = strchr(arg, ','); + if (!arg) + return -1; + + arg++; + nand.pages_per_block = atoi(arg); + arg = strchr(arg, ','); + if (!arg) + return -1; + + arg++; + nand.fts_block_offset = atoi(arg); + arg = strchr(arg, ','); + if (!arg) + return -1; + + arg++; + nand.fts_block_size = atoi(arg); + if (nand.fts_block_size == 0 || !is_pow2(nand.pages_per_block) || + !is_pow2(nand.bytes_per_page) || nand.bytes_per_page < 512) { + return -1; + } + return 0; +} int main(int argc, char *argv[]) { int i; @@ -62,6 +97,27 @@ int main(int argc, char *argv[]) { else progname = argv[0]; + + memset(&nand, 0, sizeof(nand)); + for (i = 1; i < argc; ++i) { + if (0 == strncmp(argv[i], "-N", 2)) { + if (!parse_nand_option(argv[i] + 2)) { + int j; + nand.enabled = 1; + + // Remove it form the list. + for (j = i; j < argc - 1; j++) + argv[j] = argv[j + 1]; + argc--; + break; + } + // Bad nand config. + printf("Nand option must fit: -N=<bytes_per_page>,<pages_per_block>," + "<block_offset_of_partition>,<block_size_of_partition>\n"); + return CGPT_FAILED; + } + } + if (argc < 2) { Usage(); return CGPT_FAILED; |