Commit 1deea82c759f80caa8f8c6b717833e6956d36997
Committed by
Gordon Hollingworth
1 parent
7dfdce9f
Add CM3 support
Showing
3 changed files
with
84 additions
and
6 deletions
main.c
| @@ -6,6 +6,8 @@ | @@ -6,6 +6,8 @@ | ||
| 6 | #include <unistd.h> | 6 | #include <unistd.h> |
| 7 | 7 | ||
| 8 | int verbose = 0; | 8 | int verbose = 0; |
| 9 | +int out_ep = 1; | ||
| 10 | +int in_ep = 2; | ||
| 9 | 11 | ||
| 10 | void usage(int error) | 12 | void usage(int error) |
| 11 | { | 13 | { |
| @@ -28,35 +30,105 @@ void usage(int error) | @@ -28,35 +30,105 @@ void usage(int error) | ||
| 28 | exit(-1); | 30 | exit(-1); |
| 29 | } | 31 | } |
| 30 | 32 | ||
| 33 | +libusb_device_handle * LIBUSB_CALL open_device_with_vid( | ||
| 34 | + libusb_context *ctx, uint16_t vendor_id) | ||
| 35 | +{ | ||
| 36 | + struct libusb_device **devs; | ||
| 37 | + struct libusb_device *found = NULL; | ||
| 38 | + struct libusb_device *dev; | ||
| 39 | + struct libusb_device_handle *handle = NULL; | ||
| 40 | + size_t i = 0; | ||
| 41 | + int r; | ||
| 42 | + | ||
| 43 | + if (libusb_get_device_list(ctx, &devs) < 0) | ||
| 44 | + return NULL; | ||
| 45 | + | ||
| 46 | + while ((dev = devs[i++]) != NULL) { | ||
| 47 | + struct libusb_device_descriptor desc; | ||
| 48 | + r = libusb_get_device_descriptor(dev, &desc); | ||
| 49 | + if (r < 0) | ||
| 50 | + goto out; | ||
| 51 | + if(verbose) | ||
| 52 | + printf("Found device %d idVendor=0x%04x idProduct=0x%04x\n", i, desc.idVendor, desc.idProduct); | ||
| 53 | + if (desc.idVendor == vendor_id) { | ||
| 54 | + if(desc.idProduct == 0x2763 || | ||
| 55 | + desc.idProduct == 0x2764) | ||
| 56 | + { | ||
| 57 | + if(verbose) printf("Device located successfully\n"); | ||
| 58 | + found = dev; | ||
| 59 | + break; | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + if (found) { | ||
| 65 | + r = libusb_open(found, &handle); | ||
| 66 | + if (r < 0) | ||
| 67 | + { | ||
| 68 | + if(verbose) printf("Failed to open the requested device\n"); | ||
| 69 | + handle = NULL; | ||
| 70 | + } | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | +out: | ||
| 74 | + libusb_free_device_list(devs, 1); | ||
| 75 | + return handle; | ||
| 76 | + | ||
| 77 | +} | ||
| 31 | 78 | ||
| 32 | int Initialize_Device(libusb_context ** ctx, libusb_device_handle ** usb_device) | 79 | int Initialize_Device(libusb_context ** ctx, libusb_device_handle ** usb_device) |
| 33 | { | 80 | { |
| 34 | int ret = 0; | 81 | int ret = 0; |
| 82 | + int interface; | ||
| 83 | + struct libusb_config_descriptor *config; | ||
| 35 | 84 | ||
| 36 | - *usb_device = libusb_open_device_with_vid_pid(*ctx, 0x0a5c, 0x2763); | 85 | + *usb_device = open_device_with_vid(*ctx, 0x0a5c); |
| 37 | if (*usb_device == NULL) | 86 | if (*usb_device == NULL) |
| 38 | { | 87 | { |
| 39 | return -1; | 88 | return -1; |
| 40 | } | 89 | } |
| 41 | 90 | ||
| 42 | - ret = libusb_claim_interface(*usb_device, 0); | 91 | + libusb_get_active_config_descriptor(libusb_get_device(*usb_device), &config); |
| 92 | + | ||
| 93 | + if(config->bNumInterfaces == 1) | ||
| 94 | + { | ||
| 95 | + interface = 0; | ||
| 96 | + out_ep = 1; | ||
| 97 | + in_ep = 2; | ||
| 98 | + } | ||
| 99 | + else | ||
| 100 | + { | ||
| 101 | + interface = 1; | ||
| 102 | + out_ep = 3; | ||
| 103 | + in_ep = 4; | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + ret = libusb_claim_interface(*usb_device, interface); | ||
| 43 | if (ret) | 107 | if (ret) |
| 44 | { | 108 | { |
| 45 | printf("Failed to claim interface\n"); | 109 | printf("Failed to claim interface\n"); |
| 46 | return ret; | 110 | return ret; |
| 47 | } | 111 | } |
| 48 | 112 | ||
| 113 | + printf("Initialised device correctly\n"); | ||
| 114 | + | ||
| 49 | return ret; | 115 | return ret; |
| 50 | } | 116 | } |
| 51 | 117 | ||
| 52 | int ep_write(unsigned char *buf, int len, libusb_device_handle * usb_device) | 118 | int ep_write(unsigned char *buf, int len, libusb_device_handle * usb_device) |
| 53 | { | 119 | { |
| 120 | + int a_len; | ||
| 54 | int ret = | 121 | int ret = |
| 55 | libusb_control_transfer(usb_device, LIBUSB_REQUEST_TYPE_VENDOR, 0, | 122 | libusb_control_transfer(usb_device, LIBUSB_REQUEST_TYPE_VENDOR, 0, |
| 56 | len & 0xffff, len >> 16, NULL, 0, 1000); | 123 | len & 0xffff, len >> 16, NULL, 0, 1000); |
| 57 | - int a_len; | ||
| 58 | 124 | ||
| 59 | - ret = libusb_bulk_transfer(usb_device, 0x01, buf, len, &a_len, 100000); | 125 | + if(ret != 0) |
| 126 | + { | ||
| 127 | + printf("Failed control transfer\n"); | ||
| 128 | + return ret; | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + ret = libusb_bulk_transfer(usb_device, out_ep, buf, len, &a_len, 100000); | ||
| 60 | if(verbose) | 132 | if(verbose) |
| 61 | printf("libusb_bulk_transfer returned %d\n", ret); | 133 | printf("libusb_bulk_transfer returned %d\n", ret); |
| 62 | 134 | ||
| @@ -187,12 +259,13 @@ int main(int argc, char *argv[]) | @@ -187,12 +259,13 @@ int main(int argc, char *argv[]) | ||
| 187 | exit(-1); | 259 | exit(-1); |
| 188 | } | 260 | } |
| 189 | 261 | ||
| 190 | - libusb_set_debug(ctx, 0); | 262 | + libusb_set_debug(ctx, verbose ? LIBUSB_LOG_LEVEL_WARNING : 0); |
| 191 | 263 | ||
| 192 | do | 264 | do |
| 193 | { | 265 | { |
| 194 | FILE *fp_img = NULL; | 266 | FILE *fp_img = NULL; |
| 195 | struct libusb_device_descriptor desc; | 267 | struct libusb_device_descriptor desc; |
| 268 | + struct libusb_config_descriptor *config; | ||
| 196 | 269 | ||
| 197 | printf("Waiting for BCM2835 ...\n"); | 270 | printf("Waiting for BCM2835 ...\n"); |
| 198 | 271 | ||
| @@ -204,12 +277,15 @@ int main(int argc, char *argv[]) | @@ -204,12 +277,15 @@ int main(int argc, char *argv[]) | ||
| 204 | { | 277 | { |
| 205 | libusb_get_device_descriptor(libusb_get_device | 278 | libusb_get_device_descriptor(libusb_get_device |
| 206 | (usb_device), &desc); | 279 | (usb_device), &desc); |
| 280 | + printf("Found serial number %d\n", desc.iSerialNumber); | ||
| 207 | // Make sure we've re-enumerated since the last time | 281 | // Make sure we've re-enumerated since the last time |
| 208 | if(desc.iSerialNumber == last_serial) | 282 | if(desc.iSerialNumber == last_serial) |
| 209 | { | 283 | { |
| 210 | result = -1; | 284 | result = -1; |
| 211 | libusb_close(usb_device); | 285 | libusb_close(usb_device); |
| 212 | } | 286 | } |
| 287 | + | ||
| 288 | + libusb_get_active_config_descriptor(libusb_get_device(usb_device), &config); | ||
| 213 | } | 289 | } |
| 214 | 290 | ||
| 215 | if (result) | 291 | if (result) |
| @@ -275,13 +351,14 @@ int main(int argc, char *argv[]) | @@ -275,13 +351,14 @@ int main(int argc, char *argv[]) | ||
| 275 | exit(-1); | 351 | exit(-1); |
| 276 | } | 352 | } |
| 277 | 353 | ||
| 354 | + sleep(1); | ||
| 278 | size = | 355 | size = |
| 279 | ep_read((unsigned char *)&retcode, sizeof(retcode), | 356 | ep_read((unsigned char *)&retcode, sizeof(retcode), |
| 280 | usb_device); | 357 | usb_device); |
| 281 | 358 | ||
| 282 | if (retcode == 0) | 359 | if (retcode == 0) |
| 283 | { | 360 | { |
| 284 | - if(verbose) printf("Successful\n"); | 361 | + printf("Successful read %d bytes \n", size); |
| 285 | 362 | ||
| 286 | if(fp == fp2 && executable) | 363 | if(fp == fp2 && executable) |
| 287 | { | 364 | { |
| @@ -292,6 +369,7 @@ int main(int argc, char *argv[]) | @@ -292,6 +369,7 @@ int main(int argc, char *argv[]) | ||
| 292 | printf("Failed : 0x%x", retcode); | 369 | printf("Failed : 0x%x", retcode); |
| 293 | 370 | ||
| 294 | libusb_close(usb_device); | 371 | libusb_close(usb_device); |
| 372 | + sleep(1); | ||
| 295 | } | 373 | } |
| 296 | while(fp == fp1 || loop); | 374 | while(fp == fp1 || loop); |
| 297 | 375 |
msd.elf
No preview for this file type
usbbootcode.bin
No preview for this file type