cold-flash: Rewrite error messages and return negative error values, -EAGAIN if not in cold flash mode

This commit is contained in:
Pali Rohár committed 2012-08-11 10:39:11 +02:00
1 parent cb25a8bd3e
commit 8c5590d150
1 file changed
+47 -78
+47 -78
View File
@@ -27,6 +27,7 @@
#include "image.h" #include "image.h"
#include "usb-device.h" #include "usb-device.h"
#include "printf-utils.h" #include "printf-utils.h"
#include "global.h"
#define READ_DEV 0x81 #define READ_DEV 0x81
#define WRITE_DEV 0x01 #define WRITE_DEV 0x01
@@ -147,17 +148,15 @@ static int read_asic(usb_dev_handle * udev) {
printf("Waiting for ASIC ID...\n"); printf("Waiting for ASIC ID...\n");
ret = usb_bulk_read(udev, READ_DEV, (char *)asic_buffer, sizeof(asic_buffer), READ_TIMEOUT); ret = usb_bulk_read(udev, READ_DEV, (char *)asic_buffer, sizeof(asic_buffer), READ_TIMEOUT);
if ( ret != asic_size ) { if ( ret != asic_size )
fprintf(stderr, "Invalid size of ASIC ID\n"); ERROR_RETURN("Invalid size of ASIC ID", -1);
return 0;
}
printf("Got ASIC ID:"); printf("Got ASIC ID:");
for ( i = 0; i < asic_size; ++i ) for ( i = 0; i < asic_size; ++i )
printf(" 0x%.2X", (unsigned int)asic_buffer[i]); printf(" 0x%.2X", (unsigned int)asic_buffer[i]);
printf("\n"); printf("\n");
return 1; return 0;
} }
@@ -170,20 +169,17 @@ static int send_2nd(usb_dev_handle * udev, struct image * image) {
printf("Sending OMAP peripheral boot message...\n"); printf("Sending OMAP peripheral boot message...\n");
ret = usb_bulk_write(udev, WRITE_DEV, (char *)&omap_peripheral_msg, sizeof(omap_peripheral_msg), WRITE_TIMEOUT); ret = usb_bulk_write(udev, WRITE_DEV, (char *)&omap_peripheral_msg, sizeof(omap_peripheral_msg), WRITE_TIMEOUT);
usleep(5000); usleep(5000);
if ( ret != sizeof(omap_peripheral_msg) ) { if ( ret != sizeof(omap_peripheral_msg) )
fprintf(stderr, "Error while sending OMAP peripheral boot message\n"); ERROR_RETURN("Sending OMAP peripheral boot message failed", -1);
return 0;
}
printf("Sending 2nd X-Loader image size...\n"); printf("Sending 2nd X-Loader image size...\n");
ret = usb_bulk_write(udev, WRITE_DEV, (char *)&image->size, 4, WRITE_TIMEOUT); ret = usb_bulk_write(udev, WRITE_DEV, (char *)&image->size, 4, WRITE_TIMEOUT);
usleep(5000); usleep(5000);
if ( ret != 4 ) { if ( ret != 4 )
fprintf(stderr, "Error while sending 2nd X-Loader image size\n"); ERROR_RETURN("Sending 2nd X-Loader image size failed", -1);
return 0;
}
printf("Sending 2nd X-Loader image...\n"); printf("Sending 2nd X-Loader image...\n");
printf_progressbar(0, image->size);
image_seek(image, 0); image_seek(image, 0);
readed = 0; readed = 0;
while ( readed < image->size ) { while ( readed < image->size ) {
@@ -193,15 +189,14 @@ static int send_2nd(usb_dev_handle * udev, struct image * image) {
ret = image_read(image, buffer, need); ret = image_read(image, buffer, need);
if ( ret < 0 ) if ( ret < 0 )
break; break;
if ( usb_bulk_write(udev, WRITE_DEV, (char *)buffer, ret, WRITE_TIMEOUT) != ret ) { if ( usb_bulk_write(udev, WRITE_DEV, (char *)buffer, ret, WRITE_TIMEOUT) != ret )
fprintf(stderr, "Error while sending 2nd X-Loader image\n"); ERROR_RETURN("Sending 2nd X-Loader image failed", -1);
return 0;
}
readed += ret; readed += ret;
printf_progressbar(readed, image->size);
} }
usleep(50000); usleep(50000);
return 1; return 0;
} }
@@ -217,19 +212,16 @@ static int send_secondary(usb_dev_handle * udev, struct image * image) {
printf("Sending X-Loader init message...\n"); printf("Sending X-Loader init message...\n");
ret = usb_bulk_write(udev, WRITE_DEV, (char *)&init_msg, sizeof(init_msg), WRITE_TIMEOUT); ret = usb_bulk_write(udev, WRITE_DEV, (char *)&init_msg, sizeof(init_msg), WRITE_TIMEOUT);
usleep(5000); usleep(5000);
if ( ret != sizeof(init_msg) ) { if ( ret != sizeof(init_msg) )
fprintf(stderr, "Error while sending X-Loader init message\n"); ERROR_RETURN("Sending X-Loader init message failed", -1);
return 0;
}
printf("Waiting for X-Loader response...\n"); printf("Waiting for X-Loader response...\n");
ret = usb_bulk_read(udev, READ_DEV, (char *)&buffer, 4, READ_TIMEOUT); /* 4 bytes - dummy value */ ret = usb_bulk_read(udev, READ_DEV, (char *)&buffer, 4, READ_TIMEOUT); /* 4 bytes - dummy value */
if ( ret != 4 ) { if ( ret != 4 )
fprintf(stderr, "Error no response\n"); ERROR_RETURN("No response", -1);
return 0;
}
printf("Sending Secondary image...\n"); printf("Sending Secondary image...\n");
printf_progressbar(0, image->size);
image_seek(image, 0); image_seek(image, 0);
readed = 0; readed = 0;
while ( readed < image->size ) { while ( readed < image->size ) {
@@ -239,22 +231,19 @@ static int send_secondary(usb_dev_handle * udev, struct image * image) {
ret = image_read(image, buffer, need); ret = image_read(image, buffer, need);
if ( ret < 0 ) if ( ret < 0 )
break; break;
if ( usb_bulk_write(udev, WRITE_DEV, (char *)buffer, ret, WRITE_TIMEOUT) != ret ) { if ( usb_bulk_write(udev, WRITE_DEV, (char *)buffer, ret, WRITE_TIMEOUT) != ret )
fprintf(stderr, "Error while sending Secondary image\n"); ERROR_RETURN("Sending Secondary image failed", -1);
return 0;
}
readed += ret; readed += ret;
printf_progressbar(readed, image->size);
} }
usleep(5000); usleep(5000);
printf("Waiting for X-Loader response...\n"); printf("Waiting for X-Loader response...\n");
ret = usb_bulk_read(udev, READ_DEV, (char *)&buffer, 4, READ_TIMEOUT); /* 4 bytes - dummy value */ ret = usb_bulk_read(udev, READ_DEV, (char *)&buffer, 4, READ_TIMEOUT); /* 4 bytes - dummy value */
if ( ret != 4 ) { if ( ret != 4 )
fprintf(stderr, "Error no response\n"); ERROR_RETURN("No response", -1);
return 0;
}
return 1; return 0;
} }
@@ -271,10 +260,8 @@ static int ping_timeout(usb_dev_handle * udev) {
printf("Sending X-Loader ping message\n"); printf("Sending X-Loader ping message\n");
ret = usb_bulk_write(udev, WRITE_DEV, (char *)&ping_msg, sizeof(ping_msg), WRITE_TIMEOUT); ret = usb_bulk_write(udev, WRITE_DEV, (char *)&ping_msg, sizeof(ping_msg), WRITE_TIMEOUT);
if ( ret != sizeof(ping_msg) ) { if ( ret != sizeof(ping_msg) )
fprintf(stderr, "Error while sending X-Loader ping message\n"); ERROR_RETURN("Sending X-Loader ping message faild", -1);
return 0;
}
printf("Waiting for X-Loader pong response...\n"); printf("Waiting for X-Loader pong response...\n");
while ( try_read > 0 ) { while ( try_read > 0 ) {
@@ -301,9 +288,9 @@ static int ping_timeout(usb_dev_handle * udev) {
} }
if (pong) if (pong)
return 1;
else
return 0; return 0;
else
return -1;
} }
@@ -311,38 +298,26 @@ int cold_flash(struct usb_device_info * dev, struct image * x2nd, struct image *
if ( dev->flash_device->protocol != FLASH_COLD ) { if ( dev->flash_device->protocol != FLASH_COLD ) {
printf_and_wait("Device is not in Cold Flash mode\nUnplug USB cable, turn device off, press ENTER and plug USB cable again"); printf_and_wait("Device is not in Cold Flash mode\nUnplug USB cable, turn device off, press ENTER and plug USB cable again");
return 1; return -EAGAIN;
} }
if ( x2nd->type != IMAGE_2ND ) { if ( x2nd->type != IMAGE_2ND )
fprintf(stderr, "Image type is not 2nd X-Loader\n"); ERROR_RETURN("Image type is not 2nd X-Loader", -1);
return 1;
}
if ( secondary->type != IMAGE_SECONDARY ) { if ( secondary->type != IMAGE_SECONDARY )
fprintf(stderr, "Image type is not Secondary\n"); ERROR_RETURN("Image type is not Secondary", -1);
return 1;
}
if ( ! read_asic(dev->udev) ) { if ( read_asic(dev->udev) != 0 )
fprintf(stderr, "Reading ASIC ID failed\n"); ERROR_RETURN("Reading ASIC ID failed", -1);
return 1;
}
if ( ! send_2nd(dev->udev, x2nd) ) { if ( send_2nd(dev->udev, x2nd) != 0 )
fprintf(stderr, "Sending 2nd X-Loader image failed\n"); ERROR_RETURN("Sending 2nd X-Loader image failed", -1);
return 1;
}
if ( ! ping_timeout(dev->udev) ) { if ( ping_timeout(dev->udev) != 0 )
fprintf(stderr, "Sending X-Loader ping message failed\n"); ERROR_RETURN("Sending X-Loader ping message failed", -1);
return 1;
}
if ( ! send_secondary(dev->udev, secondary) ) { if ( send_secondary(dev->udev, secondary) != 0 )
fprintf(stderr, "Sending Secondary image failed\n"); ERROR_RETURN("Sending Secondary image failed", -1);
return 1;
}
printf("Done\n"); printf("Done\n");
return 0; return 0;
@@ -353,23 +328,17 @@ int leave_cold_flash(struct usb_device_info * dev) {
int ret; int ret;
if ( dev->flash_device->protocol != FLASH_COLD ) { if ( dev->flash_device->protocol != FLASH_COLD )
fprintf(stderr, "Device is not in Cold Flash mode\n"); ERROR_RETURN("Device is not in Cold Flash mode", -1);
return 1;
}
if ( ! read_asic(dev->udev) ) { if ( read_asic(dev->udev) != 0 )
fprintf(stderr, "Reading ASIC ID failed\n"); ERROR_RETURN("Reading ASIC ID failed", -1);
return 1;
}
printf("Sending OMAP memory boot message...\n"); printf("Sending OMAP memory boot message...\n");
ret = usb_bulk_write(dev->udev, WRITE_DEV, (char *)&omap_memory_msg, sizeof(omap_memory_msg), WRITE_TIMEOUT); ret = usb_bulk_write(dev->udev, WRITE_DEV, (char *)&omap_memory_msg, sizeof(omap_memory_msg), WRITE_TIMEOUT);
usleep(5000); usleep(5000);
if ( ret != sizeof(omap_memory_msg) ) { if ( ret != sizeof(omap_memory_msg) )
fprintf(stderr, "Error while sending OMAP memory boot message\n"); ERROR_RETURN("Sending OMAP memory boot message failed", -1);
return 1;
}
usleep(500000); usleep(500000);
return 0; return 0;