/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id: crt0-pp-bl.S 11815 2006-12-19 11:33:53Z barrywardell $ * * Copyright (C) 2007 by Jonathan Gordon * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include #include #include #include #include #include #include "bootimg.h" #include /* This tool requires libusb */ #define E200_INTERFACE 0 #define E200_ENDPOINT 1 #define E200_TIMEOUT 5000 #define PROGRAM_TIMEOUT 120000 #define SANDISK_VENDOR_ID 0x0781 #define SANDISK_PRODUCT_ID 0x0720 #define PP_VENDOR_ID 0x0b70 #define PP_PRODUCT_ID 0x0003 void put_le32(void * ptr, uint32_t val) { uint8_t * b = ptr; b[0] = val; b[1] = val >> 8; b[2] = val >> 16; b[3] = val >> 24; } int send_dev(usb_dev_handle * ud, const void * data, uint32_t len) { char * buf = (char *)data; int32_t todo; int ret; while (len > 0) { todo = len > BUFSIZE ? BUFSIZE : len; ret = usb_bulk_write(ud, E200_ENDPOINT, buf, todo, E200_TIMEOUT); if (ret < 0) { fprintf(stderr, "\nBulk write error (%d, %s)\n", ret, strerror(-ret)); return ret; } buf += ret; len -= ret; } return 0; } usb_dev_handle *device_get(int vendor, int product) { struct usb_bus * bus, * busses; struct usb_device * dev; usb_dev_handle * ud; int ret, retries = 10; bool found = false; fprintf(stderr, "Searching for device %04x:%04x ... ", vendor, product); retry: found = false; usb_find_busses(); usb_find_devices(); busses = usb_get_busses(); for (bus = busses; !found && bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { if ((dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product && dev->descriptor.bDeviceClass == 0xff && dev->descriptor.bDeviceSubClass == 0xff && dev->descriptor.bDeviceProtocol == 0xff)) { found = true; break; } } if (found) { fprintf(stderr, "found!\n"); ud = usb_open(dev); if (!ud) { fprintf(stderr, "Failed to open the device!\n"); return NULL; } ret = usb_claim_interface(ud, E200_INTERFACE); if (ret < 0) { fprintf(stderr, "Failed to claim the interface (%d, %s)\n", ret, strerror(-ret)); usb_close(ud); return NULL; } return ud; } } if (retries-- > 0) { do_delay(1); fprintf(stderr, "%d ", retries); goto retry; } fprintf(stderr, "not found!\n"); return NULL; } int main(int argc, char * argv[]) { (void)argc;(void)argv; usb_dev_handle * ud; int ret; char buffer[16]; fprintf(stderr, "e200r-installer, (c) Jonathan Gordon 2007\n%s\n", "$Revision$"); usb_init(); ud = device_get(SANDISK_VENDOR_ID, SANDISK_PRODUCT_ID); if (!ud) { ud = device_get(PP_VENDOR_ID, PP_PRODUCT_ID); if (!ud) return 1; } fprintf(stderr, "Transferring Installer to Sansa...\n"); put_le32(buffer, LEN_bootimg); ret = usb_bulk_write(ud, E200_ENDPOINT, buffer, sizeof LEN_bootimg, E200_TIMEOUT); if (ret < 0) { fprintf(stderr, "\nLength write error (%d, %s)\n", ret, strerror(-ret)); return 1; } ret = send_dev(ud, bootimg, LEN_bootimg); fprintf(stderr, "%d bytes LEN_bootimg\n", ret); usb_release_interface(ud, E200_INTERFACE); usb_close(ud); return 0; }