OR   

Home / Learning Center / Production Programming / Overview

Cyclone Programming: Adding Unique Data to be Programmed Into Each Target Device

Cyclone production programming images are comprehensive archives containing all the essential information required to program a set of data into a target device. This information encompasses application binaries, programming algorithms, configuration settings, serialization specifics, programming instructions, and more.  These archives are encrypted and designed to resist corruption. Utilizing these programming images offers an efficient and dependable method for programming a substantial amount of identical data into multiple target devices. Interested users can view a closer look at programming images.

However, there are scenarios where, in addition to the static data within the programming image, there's a need to provide data at the time programming is launched. Sometimes that data is common to a production batch, such as a date code, lot code, or manufacturing location. In other cases, the data is unique to each individual target, such as a serial number or MAC address. PEmicro refers to launch-time programming data in general as "Dynamic Data". There is a type of Dynamic Data, called "Overlay Data", that the user can provide when programming is launched and temporarily combine with the static data in the programming image. In such cases, the user initiates the programming process on a Cyclone (or a set of Cyclones) through the Cyclone Control Console or Cyclone Control SDK. As part of this launch command, overlay data is provided, enabling the programming of targets with a combination of the static image data and the launch-time overlay data. In this blog post, we will demonstrate how to effectively use Overlay Data in the programming process for both the Console and SDK, including Cyclone MultiChannel use cases.

Overlay Data

Overlay Data here refers to the concept of overlaying one set of data on top of another before programming. This enables the user to add launch-time data as part of the programming process without rebuilding the programming image. That launch-time data may be the same for every target in a batch or unique for each target being programmed. The overlay data can be provided programmatically using the Cyclone Control SDK, or on the command line using the Cyclone Control Console. Examples are provided for each below. The data itself can be in either hexadecimal format or string format; there are separate commands for each in both the Control SDK and the Control Console. 

When using an overlay function, the function passes the launch-time data that the user wants to program to a specific Cyclone handle (identifier). Prior to programming, that data will be overlaid on top of the static data in the user’s Programming Image. The user needs to provide:

  • Which Cyclone should add the specified overlay data (multiple Cyclones may be launched)
  • The memory address where the overlay data will be written
  • The overlay data itself.

The Cyclone, as part of the launch process, will combine the provided overlay data with the programming image's static data for the next programming launch.  Static and overlay data are combined before programming so that devices which have ECC only have flash locations programmed a single time. Overlay data does not affect the stored programming image itself and is discarded after launch regardless of success/failure programming. For Cyclone MultiChannel programmers, overlay data applies to the active channel set by default, and can also be specified separately for individual channels when each target needs a unique value.

Overlay data can be added to the image static data at execution time only if allowed by the security settings stored in the programming image. To allow overlay data, make sure the "Allow Overlay Data" setting is enabled (default is allowed) when the image is created. This setting is found on the Image Settings tab of the Cyclone Image Creation Utility. 

The scenario where overlay data is programmed into memory space not programmed by the static data in an image is the more common overlay scenario. However, there is an image setting which can optionally allow static data in the image to be overridden with overlay data provided at the same addresses as data in the image. The setting "Allow Overlay Data to Overwrite Image" (default is not allowed) controls whether overlaying on top of image data at the same address is allowed. This doesn't affect this image itself and simply allows a temporary override of data to be programmed at certain addresses. This data is discarded after every program (so to continually override data in an image it must be provided each launch).

A user might want to enable "Allow Overlay Data to Overwrite Image" if, for example, their base image contains a default IP address somewhere in memory that could be overwritten on a board-by-board basis.

Below are examples for how the basic overlay commands are used in both the SDK and the Console. Please refer to the appropriate Cyclone User Manual for more granular information about overlay data command functions and parameters.

NOTE: One distinction of which to be aware between the SDK and Console is that when the SDK specifies overlay data for a specific Cyclone, that overlay data will continue to be used for each program launch until cleared by the clearOverlayProgramData(...) call, or until the connection to the Cyclone is closed. The Console, on the other hand, will always clear the overlay data upon exit of the application.

Cyclone Control SDK:

bool specifyOverlayProgramData(uint32_t cycloneHandle, uint32_t targetAddress, uint32_t dataLength, char* buffer);

