diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2017-01-05 12:06:12 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2017-01-07 15:53:03 +0100 |
commit | 86e745a25eed5365f0a38f8227ef58e236ccf445 (patch) | |
tree | 066326ca490870a223643fcbb145cb85dccd4b0c /utils/nwztools/scsitools | |
parent | 456a3fc952d34a3e8781ca100851e6253c537109 (diff) | |
download | rockbox-86e745a25eed5365f0a38f8227ef58e236ccf445.tar.gz rockbox-86e745a25eed5365f0a38f8227ef58e236ccf445.zip |
nwztools/scsitool: add relaxed mode for nvp
Change-Id: I0a139eb236f825368ae627fdbb2f75286f747f10
Diffstat (limited to 'utils/nwztools/scsitools')
-rw-r--r-- | utils/nwztools/scsitools/scsitool.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/utils/nwztools/scsitools/scsitool.c b/utils/nwztools/scsitools/scsitool.c index 02fa2efe6a..2680d14ca8 100644 --- a/utils/nwztools/scsitools/scsitool.c +++ b/utils/nwztools/scsitools/scsitool.c | |||
@@ -48,6 +48,7 @@ | |||
48 | bool g_debug = false; | 48 | bool g_debug = false; |
49 | const char *g_force_series = NULL; | 49 | const char *g_force_series = NULL; |
50 | char *g_out_prefix = NULL; | 50 | char *g_out_prefix = NULL; |
51 | bool g_relaxed = false; | ||
51 | int g_dev_fd = 0; | 52 | int g_dev_fd = 0; |
52 | 53 | ||
53 | #if 0 | 54 | #if 0 |
@@ -415,8 +416,8 @@ int get_model_and_series(int *model_index, int *series_index) | |||
415 | return 0; | 416 | return 0; |
416 | } | 417 | } |
417 | 418 | ||
418 | /* read nvp node, retrun nonzero on error */ | 419 | /* read nvp node, retrun nonzero on error, update size to actual length */ |
419 | int read_nvp_node(int series_index, enum nwz_nvp_node_t node, void *buffer, int size) | 420 | int read_nvp_node(int series_index, enum nwz_nvp_node_t node, void *buffer, size_t *size) |
420 | { | 421 | { |
421 | int node_index = NWZ_NVP_INVALID; | 422 | int node_index = NWZ_NVP_INVALID; |
422 | if(nwz_series[series_index].nvp_index) | 423 | if(nwz_series[series_index].nvp_index) |
@@ -432,7 +433,7 @@ int read_nvp_node(int series_index, enum nwz_nvp_node_t node, void *buffer, int | |||
432 | * | 433 | * |
433 | * NOTE: byte 0 is always 0 because the OF always picks small para_noise | 434 | * NOTE: byte 0 is always 0 because the OF always picks small para_noise |
434 | * indexes but I guess the actual encoding the one above */ | 435 | * indexes but I guess the actual encoding the one above */ |
435 | int xfer_size = size + 4; | 436 | int xfer_size = *size + 4; |
436 | uint8_t *xfer_buf = buffer_alloc(xfer_size); | 437 | uint8_t *xfer_buf = buffer_alloc(xfer_size); |
437 | int ret = do_dnk_cmd(true, 0x23, 10, node_index, xfer_buf, &xfer_size); | 438 | int ret = do_dnk_cmd(true, 0x23, 10, node_index, xfer_buf, &xfer_size); |
438 | if(ret) | 439 | if(ret) |
@@ -449,16 +450,17 @@ int read_nvp_node(int series_index, enum nwz_nvp_node_t node, void *buffer, int | |||
449 | cprintf(GREY, "Device responded with invalid data\n"); | 450 | cprintf(GREY, "Device responded with invalid data\n"); |
450 | return 1; | 451 | return 1; |
451 | } | 452 | } |
452 | if(xfer_size - 4 != (int)size) | 453 | if(!g_relaxed && xfer_size - 4 != (int)*size) |
453 | { | 454 | { |
454 | free(xfer_buf); | 455 | free(xfer_buf); |
455 | cprintf(GREY, "Device didn't send the expected amount of data\n"); | 456 | cprintf(GREY, "Device didn't send the expected amount of data\n"); |
456 | return 7; | 457 | return 7; |
457 | } | 458 | } |
459 | *size = xfer_size - 4; | ||
458 | /* unscramble and copy */ | 460 | /* unscramble and copy */ |
459 | for(int i = 4, idx = get_big_endian16(xfer_buf); i < xfer_size; i++, idx++) | 461 | for(int i = 4, idx = get_big_endian16(xfer_buf); i < xfer_size; i++, idx++) |
460 | xfer_buf[i] ^= para_noise[idx % sizeof(para_noise)]; | 462 | xfer_buf[i] ^= para_noise[idx % sizeof(para_noise)]; |
461 | memcpy(buffer, xfer_buf + 4, size); | 463 | memcpy(buffer, xfer_buf + 4, *size); |
462 | free(xfer_buf); | 464 | free(xfer_buf); |
463 | return 0; | 465 | return 0; |
464 | } | 466 | } |
@@ -506,7 +508,7 @@ int get_dnk_nvp(int argc, char **argv) | |||
506 | printf("Node usage: <node>\n"); | 508 | printf("Node usage: <node>\n"); |
507 | printf("Nodes:\n"); | 509 | printf("Nodes:\n"); |
508 | for(unsigned i = 0; i < NWZ_NVP_COUNT; i++) | 510 | for(unsigned i = 0; i < NWZ_NVP_COUNT; i++) |
509 | printf(" %s\t%s\n", nwz_nvp[i].name, nwz_nvp[i].desc); | 511 | printf(" %-6s%s\n", nwz_nvp[i].name, nwz_nvp[i].desc); |
510 | return 1; | 512 | return 1; |
511 | } | 513 | } |
512 | int series_index, model_index; | 514 | int series_index, model_index; |
@@ -523,15 +525,19 @@ int get_dnk_nvp(int argc, char **argv) | |||
523 | printf("I don't know about node '%s'\n", argv[0]); | 525 | printf("I don't know about node '%s'\n", argv[0]); |
524 | return 4; | 526 | return 4; |
525 | } | 527 | } |
526 | uint8_t *buffer = malloc(nwz_nvp[node].size); | 528 | size_t size = nwz_nvp[node].size; |
527 | ret = read_nvp_node(series_index, node, buffer, nwz_nvp[node].size); | 529 | /* in relaxed mode, always ask for a lot of data to make sure we get everything */ |
530 | if(g_relaxed) | ||
531 | size = 4096; | ||
532 | uint8_t *buffer = malloc(size); | ||
533 | ret = read_nvp_node(series_index, node, buffer, &size); | ||
528 | if(ret != 0) | 534 | if(ret != 0) |
529 | { | 535 | { |
530 | free(buffer); | 536 | free(buffer); |
531 | return ret; | 537 | return ret; |
532 | } | 538 | } |
533 | cprintf(GREEN, "%s:\n", nwz_nvp[node].name); | 539 | cprintf(GREEN, "%s:\n", nwz_nvp[node].name); |
534 | print_hex(buffer, nwz_nvp[node].size); | 540 | print_hex(buffer, size); |
535 | 541 | ||
536 | free(buffer); | 542 | free(buffer); |
537 | return 0; | 543 | return 0; |
@@ -747,8 +753,9 @@ int do_dest(int argc, char **argv) | |||
747 | int model_index, series_index; | 753 | int model_index, series_index; |
748 | int ret = get_model_and_series(&model_index, &series_index); | 754 | int ret = get_model_and_series(&model_index, &series_index); |
749 | /* in all cases, we need to read shp */ | 755 | /* in all cases, we need to read shp */ |
750 | uint8_t *shp = malloc(nwz_nvp[NWZ_NVP_SHP].size); | 756 | size_t size = nwz_nvp[NWZ_NVP_SHP].size; |
751 | ret = read_nvp_node(series_index, NWZ_NVP_SHP, shp, nwz_nvp[NWZ_NVP_SHP].size); | 757 | uint8_t *shp = malloc(size); |
758 | ret = read_nvp_node(series_index, NWZ_NVP_SHP, shp, &size); | ||
752 | if(ret != 0) | 759 | if(ret != 0) |
753 | { | 760 | { |
754 | free(shp); | 761 | free(shp); |
@@ -819,7 +826,7 @@ int do_dest(int argc, char **argv) | |||
819 | } | 826 | } |
820 | set_little_endian32(shp, dst); | 827 | set_little_endian32(shp, dst); |
821 | set_little_endian32(shp + 4, sps); | 828 | set_little_endian32(shp + 4, sps); |
822 | int ret = write_nvp_node(series_index, NWZ_NVP_SHP, shp, nwz_nvp[NWZ_NVP_SHP].size); | 829 | int ret = write_nvp_node(series_index, NWZ_NVP_SHP, shp, size); |
823 | free(shp); | 830 | free(shp); |
824 | return ret; | 831 | return ret; |
825 | } | 832 | } |
@@ -866,6 +873,7 @@ static void usage(void) | |||
866 | printf(" -d/--debug Display debug messages\n"); | 873 | printf(" -d/--debug Display debug messages\n"); |
867 | printf(" -c/--no-color Disable color output\n"); | 874 | printf(" -c/--no-color Disable color output\n"); |
868 | printf(" -s/--series <name> Force series (disable auto-detection, use '?' for the list)\n"); | 875 | printf(" -s/--series <name> Force series (disable auto-detection, use '?' for the list)\n"); |
876 | printf(" -r/--relaxed Relax length checks on nvp properties\n"); | ||
869 | printf("Commands:\n"); | 877 | printf("Commands:\n"); |
870 | for(unsigned i = 0; i < NR_CMDS; i++) | 878 | for(unsigned i = 0; i < NR_CMDS; i++) |
871 | printf(" %s\t%s\n", cmd_list[i].name, cmd_list[i].desc); | 879 | printf(" %s\t%s\n", cmd_list[i].name, cmd_list[i].desc); |
@@ -885,7 +893,7 @@ int main(int argc, char **argv) | |||
885 | {0, 0, 0, 0} | 893 | {0, 0, 0, 0} |
886 | }; | 894 | }; |
887 | 895 | ||
888 | int c = getopt_long(argc, argv, "?dcfo:s:", long_options, NULL); | 896 | int c = getopt_long(argc, argv, "?dcfo:s:r", long_options, NULL); |
889 | if(c == -1) | 897 | if(c == -1) |
890 | break; | 898 | break; |
891 | switch(c) | 899 | switch(c) |
@@ -907,6 +915,9 @@ int main(int argc, char **argv) | |||
907 | case 's': | 915 | case 's': |
908 | g_force_series = optarg; | 916 | g_force_series = optarg; |
909 | break; | 917 | break; |
918 | case 'r': | ||
919 | g_relaxed = true; | ||
920 | break; | ||
910 | default: | 921 | default: |
911 | abort(); | 922 | abort(); |
912 | } | 923 | } |