int usb_read_bootloader(int *_len) { long len = 0; int n = 0; unsigned long offset = (CFG_LOADADDR -0x120); static unsigned MSG = 0xaabbccdd; /*Enable USB mux pin cfg enable USB clock */ enable_irqs(); if (usb_open(&usbdev)) return -1; usb_queue_read(&usbdev, &len, 4); printf("USB write MSG flag\n"); usb_write(&usbdev, &MSG, 4); n = usb_wait_read(&usbdev); if (n) return -1; printf("USB read to %x len=%d\n", offset, len); if (usb_read(&usbdev, (void*) offset, len)) return -1; /* read the img file */ usb_queue_read(&usbdev, &len, 4); n = usb_wait_read(&usbdev); if (n) return -1; /* read the boot.img for booti command */ printf("USB read2 to %x len=%d\n", 0x81000000, len); if (usb_read(&usbdev, (void*) 0x81000000, len)) return -1; usb_close(&usbdev); disable_irqs(); *_len = len; return 0; }
int usb_read(struct usb *usb, void *data, unsigned len) { unsigned xfer; unsigned char *x = data; int n; while (len > 0) { xfer = (len > USB_MAX_IO) ? USB_MAX_IO : len; usb_queue_read(usb, x, xfer); n = usb_wait_read(usb); if (n) return n; x += xfer; len -= xfer; } return 0; }
static int load_from_usb(unsigned *_len, struct usb *usb) { unsigned len, n; enable_irqs(); usb_queue_read(usb, &len, 4); usb_write(usb, &MSG, 4); n = usb_wait_read(usb); if (n) return -1; if (usb_read(usb, (void*) CONFIG_ADDR_DOWNLOAD, len)) return -1; usb_close(usb); disable_irqs(); *_len = len; return 0; }