FlashcatUSB Manual
FlashcatUSB Manual
FlashcatUSB Manual
FlashcatUSB
USER'S GUIDE Release Candidate 15
THE INDEX
Introduction Software requirements List of supported Flash memory devices Driver Installation Setting up device for application mode Using JTAG mode for flash programming Using SPI mode for flash programming Using NAND mode flash programming Getting started with the script engine How a script file is executed Script file structure Events Variables Conditions Creating access to a memory device Script control Autorun Feature List of console or script functions
INTRODUCTION
The FlashcatUSB device is a versatile multi-protocol Flash memory programmer. It is a cost effective hardware tool that is used both by industry professionals and hobbyists. By utilizing a single USB micro-controller design, the hardware in conjunction with software and firmware can allow the device to configure its operation to meet the required protocols of a desired TAP (test-access point) or interface bus (such as a serial peripheral interface). Since the device uses a hardware based USB interface, it can then perform its function at a much faster rate than traditional serial or parallel ports. The hardware board features: USB 1.1 and 2.0 compatible 32KB of programmable memory (4KB reserved for the USB bootloader) 16 MHz RISC based-processor (Atmel AVR 8-bit core) Two switches for application mode changes Output voltage selector jumper (3.3v or 5v) LED for indicating current application status Button for resetting the device or for activating the bootloader Currently supported features for JTAG mode: CFI compatible flash memory Intel, AMD, and SST algorithms supported DMA and PrAcc modes supported for target memory access MIPS supported (for EJTAG) Instruction register (IR) auto-sected from 4 to 512 bits. Currently supported features for SPI mode: Mode 0, 1, and 2 compatible High density devices supported: 1 to 128 mbit. High-speed mode (FOSC/2) Reads up to 400KB per second Ability to program MCU's with on board Flash / NV memory
SOFTWARE REQUIREMENTS
A computer with at least a 1 GHz processor and 256 MB of free memory available. Operating systems supported: Windows XP, Windows Vista, Windows 7. Supports both 32-bit and 64-bit environments. Apple OS X and Ubuntu version is coming soon. Microsoft .net Framework 4.0: Download: http://www.microsoft.com/download/en/details.aspx?id=17851 or from Windows Update
Verified SPI compatible flash devices: Atmel AT25DF641 Atmel AT25DF321 Atmel AT25DF161 Atmel AT25DF081 Atmel AT26DF081A Atmel AT26DF161 Atmel AT26DF161A Atmel AT26DF321 Spansion S25FL128P Spansion S25FL064 Spansion S25FL032 Spansion S25FL016 Spansion S25FL008 ST M25P128 ST M25P64 ST M25P32 ST M25P16 ST M25P80 ST M25P40 ST M25P20 ST M25P10 Atmel AT45DB011 Atmel AT45DB021 Atmel AT45DB041 Atmel AT45DB081 Atmel AT45DB161 Windbond W25X40 Windbond W25X80 Windbond W25X16 Windbond W25X32 Windbond W25X64 Windbond W25Q80BV Windbond W25Q16BV Windbond W25Q32BV Windbond W25Q64BV MXIC MX25L10 MXIC MX25L20 MXIC MX25L40 MXIC MX25L80 MXIC MX25L160 MXIC MX25L320 MXIC MX25L640 MXIC MX25L128 MXIC MX25L4006 EON EN25F20 EON EN25F40 EON EN25F80 Atmel AT45DB321 Atmel AT45DB642 Atmel AT45DB011D Atmel AT45DB021D Atmel AT45DB041D EON EN25P16 EON EN25P32 EON EN25P64 SST 25VF010A SST 25VF020A SST 25WF040 SST 25VF040B SST 25VF080 SST 25VF080B SST 26VF016 SST 25VF016B SST 25VF032 SST 25VF032B SST 25VF064B SST 26VF064 PCT 25VF064C SST 25VF128B PMC PM25LV010 PMC PM25LV020 PMC PM25LV040 PMC PM25LV080B PMC PM25LV080B Atmel AT45DB081D Atmel AT45DB161D Atmel AT45DB321D Atmel AT45DB642D
Support MCU's with on board memory programmable via SPI Nordic nRF24LE1 If your flash is not listed above, just contact us. We can add almost any flash device upon request. We do this frequently for many companies and individuals.
DRIVER INSTALLATION
When you connect FlashcatUSB to your PC for the first time, you should notice a "Found new hardware" notification pop-up, after which this prompt should appear:
Click Browse and locate the driver folder from the software package and click Next to install the software drivers. You will need to repeat this process once for each AVR firmware you use.
Application Mode
Bootloader Mode
In Application Mode, pressing the hardware button will only perform a USB reset. In Bootloader Mode, it will reset the device but when the device automatically reconnects, it will start in the DFU state, allowing the software to load new AVR firmware. To load new firmware, go to the AVR Firmware tab, click the Load File button, select the firmware from inside the folder that accompanies the software, click Program and finally Start Application to reset the device which will cause it to begin the application from the firmware you selected.
The image above shows you the pin outs of the 10-pin port and how it should be connected to the test-access port (TAP) of your target device. FlashcatUSB will only act like a passive diagnostic tool for the target system, so the device will need to be powered on by itself.
The image above shows you the pin outs of the 10-pin port and how it should be connected to the SPI bus of your targeted device. Unlike JTAG mode, you can use the VCC pin to power the target device. You should make note of the external power the chip needs and to make sure you have that voltage selected on the FlashcatUSB board. Most SPI chips use the 3.3v setting.
*Note: the RST and PROG pins are only used when connecting to MCU's with on board flash, such as the Nordic nRF24LE1 device.
The above diagram is how you should connect the 10-pin port to a typical SOIC-16 package of a SPI compatible Flash device.
The above diagram is how you should connect the 10-pin port to a typical SOIC-8 and DIP-8 package of a SPI compatible Flash device.
Optionally, you can also purchase drop-in sockets for most common SPI chip packages.
When you start FlashcatUSB with the SPI device connected, the software should automatically detect the chip and load its settings accordingly. If the chip is detected, but not supported by the software, you can then use the SPI Manual Settings tab to specify all of the settings with the values from the chip's datasheet.
Will popup "Hello World" when executed. You can also use events like functions to parse information an use the event like you would a command function. For example:
msgbox(JiggaJigga("Hello"," World")) CreateEvent(JiggaJigga) StrVar = $1 & $2 Return StrVar EndEvent
Commands Commands are built in functions that you will want to use to access the functionality of the software. Some functions can be used to retrieve values and some are used only to do certain tasks. You can test out commands by entering them into the software's console page. This can be a good way to test out elements of your script in real time, without the need to close and restart the software each time. Variables A variable is a name that you assign a object too. You can assign a string, data, integers, or boolean values.
ThisVar = "Hello World"
Will now create a variable named ThisVar whose string value is "Hello World". To create a data array use ";" after each byte:
MyData = 0x01;0x02;0x03;0x04;0x05;0x06
If you assign a variable 4 or less bytes, the variable will auto convert to a Integer type instead of a Data type. To create a boolean variable:
DoVar = True
Integer variables are able to be added or subtracted. String and Data variables can be combined.
VarInt = 5 VarInt += 10 msgbox(VarInt) #this will produce the result of 15
For strings and data, use the operand "&", for example:
VarStr = "Hello " VarStr = VarStr & "World!" msgbox(VarStr) #Will produce "Hello World!" MyData = 0x01;0x02;0x03;0x04;0x05 MyData = MyData & 0x06;0x07 msgbox(hex(MyData)) #Will produce "0x01020304050607"
the hex command converts the data array into a hex string that can be printed.
Conditions Simply put, you can create a IF ELSE statement to execute code based on a condition. Use the tag "If" followed by a condition statement. You can add a "else" tag to execute if the statement is evaluated false. End the condition using the tag "EndIf" For example, take the following code:
If (5 > 2) msgbox("This will be executed") Else msgbox("This will not") EndIf
The condition statement (5 > 2) is evaluate and found to be true. You can also use functions that return TRUE or FALSE in a If statement. If you precede the condition statement with the "not" keyword, what ever the statement is evaluated at, the opposite will happen. You can also use the "!" character for the same effect.
If not (GetValue() > 10) msgbox("This will be executed") EndIf CreateEvent(GetValue) retVar = 5 return retVar EndEvent
Creating access to a memory device FlashcatUSB allows you to create connections from the software to the flash device on a target system. Since a target system can contain multiple memory devices, you can create individual tabs and scripting variables for each device.
JTAG.MemoryAddress(0x0) JTAG.MemoryType("RAM") JTAG.MemorySize(0x800000) CFGMEM = JTAG.MemoryInit()
The above scripting code shows you how to create a single memory device. The first line sets the physical address of where the memory is located on the DRAM chain. This can change from device to device. The second line sets the memory type, this can be "RAM" or volatile memory, "CFI" for non-volatile, or "SPI" for serial memory. The third line sets the size of the device. This is only required for volatile memory such as RAM. The size of CFI and SPI devices will automatically be discovered by the Init. The last command is the Init function. It will make FlashcatUSB perform all the functions to create the memory device. This function can also be used to store the flash index to a variable. Each time you successfully create a flash device, it will return the unique index of the device. So the first device will be index 0, the second index 1 and so on. Script Control To allow you to control the execution of the script, you can use many built in tags. GOTO The "goto" keyword can be used to change the current position in your script that you are
executing. The syntax is 'goto: <label>'. A label is a simple tag name that you can place anywhere in your current event. To create one, make a name and end it with a colon. Using GOTO keywords, you can also create simple loops.
VarInt = 0 #This creates a variable and gives it a value of 0 TOPCODE: #This creates the label, named TOPCODE If (VarInt = 10) #This does a compare to see if VarInt is 10 GOTO TOPCODEDONE #This keyword will make a jump to the end of the code Endif VarInt += 1 GOTO TOPCODE #This will always jump to the top TOPCODEDONE: #When your code is done, it jumps here
EXIT The "exit" keyword can be used to skip a section of code, to exit out of a current condition segment (i.e. if/endif or while loop). The syntax is 'exit' or 'exit <event>' or 'exit script'. If you run exit script, no matter what event you are in, the entire script will stop execting. For example, if you are in a condition statement and want to leave, you can do this:
If (VarInt = 10) #This does a compare to see if VarInt is 10 SomeFunction() Var2 = 0x40 exit Var3 = 0x40 #This will not be executed Endif
Autorun Feature (JTAG mode only) Since some devices share the same CPU ID code, and you may want to have different device scripts, you can use the autorun feature. To do so, edit or create the Autorun.ini file located in the Scripts folder. Each line (not commented out) represents one device script. The format is:
<CPU_ID>:<SCRIPT_NAME>:<DEVICE_NAME>
Add as many scripts as you need and when you run the software, when it connects via JTAG it will load all of the scripts that match the CPU ID. Then the first device will be selected on the GUI and executed. To change scripts, simply change the menu item on the drop down list. For your convenience the last script executed will be remembered for future use.
The following is a list of commands that are built into the application. You can access these commands from both the scripting engine (via device scripts) and the console tab of the application. Some of these commands are specific to the mode in which FlashcatUSB is connected, these are namely the commands that begin with SPI or JTAG. The Memory commands are index. That is, if you have created more than one memory device, specifying the index will allow you to access that specific device. For example, memory(0).read will perform the read operation from the first memory device; memory(1).read will do the same from the second device, and so on. When you create a memory device using the JTAG.MemoryInit, you should save that index to a variable so you can specify which device to perform the memory operation from. Some of the functions can return values. These values can be put into variables for further processing. The types of the values are: Bool - is a value of either TRUE or FALSE String - is a value of readable characters. This value is indicated with surrounding quotes Integer - is a 32 bit (unsigned) number. Hex values are automatically converted Data - is an array of bytes. Can also be specified with 0x80;0x81;0x82 etc. Command: Parameters: Syntax: Description: SetParam Integer, Integer Setting, Value Sets a device parameter on the board (firmware controlled). The delays are set in milliseconds and is the amount of time the AVR should wait between read or write instructions. The main purpose of this command is to fine tune performance; the faster the device operates, the higher the error rate is. This can also affect different target devices differently. 1: Intel Flash delay 2: AMD Flash delay 3: Memory read delay SetParam(1, 30) #Sets the Intel flash delay to 30 ms Ejctrl Integer Integer Sends a JTAG control message to the target device. These types of commands are very dependant on the target device. This can be used to stop (0x10000) or start (0x0) the target processor. The result of the command is returned. Ejctrl(0x10000) #Stops the target processor
Settings:
Examples:
Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Returns: Description:
Pause Integer Waits the specified amount of time (in milliseconds), useful only in scripts. Pause(1000) #Waits 1 second FixFlash None Attempts to reprogram the bootloader of a device blindly (no verification, no check device id etc.). This is sometimes successful in restoring a device that does not boot correctly. Only supported in JTAG mode. FixFlash() Verify None or Bool Bool or nothing Used to enable or disable the flash verify process. It can also be used to return the current setting. Verify(true) writeline String Displays a message to the console. writeline("this is only a test") msgbox String Displays a message to the user using a pop-up box. msgbox("Hello World!") mode None String Returns a string indicating which mode FlashcatUSB is in. mode() #Returns "JTAG" ask String Bool Asks the user a yes or no question and returns that value. You can use this in a if statement to make conditional sections.
Examples: Command: Parameters: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Syntax: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples:
ask("Continue script?") status String This sets the status text (the bottom bar of the software). status("script is complete") Tab.Create String Integer Creates a application specific tab. Returns the index of the tab. Tab.Create("My Device") Tab.AddGroup String, Integer, Integer, Integer, Integer Name of group, (X-axis), (Y-axis), Length, Height Creates a group box on the tab. Tab.AddGroup("Feature",10,10,420,140) Tab.AddBox String, String, Integer, Integer Creates a input box on your tab. Tab.AddBox("BXNAME","default text",30,110) Tab.AddText String, String, Integer, Integer Creates a text label on your tab. Tab.AddBox("txtName","What to say",30,110) Tab.AddImage String, String, Integer, Integer Adds a image to your tab from the specified file (in your scripts folder) Tab.AddImage("ImgName","logo.gif",20,20) Tab.AddButton Event, String, Integer, Integer Adds a button to your tab. The specified event is called when the user clicks on the button. Tab.AddButton(HelloWorld,"Click Me!",20,20)
Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command:
Tab.AddProgress Integer, Integer, Integer Adds a progress bar to your form. This bar will then be automatically updated via internal functions that you call (selected ones that might take time to process). The parameters are x-axis, y-axis, and bar width. Tab.AddProgress(20,92,404) Tab.Remove String Removes any previously added object from your tab. Tab.Remove("ImgName") Tab.SetText String, String Changes the text of any previously created object Tab.SetText("txtName","Jigga Jigga!") Tab.ButtonDisable String Disables a button so the user can not click it and run the event. Tab.ButtonDisable("btName") Tab.ButtonEnable String Enables the button (if you had it disabled) Tab.ButtonEnable("btName") JTAG.MemoryAddress Integer Initialized the dynamic memory controller and sets the base memory address. JTAG.MemoryAddress(0x80000000) JTAG.MemoryType String Sets the device type of the memory. This can be "RAM", "CFI" or "SPI". Note: SPI mode over JTAG is not yet supported. JTAG.MemoryType("CFI") JTAG.MemorySize
Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples:
Integer Sets the size of the memory (in bytes) of the dynamic memory JTAG.MemorySize(0x800000) JTAG.MemoryInit None Will initialize and connect the FlashcatUSB interface to the memory interface. You may need to specify address and size prior to calling this function. If successful, the GUI will add the "Memory" tab. This command also returns the unique index of the created device. MemIndex = JTAG.MemoryInit() JTAG.FlashInit None Will connect to the CFI compliant flash on the memory controller to allow for reading and writing. This will create the "Flash" tab on the GUI. Must set FlashBase prior. JTAG.FlashInit() JTAG.FlashFind None Will scan the entire memory address range for a CFI compatible flash. JTAG.FlashFind() JTAG.BigEndian None Sets the endian for the JTAG memory devices to big. JTAG.BigEndian() JTAG.LittleEndian None Sets the endian for the JTAG memory devices to little. JTAG.LittleEndian() JTAG.Debug Bool (true or flase) Writes the JTAG data register with the standard flag to put the target device into debug mode: (PRACC|PROBEN|SETDEV|JTAGBRK) JTAG.Debug(true) #Will send the JTAG debug command
Command: Syntax: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Syntax: Description: Examples: Command: Parameters: Returns: Description:
JTAG.Reset Writes the JTAG data register with the standard flag to issue a processor reset. This command can have different results depending on the particular processor part: (PRRST|PERRST) JTAG.Reset #Will send a JTAG reset command JTAG.EnableVCC Bool (true or flase) Enables the JTAG VCC pin to output voltage. This can be either 5v or 3.3v depending on the board jumper. This pin can provide up to 100ma of power and can be suitable for operating most memory devices, although not enough to power an entire target board. JTAG.EnableVCC(true) #Will make the VCC pin output power JTAG.RunSVF Data (byte array) This command will run a Serial Vactor Format file and process and write all of the commands to a connected JTAG device. This can be use to program Xilinx CPLDs for example. JTAG.RunSVF(DataVar) #Runs a *.SVF file JTAG.RunXSVF Data (byte array) This command will run a compact (binary) Serial Vactor Format file and process and write all of the commands to a connected JTAG device. This can be use to program Xilinx CPLDs for example. JTAG.RunXSVF(DataVar) #Runs a *.XSVF file Memory.Write Data, Integer, Optional Integer Data object to write, flash address offset, optional length Writes a data variable to the flash device. Works for both CFI and SPI flash devices, but please note you must have already initiated the flash. Memory.Write(dataVar,0,256) #Writes Memory.Read Integer, Integer, Optional Bool Data Reads data from the flash device. Works for both CFI and SPI type flash
Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Returns: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Returns:
devices, but please note you must have already initiated the flash. dataVar = Memory.Read(0,512) #Reads 512 bytes Memory.ReadString Integer String Reads a string from the location specified on the flash device. Returns nothing if error or string not found. dataStr = Memory.ReadString(0x5000) Memory.ReadVerify Integer, Integer Data Similar to ReadFlash(), this function actually does it twice and compares the result, and if needed verifies all data to ensure that the data read is 100% accurate. Returns nothing if verification failed. This function is preferred over ReadFlash where the integrity of the data is vital. dataVar = Memory.ReadVerify(0,512) #Reads 512 bytes Memory.GetSectorCount Integer Erases the specified flash sector sectors = Memory.GetSectorCount() Memory.EraseSector Integer Nothing Erases the specified flash sector Memory.EraseSector(0) Memory.EraseSection Integer, Integer Nothing Erases a section of the flash memory, starting at the address (the first parameter), and the number of bytes (second parameter). Memory.EraseSector(0x10000,0x8000) Memory.EraseBulk None Nothing
Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Description: Examples:
Erases the entire flash memory Memory.EraseBulk() Memory.GetSectorSize Integer Integer Returns the size dataInt = Memory.GetSectorSize(0) Memory.Backup None Previously known as "Dump", this reads all the data from flash (twice) and then prompts the user to save the file to disk. Usefully for making a flash backup that has data integrity. Memory.Backup() Memory.Exist None Bool Returns true if a memory device at a given index has been created. Memory(2).Exist() Memory.WriteWord Integer, Integer Writes an integer (all 32 bits) to a specific address on the memory device. Memory(2).WriteWord(0x80010000,0x32) SPI.Fosc Integer Used to set the hardware SPI clock divider. The SPI speed is the system clock (16 MHz) divided by the Fosc value. Supported values: 2, 4, 8, 16, 32, 64, 128 SPI.Fosc(4) SPI.Order String Used to set the bit order for all SPI commands. For most significant bit, use "MSB" for least significant bit use "LSB". SPI.Order("MSB")
Command: Parameters: Description: Examples: Command: Parameters: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Syntax: Description: Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Description: Examples: Command:
SPI.Mode Integer Used to set the SPI device mode. Supported modes 0, 1, 2, 3. SPI.Mode(0) SPI.Swap Bool Used to reverse the bit order of bytes of the data being written or read to the flash. For example, if your flash uses MSB, but your microprocessor is LSB and reads the data off of the SPI flash, you can use this command to conveniently swap the bits. SPI.Swap(true) OpenFile String, String (optional) Data Prompts the user for a file and then reads the file from disk and returns a data variable. First parameter is the title of the window and the optional second is the standard file filter to use. MyData = OpenFile("Choose file", "Firmware files (*.bin)|*.bin") SaveFile Data, String, String (optional) Data variable to write, title prompt, default save name Prompts the user to save a data variable to the hard drive. SaveFile(MyData,"Where to save?","fileread.bin") hex Integer String Converts a integer value or variable into a hex string hex(255) #ouputs "0xFF" resize Data, Integer, Integer (optional) Resizes a byte array (usually in a variable), starting at the first parameter. The optional parameter can be used to specify how many to copy. resize(datavar,2) #removes the first two bytes Len
String, Integer or Data Integer Returns the length of a string , the number of bytes in a data object or the number of bytes to hold a integer. len("hello") #returns 5 dataVar = 0x1F;0x2F;0x2F;0xFF;0x2A;0x50 len(dataVar) #returns 6 len(302) #returns 2 Byte Data, Integer Integer Returns the value of the byte located in a data array. dataVar = 0x1F;0x3F;0x2F;0xFF;0x2A;0x50 word(dataVar,2) #Returns 47 Word Data, Integer Integer Returns the value of the four bytes located in a data array. dataVar = 0x1F;0x3F;0x2F;0xFF;0x2A;0x50 word(dataVar,2) #Returns 805251664 HWord Data, Integer Integer Returns the value of the two bytes located in a data array. dataVar = 0x1F;0x3F;0x2F;0xFF;0x2A;0x50 hword(dataVar,2) #Returns 12287 value String String Returns the text value of a Tab object, such as a textbox you have created. strVar = value(MYINPUTBOX) ToInteger String Integer Converts a integer stored in a string as a integer.
Examples: Command: Parameters: Returns: Description: Examples: Command: Parameters: Returns: Description: Examples:
ToInteger("234")
#Returns 234
sigmakey None String Returns the SIGMA key of a given device. Only compatible in JTAG mode. Also prints the key to the console. strVar = sigmakey() copy Data, Data Data Copies two data variables and returns them as a new combined data variable. dataVar = copy(data1,data2) #equals data1+data2