AN 425: Using the Command-Line Jam STAPL Solution for Device Programming
Using the Command-Line Jam STAPL Solution for Device Programming
You can simplify in-field upgrades and enhance the quality, flexibility, and life-cycle of your end products by using Jam STAPL to implement ISP. The Jam STAPL solution provides a software-level and vendor-independent standard for ISP using PCs or embedded processors. The Jam STAPL solution is suitable for embedded systems—small file size, ease of use, and platform independence.
Jam STAPL Players
- Jam STAPL Player—ASCII text-based Jam STAPL files (.jam)
- Jam STAPL Byte-Code Player—byte-code Jam STAPL files (.jbc)
The Jam STAPL players parse the descriptive information in the .jam or .jbc. The players then interprets the information as data and algorithms to program the targeted devices. The players do not program a particular vendor or device architecture but only read and understand the syntax defined by the Jam STAPL specification.
Alternatively, you can also use the quartus_jli command-line executable to program and test Altera® devices using .jam or .jbc. The quartus_jli command-line executable is provided with the Quartus® II software version 6.0 and later.
Differences Between the Jam STAPL Players and quartus_jli
The Jam STAPL players are interpreter programs that read and execute the .jam or .jbc files. The Jam STAPL players can access the IEEE 1149.1 signals that are used for all instructions based on the IEEE 1149.1 interface. The players can also process user-specified actions and procedures in the .jam or .jbc.
The quartus_jli command-line executable has the same functionality as the Jam STAPL players but with additional capabilities:
- It provides command-line control of the Quartus II software from the UNIX or DOS prompt.
- It supports all programming hardware available in the Quartus II software version 6.0 and later.
Features | Jam STAPL Players | quartus_jli |
---|---|---|
Supported Download Cables | ByteBlaster™ II, ByteBlasterMV, and ByteBlaster parallel port download cables. | All programming cables are supported by the JTAG server such as the USB-Blaster™, ByteBlaster II, ByteBlasterMV, ByteBlaster, MasterBlaster™, and EthernetBlaster. |
Porting of Source Code to the Embedded Processor | Yes | No |
Supported Platforms |
|
|
Enable or Disable Procedure from the Command-Line Syntax |
|
|
Jam STAPL Files
ASCII Text Files (.jam)
Altera supports the following formats of the ASCII text-based .jam:
- JEDEC JESD71 STAPL format. Altera recommends that you use this format for new projects. In most cases, you use .jam files in tester environments.
- Jam version 1.1 format (pre-JEDEC).
Byte-Code Files
The binary .jbc files are compiled versions of .jam files. A .jbc is compiled to a virtual processor architecture where the ASCII text-based Jam STAPL commands are mapped to byte-code instructions compatible with the virtual processor.
- Jam STAPL Byte-Code .jbc format—compiled version of the JEDEC JESD71 STAPL file. Altera recommends that you use this format in embedded application to minimize memory usage.
- Jam Byte-Code .jbc format—compiled version of the Jam version 1.1 format file.
Generating Byte-Code Jam STAPL Files
The Quartus II software tools support programming and configuration of multiple devices from single or multiple .jbc files. You can include Altera and non-Altera JTAG-compliant devices in the JTAG chain. If you do not specify a programming file in the Programming File Names field, devices in the JTAG chain are bypassed.

