USBDM_ErrorCode programBlock(FlashImagePtr flashImage, uint32_t size, uint32_t startBlock, ProgressDialoguePtr callBack) {
   LOGGING;
   uint8_t buffer[256];
   memset(buffer, 0xFF, sizeof(buffer));
   USBDM_ErrorCode rc = BDM_RC_OK;
   while(size>0) {
      uint32_t blockSize = size;
      if (blockSize > sizeof(buffer)) {
         blockSize = sizeof(buffer);
      }
      log.print("Programming block [0x%04X...0x%04X]\n", startBlock, startBlock+blockSize-1);
      // Copy data to buffer
      for (uint32_t index=0; index<blockSize; index++) {
         buffer[index] = flashImage->getValue(startBlock+index);
      }
      // Program buffer
      rc = ICP_Program(startBlock, blockSize, buffer, callBack);
      if (rc != BDM_RC_OK) {
         return rc;
      }
      startBlock += blockSize;
      size       -= blockSize;
   }
   return rc;
}
ICP_ErrorType programBlock(FlashImage *flashImageDescription, uint32_t size, uint32_t startBlock) {
   LOGGING;
   uint8_t buffer[256];
   memset(buffer, 0xFF, sizeof(buffer));
   ICP_ErrorType rc = ICP_RC_OK;
   while(size>0) {
      uint32_t blockSize = size;
      if (blockSize > sizeof(buffer)) {
         blockSize = sizeof(buffer);
      }
      log.print("Programming block [0x%04X...0x%04X]\n", startBlock, startBlock+blockSize-1);
      // Copy data to buffer
      for (uint32_t index=0; index<blockSize; index++) {
         buffer[index] = flashImageDescription->getValue(startBlock+index);
      }
      // Program buffer
      rc = ICP_Program(startBlock, blockSize, buffer);
      if (rc != ICP_RC_OK) {
         return rc;
      }
      startBlock += blockSize;
      size       -= blockSize;
   }
   return rc;
}