Commit bc1fe9e8330a1159baaa796afdf78a7f7d2c7b23

Authored by Chris Burton
Committed by Gordon Hollingworth
1 parent 94c87275

Directory overlay support (#23)

* Add boot directory overlay support (USB path)

* Sleep before libusb_control_transfer seems to prevent timeout errors??

* Cleanup (removing unneeded sleep/spacing)
Break out of "file_server" loop if the device no longer exists (prevents getting stuck in the loop)
Sleep longer in the main detection loop (reduces CPU usage)

* Cleanup merged code

* Add delay option to reduce CPU usage (e.g. 500 = 7% CPU usage, 5000 = 1% CPU usage)

* Require space between "-m" option and delay value.
Showing 1 changed file with 68 additions and 7 deletions
main.c 100755 → 100644
... ... @@ -8,7 +8,10 @@
8 8 int signed_boot = 0;
9 9 int verbose = 0;
10 10 int loop = 0;
  11 +int overlay = 0;
  12 +long delay = 500;
11 13 char * directory = NULL;
  14 +char pathname[18];
12 15  
13 16 int out_ep;
14 17 int in_ep;
... ... @@ -31,6 +34,10 @@ void usage(int error)
31 34 fprintf(dest, "rpiboot -d [directory] : Boot the device using the boot files in 'directory'\n");
32 35 fprintf(dest, "Further options:\n");
33 36 fprintf(dest, " -l : Loop forever\n");
  37 + fprintf(dest, " -o : Use files from overlay subdirectory if they exist (when using a custom directory)\n");
  38 + fprintf(dest, " USB Path (1-1.3.2 for example) is shown in verbose mode.\n");
  39 + fprintf(dest, " (bootcode.bin is always preloaded from the base directory)\n");
  40 + fprintf(dest, " -m delay : Microseconds delay between checking for new devices (default 500)\n");
34 41 fprintf(dest, " -v : Verbose\n");
35 42 fprintf(dest, " -s : Signed using bootsig.bin\n");
36 43 fprintf(dest, " -h : This help\n");
... ... @@ -46,18 +53,39 @@ libusb_device_handle * LIBUSB_CALL open_device_with_vid(
46 53 struct libusb_device *dev;
47 54 struct libusb_device_handle *handle = NULL;
48 55 uint32_t i = 0;
49   - int r;
  56 + int r, j, len;
  57 + uint8_t path[8];
50 58  
51 59 if (libusb_get_device_list(ctx, &devs) < 0)
52 60 return NULL;
53 61  
54 62 while ((dev = devs[i++]) != NULL) {
  63 + len = 0;
55 64 struct libusb_device_descriptor desc;
56 65 r = libusb_get_device_descriptor(dev, &desc);
57 66 if (r < 0)
58 67 goto out;
  68 +
  69 + if(overlay || verbose == 2)
  70 + {
  71 + r = libusb_get_port_numbers(dev, path, sizeof(path));
  72 + len = snprintf(&pathname[len], 18-len, "%d", libusb_get_bus_number(dev));
  73 + if (r > 0) {
  74 + len += snprintf(&pathname[len], 18-len, "-");
  75 + len += snprintf(&pathname[len], 18-len, "%d", path[0]);
  76 + for (j = 1; j < r; j++)
  77 + {
  78 + len += snprintf(&pathname[len], 18-len, ".%d", path[j]);
  79 + }
  80 + }
  81 + }
  82 +
59 83 if(verbose == 2)
  84 + {
60 85 printf("Found device %u idVendor=0x%04x idProduct=0x%04x\n", i, desc.idVendor, desc.idProduct);
  86 + printf("Bus: %d, Device: %d Path: %s\n",libusb_get_bus_number(dev), libusb_get_device_address(dev), pathname);
  87 + }
  88 +
61 89 if (desc.idVendor == vendor_id) {
62 90 if(desc.idProduct == 0x2763 ||
63 91 desc.idProduct == 0x2764)
... ... @@ -142,7 +170,7 @@ int ep_write(void *buf, int len, libusb_device_handle * usb_device)
142 170  
143 171 if(ret != 0)
144 172 {
145   - printf("Failed control transfer\n");
  173 + printf("Failed control transfer (%d,%d)\n", ret, len);
146 174 return ret;
147 175 }
148 176  
... ... @@ -194,6 +222,17 @@ void get_options(int argc, char *argv[])
194 222 {
195 223 verbose = 1;
196 224 }
  225 + else if(strcmp(*argv, "-o") == 0)
  226 + {
  227 + overlay = 1;
  228 + }
  229 + else if(strcmp(*argv, "-m") == 0)
  230 + {
  231 + argv++; argc--;
  232 + if(argc < 1)
  233 + usage(1);
  234 + delay = atol(*argv);
  235 + }
197 236 else if(strcmp(*argv, "-vv") == 0)
198 237 {
199 238 verbose = 2;
... ... @@ -209,6 +248,14 @@ void get_options(int argc, char *argv[])
209 248  
210 249 argv++; argc--;
211 250 }
  251 + if(overlay&&!directory)
  252 + {
  253 + usage(1);
  254 + }
  255 + if(!delay)
  256 + {
  257 + usage(1);
  258 + }
212 259 }
213 260  
214 261 boot_message_t boot_message;
... ... @@ -288,10 +335,24 @@ FILE * check_file(char * dir, char *fname)
288 335 // Check directory first then /usr/share/rpiboot
289 336 if(dir)
290 337 {
291   - strcpy(path, dir);
292   - strcat(path, "/");
293   - strcat(path, fname);
294   - fp = fopen(path, "rb");
  338 + if(overlay&&(pathname != NULL))
  339 + {
  340 + strcpy(path, dir);
  341 + strcat(path, "/");
  342 + strcat(path, pathname);
  343 + strcat(path, "/");
  344 + strcat(path, fname);
  345 + fp = fopen(path, "rb");
  346 + memset(path, 0, sizeof(path));
  347 + }
  348 +
  349 + if (fp == NULL)
  350 + {
  351 + strcpy(path, dir);
  352 + strcat(path, "/");
  353 + strcat(path, fname);
  354 + fp = fopen(path, "rb");
  355 + }
295 356 }
296 357  
297 358 if(fp == NULL)
... ... @@ -514,7 +575,7 @@ int main(int argc, char *argv[])
514 575  
515 576 if (ret)
516 577 {
517   - usleep(500);
  578 + usleep(delay);
518 579 }
519 580 }
520 581 while (ret);
... ...