- On the Quartus II menu, select Tools > Programmer.
- Click Add File and select the programming files for the respective devices.
- On the Quartus II Programmer menu, select File > Create/Update > Create Jam, SVF, or ISC File.
-
In the File Format list, select a .jbc format.
Figure 2. Generating a .jbc for a Multi-Device JTAG Chain in the Quartus II Software
- Click OK.
List of Supported .jam and .jbc Actions and Procedures
- Action—a sequence of steps required to implement a complete operation.
- Procedure—one of the steps contained in an action statement.
An action statement can contain one or more procedure statements or no procedure statement. For action statements that contain procedure statements, the procedure statements are called in the specified order to complete the associated operation. You can specify some of the procedure statements as “recommended” or “optional” to include or exclude them in the execution of the action statement.
Devices |
(.jam)/(.jbc) Action |
Optional Procedures (Off by default) |
---|---|---|
MAX® 3000A MAX 7000B MAX 7000AE |
Program |
|
Blankcheck | do_disable_isp_clamp | |
Verify |
|
|
Erase | do_disable_isp_clamp | |
Read_usercode | — | |
MAX II MAX V MAX 10 FPGA |
Program | |
Blankcheck | ||
Verify | ||
Erase | ||
Read_usercode | — | |
Stratix® device family Arria® device family Cyclone® device family |
Configure |
|
Read_usercode | — | |
Enhanced Configuration Devices |
Program |
|
Blankcheck | — | |
Verify | do_read_usercode | |
Erase | — | |
Read_usercode | — | |
Init_configuration | — | |
Serial Configuration Devices |
Configure |
|
Program |
|
|
Blankcheck | — | |
Verify | — | |
Erase | — | |
Read_usercode | — |
Definitions of .jam and .jbc Action and Procedure Statements
Action | Description |
---|---|
Program | Programs the device. |
Blankcheck | Checks the erased state of the device. |
Verify | Verifies the entire device against the programming data in the .jam or .jbc. |
Erase | Performs a bulk erase of the device. |
Read_usercode | Returns the JTAG USERCODE register information from the device. |
Configure | Configures the device. |
Init_configuration | Specifies that the configuration device configures the attached devices immediately after programming. |
Check_idcode | Compares the actual device IDCODE with the expected IDCODE generated in the .jam and .jbc. |
Procedure | Description |
---|---|
do_blank_check | When enabled, the device is blank-checked. |
do_secure | When enabled, the security bit of the device is set. |
do_read_usercode | When enabled, the player reads the JTAG USERCODE of the device and prints it to the screen. |
do_disable_isp_clamp | When enabled, the ISP clamp mode of the device is ignored. |
do_low_temp_programming | When enabled, the procedure allows the industrial low temperature ISP for MAX 3000A, 7000B, and 7000AE devices. |
do_bypass_cfm | When enabled, the procedure performs the specified action only on the user flash memory (UFM). |
do_bypass_ufm | When enabled, the procedure performs the specified action only on the configuration flash memory (CFM). |
do_real_time_isp | When enabled, the real-time ISP feature is turned on for the ISP action being executed. |
do_init_configuration | When enabled, the configuration device configures the attached device immediately after programming. |
do_halt_on_chip_cc | When enabled, the procedure halts the auto-configuration controller to allow programming using the JTAG interface. The nSTATUS pin remains low even after the device is successfully configured. |
do_ignore_idcode_errors | When enabled, the procedure allows configuration of the device even if an IDCODE error exists. |
do_erase_all_cfi | When enabled, the procedure erases the common flash interface (CFI) flash memory that is attached to the parallel flash loader (PFL) of the MAX 10, MAX V, or MAX II device. |
do_epcs_unprotect | When enabled, the procedure removes the protection mode of the serial configuration devices (EPCS). |
do_verify | When Enabled, during Programming, the data is verified |
do_bypass_icb | By default, operations will be targeted on fullchip (except read back). However if this procedure is enabled, ICB settings will be excluded. |
do_bypass_cfm1 | By default, operations will be targeted on fullchip (except read back). However if this procedure is enabled, CFM1 sector (if present) will be excluded. |
do_force_sram_download | When this option is set, CRAM is upgraded (= internal reconfiguration) automatically on the timing pof was loaded to CFM. This option is used with real_time_isp. |
Jam STAPL Player and quartus_jli Exit Codes
Exit Code | Description |
---|---|
0 | Success |
1 | Checking chain failure |
2 | Reading IDCODE failure |
3 | Reading USERCODE failure |
4 | Reading UESCODE failure |
5 | Entering ISP failure |
6 | Unrecognized device ID |
7 | Device version is not supported |
8 | Erase failure |
9 | Blank-check failure |
10 | Programming failure |
11 | Verify failure |
12 | Read failure |
13 | Calculating checksum failure |
14 | Setting security bit failure |
15 | Querying security bit failure |
16 | Exiting ISP failure |
17 | Performing system test failure |
Using the Jam STAPL Player
To specify an action in the Jam STAPL Player command, use the -a option followed immediately by the action statement with no spaces. The following command programs the entire device using the specified .jam:
jam -aprogram <filename>.jam

You can execute the optional procedures associated with each action using the –d option followed immediately by the procedure statement with no spaces. The following command erases only the UFM block of the device using real-time ISP:
jam -aerase -ddo_bypass_cfm=1 -ddo_real_time_isp=1 <filename>.jam

