From 7e103740357273dcf1143bd04a1cb7fa957be89a Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Thu, 1 May 2014 19:15:05 +0200 Subject: commandline: Added signature to configurationreply --- commandline/builds/Windows/micronucleus.exe | Bin 27150 -> 27662 bytes commandline/library/micronucleus_lib.c | 74 ++++++++++++++++++---------- commandline/library/micronucleus_lib.h | 2 + commandline/micronucleus.c | 1 + 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/commandline/builds/Windows/micronucleus.exe b/commandline/builds/Windows/micronucleus.exe index 45c8b2d..6a373d7 100644 Binary files a/commandline/builds/Windows/micronucleus.exe and b/commandline/builds/Windows/micronucleus.exe differ diff --git a/commandline/library/micronucleus_lib.c b/commandline/library/micronucleus_lib.c index d6b4243..f7b51d5 100644 --- a/commandline/library/micronucleus_lib.c +++ b/commandline/library/micronucleus_lib.c @@ -62,32 +62,56 @@ micronucleus* micronucleus_connect(int fast_mode) { nucleus->device = usb_open(dev); - // get nucleus info - unsigned char buffer[4]; - int res = usb_control_msg(nucleus->device, USB_ENDPOINT_IN| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, 0, (char *)buffer, 4, MICRONUCLEUS_USB_TIMEOUT); - assert(res >= 4); - - nucleus->flash_size = (buffer[0]<<8) + buffer[1]; - nucleus->page_size = buffer[2]; - nucleus->pages = (nucleus->flash_size / nucleus->page_size); - if (nucleus->pages * nucleus->page_size < nucleus->flash_size) nucleus->pages += 1; - - nucleus->bootloader_start = nucleus->pages*nucleus->page_size; - - if ((nucleus->version.major>=2)&&(!fast_mode)) { - // firmware v2 reports more aggressive write times. Add 2ms if fast mode is not used. - nucleus->write_sleep = (buffer[3] & 127) + 2; - } else { + if (nucleus->version.major>=2) { // Version 2.x + // get nucleus info + unsigned char buffer[6]; + int res = usb_control_msg(nucleus->device, USB_ENDPOINT_IN| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, 0, (char *)buffer, 6, MICRONUCLEUS_USB_TIMEOUT); + assert(res >= 4); + + nucleus->flash_size = (buffer[0]<<8) + buffer[1]; + nucleus->page_size = buffer[2]; + nucleus->pages = (nucleus->flash_size / nucleus->page_size); + if (nucleus->pages * nucleus->page_size < nucleus->flash_size) nucleus->pages += 1; + + nucleus->bootloader_start = nucleus->pages*nucleus->page_size; + + if ((nucleus->version.major>=2)&&(!fast_mode)) { + // firmware v2 reports more aggressive write times. Add 2ms if fast mode is not used. + nucleus->write_sleep = (buffer[3] & 127) + 2; + } else { + nucleus->write_sleep = (buffer[3] & 127); + } + + // if bit 7 of write sleep time is set, divide the erase time by four to + // accomodate to the 4*page erase of the ATtiny841/441 + if (buffer[3]&128) { + nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages / 4; + } else { + nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages; + } + + nucleus->signature1 = buffer[4]; + nucleus->signature2 = buffer[5]; + + } else { // Version 1.x + // get nucleus info + unsigned char buffer[4]; + int res = usb_control_msg(nucleus->device, USB_ENDPOINT_IN| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, 0, (char *)buffer, 4, MICRONUCLEUS_USB_TIMEOUT); + assert(res >= 4); + + nucleus->flash_size = (buffer[0]<<8) + buffer[1]; + nucleus->page_size = buffer[2]; + nucleus->pages = (nucleus->flash_size / nucleus->page_size); + if (nucleus->pages * nucleus->page_size < nucleus->flash_size) nucleus->pages += 1; + + nucleus->bootloader_start = nucleus->pages*nucleus->page_size; + nucleus->write_sleep = (buffer[3] & 127); - } - - // if bit 7 of write sleep time is set, divide the erase time by four to - // accomodate to the 4*page erase of the ATtiny841/441 - if (buffer[3]&128) { - nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages / 4; - } else { - nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages; - } + nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages; + + nucleus->signature1 = 0; + nucleus->signature2 = 0; + } } } } diff --git a/commandline/library/micronucleus_lib.h b/commandline/library/micronucleus_lib.h index 5bab8b4..2db7b62 100644 --- a/commandline/library/micronucleus_lib.h +++ b/commandline/library/micronucleus_lib.h @@ -73,6 +73,8 @@ typedef struct _micronucleus { unsigned int pages; // total number of pages to program unsigned int write_sleep; // milliseconds unsigned int erase_sleep; // milliseconds + unsigned char signature1; // only used in protocol v2 + unsigned char signature2; // only used in protocol v2 } micronucleus; typedef void (*micronucleus_callback)(float progress); diff --git a/commandline/micronucleus.c b/commandline/micronucleus.c index 1b76e72..0e76997 100644 --- a/commandline/micronucleus.c +++ b/commandline/micronucleus.c @@ -201,6 +201,7 @@ int main(int argc, char **argv) { // } printf("> Device has firmware version %d.%d\n",my_device->version.major,my_device->version.minor); + if (my_device->signature1) printf("> Device signature: 0x1e%02x%02x \n",(int)my_device->signature1,(int)my_device->signature2); printf("> Available space for user applications: %d bytes\n", my_device->flash_size); printf("> Suggested sleep time between sending pages: %ums\n", my_device->write_sleep); printf("> Whole page count: %d page size: %d\n", my_device->pages,my_device->page_size); -- cgit v1.2.3