The function has to be called prior to startImageExecution. The first parameter is the handle of the Cyclone. The second parameter is the address where the overlaying of the data starts. The third parameter is the number of bytes to overlay, and the fourth parameter is a pointer to the bytes holding the data.

uint8_t data[] = {0x50,0x45,0x4D,0x49,0x43,0x52,0x4F}; // "PEMICRO"
specifyOverlayProgramData(cycloneHandle, 0x1080, sizeof(data), data); // Specify overlay data to be used when launching image
startImageExecution(cycloneHandle, 1);                                // Provide the overlay data to the Cyclone and launch programming
clearOverlayProgramData(cycloneHandle);                               // Clear overlay program data

Cyclone Control Console Example:

Here is the equivalent if the console is used to provide data at launch time: 

CycloneControlConsole.exe -cyclone=USB1 -specifyOverlayData=1,1080,50,45,4D,49,43,52,4F -launchimage=1

Cyclone MultiChannel Overlay Data

On a Cyclone MultiChannel programmer, overlay data is applied to the active channel set by default. If channels 11, 12, 13, and 14 are active, a single overlay command applies the same overlay bytes to all four channels. This is useful for data that should be identical on every target programmed in the batch, such as a production date, lot code, or manufacturing location.

For example, the following Console command selects channels 11, 12, 13, and 14, applies the same overlay bytes to all active channels, and launches image 1:

CycloneControlConsole.exe -cyclone=USB1 -setactivechannels=11,12,13,14 -specifyOverlayData=1,1080,32,30,32,36,30,35,32,36 -launchimage=1

The same all-active-channel operation using the SDK would look like this:

uint8_t lotCode[] = {0x32,0x30,0x32,0x36,0x30,0x35,0x32,0x36}; // "20260526"

clearOverlayProgramData(cycloneHandle);
setActiveChannels(cycloneHandle, "11,12,13,14");
specifyOverlayProgramData(cycloneHandle, 0x1080, sizeof(lotCode), lotCode);
startImageExecution(cycloneHandle, 1);
clearOverlayProgramData(cycloneHandle);

In other cases, such as serial numbers or MAC addresses, it is more common for each channel to program unique data. To do that, specify overlay data separately for each channel before launching. In the Console, bracketed channel lists can be added to the overlay command so each active channel receives a different value. The following example programs image 1 on channels 11, 12, 13, and 14 while providing a different 4-byte value at address 0x1080 for each channel:

CycloneControlConsole.exe -cyclone=USB1 -setactivechannels=11,12,13,14 -specifyOverlayData[11]=1,1080,00,00,00,11 -specifyOverlayData[12]=1,1080,00,00,00,12 -specifyOverlayData[13]=1,1080,00,00,00,13 -specifyOverlayData[14]=1,1080,00,00,00,14 -launchimage=1


Using the SDK, the same per-channel behavior is achieved by changing the active channel list before each call to specifyOverlayProgramData. Each overlay entry is stored with the channel context that is active when it is specified. After all per-channel overlay entries have been specified, set the active channel list back to the full group and launch programming:

uint8_t serial11[] = {0x00,0x00,0x00,0x11};
uint8_t serial12[] = {0x00,0x00,0x00,0x12};
uint8_t serial13[] = {0x00,0x00,0x00,0x13};
uint8_t serial14[] = {0x00,0x00,0x00,0x14};

clearOverlayProgramData(cycloneHandle);

setActiveChannels(cycloneHandle, "11");
specifyOverlayProgramData(cycloneHandle, 0x1080, sizeof(serial11), serial11);

setActiveChannels(cycloneHandle, "12");
specifyOverlayProgramData(cycloneHandle, 0x1080, sizeof(serial12), serial12);

setActiveChannels(cycloneHandle, "13");
specifyOverlayProgramData(cycloneHandle, 0x1080, sizeof(serial13), serial13);

setActiveChannels(cycloneHandle, "14");
specifyOverlayProgramData(cycloneHandle, 0x1080, sizeof(serial14), serial14);

setActiveChannels(cycloneHandle, "11,12,13,14");
startImageExecution(cycloneHandle, 1);
clearOverlayProgramData(cycloneHandle);

Cyclone Control Suite and Licensing

The CycloneControlConsole and CycloneControlSDK Library are provided free of charge as part of the Cyclone installation software; click for direct download.