jam -aconfigure <filename>.jam jam -aprogram <filename>.jam
Using the quartus_jli Command-Line Executable
Option | Description |
---|---|
-a | Specifies the action to perform. |
-c | Specifies the JTAG server cable number. |
-d | Disables a recommended procedure. |
-e | Enables an optional procedure. |
-i | Displays information on a specific option or topic. |
-l | Displays the header file information in a .jam or the list of supported actions and procedures in a .jbc file when the file is executed with an action statement. |
-n | Displays the list of available hardware. |
-f | Specifies a file containing additional command-line arguments. |
Command-line Syntax of quartus_jli Command-Line Executable
quartus_jli -a<action name> -c<cable index> <filename>.jam
quartus_jli -a<action name> -e<procedure to enable> -c<cable index> <filename>.jam
quartus_jli -a<action name> -d<procedure to disable> -c<cable index> <filename>.jam
quartus_jli -aconfigure <filename>.jam quartus_jli -aprogram <filename>.jam
quartus_jli --help=<option|topic>
The following examples show the command-line syntax to run the quartus_jli command-line executable.
Display a List of Available Download Cables in a Machine
quartus_jli –n

Display Header File Information in a Jam File
quartus_jli -a<action name> <filename>.jam -l

Configure and Return JTAG USERCODE of an FPGA Device
quartus_jli -aconfigure -edo_read_usercode -c2 <filename>.jam

