diff options
-rw-r--r-- | src/cold-flash.c | 388 | ||||
-rw-r--r-- | src/main.c | 99 |
2 files changed, 0 insertions, 487 deletions
diff --git a/src/cold-flash.c b/src/cold-flash.c deleted file mode 100644 index d3c5cde..0000000 --- a/src/cold-flash.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - cold-flash.c - Cold flashing - Copyright (C) 2011-2012 Pali Rohár <pali.rohar@gmail.com> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -*/ - -#include <stdio.h> -#include <stdint.h> -#include <string.h> -#include <errno.h> -#include <usb.h> - -#define READ_DEV 0x81 -#define WRITE_DEV 0x01 -#define READ_TIMEOUT 500 -#define WRITE_TIMEOUT 3000 - -static uint32_t tab[256]; - -static void crc32_gentab(void) { - - int i, j; - uint32_t crc; - uint32_t poly = 0xEDB88320L; - - for ( i = 0; i < 256; i++) { - - crc = i; - - for ( j = 8; j > 0; j-- ) { - - if (crc & 1) - crc = (crc >> 1) ^ poly; - else - crc >>= 1; - - } - - tab[i] = crc; - - } - -} - -static uint32_t crc32(unsigned char * bytes, size_t size, uint32_t crc) { - - static int gen = 0; - uint32_t i; - - if ( ! gen ) { - crc32_gentab(); - gen = 1; - } - - for ( i = 0; i < size; ++i ) - crc = (crc >> 8) ^ tab[(crc ^ bytes[i]) & 0xff]; - - return crc; - -} - -/* Omap download message */ -static const uint8_t omap_download_msg[4] = { 0x02, 0x00, 0x03, 0xF0 }; - -/* Structure of X-Loader message */ -struct xloader_msg { - uint8_t type[4]; /* 4 bytes - type of message */ - uint8_t size[4]; /* 4 bytes - size of file */ - uint8_t crc1[4]; /* 4 bytes - crc32 of file */ - uint8_t crc2[4]; /* 4 bytes - crc32 of first 12 bytes of message */ -}; - -#define XLOADER_MSG_TYPE_PING 0x6301326E -#define XLOADER_MSG_TYPE_SEND 0x6302326E - -struct xloader_msg xloader_msg_create(uint32_t type, FILE * file, size_t offset, uint32_t size) { - - struct xloader_msg msg; - uint8_t buffer[1024]; - size_t need, readed; - uint32_t crc = 0; - int ret; - - memcpy(msg.type, &type, 4); - memcpy(msg.size, &size, 4); - - if ( file ) { - fseek(file, offset, SEEK_SET); - readed = 0; - while ( readed < size ) { - need = size - readed; - if ( need > sizeof(buffer) ) - need = sizeof(buffer); - ret = fread(buffer, 1, need, file); - if ( ret < 0 ) - break; - crc = crc32(buffer, ret, crc); - readed += ret; - } - } - - memcpy(msg.crc1, &crc, 4); - - crc = crc32((unsigned char *)&msg, 12, 0); - memcpy(msg.crc2, &crc, 4); - - return msg; - -} - -static int read_asic(usb_dev_handle * udev) { - - uint8_t asic_buffer[127]; - int asic_size = 69; - int i, ret; - - printf("Waiting for ASIC ID...\n"); - ret = usb_bulk_read(udev, READ_DEV, (char *)asic_buffer, sizeof(asic_buffer), READ_TIMEOUT); - if ( ret != asic_size ) { - fprintf(stderr, "Invalid size of ASIC ID\n"); - return 0; - } - - printf("Got ASIC ID:"); - for ( i = 0; i < asic_size; ++i ) - printf(" 0x%.2X", (unsigned int)asic_buffer[i]); - printf("\n"); - - return 1; - -} - -static int send_2nd(usb_dev_handle * udev, FILE * file, size_t offset, size_t size) { - - uint8_t buffer[1024]; - uint32_t size32; - size_t need, readed; - int ret; - - size32 = size; - fseek(file, offset, SEEK_SET); - - if ( size == 0 ) { - fprintf(stderr, "2nd X-Loader image has zero size\n"); - return 0; - } - - if ( size > UINT32_MAX ) { - fprintf(stderr, "2nd X-Loader image is too big\n"); - return 0; - } - - printf("Sending OMAP download message...\n"); - ret = usb_bulk_write(udev, WRITE_DEV, (char *)omap_download_msg, sizeof(omap_download_msg), WRITE_TIMEOUT); - usleep(5000); - if ( ret != sizeof(omap_download_msg) ) { - fprintf(stderr, "Error while sending OMAP download message\n"); - return 0; - } - - printf("Sending 2nd X-Loader image size...\n"); - ret = usb_bulk_write(udev, WRITE_DEV, (char *)&size32, sizeof(size32), WRITE_TIMEOUT); - usleep(5000); - if ( ret != sizeof(size32) ) { - fprintf(stderr, "Error while sending 2nd X-Loader image size\n"); - return 0; - } - - printf("Sending 2nd X-Loader image...\n"); - readed = 0; - while ( readed < size ) { - need = size - readed; - if ( need > sizeof(buffer) ) - need = sizeof(buffer); - ret = fread(buffer, 1, need, file); - if ( ret < 0 ) - break; - if ( usb_bulk_write(udev, WRITE_DEV, (char *)buffer, ret, WRITE_TIMEOUT) != ret ) { - fprintf(stderr, "Error while sending 2nd X-Loader image\n"); - return 0; - } - readed += ret; - } - usleep(50000); - - return 1; - -} - -static int send_secondary(usb_dev_handle * udev, FILE * file, size_t offset, size_t size) { - - struct xloader_msg init_msg; - uint8_t buffer[1024]; - uint32_t size32; - size_t need, readed; - int ret; - - size32 = size; - fseek(file, offset, SEEK_SET); - - if ( size == 0 ) { - fprintf(stderr, "2nd Secondary image has zero size\n"); - return 0; - } - - if ( size > UINT32_MAX ) { - fprintf(stderr, "2nd Secondary image is too big\n"); - return 0; - } - - init_msg = xloader_msg_create(XLOADER_MSG_TYPE_SEND, file, offset, size32); - - printf("Sending X-Loader init message...\n"); - ret = usb_bulk_write(udev, WRITE_DEV, (char *)&init_msg, sizeof(init_msg), WRITE_TIMEOUT); - usleep(5000); - if ( ret != sizeof(init_msg) ) { - fprintf(stderr, "Error while sending X-Loader init message\n"); - return 0; - } - - printf("Waiting for X-Loader response...\n"); - ret = usb_bulk_read(udev, READ_DEV, (char *)&size32, sizeof(size32), READ_TIMEOUT); /* size32 - dummy value */ - if ( ret != sizeof(size32) ) { - fprintf(stderr, "Error no response\n"); - return 0; - } - - printf("Sending Secondary image...\n"); - readed = 0; - while ( readed < size ) { - need = size - readed; - if ( need > sizeof(buffer) ) - need = sizeof(buffer); - ret = fread(buffer, 1, need, file); - if ( ret < 0 ) - break; - if ( usb_bulk_write(udev, WRITE_DEV, (char *)buffer, ret, WRITE_TIMEOUT) != ret ) { - fprintf(stderr, "Error while sending Secondary image\n"); - return 0; - } - readed += ret; - } - usleep(5000); - - printf("Waiting for X-Loader response...\n"); - ret = usb_bulk_read(udev, READ_DEV, (char *)&size32, sizeof(size32), READ_TIMEOUT); /* size32 - dummy value */ - if ( ret != sizeof(size32) ) { - fprintf(stderr, "Error no response\n"); - return 0; - } - - return 1; - -} - -static int ping_timeout(usb_dev_handle * udev) { - - int ret; - int pong = 0; - int try_ping = 10; - - while ( try_ping > 0 ) { - - struct xloader_msg ping_msg = xloader_msg_create(XLOADER_MSG_TYPE_PING, NULL, 0, 0); - int try_read = 4; - - printf("Sending X-Loader ping message\n"); - ret = usb_bulk_write(udev, WRITE_DEV, (char *)&ping_msg, sizeof(ping_msg), WRITE_TIMEOUT); - if ( ret != sizeof(ping_msg) ) { - fprintf(stderr, "Error while sending X-Loader ping message\n"); - return 0; - } - - printf("Waiting for X-Loader pong response...\n"); - while ( try_read > 0 ) { - - uint32_t ping_read; - ret = usb_bulk_read(udev, READ_DEV, (char *)&ping_read, sizeof(ping_read), READ_TIMEOUT); - if ( ret == sizeof(ping_read) ) { - printf("Got it\n"); - pong = 1; - break; - } - - usleep(5000); - --try_read; - - } - - if ( pong ) - break; - - printf("Responce timeout\n"); - --try_ping; - - } - - if (pong) - return 1; - else - return 0; - -} - -int cold_flash(usb_dev_handle * udev, const char * x2nd, const char * secondary) { - - size_t size1, size2; - FILE * file1 = NULL; - FILE * file2 = NULL; - int ret = 1; - - file1 = fopen(x2nd, "r"); - if ( ! file1 ) { - fprintf(stderr, "Cannot open 2nd X-Loader file '%s': %s\n", x2nd, strerror(errno)); - goto cleanup; - } - - file2 = fopen(secondary, "r"); - if ( ! file2 ) { - fprintf(stderr, "Cannot open Secondary file '%s': %s\n", secondary, strerror(errno)); - goto cleanup; - } - - fseek(file1, 0, SEEK_END); - size1 = ftell(file1); - - fseek(file2, 0, SEEK_END); - size2 = ftell(file2); - - if ( usb_set_configuration(udev, 1) < 0 ) { - fprintf(stderr, "usb_set_configuration failed: %s\n", strerror(errno)); - goto cleanup; - } - - if ( usb_claim_interface(udev, 1) < 0 ) { - fprintf(stderr, "usb_claim_interface failed: %s\n", strerror(errno)); - goto cleanup; - } - - if ( ! read_asic(udev) ) { - fprintf(stderr, "Reading ASIC ID failed\n"); - goto cleanup; - } - - if ( ! send_2nd(udev, file1, size1, 0) ) { - fprintf(stderr, "Sending 2nd X-Loader image failed\n"); - goto cleanup; - } - - if ( ! ping_timeout(udev) ) { - fprintf(stderr, "Sending X-Loader ping failed\n"); - goto cleanup; - } - - if ( ! send_secondary(udev, file2, size2, 0) ) { - fprintf(stderr, "Sending Secondary image failed\n"); - goto cleanup; - } - - printf("Done\n"); - ret = 0; - -cleanup: - if (file1) - fclose(file1); - if (file2) - fclose(file2); - return ret; - -} - -/*int fiasco_cold_flash(usb_dev_handle * udev, const char * device, const char * hw_rev, const char * fiasco) { - - -}*/ @@ -68,105 +68,6 @@ void show_usage() int i; show_title(); -#if 0 - // TODO: remove console: serial.c - // TODO: remove inject usb and supported list - // TODO: remove option for calculate hash - - printf ("" - -#if defined(WITH_USB) && ! defined(WITH_DEVICE) - "Over USB:\n" - " -b [cmdline] boot default or loaded kernel with cmdline (default: use default kernel cmdline)\n" - " -R reboot device\n" - " -l load all specified images to RAM\n" - " -f flash all specified images\n" - " -c cold flash 2nd and secondary images\n" - "\n" -#endif - -#ifdef WITH_DEVICE - "On device:\n" - " -R reboot device\n" - " -f flash all specified images\n" - " -x [/dev/mtd] check for bad blocks on mtd device (default: check all)\n" - " -E dump all images from device to fiasco image, see -M and -t\n" - " -e [dir] dump all images from device to directory, see -t (default: current dir)\n" - "\n" -#endif - -#if defined(WITH_USB) || defined(WITH_DEVICE) - "Device configuration:\n" - " -i identify, show all information about device\n" - " -D 0|1|2 change root device: 0 - flash, 1 - mmc, 2 - usb\n" - " -U 0|1 disable/enable USB host mode\n" - " -r 0|1 disable/enable R&D mode\n" - " -F flags change R&D flags, flags are comma separated list, can be empty\n" - " -H rev change HW revision\n" - " -K ver change kernel version string\n" - " -N ver change NOLO version string\n" - " -S ver change SW release version string\n" - " -C ver change content eMMC version string\n" - "\n" -#endif - - "Normal image specification:\n" - " -m [arg] specify normal image\n" - " arg is [[[dev:[hw:]]ver:]type:]file[%%lay]\n" - " dev is device name string (default: emtpy)\n" - " hw are comma separated list of HW revisions (default: empty)\n" - " ver is image version string (default: empty)\n" - " type is image type (default: try autodetect)\n" - " file is image file name\n" - " lay is layout file name (default: none)\n" - "\n" - - "Fiasco image specification:\n" - " -M file specify input fiasco image\n" - " -t [types] filter images by comma separated list of image types (default: do not filter)\n" - " -d [dev] filter images by device (default: do not filter)\n" - " -w [hw] filter images by HW revision (default: do not filter)\n" - " -u [dir] unpack fiasco image to directory (default: current dir)\n" - " -g [ver] generate fiasco image for SW release version (default: without SW release)\n" - "\n" - - "Other options:\n" - " -I identify images\n" -#if defined(WITH_USB) || defined(WITH_DEVICE) - " -c console prompt mode\n" -#endif -#if ( defined(WITH_USB) || defined(WITH_DEVICE) ) && defined(WITH_SQUEUES) - " -Q enter shared queues server mode (for gui or remote)\n" -#endif - " -s simulate, do not flash or write on disk\n" - " -n disable hash, checksum and image type checking\n" - " -v be verbose and noisy\n" - " -V show 0xFFFF version information\n" - " -h show this help message\n" - "\n" - -#if defined(WITH_USB) || defined(WITH_DEVICE) - "R&D flags:\n" - " no-omap-wd disable auto reboot by OMAP watchdog\n" - " no-ext-wd disable auto reboot by external watchdog\n" - " no-lifeguard-reset disable auto reboot by lifeguard\n" - " serial-console enable serial console\n" - " no-usb-timeout disable usb timeout\n" - " sti-console enable sti console\n" - " no-charging disable battery charging\n" - " force-power-key force omap boot reason to power key\n" - "\n" -#endif - - ); - - printf( "Image types:\n"); - for ( i = 0; image_types[i]; ++i ) - printf(" %-15s %s\n", image_types[i], image_desc[i]); - printf( "\n"); - -#endif - #if HAVE_USB printf ("Over USB:\n" " -b [arg] boots the kernel with arguments\n" |