diff options
Diffstat (limited to 'commandline')
| -rw-r--r-- | commandline/builds/Windows/micronucleus.exe | bin | 27150 -> 27662 bytes | |||
| -rw-r--r-- | commandline/library/micronucleus_lib.c | 74 | ||||
| -rw-r--r-- | commandline/library/micronucleus_lib.h | 2 | ||||
| -rw-r--r-- | 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 Binary files differindex 45c8b2d..6a373d7 100644 --- a/commandline/builds/Windows/micronucleus.exe +++ b/commandline/builds/Windows/micronucleus.exe 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);  | 