Using Jam STAPL for ISP with an Embedded Processor
Methods to Connect the JTAG Chain to the Embedded Processor
You can connect the JTAG chain to the embedded processor in two ways:
- Connect the embedded processor directly to the JTAG chain
- Connect the JTAG chain to an existing bus using an interface device
In both JTAG connection methods, you must include space for the MasterBlaster or ByteBlasterMV header connection. The header is useful during prototyping because it allows you to quickly verify or modify the contents of the device. During production, you can remove the header to save cost.
Connecting the Embedded Processor Directly to the JTAG Chain
This method is the most straightforward. This method saves board space but reduces the number of available embedded processor pins.
Connecting the JTAG Chain to an Existing Bus Using an Interface Device
Design Schematic of Interface Device
The following figure shows an example design schematic of an interface device. This example design is for your reference only. If you use this example, you must ensure that:
- TMS, TCK, and TDI are synchronous outputs
- Multiplexer logic is included to allow board access for the MasterBlaster or ByteBlasterMV download cable
The embedded processor asserts the JTAG chain’s address. You can set the R_nW and R_AS signals to notify the interface device when you want the processor to access the chain.
- To write—connect the data[3..0] data path to the JTAG outputs of the device using the three D registers that are clocked by the system clock (CLK). This clock can be the same clock used by the processor.
- To read—enable the tri-state buffers and let the TDO signal flow back to the processor.
This example design also provides a hardware connection to read back the values in the TDI, TMS, and TCK registers. This optional feature is useful during the development phase because it allows the software to check the valid states of the registers in the interface device.
In addition, the example design includes multiplexer logic to permit a MasterBlaster or ByteBlasterMV download cable to program the device chain. This capability is useful during the prototype phase of development when you want to verify the programming and configuration.
Board Layout
Treat the TCK Signal Trace as a Clock Tree
Ensure that the TCK signal meets the rise time (tR) and fall time (tF) parameters specified in the data sheet of the relevant device family.
You may also need to terminate the signal to prevent overshoot, undershoot, or ringing. This step is often overlooked because the signal is software-generated and originated at a processor general-purpose I/O pin.
Use a Pull-Down Resistor on the TCK Signal
A missing pull-down resistor can cause a device to power-up in the state of JTAG and its boundary-scan test (BST). This situation can cause conflicts on the board.
A typical resistor value is 1 kΩ.
Make the JTAG Signal Traces as Short as Possible
Give special attention to the TCK and TMS pins. Because TCK and TMS signals are connected to every device in the JTAG chain, these traces see higher loading than the TDI or TDO signals.
Depending on the length and loading of the JTAG chain, you may require additional buffering to ensure the integrity of the signals that propagate to and from the processor.
Add External Resistors to Pull the Outputs to a Defined Logic Level
The output pins tri-state during programming or configuration. Additionally, on MAX® 7000, FLEX® 10K, APEX™ 20K, and all configuration devices, the pins are pulled up by a weak internal resistor—for example, 50 kΩ.
However, not all Altera devices have weak pull-up resistors during ISP or in-circuit reconfiguration. For information about which device has weak pull-up resistors, refer to the data sheet of the relevant device family.
Embedded Jam STAPL Players
The Jam STAPL Byte-Code Player
The source code for the 16 bit and 32 bit Jam STAPL Byte-Code Player is divided into two categories:
- jbistub.c—platform-specific code that handles I/O functions and applies to specific hardware.
- All other C files—generic code that performs the internal functions of the player.
Steps to Port the Jam STAPL Byte-Code Player
For embedded environments, you can remove this code with a single #define preprocessor statement. In addition, porting the code involves making minor changes to specific parts of the code in jbistub.c.
Function | Description |
---|---|
jbi_jtag_io() | Provides interfaces to the four IEEE 1149.1 JTAG signals, TDI, TMS, TCK, and TDO. |
jbi_export() | Passes information, such as the user electronic signature (UES), back to the calling program. |
jbi_delay() | Implements the programming pulses or delays needed during execution. |
jbi_vector_map() | Processes signal-to-pin map for non-IEEE 1149.1 JTAG signals. |
jbi_vector_io() | Asserts non-IEEE 1149.1 JTAG signals as defined in the VECTOR MAP. |
Perform the steps in the following sections to ensure that you customize all the necessary codes.
Step 1: Set the Preprocessor Statements to Exclude Extraneous Code
#define PORT EMBEDDED
Step 2: Map the JTAG Signals to the Hardware Pins
PC Parallel Port Signal Mapping Sample Source Code for jbi_jtag_io()
int jbi_jtag_io(int tms, int tdi, int read_tdo) { int data = 0; int tdo = 0; if (!jtag_hardware_initialized) { initialize_jtag_hardware(); jtag_hardware_initialized = TRUE; } data = ((tdi ? 0x40 : 0) | (tms ? 0x2 : 0)); /*TDI,TMS*/ write_byteblaster(0, data); if (read_tdo) { tdo = (read_byteblaster(1) & 0x80) ? 0 : 1; /*TDO*/ } write_blaster(0, data | 0x01); /*TCK*/ write_blaster(0, data); return (tdo); }
- The PC parallel port inverts the actual value of TDO. Because of this, the jbi_jtag_io() function in the preceding code inverts the value again to retrieve the original data in the following line:
tdo = (read_byteblaster(1) & 0x80) ? 0 : 1;
- If your target processor does not invert TDO, use the following code:
tdo = (read_byteblaster(1) & 0x80) ? 1 : 0;
- To map the signals to the correct addresses, use the left shift (<<) or right shift (>>) operator. For example, if TMS and TDI are at ports 2 and 3, respectively, use this code:
data = (((tdi ? 0x40 : 0) >> 3) | ((tms ? 0x02 : 0) << 1));
- Apply the same process to TCK and TDO.
The read_byteblaster and write_byteblaster signals use the inp() and outp() functions from the conio.h library, respectively, to read and write to the port. If these functions are not available, you must substitute them with equivalent functions.
Step 3: Handle Text Messages from jbi_export()
If there is no stdout device available, the information can be redirected to a file or storage device, or passed back as a variable to the program that called the player.
Step 4: Customize Delay Calibration
one_ms_delay = 1000
If this parameter is known, adjust it accordingly. Otherwise, use code similar to the code included for Windows and DOS platforms that counts the number of clock cycles it takes to execute a single loop. This code has been sampled over multiple tests and, on average, produces an accurate delay result. The advantage to this approach is that calibration can vary based on the speed of the host processor.
After the Jam STAPL Byte-Code Player is ported and working, verify the timing and speed of the JTAG port at the target device. Timing parameters for the supported Altera devices must comply with the JTAG timing parameters and values provided in the data sheet of the relevant device family.
If the Jam STAPL Byte-Code Player does not operate within the timing specifications, you must optimize the code with the appropriate delays. Timing violations can occur in powerful processors that can generate TCK at a rate faster than 10 MHz.
Jam STAPL Byte-Code Player Memory Usage
Estimating ROM Usage
The .jbc size can be separated into these categories:
- The amount of memory required to store the programming data.
- The space required for the programming algorithm.
This equation provides a .jbc size estimate that may vary by ±10%, depending on device utilization. If device utilization is low, .jbc sizes tend to be smaller because the compression algorithm used to minimize file size will more likely find repetitive data.
This equation also indicates that the algorithm size stays constant for a device family but the programming data size grows slightly as more devices are targeted. For a given device family, the increase in the .jbc size caused by the data component is linear.
- Alg stands for space used by the algorithm
- Data stands for space used by the compressed programming data
- k stands for the index representing the device being targeted
- N stands for the number of target devices in the chain
Algorithm File Size Constants
Device | Typical .jbc Algorithm Size (KB) |
---|---|
Stratix® device family | 15 |
Cyclone® device family | 15 |
Arria® device family | 15 |
Mercury™ | 15 |
EPC16 | 24 |
EPC8 | 24 |
EPC4 | 24 |
EPC2 | 19 |
MAX® 7000AE | 21 |
MAX 7000 | 21 |
MAX 3000A | 21 |
MAX 9000 | 21 |
MAX 7000S | 25 |
MAX 7000A | 25 |
MAX 7000B | 17 |
MAX II | 24.3 |
MAX V | 24.3 |
MAX 10 | 24.32 |
Devices | Typical .jbc Algorithm Size (KB) |
---|---|
FLEX® 10K, MAX 7000A, MAX 7000S, MAX 7000AE3 | 31 |
FLEX 10K, MAX 9000, MAX 7000A, MAX 7000S, MAX 7000AE | 45 |
MAX 7000S, MAX 7000A, MAX 7000AE | 31 |
MAX 9000, MAX 7000A, MAX 7000S, MAX 7000AE | 45 |
Compressed and Uncompressed Data Size Constants
Device | Typical Jam STAPL Byte-Code Data Size (KB) | |
---|---|---|
Compressed | Uncompressed4 | |
EP1S10 | 105 | 448 |
EP1S20 | 188 | 745 |
EP1S25 | 241 | 992 |
EP1S30 | 320 | 1310 |
EP1S40 | 369 | 1561 |
EP1S60 | 520 | 2207 |
EP1S80 | 716 | 2996 |
EP1C3 | 32 | 82 |
EP1C6 | 57 | 150 |
EP1C12 | 100 | 294 |
EP1C20 | 162 | 449 |
EPC4 5 | 242 | 370 |
EPC85 | 242 | 370 |
EPC86 | 547 | 822 |
EPC165 | 242 | 370 |
EPC167 | 827 | 1344 |
EP1SGX25 | 243 | 992 |
EP1SGX40 | 397 | 1561 |
EP1M120 | 30 | 167 |
EP1M350 | 76 | 553 |
EP20K30E | 14 | 48 |
EP20K60E | 22 | 85 |
EP20K100E | 32 | 130 |
EP20K160E | 56 | 194 |
EP20K200E | 53 | 250 |
EP20K300E | 78 | 347 |
EP20K400E | 111 | 493 |
EP20K600E | 170 | 713 |
EP20K1000E | 254 | 1124 |
EP20K1500E | 321 | 1509 |
EP2A15 | 107 | 549 |
EP2A25 | 163 | 788 |
EP2A40 | 257 | 1209 |
EP2A70 | 444 | 2181 |
EPM7032S | 8 | 8 |
EPM7032AE | 6 | 6 |
EPM7064S | 13 | 13 |
EPM7064AE | 8 | 8 |
EPM7128S, EPM7128A | 5 | 24 |
EPM7128AE | 4 | 12 |
EPM7128B | 4 | 12 |
EPM7160S | 10 | 28 |
EPM7192S | 11 | 35 |
EPM7256S, EPM7256A | 15 | 51 |
EPM7256AE | 11 | 18 |
EPM7512AE | 18 | 37 |
EPM9320, EPM9320A | 21 | 57 |
EPM9400 | 21 | 71 |
EPM9480 | 22 | 85 |
EPM9560, EPM9560A | 23 | 98 |
EPF10K10, EPF10K10A | 12 | 15 |
EPF10K20 | 21 | 29 |
EPF10K30 | 33 | 47 |
EPF10K30A | 36 | 51 |
EPF10K30E | 36 | 59 |
EPF10K40 | 37 | 62 |
EPF10K50, EPF10K50V | 50 | 78 |
EPF10K50E | 52 | 98 |
EPF10K70 | 76 | 112 |
EPF10K100, EPF10K100A, EPF10K100B | 95 | 149 |
EPF10K100E | 102 | 167 |
EPF10K130E | 140 | 230 |
EPF10K130V | 136 | 199 |
EPF10K200E | 205 | 345 |
EPF10K250A | 235 | 413 |
EP20K100 | 128 | 244 |
EP20K200 | 249 | 475 |
EP20K400 | 619 | 1,180 |
EPC2 | 136 | 212 |
EPM240 | 12.48 | 12.4 |
EPM570 | 11.4 | 19.6 |
EPM1270 | 16.9 | 31.9 |
EPM2210 | 24.7 | 49.3 |
MAX V | 9 | 9 |
MAX 10 | 9 | 9 |
Jam STAP Byte-Code Player Size
Build | Description | Size (KB) |
---|---|---|
16 bit | Pentium/486 using the MasterBlaster or ByteBlasterMV download cables | 80 |
32 bit | Pentium/486 using the MasterBlaster or ByteBlasterMV download cables | 85 |
Estimating Dynamic Memory Usage
The .jbc size is determined by a single-device or multi-device equation.
The amount of RAM used by the Jam STAPL Byte-Code Player is the total size of the .jbc and the sum of the data required for each targeted device. If the .jbc file is generated using compressed data, then some RAM is used by the player to uncompress and temporarily store the data.
If you use an uncompressed .jbc, the RAM size is equal to the uncompressed .jbc size.
Example of Calculating DRAM Required by Jam STAPL Byte-Code Player
This example uses a 16-bit Motorola 68000 processor to program EPM7128AE and EPM7064AE devices in an IEEE Std. 1149.1 JTAG chain using a compressed .jbc.
-
Use the multi-device equation to estimate the .jbc size.
Figure 15. Multi-Device Equation to Estimate .jbc Size
- Because the .jbc file contains compressed data, use the compressed data file size constants to determine the data size. Refer to the related information.
- In this example, Alg is 21 KB and Data is the sum of EPM7064AE and EPM7128AE data sizes (8 KB + 4 KB = 12 KB).
- The the .jbc file size is 33 KB.
-
Estimate the Jam STAPL Byte-Code Player size—this example uses a Jam STAPL Byte-Code Player size of 62 KB because the Motorola
68000 processor is a 16 bit processor. Use the following equation to determine the amount of ROM required. In this example,
the ROM size is 95 KB.
Figure 16. Equation to Estimate the Maximum Required ROM Size
-
Estimate the RAM usage using the following equation. In this example, the .jbc size is 33 KB.
Figure 17. Equation to Estimate Maximum Required DRAM
- Because the .jbc uses compressed data, add up the uncompressed data size for each device to find the total amount of RAM usage. Refer to the related information.
- The uncompressed data size constants for EPM7064AE and EPM7128AE are 8 KB and 12 KB, respectively.
- The total DRAM usage in this example is calculated as RAM Size = 33 KB + (8 KB + 12 KB) = 53 KB.
Updating Devices Using Jam
JBI_RETURN_TYPE jbi_execute ( PROGRAM_PTR program long program_size, char *workspace, long workspace_size, char *action, char **init_list, int reset_jtag long *error_address, int *exit_code, int *format_version )
The code within main() in jbistub.c determines the variables that are passed to jbi_execute(). In most cases, this code is not applicable to an embedded environment. Therefore, you can remove this code and set up the jbi_execute() routine for the embedded environment.
Before calling the jbi_execute function, construct init_list with the correct arguments that correspond to the valid actions in .jbc, as specified in the JEDEC standard JESD71 specification. The init_list is a null-terminated array of pointers to strings.
An initialization list tells the Jam STAPL Byte-Code Player the types of functions to perform—for example, program and verify—and this list is passed to jbi_execute(). The initialization list must be passed in the correct manner. If an initialization list is not passed or the initialization list is invalid, the Jam STAPL Byte-Code Player simply checks the syntax of the .jbc and if there is no error, returns a successful exit code without performing the program function.
Code to Set Up init_list for Performing Program and Verify Operation
char CONSTANT_AREA init_list[][] = "DO_PROGRAM=1", "DO_VERIFY=1";
The default code in the Jam STAPL Byte-Code Player sets init_list differently and is used to give instructions to the Jam STAPL Byte-Code Player from the command prompt.
The code in this example declares the init_list variable while setting it equal to the appropriate parameters. The CONSTANT_AREA identifier instructs the compiler to store the init_list array in the program memory.
After the Jam STAPL Byte-Code Player completes a task, the player returns a status code of type JBI_RETURN_TYPE or integer. A return value of "0" indicates a successful action. The jbi_execute() routine can return any of the exit codes as defined in the Jam STAPL Specification.
jbi_execute Parameters
Parameter | Status | Description |
---|---|---|
program | Mandatory |
A pointer to the .jbc. For most embedded systems, setting up this parameter is as easy as assigning an address to the pointer before calling jbi_execute(). |
program_size | Mandatory |
Amount of memory (in bytes) that the .jbc occupies. |
workspace | Optional |
A pointer to dynamic memory that can be used by the Jam STAPL Byte-Code Player to perform its necessary functions. The purpose of this parameter is to restrict the player memory usage to a predefined memory space. This memory must be allocated before calling jbi_execute(). If the maximum dynamic memory usage is not a concern, set this parameter to null, which allows the player to dynamically allocate the necessary memory to perform the specified action. |
workspace_size | Optional |
A scalar representing the amount of memory (in bytes) to which workspace points. |
action | Mandatory |
A pointer to a string (text that directs the Jam STAPL Byte-Code Player). Example actions are PROGRAM or VERIFY. In most cases, this parameter is set to the string PROGRAM. The text can be in upper or lower case because the player is not case-sensitive. The Jam STAPL Byte-Code Player supports all actions defined in the Jam STAPL Specification. Take note that the string must be null-terminated. |
init_list | Optional |
An array of pointers to strings. Use this parameter when applying Jam version 1.1 files, or when overriding optional sub-actions. Altera recommends using the STAPL-based .jbc with init_list. When you use a STAPL-based .jbc, init_list must be a null-terminated array of pointers to strings. |
error_address | — | A pointer to a long integer. If an error is encountered during execution, the Jam STAPL Byte-Code Player records the line of the .jbc where the error occurred. |
exit_code | — | A pointer to a long integer. Returns a code if there is an error that applies to the syntax or structure of the .jbc. If this kind of error is encountered, the supporting vendor must be contacted with a detailed description of the circumstances in which the exit code was encountered. |
Running the Jam STAPL Byte-Code Player
In some cases, you can perform in-field upgrades depending on whether the current device design is up-to-date. The JTAG USERCODE value is often used as an electronic "stamp" that indicates the device design revision. If the USERCODE is set to an older value, the embedded firmware updates the device.
The following pseudocode shows how you can call the Jam Byte-Code Player multiple times to update the target Altera device:
result = jbi_execute(jbc_file_pointer, jbc_file_size, 0, 0,\ "READ_USERCODE", 0, error_line, exit_code);
The Jam STAPL Byte-Code Player reads the JTAG USERCODE and exports it using the jbi_export() routine. The code then branches based on the result.
With Jam STAPL Byte-Code software support, updates to the supported Altera devices are as easy as adding a few lines of code.
Switch Statement
You can use a switch statement, as shown in this example, to determine which device needs to be updated and which design revision you must use.
switch (USERCODE) { case "0001": /*Rev 1 is old - update to new Rev*/ result = jbi_execute (rev3_file, file_size_3, 0, 0,\ "PROGRAM", 0, error_line, exit_code); case "0002": /*Rev 2 is old - update to new Rev*/ result = jbi_excecute(rev3_file, file_size_3, 0, 0,\ "PROGRAM", 0, error_line, exit_code); case "0003": ; /*Do nothing - this is the current Rev*/ default: /*Issue warning and update to current Rev*/ Warning - unexpected design revision; /*Program device with newest Rev anyway*/ result = jbi_execute(rev3_file, file_size_3, 0, 0,\ "PROGRAM", 0, error_line, exit_code); }
Document Revision History
Date | Version | Changes |
---|---|---|
April 2017 | 2017.04.10 |
|
December 2016 | 2016.12.09 | Updated the typical jam STAPL byte-code data size for MAX V and MAX 10 devices in Data Constants for Altera Devices Supporting the Jam Language (for ISP) table. |
September 2014 | 2014.09.22 |
|
December 2010 | 5.0 |
|
July 2010 | 4.0 |
Technical publication edits. Updated screen shots. |
July 2009 | 3.0 |
Technical publication edits only. No technical content changes. |
August 2008 | 2.1 |
|
November 2007 | 2.0 |
|
December 2006 | 1.1 |
|