summaryrefslogtreecommitdiff
path: root/utils/nwztools
diff options
context:
space:
mode:
Diffstat (limited to 'utils/nwztools')
-rw-r--r--utils/nwztools/scsitools/scsitool.c37
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 @@
48bool g_debug = false; 48bool g_debug = false;
49const char *g_force_series = NULL; 49const char *g_force_series = NULL;
50char *g_out_prefix = NULL; 50char *g_out_prefix = NULL;
51bool g_relaxed = false;
51int g_dev_fd = 0; 52int 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 */
419int read_nvp_node(int series_index, enum nwz_nvp_node_t node, void *buffer, int size) 420int 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 }