This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430Flasher using latest MSP-FET - speed

Other Parts Discussed in Thread: MSP-FET, MSP430G2955, MSP-GANG, MSP430G2553, 4430, ENERGYTRACE

Using the MSP-FET seems not to flash substantially quicker as its predecessor. However, this device is promoted as being substantially faster. Are there any official tests/benchmarks about this?

Not only is this interesting during debugging (where one can experience some speed enhancement), but also when the CLI-tool MSP430Flasher is used. When I program approx. 7 kB of  a MSP430G2xx3, MSP430Flasher takes approx. 9 seconds. The net time of "loading the file" (into flash) takes approx. 5 seconds.

Any comments about this finding? Resp. Hints about reducing the overall programming time? The latter is relevant in relationship with bulk programming.

  • There is specification table for MSP-FET with JTAG / SBW write speed inside slau278 MSP430 Hardware Tools User's Guide.

    If you put it against FET430UIF, it is 4 times faster, but related to my flasher it is slower.

    D:\msp430>flash -p com33 -f test_msp430g2955.txt -e -w -v

    File: "test_msp430g2955.txt"
    Address: 02100  Words: 28544
    Size: 57088 bytes

    Get Device
    # JTID Fuse Device Proc
    3  89   OK   2955  00A0

    Erase

    Write
    Time: 1153 ms  Speed: 48,3 KB/s

    Verify
    Time: 262 ms  Speed: 212,6 KB/s

    Release Device

    Total Time: 1625 ms

    D:\msp430>

  • Table B44 in slau378 shows the transfer speed with MSP-FET (the other devices are not specified).

    Note: the table contains the remark "Protocol speed selectable by software. System limitations due to
    external RC components on reset pin (SBWTDIO) might apply."

    What about "msp430>flash"? I don't know this.
  • Rob Maris said:

    Note: the table contains the remark "Protocol speed selectable by software. System limitations due to
    external RC components on reset pin (SBWTDIO) might apply."

    This is only related to SBW, not JTAG.

    Rob Maris said:

    What about "msp430>flash"? I don't know this.

    It is part of my software / hardware msp-gang like flasher, with dual CDC-Uart / CDC-Mailbox bridges.

    http://forum.43oh.com/topic/2972-sbw-msp430f550x-based-programmer

  • Of course, this is only related to SBW. But due to utilization of pins this is the only option in the target board. It is a pity that the note is vague. Hints on component selection for optimum SBW speed are missing.
  • To enable maximum SBW speed, don't put any capacitor on target board RESET pin.
  • Well, the cap on RESET is already a low 1 nF, which is the minimum requirement to prevent spurious resets in a noisy environment.

    I measured the clock frequency in spy-by-wire mode: 500 kHz.

    The signals on both clock and data looks quite fine (slopes thats are steep enough). Theoretically: to transfer 8192 bytes,  approx. 160 ms are required. Since quite some idle time is present in the communication stream where the hex file is loaded (estimated to 50%), the transfer alone would require only a mere 350 ms.

    According to the datasheet, the programming of a whole 8 kB flash would require approx. 180 ms (fFTG = 450 kHz,.block programming, words), including overhead.

    Why the hell does MSP430Flasher need 5000 ms between start of loading and end of this transfer (normally also the start of verification?

    Edit: the Version of MSP430Flasher is 1.3.3

  • As you (probably) already know MSP430 Flasher and MSP-FET firmware (slac460 MSP430.DLL) is open source, and detailed answer for your question is there.

    AFAIK, maximum SBW frequency defined inside MSP-FET firmware is SBW600KHz. However, SBW is not transferring 1 data bit / clock, and this is also covered by slau320. MSP430x2xx don't have mailbox exchange system, so (using standard SBW) FET don't know when flashing of word is done, so it takes longer, and I guess that MSP-FET don't support block write for MSP430x2xx targets.

    My flasher (almost) don't have any latency, and it is close to max writing flash rate, but it is completely different animal. 

  • I don't have the time to get to optimize MSP430Flasher. Moreover, I hate this device because of the strict coupling of firmware with CCS version resp. MSP430Flasher version, which requires that all software on different computers need have same software in order to avoid firmware update/downdate issues :(.

    So two options arise as alternatives.
    1) Elprotronics FlashPro-430-LJ
    2) Your device and CLI-Software (sorry, despite the links in previous posts I didn't find appropriate purchasing information

  • Do you need FET compatible with CCS / IAR with break-point debugging or just flasher?

    There is no purchase info for my flasher because it is not published yet.

  • Just flasher

  • Rob Maris said:
    Hints on component selection for optimum SBW speed are missing.

    AFAIK, maximum SBW frequency noted in MSP430 device datasheets is 20 MHz, and maximum JTAG frequency is 10 MHz. And I guess that values (8 MHz max) from specification table (JTAG and Spy-Bi-Wire Interface, Timing) inside slau278 MSP430 Hardware Tools User's Guide are maximum possible values related to FET hardware. Difference between table value SBW 8 MHz max (that can be selectable by software!) and max 600 kHz that can be found in source code (and that is measured by you) is significant.

    In older TI FET devices it was possible to read / calculate everything based on open source (SBW / JTAG sequence was fired with DMA), but now there is FPGA as interface between master and target device.

  • I have investigated in some stuff. Regarding the timing: Elprotronics yields a far faster speed of flashing than MSP430flasher. This is also true on a (slow) 400 kHz clocking scheme.

    Regarding the SBW signal timing, MSP-FET430UIF is comparable with Elprotronics device: notably a non-stable clock signal that also has no 50% duty cycle - min. 250ns low pulses resp. 400ns low pulses on Elprotronics. However, the latter case shows substantially higher density of pulses in given time intervals. Some detail: The UIF-device has low pulses of approx. 250-3000 ns, and high states of minimal 500 ns.

    Contrary the new MSP-FET, which proves to operate with a clean, stable clock signal with 50% duty, freq. is approx. 450 kHz. As a consequence, the effective clock rate is almost as high as with Elprotronics in 1 MHz (fast) mode. Upon reqest I can supply scope screenshots.

    What now?

    The main weak point in MSP430flasher is the call to MSP430_ProgramFile(), an undisclosed function (this alone takes approx. 5 seconds with 8 KB to flash). However, the MSPDebugStack Developer’s Guide states that slow flashing is mainly due to RAM content preservation (which comes in handy during program debugging). It is advised to explicitly call MSP430_Configure(RAM_PRESERVE_MODE, DISABLE).

    Prior to spend time in building a modified MSP430Flasher, I'd appreciate to get qualified advice about that. I treat this as a quite important issue, since total flashing times of over 10 seconds with small devices is not state of the art (compared to some other microcontroller families). This also hurts in CCS, where it slows down quick iteration cycles.

  • At the time when TI FET was not open source, John Taylor made SBW decoding, and analyzed why flash writing need so much time.

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/257845/909639#909639

    Don't know if FET is still working by same RAM recovery algorithm, or it is improved somehow.

    Flash writing function that is executed from RAM for MSP430x5xx device is msp430x5xx_FlashWrite.s43 (from slac460 MSP430.DLL) with long / double word flash write where data are transferred by mailbox from master device. Block write is not used.

    Even my flasher is not debugger, it will store / recover original RAM contest for all (up to 8) target devices. However, it is used for each function only once, and impact on total function execution time is minimal. Flash writing example: store target device RAM, load write function to target device RAM, execute complete write (all segments), recover original RAM contest.


    If you want, leave somewhere your 8 KByte example as hex / txt file, and I can test it with my flasher and MSP430G2955 as target. I don't care about contest (it can be randomized), just put 0FFFFh on 0FFFEh address.

  • zrno soli said:
    To enable maximum SBW speed, don't put any capacitor on target board RESET pin.

     Hi Zrno, in first my better appreciation about your work I like so much for precision you exposed and detailed timing over cases.

     About capacitor I suppose if you wish investigate more, I am not removing but I use 47k to vcc and 10NF with series resistor of 470Ohm 1K to ground for Reset network, so dynamic impedance of reset is low but not near zero, with this can I have both reset working and SBW too, can you check if this is a limiting or not? I never noticed slow down but I was using Elprotronics programmer.

     Also if board is for SMD capacitor it can be added soldering in an A shaped form to original landpattern of capacitor. Actually this is forever my reset circuitry I use on MSP.

  • Regarding the so called RAM_PRESERVE_MODE, you are right. I also assumed that RAM is only preserved upon the start of a whole bunch of data to being flashed, and not for each block of data that is momentarily stored into RAM for flashing. It has been tested using the source code of MSP40Flasher. Disabling that feature has virtually no impact.

    Still it is disappointing that flashing 8kB using SBW takes 4-5 seconds, while the elprotronics devices uses up a fraction of this time while their SBW clock is effectively comparable with the new MSP-FET, see two posts back.

    I can still confirm that the slowliness is in MSP430DLL's MSP430_ProgramFile(): in Windows as well as in Linux. Hence, Operatings System issues should not dominate in the processing time matter.

    Thanks, zrno, for referencing to an assembler file. I'd suggest that the generic flashing is performed through Bios/src/funclets/writeFll.s43.

    This funclet seems to program only bytewise or wordwise. Thus, a block write is lacking. Hard to understand that, since block write would not only speed up simple programming, but also would help speed up debug iteration cycles in CCS. Here, MSP430 is clearly to get into shortfall compared to other MCU-families.

  • My last post was related to 5xx/6xx target devices with mailbox system.

    2xx devices don't have mailbox system, and I guess that target RAM is not used, and they are flashed directly by SBW / JTAG (like in slau320). And (maybe) because of this you didn't found any difference bypassing RAM_PRESERVE_MODE. Don't have time and interest to research MSP430.DLL and to confirm for sure how 2xx flashing is done, and is this somehow related to writeFll.s43.

    5xx mailbox system request 2 shifting per word, and standard SBW at low frequency is not able to support block write (100 KByte/s). It can be calculated what is the minimum JTAG frequency for block write support.

    There is no way for data exchange between SBW / JTAG master and 2xx target in free running mode, and block write (50 KByte/s) can't be used at all (with standard SBW / JTAG) for 2xx, not related to SBW / JTAG frequency.

  • Hi Rob,

    I was wondering - are you mainly concerned with programming speed for production programming rather than debugging (since you said you only need to flash the device)? Have you looked at something like the MSP-GANG where you can flash 8 devices at once? There are benchmarks for it in the users's guide www.ti.com/.../slau358 in section 2.7.1.

    Regards,
    Katie
  • Hi Katie,

    I did try an Elprotronics product, but rejected it, because they only support a command line interface in their (more expensive) standard package. I was wondering about the fact that their lite package goes with a sophisticated GUI program, but a "low-level" access is not provided (I use my own GUI script that calls MSP430Flasher, in order to allow customer-specific handling of Info-Flash, e.g. automatic serial nummer and parameter flashing).

    But there is more: My experiences with former Stellarisware or with current competing Silabs ZeroGecko devices makes me a bit impatient when I obey the slow flash rate in CCS6 cycles (SBW). Next, I'll work with MSP430G2553. I'm not amused by the 8-10 seconds that a 16KB flash (added to erase, VCC procedures) would consume for every debug iteration in CC6. And the new MPS-FET does not hold the promise of being up to three times faster than the UIF-device. Perhaps for some other MSP derivatives.

  • Rob,


    I tried to reproduce the 5 seconds of programming time using the following parameters:

    Windows 7
    MSP430 Flasher v1.3.3
    MSP Debug Stack (MSP430.DLL) v3.4.3.4
    Target device: MSP430G2553 connected via Spy-Bi-Wire using MSP-FET
    Command: MSP430Flasher -w firmware.hex -v -z [VCC]
    firmware.hex = 7KB of data in Intel-hex format in one continuous block placed at MAIN start (0xC000)

    The longest programming time (incl. verification) I got was 3915ms.

    One thing that has an impact is the chosen erase mode. Unless, specifically disabled, an erase of the target memory is always performed when calling the MSP Debug Stack's MSP430_ProgramFile() function.
    The default erase mode is ERASE_ALL which erases MAIN and INFO memory and is comparably time consuming. Please try to use the -e switch with different arguments:

    MSP430Flasher -e ERASE_MAIN -w firmware.hex -v -z [VCC]  --> programming time on my end: 2857ms
    MSP430Flasher -e NO_ERASE -w firmware.hex -v -z [VCC]  --> programming time on my end: 2261ms

    The second option is obviously only applicable when you can be sure that the target memory is already erased.

    I will look into some further ways of reducing programming time.

    Best regards,
    Robert

  • Hi zrno,

    I can't imagine that block write couldn'd be used with small devices like 430G2xxx. The flash routine takes perhaps approx. 30 bytes, and a block size of 128 bytes could well be present in 256-byte RAM devices. So the interface could place blocks of 128 bytes into RAM and apply block mode. If this would NOT be possible, then it would also be impossible for Elprotronics to achieve approx. 1.5 seconds for flashing 7 KB in SBW mode (sorry - I forgot to mention the measured time in one of the previous posts).
    I appreciate your detail info, because it helps understand the bottlenecks that play a major role, here.
  • For each 2xx device there is Flash Memory section inside datasheet, and there is flash timing. 2xx max flash module frequency is 476 kHz and word write will take 30 cycles. Let's take 40 cycles on 400 kHz. Word write (not block write) rate will be around 400000 / 40 / 512 = 19.5 KByte / second. So, there is no problem for Elprotronic to flash 7 KByte / 1.5 seconds without block write.

    In my first on topic post, you can see block writing rate about 48 KByte/s for 2xx (flash module frequency 461538 Hz), but there is extra line connection for data transfer between SBW master and 2xx target. Block write function is downloaded to 128 bytes of target RAM and executed from there.

  • Thanks, Robert, for your efforts. I already did erase Main only. I'd guess that your times represent complete invocation times of MSP430Flasher, since only calls to an executable using the time command (Linux) allows precise ms-results. If this applies, your results are fare better. My measured times were stopwatch measurements that solely measured the "Loading file into device..." (as output by StdUseCase.cpp). That alone -flashing only - takes approx. 4 seconds. With MSP-FET. The whole program invocation takes 10-13 seconds.

    I'll prepare a slight modification of this source file in order that it prints the time consumption of the flashing phase as well as the verification phase separately.
  • Robert, I had got the opportunity to include time measurements in the 1.3.3-code. Here is the result (Linux):

    rob@rob-notebook ~/MSP430Flasher_1.3.3 $ ./MSP430Flasher -g -e ERASE_MAIN -walcor.txt -v -z\[VCC\]
    * -----/|-------------------------------------------------------------------- *
    * / |__ *
    * /_ / MSP430 Flasher v1.3.3 *
    * | / *
    * -----|/-------------------------------------------------------------------- *
    *
    * Evaluating triggers...* Checking for available FET debuggers:
    * Found USB FET @ ttyACM0 <- Selected
    * Initializing interface @ ttyACM0...done
    * Checking firmware compatibility:
    * FET firmware is up to date.
    * Reading FW version... v:560 msec done
    * Setting VCC to 3000 mV... s:26 msec done
    * Accessing device...done
    * Reading device information... (649 ms) c:649 msec (0 ms) e:0 msec done
    * Loading file into device... (3967 ms) done
    * Verifying memory (alcor.txt)... (462 ms) p:4430 msec

    >:6198 msec done
    *
    * ----------------------------------------------------------------------------
    * Arguments : -g -e ERASE_MAIN -walcor.txt -v -z[VCC]
    * Warning: Some default options were used due to incomplete argument list.
    * ----------------------------------------------------------------------------
    * Driver : loaded
    * Dll Version : 30403004
    * FwVersion : 30403004
    * Interface : TIUSB
    * HwVersion : U 3.0
    * JTAG Mode : AUTO
    * Device : MSP430G2xx3
    * EEM : Level 1, ClockCntrl 1
    * Prog.File : alcor.txt (ERASE_MAIN, verified = alcor.txt)
    * BSL Unlock : FALSE
    * InfoA Access: FALSE
    * VCC ON : 3000 mV
    * ----------------------------------------------------------------------------
    * Starting target code execution...done
    * Disconnecting from device...done
    *
    * ----------------------------------------------------------------------------
    * Driver : closed (No error)
    * ----------------------------------------------------------------------------
    */

    I have emphasized the ms-results in bold. with "letter:" prefix is measured in MSP430_Flasher.cpp. Letter code:

    v: version retrieval
    s: power-up & configure
    e: erase
    p: program & verify
    >: total time (here: just above 6 seconds)

    results in (..) are measured in StdUseCase.cpp. Here you see verification & program separated.

    Note: in Linux, the stdout text output is delayed until Linefeed is output (after "done"!). Since this is confusing, I had added a fflush() call just after ,"* Loading file into device..."

  • The previous post is related to the new MSP-FET.

    Here results using MSP-FET430UIF (log manually shortened):

    rob@rob-notebook ~/MSP430Flasher_1.3.3 $ ./MSP430Flasher -g -e ERASE_MAIN -walcor.txt -v -z\[VCC\]
    * Evaluating triggers...* Checking for available FET debuggers: 
    * Found USB FET @ ttyACM0 <- Selected
    * Initializing interface @ ttyACM0...done
    * Checking firmware compatibility:
    * FET firmware is up to date.
    * Reading FW version... v:350 msec done
    * Setting VCC to 3000 mV... s:1002 msec done
    * Accessing device...done
    * Reading device information... (575 ms) c:575 msec (0 ms) e:0 msec done
    * Loading file into device... (6290 ms) done
    * Verifying memory (alcor.txt)... (458 ms) p:6748 msec

    >:9236 msec done
    *
    * ----------------------------------------------------------------------------
    * Arguments : -g -e ERASE_MAIN -walcor.txt -v -z[VCC]
    * Warning: Some default options were used due to incomplete argument list.
    * ----------------------------------------------------------------------------
    * Driver : loaded
    * Dll Version : 30403004
    * FwVersion : 30403004
    * Interface : TIUSB
    * HwVersion : U 1.40

  • What is the size of alcor.txt, and how many divided address segments (not continuous) are inside?
  • the .txt-file used has one big range of approx. 6 kB and three small ranges (vector area), see attachment.

    Attached also: a diff file for MSP430Flasher 1.3.3 that documents Makfile changes (as posted elsewhere) and time measurement additions.

    @E000
    5C 92 54 03 52 25 7C 90 80 00 DF 24 7C 90 60 00
    6B 24 7C 90 40 00 2B 24 7C 90 20 00 1E 20 C2 93
    54 03 0E 20 3D 40 1F 00 1D F2 00 02 3D D0 20 00
    4C 43 B0 12 32 F2 3C 40 E0 2E B0 12 0E F5 09 3C
    3D 40 1F 00 1D F2 00 02 3D D0 20 00 4C 43 B0 12
    32 F2 F2 40 20 00 54 03 28 3D 3D 40 1F 00 1D F2
    00 02 4C 43 B0 12 32 F2 C2 43 54 03 1E 3D C2 93
    54 03 1C 24 F2 90 20 00 54 03 0A 24 3D 40 1F 00
    1D F2 00 02 3D D0 40 00 4C 43 B0 12 32 F2 28 3C
    3D 40 1F 00 1D F2 00 02 3D D0 40 00 4C 43 B0 12
    32 F2 3C 40 AE 07 B0 12 0E F5 1A 3C 3D 40 1F 00
    1D F2 00 02 3D D0 20 00 4C 43 B0 12 32 F2 3C 40
    E0 2E B0 12 0E F5 3D 40 1F 00 1D F2 00 02 3D D0
    40 00 4C 43 B0 12 32 F2 3C 40 AE 07 B0 12 0E F5
    F2 40 40 00 54 03 E1 3C C2 93 54 03 43 24 F2 90
    20 00 54 03 24 24 F2 90 40 00 54 03 12 24 F2 90
    80 00 54 03 5E 20 3D 40 1F 00 1D F2 00 02 3D D0
    60 00 4C 43 B0 12 32 F2 3C 40 CD 04 B0 12 0E F5
    50 3C 3D 40 1F 00 1D F2 00 02 3D D0 60 00 4C 43
    B0 12 32 F2 3C 40 CD 04 B0 12 0E F5 42 3C 3D 40
    1F 00 1D F2 00 02 3D D0 40 00 4C 43 B0 12 32 F2
    3C 40 AE 07 B0 12 0E F5 3D 40 1F 00 1D F2 00 02
    3D D0 60 00 4C 43 B0 12 32 F2 3C 40 CD 04 B0 12
    0E F5 27 3C 3D 40 1F 00 1D F2 00 02 3D D0 20 00
    4C 43 B0 12 32 F2 3C 40 E0 2E B0 12 0E F5 3D 40
    1F 00 1D F2 00 02 3D D0 40 00 4C 43 B0 12 32 F2
    3C 40 AE 07 B0 12 0E F5 3D 40 1F 00 1D F2 00 02
    3D D0 60 00 4C 43 B0 12 32 F2 3C 40 CD 04 B0 12
    0E F5 F2 40 60 00 54 03 70 3C C2 93 54 03 43 24
    F2 90 20 00 54 03 24 24 F2 90 40 00 54 03 12 24
    F2 90 60 00 54 03 5E 20 3D 40 1F 00 1D F2 00 02
    3D D0 80 00 4C 43 B0 12 32 F2 3C 40 CD 04 B0 12
    0E F5 50 3C 3D 40 1F 00 1D F2 00 02 3D D0 80 00
    4C 43 B0 12 32 F2 3C 40 CD 04 B0 12 0E F5 42 3C
    3D 40 1F 00 1D F2 00 02 3D D0 40 00 4C 43 B0 12
    32 F2 3C 40 AE 07 B0 12 0E F5 3D 40 1F 00 1D F2
    00 02 3D D0 80 00 4C 43 B0 12 32 F2 3C 40 CD 04
    B0 12 0E F5 27 3C 3D 40 1F 00 1D F2 00 02 3D D0
    20 00 4C 43 B0 12 32 F2 3C 40 E0 2E B0 12 0E F5
    3D 40 1F 00 1D F2 00 02 3D D0 40 00 4C 43 B0 12
    32 F2 3C 40 AE 07 B0 12 0E F5 3D 40 1F 00 1D F2
    00 02 3D D0 80 00 4C 43 B0 12 32 F2 3C 40 CD 04
    B0 12 0E F5 F2 40 80 00 54 03 30 41 0A 12 09 12
    31 80 14 00 0B 4D 0A 43 3A 90 13 00 0B 2C 0F 41
    0F 5A 0E 4A 1E 52 16 03 EF 4E 00 00 1A 53 3A 90
    13 00 F5 2B 39 40 03 00 B0 12 CE F3 0A 43 2A 92
    09 2C 0F 41 0F 59 DF 4A 82 02 00 00 19 53 1A 53
    2A 92 F7 2B 39 40 0D 00 3B 80 0C 00 3B 90 0A 00
    04 28 3B 80 5E 00 0E 24 94 3C 0B 5B 10 4B 10 E3
    12 E4 32 E4 32 E4 32 E4 F0 E3 CE E3 AC E3 8A E3
    68 E3 46 E3 0A 43 3A 90 05 00 83 2C 0F 41 0F 59
    0E 4A 1E 52 18 03 EF 4E 00 00 19 53 1A 53 3A 90
    05 00 F4 2B 76 3C 0A 43 3A 90 05 00 72 2C 0F 41
    0F 59 0E 4A 1E 52 26 03 EF 4E 00 00 19 53 1A 53
    3A 90 05 00 F4 2B 65 3C 0A 43 3A 90 05 00 61 2C
    0F 41 0F 59 0E 4A 1E 52 24 03 EF 4E 00 00 19 53
    1A 53 3A 90 05 00 F4 2B 54 3C 0A 43 3A 90 05 00
    50 2C 0F 41 0F 59 0E 4A 1E 52 22 03 EF 4E 00 00
    19 53 1A 53 3A 90 05 00 F4 2B 43 3C 0A 43 3A 90
    05 00 3F 2C 0F 41 0F 59 0E 4A 1E 52 20 03 EF 4E
    00 00 19 53 1A 53 3A 90 05 00 F4 2B 32 3C 0A 43
    3A 90 05 00 2E 2C 0F 41 0F 59 0E 4A 1E 52 1E 03
    EF 4E 00 00 19 53 1A 53 3A 90 05 00 F4 2B 21 3C
    0A 43 3A 90 05 00 1D 2C 0F 41 0F 59 0E 4A 1E 52
    1C 03 EF 4E 00 00 19 53 1A 53 3A 90 05 00 F4 2B
    10 3C 0A 43 3A 90 05 00 0C 2C 0F 41 0F 59 0E 4A
    1E 52 1A 03 EF 4E 00 00 19 53 1A 53 3A 90 05 00
    F4 2B 0A 43 3A 90 1E 00 0C 2C 1C 43 1D 43 B0 12
    AC EF 3C 40 64 00 B0 12 BE F1 1A 53 3A 90 1E 00
    F4 2B F2 D0 48 00 19 00 B0 12 96 F5 6C 93 FC 27
    0C 41 7D 40 12 00 B0 12 24 ED 31 50 14 00 30 40
    74 F5 0A 12 09 12 09 4C F2 40 A9 00 60 00 F2 D2
    21 00 F2 D0 20 00 21 00 0A 43 3A 90 20 00 1A 2C
    3A 90 14 00 12 24 0F 4A 0F 5F AF 99 00 02 0B 24
    0F 4A 0F 5F AF 49 00 02 4C 4A 0F 4A 0F 5F 1D 4F
    00 02 B0 12 32 F2 29 53 01 3C 29 53 1A 53 3A 90
    20 00 E6 2B 1C 42 24 02 B0 12 66 F1 7C F0 03 00
    5C 53 C2 4C 55 03 0A 43 5F 42 55 03 0A 9F 0C 2C
    0F 4A 0F 5F 3F 50 2A 00 DA 4F 00 02 7E 02 1A 53
    5F 42 55 03 0A 9F F4 2B B2 90 7C 00 06 02 04 20
    3F 40 34 00 0E 43 56 3C B2 90 63 00 06 02 04 20
    3F 40 29 00 0E 43 4E 3C B2 90 52 00 06 02 04 20
    3F 40 23 00 0E 43 46 3C B2 90 4F 00 06 02 04 20
    3F 40 21 00 0E 43 3E 3C B2 90 27 00 06 02 04 20
    3F 40 11 00 0E 43 36 3C B2 90 18 00 06 02 04 20
    3F 40 0B 00 0E 43 2E 3C B2 90 13 00 06 02 04 20
    3F 40 09 00 0E 43 26 3C B2 90 09 00 06 02 04 20
    3F 40 05 00 0E 43 1E 3C B2 90 07 00 06 02 03 20
    2F 42 0E 43 17 3C A2 92 06 02 04 20 3F 40 03 00
    0E 43 10 3C B2 90 03 00 06 02 03 20 2F 43 0E 43
    09 3C 92 93 06 02 03 20 1F 43 0E 43 03 3C 3F 40
    34 00 0E 43 82 4F 56 03 82 4E 58 03 4C 43 B0 12
    00 E0 3C 40 88 13 B0 12 0E F5 30 40 74 F5 B2 40
    80 5A 20 01 3F 40 80 00 5F D2 FD 10 C2 4F 57 00
    E2 D3 58 00 F2 D0 20 00 53 00 D2 42 FC 10 56 00
    F2 43 21 00 F2 40 7D 00 22 00 C2 43 27 00 C2 43
    2E 00 F2 43 29 00 C2 43 2A 00 F2 40 73 00 2F 00
    F2 43 19 00 F2 40 7F 00 1A 00 B0 12 60 F2 F2 D2
    21 00 F2 D0 20 00 21 00 E2 D3 19 00 F2 F0 BF 00
    21 00 7C 40 20 00 B0 12 BA F2 B0 12 A0 EE B0 12
    54 EC 82 93 42 03 05 20 3C 40 EE F5 B0 12 72 E4
    04 3C 3C 40 2E F6 B0 12 72 E4 3C 40 D0 07 5D 43
    B0 12 F2 F3 F2 40 D7 00 2D 00 F2 40 50 00 2C 00
    C2 43 2B 00 F2 40 80 00 25 00 F2 40 80 00 24 00
    C2 43 23 00 B2 40 1C 5A 20 01 D2 D3 00 00 32 D2
    82 43 8E 02 82 43 90 02 82 93 90 02 04 38 1C 20
    B2 92 8E 02 19 2C 3C 40 3C 00 B0 12 BE F1 D2 B3
    8E 02 04 20 F2 F0 DB 00 19 00 03 3C F2 D0 24 00
    19 00 92 53 8E 02 82 63 90 02 82 93 90 02 EB 3B
    03 20 B2 92 8E 02 E7 2B 3C 40 D0 07 5D 43 B0 12
    F2 F3 82 93 44 03 0F 24 82 93 12 03 07 20 B0 12
    E6 F2 B0 12 32 F4 B0 12 60 E9 02 3C B0 12 54 E8
    82 93 44 03 F1 23 F2 40 69 00 60 00 32 D0 D8 00
    E8 3F 0A 12 09 12 08 12 07 12 06 12 05 12 04 12
    21 83 06 4F 05 4E 04 4D 0A 4C 92 43 9C 02 3C 40
    F5 00 5D 43 B0 12 F2 F3 5F 42 19 00 82 4F 14 03
    1C 43 B0 12 70 F4 7C 40 80 00 B0 12 00 E0 2C 43
    B0 12 BE F1 0C 43 B0 12 70 F4 0F 45 4F D6 C2 CF
    19 00 3C 40 37 00 B0 12 BE F1 29 42 0F 45 5F D2
    19 00 4F D6 C2 4F 19 00 1C 43 B0 12 70 F4 92 43
    9A 02 82 93 9A 02 05 24 32 D0 18 00 82 93 9A 02
    FB 23 0C 43 B0 12 70 F4 A2 43 9A 02 82 93 9A 02
    05 24 32 D0 18 00 82 93 9A 02 FB 23 19 83 E4 23
    39 40 2E 00 F2 D0 6C 00 19 00 19 B3 09 24 29 B3
    03 24 4F 45 3F E3 02 3C 4F 46 3F E3 C2 FF 19 00
    5F 42 19 00 82 4F 14 03 81 4A 00 00 08 44 07 43
    27 92 1B 2C 0C 47 B0 12 AC F2 0F 4C 4C 48 B0 12
    B0 F2 7C F0 30 00 4C DF 2F 41 7F F0 0F 00 4C DF
    B0 12 6A EA 2C 41 B0 12 62 F1 81 4C 00 00 12 C3
    48 10 48 11 17 53 27 92 E5 2B 19 83 CB 23 0C 43
    B0 12 70 F4 7C 40 20 00 B0 12 00 E0 0D 12 3D 40
    0E 00 1D 83 FE 23 3D 41 03 43 4C 43 B0 12 00 E0
    3C 40 D0 07 5D 43 B0 12 F2 F3 82 43 9C 02 21 53
    30 40 6A F5 0A 12 09 12 09 43 0A 43 82 93 42 03
    04 20 3C 40 2E F6 B0 12 72 E4 1C 42 54 10 3D 40
    11 00 B0 12 AC E2 09 93 27 20 3C 40 40 02 3D 40
    A0 02 B0 12 62 EB 7C 90 03 00 14 24 19 43 1C 42
    54 10 B0 12 CE F3 3E 40 03 00 0F 43 2F 92 12 2C
    DE 9F 82 02 40 02 01 24 09 43 1E 53 1F 53 2F 92
    F7 2B 08 3C 3C 40 64 00 B0 12 BE F1 1A 53 3A 90
    33 00 02 2C 09 93 D9 27 7C 40 20 00 B0 12 00 E0
    3C 40 F4 01 B0 12 BE F1 3A 90 33 00 14 2C 1C 43
    3E 40 0D 00 0F 43 3F 90 05 00 10 2C 0D 4F 1D 52
    26 03 EE 9D 40 02 01 24 0C 43 1E 53 1F 53 3F 90
    05 00 F4 2B 03 3C E2 C3 50 03 0C 43 0C 93 11 20
    3A 90 33 00 07 2C 1C 42 54 10 3D 40 12 00 B0 12
    AC E2 0D 3C 1C 42 54 10 3D 40 13 00 B0 12 AC E2
    06 3C 1C 42 54 10 3D 40 14 00 B0 12 AC E2 82 93
    42 03 04 20 3C 40 EE F5 B0 12 72 E4 B2 F0 AF FF
    44 03 F2 D0 24 00 19 00 82 43 12 03 30 40 74 F5
    0A 12 0A 43 F2 B0 50 00 28 00 79 24 B2 B0 40 00
    44 03 33 24 F2 B0 10 00 28 00 2F 24 04 3C 3C 40
    64 00 B0 12 BE F1 F2 B0 40 00 28 00 11 20 F2 B0
    10 00 28 00 0D 24 1A 53 3A 90 06 00 06 28 92 43
    46 03 0C 43 1D 43 B0 12 AC EF 3A 90 33 00 E7 2B
    F2 D0 24 00 19 00 92 93 46 03 08 20 92 53 46 03
    1C 42 54 10 7D 40 6A 00 B0 12 FE F1 B2 F0 BF FF
    44 03 0A 43 F2 D0 48 00 19 00 B2 B0 10 00 44 03
    42 24 F2 B0 40 00 28 00 3E 24 04 3C 3C 40 64 00
    B0 12 BE F1 F2 B0 10 00 28 00 0F 20 F2 B0 40 00
    28 00 0B 24 1A 53 3A 90 0B 00 04 28 0C 43 1D 43
    B0 12 AC EF 3A 90 33 00 E9 2B F2 D0 24 00 19 00
    3A 90 0B 00 08 28 82 43 46 03 1C 42 54 10 7D 40
    0C 00 B0 12 FE F1 B2 F0 EF FF 44 03 F2 D0 48 00
    19 00 11 3C 1A 53 3A 90 1F 00 05 28 F2 F0 DB 00
    19 00 92 43 12 03 3C 40 64 00 B0 12 BE F1 F2 B0
    50 00 28 00 EF 27 3A 41 30 41 0A 12 09 12 0A 4C
    29 42 B2 40 30 00 8A 02 82 43 8C 02 0C 43 B0 12
    70 F4 3C 40 80 0C B0 12 10 F3 1C 43 B0 12 70 F4
    A2 43 9A 02 82 93 9A 02 05 24 32 D0 18 00 82 93
    9A 02 FB 23 0C 43 B0 12 70 F4 A2 43 9A 02 82 93
    9A 02 05 24 32 D0 18 00 82 93 9A 02 FB 23 4C 4A
    3C F0 80 FF B0 12 70 F4 4A 5A A2 43 9A 02 82 93
    9A 02 05 24 32 D0 18 00 82 93 9A 02 FB 23 19 83
    EE 23 1C 43 B0 12 70 F4 A2 43 9A 02 82 93 9A 02
    05 24 32 D0 18 00 82 93 9A 02 FB 23 0C 43 B0 12
    70 F4 A2 43 9A 02 82 93 9A 02 05 24 32 D0 18 00
    82 93 9A 02 FB 23 29 42 4C 4A 3C F0 80 FF B0 12
    70 F4 4A 5A A2 43 9A 02 82 93 9A 02 05 24 32 D0
    18 00 82 93 9A 02 FB 23 19 83 EE 23 1C 43 B0 12
    70 F4 82 93 8C 02 03 20 82 93 8A 02 08 24 32 D0
    18 00 82 93 8C 02 FB 23 82 93 8A 02 F8 23 30 40
    74 F5 0A 12 0A 4D 5F 42 50 03 5F B3 18 24 82 4C
    98 02 C2 43 9E 02 E2 43 9F 02 7C 40 60 00 B0 12
    00 E0 3C 40 14 00 B0 12 BE F1 2F 43 5F D2 50 03
    7F F0 DE 00 C2 4F 50 03 7C 40 03 00 59 3C 6F B2
    1F 20 7F B0 10 00 0B 24 1F 43 5F D2 50 03 7F F0
    EF 00 C2 4F 50 03 F2 D2 21 00 5C 43 49 3C 7F B0
    20 00 0B 24 1F 43 5F D2 50 03 7F F0 DF 00 C2 4F
    50 03 F2 D2 21 00 6C 43 3B 3C 7C 40 03 00 38 3C
    7C 40 20 00 B0 12 00 E0 3D 40 BF 00 1D F2 3E 02
    3D D0 40 00 7C 40 1F 00 B0 12 32 F2 B0 12 8C F4
    C2 4C 9F 02 82 43 52 03 D2 42 52 03 9E 02 0F 3C
    B0 12 8C F4 5F 42 9E 02 0E 4F 5E 53 C2 4E 9E 02
    4F 4F 1F 52 98 02 CF 4C 00 00 92 53 52 03 5F 42
    9F 02 82 9F 52 03 EC 2B DA 42 9F 02 00 00 1F 43
    5F D2 50 03 6F C2 C2 4F 50 03 F2 D2 21 00 4C 43
    3A 41 30 41 0A 12 3A 40 54 02 E2 D3 19 00 F2 40
    69 00 60 00 7C 40 20 00 7D 40 2F 00 B0 12 12 F4
    7C 40 22 00 7D 40 40 00 B0 12 12 F4 7C 40 24 00
    7D 42 B0 12 12 F4 7C 40 32 00 7D 40 24 00 B0 12
    12 F4 7C 40 33 00 6D 42 B0 12 12 F4 7C 40 30 00
    7D 40 95 00 B0 12 12 F4 7C 40 31 00 B0 12 3A F3
    7C 40 0F 00 B0 12 3A F3 4C 4C 2A 53 8A 4C FE FF
    7C 40 20 00 B0 12 3A F3 4C 4C 2A 53 8A 4C FE FF
    7C 40 21 00 B0 12 3A F3 4C 4C 2A 53 8A 4C FE FF
    7C 40 22 00 B0 12 3A F3 4C 4C 2A 53 8A 4C FE FF
    7C 40 23 00 B0 12 3A F3 4C 4C 2A 53 8A 4C FE FF
    7C 40 24 00 B0 12 3A F3 4C 4C 2A 53 8A 4C FE FF
    7C 40 31 00 B0 12 3A F3 4C 4C 2A 53 8A 4C FE FF
    3A 41 30 41 4E 4D 1F 43 1F F2 3C 02 0E 5F 1F 42
    0A 02 12 C3 0F 10 0F 11 3F F0 F0 FF 3F 50 10 00
    0F 9E 04 2C D2 D3 50 03 5C 43 50 3C 2F 43 5F D2
    50 03 5F C3 C2 4F 50 03 C2 4D 9F 02 82 4C 98 02
    7C 40 20 00 B0 12 00 E0 3C 40 14 00 B0 12 BE F1
    3D 40 BF 00 1D F2 3E 02 7C 40 1F 00 B0 12 32 F2
    B2 B0 80 00 3C 02 04 24 5C 42 9F 02 B0 12 A8 F4
    82 43 52 03 D2 42 52 03 9E 02 0E 3C 5F 42 9E 02
    0E 4F 5E 53 C2 4E 9E 02 4F 4F 1F 52 98 02 6C 4F
    B0 12 A8 F4 92 53 52 03 5F 42 9F 02 82 9F 52 03
    ED 2B 7C 40 80 00 B0 12 00 E0 E2 B3 28 00 FD 27
    3C 40 E8 03 B0 12 0E F5 4C 43 B0 12 00 E0 1F 43
    5F D2 50 03 7F C2 C2 4F 50 03 4C 43 30 41 0F 12
    0E 12 0D 12 0C 12 0B 12 C2 93 2B 00 48 24 F2 B0
    40 00 2B 00 06 24 B2 D0 40 00 44 03 F2 F0 BF 00
    2B 00 F2 B0 10 00 2B 00 06 24 B2 D0 10 00 44 03
    F2 F0 EF 00 2B 00 E2 B2 2B 00 04 24 A2 D2 44 03
    E2 C2 2B 00 F2 B2 2B 00 02 24 F2 C2 2B 00 D2 B3
    2B 00 0C 24 F2 90 60 00 54 03 06 20 2F 42 5F D2
    50 03 6F C3 C2 4F 50 03 D2 C3 2B 00 E2 B3 2B 00
    02 24 E2 C3 2B 00 F2 B0 80 FF 2B 00 06 24 0C 43
    B0 12 26 EF F2 F0 7F 00 2B 00 F2 B0 20 00 2B 00
    03 24 F2 F0 DF 00 2B 00 C2 93 2B 00 B8 23 B1 C0
    D0 00 0A 00 3B 41 3C 41 3D 41 3E 41 3F 41 00 13
    0A 12 3A 40 64 02 F2 F0 BF 00 21 00 F2 40 29 00
    60 00 6C 42 B0 12 52 F4 4C 43 B0 12 52 F4 4C 43
    7D 40 22 00 B0 12 AA F3 5C 43 7D 40 38 00 B0 12
    AA F3 6C 42 7D 40 5E 00 B0 12 AA F3 7C 40 07 00
    7D 40 8B 00 B0 12 AA F3 7C 40 11 00 6D 42 B0 12
    AA F3 7C 40 0A 00 B0 12 86 F3 4C 4C 2A 53 8A 4C
    FE FF 7C 40 0E 00 B0 12 86 F3 4C 4C 2A 53 8A 4C
    FE FF 7C 40 0F 00 B0 12 86 F3 4C 4C 2A 53 8A 4C
    FE FF 3A 41 30 41 0D 43 0C 93 1B 24 2C 83 3C 20
    82 43 4A 03 B2 90 09 00 4A 03 0A 2C 1F 42 4A 03
    CF 43 74 02 92 53 4A 03 B2 90 09 00 4A 03 F6 2B
    82 43 4A 03 82 43 4E 03 1D 42 4C 03 82 43 4C 03
    23 3C B2 90 09 00 4C 03 1F 2C B2 92 4A 03 04 28
    82 43 4A 03 92 53 4C 03 F2 B0 80 FF 18 00 02 20
    0C 43 01 3C 1C 43 82 93 4E 03 0A 24 1E 42 4C 03
    5F 4E 74 02 0F 5F 0F DC CE 4F 74 02 92 53 4A 03
    0C 93 02 20 92 43 4E 03 0C 4D 30 41 0C 93 1A 24
    1C 83 2F 20 82 9D 5C 03 12 28 82 43 5C 03 F2 B0
    40 00 19 00 06 20 F2 D0 40 00 19 00 F2 C2 19 00
    20 3C F2 D2 19 00 F2 F0 BF 00 19 00 1A 3C 92 53
    5C 03 17 3C 82 9D 5A 03 12 28 82 43 5A 03 F2 B0
    20 00 19 00 06 20 F2 D0 20 00 19 00 E2 C2 19 00
    08 3C E2 D2 19 00 F2 F0 DF 00 19 00 02 3C 92 53
    5A 03 30 41 0A 12 09 12 7A 4C 21 3C 1C 53 0E 93
    0D 24 3F 90 00 01 0A 2C 29 43 4F 4F 8F 10 7B 4C
    0F DB 19 83 FA 23 02 3C 2F 92 02 28 7B 4C 01 3C
    0B 4A 1F 83 3F 93 0B 24 4B 4B 1D 53 CD 4B FF FF
    1F 83 3F 93 FA 23 03 3C 1D 53 CD 4F FF FF 7F 4C
    0F 9A FA 23 7F 4C 0F 93 E7 23 7F 4C 8F 10 6B 4C
    0F 5B D4 23 30 40 74 F5 0A 12 09 12 3F 40 B0 F6
    3F 90 B6 F6 16 24 3F 40 C2 F6 3F 90 D2 F6 11 24
    3A 40 D2 F6 3A 80 C2 F6 0A 11 0A 11 39 40 C2 F6
    3C 49 7F 4C 0F 5F 1F 4F B0 F6 3D 49 8F 12 1A 83
    F7 23 3F 40 00 00 3F 90 00 00 08 24 3A 40 00 00
    02 3C 3F 4A 8F 12 3A 90 00 00 FB 23 30 40 74 F5
    0A 12 09 12 09 43 0A 43 1B 43 0F 93 04 24 09 4D
    0D 4C 0C 43 0D 3C 0C 5C 0D 6D 09 69 09 8E 04 28
    1C D3 0B 5B F8 2B 03 3C 09 5E 0B 5B F4 2B 1B 43
    0C 5C 0D 6D 09 69 0A 6A 09 8E 0A 7F 04 28 1C D3
    0B 5B F6 2B 04 3C 09 5E 0A 6F 0B 5B F1 2B 0E 49
    0F 4A 39 41 3A 41 30 41 3D F0 0F 00 3D E0 0F 00
    0D 5D 0D 5D 00 5D 12 C3 0C 10 12 C3 0C 10 12 C3
    0C 10 12 C3 0C 10 12 C3 0C 10 12 C3 0C 10 12 C3
    0C 10 12 C3 0C 10 12 C3 0C 10 12 C3 0C 10 12 C3
    0C 10 12 C3 0C 10 12 C3 0C 10 12 C3 0C 10 12 C3
    0C 10 30 41 0F 12 1F 42 2E 01 92 53 92 02 82 63
    94 02 82 93 88 02 03 20 82 93 86 02 04 24 92 83
    86 02 82 73 88 02 82 93 8C 02 03 20 82 93 8A 02
    04 24 92 83 8A 02 82 73 8C 02 82 93 9A 02 02 24
    92 83 9A 02 B1 C0 10 00 02 00 3F 41 00 13 0D 43
    3E 40 E8 03 0F 43 B0 12 60 F3 1E 42 72 01 12 C3
    0E 10 0F 43 B0 12 D0 F0 82 4C 86 02 82 4D 88 02
    82 93 88 02 03 20 82 93 86 02 08 24 32 D0 18 00
    82 93 88 02 FB 23 82 93 86 02 F8 23 30 41 1F 42
    42 03 0F 93 03 24 1F 83 0A 24 0C 3C 82 93 9C 02
    09 20 7E 40 40 00 7F 42 B0 12 12 E7 03 3C 4D 4D
    B0 12 AC E2 F2 D0 24 00 19 00 F2 D0 48 00 19 00
    30 41 0A 12 0A 4D F2 40 A9 00 60 00 7C F0 1F 00
    4C 5C F2 D2 21 00 F2 F0 DF 00 21 00 B0 12 5A F5
    4C 4A B0 12 5A F5 F2 D0 20 00 21 00 3A 41 30 41
    31 82 0C 41 3D 40 7F F6 3E 42 B0 12 48 F5 3C 40
    E8 F5 3D 40 80 10 B0 12 F6 F4 0C 93 06 24 0C 41
    3D 42 3E 40 80 10 B0 12 A4 02 31 52 30 41 3D F0
    0F 00 3D E0 0F 00 0D 5D 00 5D 0C 5C 0C 5C 0C 5C
    0C 5C 0C 5C 0C 5C 0C 5C 0C 5C 0C 5C 0C 5C 0C 5C
    0C 5C 0C 5C 0C 5C 0C 5C 30 41 F2 40 16 00 26 00
    F2 40 16 00 41 00 7C D0 09 00 C2 4C 60 00 F2 D0
    80 00 61 00 E2 D2 62 00 C2 43 63 00 C2 43 64 00
    D2 C3 61 00 30 41 A2 B2 44 03 11 24 92 43 46 03
    1C 42 54 10 7D 40 6A 00 B0 12 FE F1 F2 D0 48 00
    19 00 A2 C2 44 03 7C 40 31 00 B0 12 3A F3 30 41
    8C 10 4C 4C 82 4C 86 02 82 43 88 02 82 93 88 02
    03 20 82 93 86 02 08 24 32 D0 18 00 82 93 88 02
    FB 23 82 93 86 02 F8 23 30 41 0A 12 0A 4C F2 40
    69 00 60 00 E2 C3 19 00 3C 40 80 00 4C DA B0 12
    5A F5 0C 4A B0 12 5A F5 E2 D3 19 00 3A 41 30 41
    0A 12 0A 43 0B 43 12 C3 0D 10 0C 10 02 28 0A 5E
    0B 6F 0E 5E 0F 6F 0D 93 F6 23 0C 93 F4 23 0C 4A
    0D 4B 3A 41 30 41 F2 40 29 00 60 00 F2 D0 40 00
    21 00 3F 40 40 00 4C DF B0 12 5A F5 4C 43 B0 12
    5A F5 F2 F0 BF 00 21 00 30 41 0A 12 0A 4D F2 40
    29 00 60 00 F2 D0 40 00 21 00 B0 12 5A F5 0C 4A
    B0 12 5A F5 F2 F0 BF 00 21 00 3A 41 30 41 0F 43
    2F 92 0E 2C 3E 40 82 02 0E 8F 0D 4C 3D F0 0F 00
    DE 4D 6E F6 03 00 B0 12 62 F1 1F 53 2F 92 F2 2B
    30 41 B2 40 50 02 60 01 0C 5C 82 4C 72 01 B2 40
    05 00 74 01 92 C3 60 01 4D 93 02 24 A2 D3 60 01
    30 41 0A 12 0A 4D F2 40 69 00 60 00 E2 C3 19 00
    B0 12 5A F5 0C 4A B0 12 5A F5 E2 D3 19 00 3A 41
    30 41 B2 B0 20 00 44 03 0B 24 1C 42 54 10 7D 40
    10 00 B0 12 FE F1 92 53 40 03 B2 F0 DF FF 44 03
    30 41 F2 40 29 00 60 00 F2 D0 40 00 21 00 3F 40
    C0 00 4C DF B0 12 5A F5 F2 F0 BF 00 21 00 30 41
    0C 93 06 20 D2 C3 21 00 D2 42 14 03 19 00 05 3C
    D2 D3 21 00 F2 D0 6C 00 19 00 30 41 F2 40 A9 00
    60 00 F2 D0 20 00 21 00 F2 C2 21 00 4C 43 B0 12
    5A F5 F2 D2 21 00 30 41 F2 40 A9 00 60 00 F2 D0
    20 00 21 00 F2 C2 21 00 B0 12 5A F5 F2 D2 21 00
    30 41 31 40 00 04 B0 12 9C F5 0C 93 02 24 B0 12
    78 F0 0C 43 B0 12 CE E5 B0 12 A0 F5 F2 B0 80 FF
    23 00 03 24 B2 D0 20 00 44 03 C2 43 23 00 B1 C0
    D0 00 00 00 00 13 0F 4C 6E 4F 6B 4D 4C 4E 0C 8B
    4E 93 04 24 1D 53 1F 53 0C 93 F6 27 30 41 B0 12
    5E F1 82 4C 96 02 92 83 96 02 82 93 96 02 FB 23
    30 41 1F 4C 01 00 0F 93 05 24 1D 53 CD 43 FF FF
    1F 83 FB 23 30 41 0F 4C 0C 4D 3D 40 03 00 0D 5F
    1E 4F 01 00 30 40 48 F5 0F 4C 0E 93 05 24 1F 53
    FF 4D FF FF 1E 83 FB 23 30 41 C2 4C 67 00 D2 B3
    03 00 FD 27 5C 42 66 00 30 41 34 41 35 41 36 41
    37 41 38 41 39 41 3A 41 30 41 E2 B3 03 00 FD 27
    00 13 B2 50 11 01 48 03 00 13 32 D0 10 00 FD 3F
    1E 43 30 40 14 F0 5C 42 50 03 30 41 1C 43 30 41
    03 43 FF 3F 49 44 20 58 58 58 58 20 43 4F 44 45
    20 58 58 58 58 58 00 00 41 4C 41 52 4D 00 51 55
    49 54 20 00 57 41 4B 45 20 00 44 41 54 41 20 00
    45 52 52 20 20 00 54 49 4D 45 20 00 41 51 4E 4F
    20 00 50 41 52 41 20 00 30 2E 39 30 00 00 30 00
    48 00 03 00 09 00 0C 00 CF 00 97 00 81 00 1B 00
    6B 00 5B 00 34 00 38 00 00 00 09 00 00 00 A3 00
    38 00 38 00 07 00 00 00 00 00 69 00 81 00 7E 00
    96 00 72 00 BC 00 A0 00 00 00 E8 00 00 00 30 00
    8C 00 07 00 27 00 0C 00 CF 00 97 00 81 00 1B 00
    6B 00 5B 00 34 00 38 00 08 00 1D 00 19 00 21 00
    38 00 1A 00 07 00 00 00 00 00 69 00 81 00 7E 00
    96 00 72 00 BC 00 A0 00 00 00 E8 00 00 00 30 31
    32 33 34 35 36 37 38 39 41 42 43 44 45 46 00 30
    2E 39 30 00 30 31 00 00 01 02 02 04 00 A4 F5 B8
    F5 BE F5 C4 F5 CA F5 D0 F5 D6 F5 DC F5 E2 F5 02
    28 00 01 00 00 00 20 04 34 02 07 00 02 00 00 00
    22 F5 90 F5 36 F5 00 00 A1 00 00 00 08 00 00 00
    16 00 88 F6 12 03 B6 F6 00 02 BA F6 80 10 BE F6
    40 10
    @FFE4
    DC F4 EE ED
    @FFEC
    8A F5 7A F5 74 F1 8A F5 82 F5
    @FFF8
    8A F5 8A F5 8A F5 C2 F4
    q
    

    diff --git a/MSP430_Flasher.cpp b/MSP430_Flasher.cpp
    index 7c713bc..178860e 100644
    --- a/MSP430_Flasher.cpp
    +++ b/MSP430_Flasher.cpp
    @@ -55,6 +55,7 @@
     /*****************************************************************************/
     
     #include "StdUseCase.h"
    +#include <sys/time.h>
     
     /*****************************************************************************/
     /*                                 VARIABLES                                 */
    @@ -104,6 +105,20 @@ int main(int argc, char* argv[])
         return RetState;
     }
     
    +static double tstamp, tstamp_old, tstamp_begin;
    +static void elapsed_time(char code)
    +{
    +    struct timeval time;
    +    tstamp_old = tstamp;
    +    //tstamp = clock();
    +    gettimeofday(&time, NULL);
    +    tstamp = (double)time.tv_sec + (double)time.tv_usec*1e-6;
    +    if (!code) {
    +        return;
    +    }
    +    printf(" %c:%d msec ", code, (int)((double)(tstamp-tstamp_old)*1000));
    +}
    +
     //***************************************************************************//
     //! \brief Main Flasher routine
     //! \param[in] argc Number of arguments in the argument string
    @@ -115,6 +130,8 @@ int main(int argc, char* argv[])
     //! STATUS_ERROR: The initialization failed.
     int Flasher(int argc, char* argv[], sDefOptions_t* sOpt, sRTE_t* RTE)
     {
    +    elapsed_time(0);
    +    tstamp_begin = tstamp;
         int RetState = 0;
     
     //==ENABLE LOG===============================================================//
    @@ -144,11 +161,13 @@ int Flasher(int argc, char* argv[], sDefOptions_t* sOpt, sRTE_t* RTE)
     
             StdUseCase_ReadFWVersion();
             StdUseCase_ReadHWVersion();
    +	elapsed_time('v');
     
     //==POWER UP AND CONFIGURE===================================================//
     
             StdUseCase_PowerUp(&g_sOpt);
             StdUseCase_Configure(&g_sOpt);
    +	elapsed_time('s');
     
     //==GET DEVICE UNDER JTAG CONTROL============================================//
     
    @@ -159,14 +178,18 @@ int Flasher(int argc, char* argv[], sDefOptions_t* sOpt, sRTE_t* RTE)
             {
                 StdUseCase_EemInit();
             }
    +	elapsed_time('c');
     
     //==ERASE MEMORY (optional)==================================================//
     
    +	
             StdUseCase_Erase(&g_sOpt);
    +	elapsed_time('e');
     
     //==PROGRAM & VERIFY / READ OUT DEVICE MEMORY================================//
     
             StdUseCase_ReadWrite(&g_sOpt, &g_RTE);
    +	elapsed_time('p');
     
     //==RESET DEVICE=============================================================//
     
    @@ -187,6 +210,8 @@ int Flasher(int argc, char* argv[], sDefOptions_t* sOpt, sRTE_t* RTE)
     
     //==DISPLAY INITIALIZATION RESULTS===========================================//
     
    +	tstamp = tstamp_begin;
    +	puts("\n"); elapsed_time('>');
             StdUseCase_DisplayResults(argc, argv, &g_sOpt);
     
     //==RUN TO BREAKPOINT(S)=====================================================//
    @@ -195,7 +220,6 @@ int Flasher(int argc, char* argv[], sDefOptions_t* sOpt, sRTE_t* RTE)
         }
             
     //===========================================================================//
    -    
         return (RetState);
     }
     
    diff --git a/Makefile b/Makefile
    index 57dec9a..3c6476f 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -1,5 +1,5 @@
     CC=g++
    -CFLAGS=-std=c++0x -I./Inc
    +CFLAGS=-std=c++11 -I./Inc  -m32
     LDFLAGS=-L../ -lmsp430
     SOURCES=MSP430_Flasher.cpp Support.cpp StdUseCase.cpp
     OBJECTS=$(SOURCES:.cpp=.o)
    diff --git a/StdUseCase.cpp b/StdUseCase.cpp
    index 24c39ec..f48bece 100644
    --- a/StdUseCase.cpp
    +++ b/StdUseCase.cpp
    @@ -40,9 +40,12 @@
     /*****************************************************************************/
     
     #include "StdUseCase.h"
    +#include <sys/time.h>
     
     #ifndef WIN32
     #include <thread>
    +#include <condition_variable>
    +#include <mutex>
     #endif
     
     using namespace std;
    @@ -207,6 +210,20 @@ bool Event::wait(unsigned int msTimeout)
     /*                                FUNCTIONS                                  */
     /*****************************************************************************/
     
    +static double tstamp, tstamp_old, tstamp_begin;
    +static void elapsed_time(char code)
    +{
    +    struct timeval time;
    +    tstamp_old = tstamp;
    +    //tstamp = clock();
    +    gettimeofday(&time, NULL);
    +    tstamp = (double)time.tv_sec + (double)time.tv_usec*1e-6;
    +    if (!code) {
    +        return;
    +    }
    +    printf(" (%d ms) ", (int)((double)(tstamp-tstamp_old)*1000));
    +}
    +
     /*****************************************************************************/
     //! \brief This function initializes the debug interface.
     //! \param[in] sOpt Pointer to the default options
    @@ -691,6 +708,7 @@ void StdUseCase_GetDevice(sDefOptions_t* sOpt)
     {
         char c = 0;
         int k = 0;
    +    elapsed_time(0);
     	int targetID = DEVICE_UNKNOWN;
     
     	if(sOpt->pcDeviceName != NULL && (strcmp(sOpt->pcDeviceName, "Unknown") != 0))
    @@ -806,6 +824,7 @@ void StdUseCase_GetDevice(sDefOptions_t* sOpt)
                 }
             }
         }
    +    elapsed_time(' ');
     }
     
     /*****************************************************************************/
    @@ -924,6 +943,7 @@ void StdUseCase_DisplayResults(int argc, char* argv[], sDefOptions_t* sOpt)
     //! \param[in] sOpt Pointer to the option struct
     void StdUseCase_Erase(sDefOptions_t* sOpt)
     {
    +    elapsed_time(0);
         // if memory should be erased without writing afterwards
         if(sOpt->pcFile == NULL && (inst_state & ERASE_NO_WRITE) && strcmp(sOpt->pcEraseType, "ERASE_TOTAL") && strcmp(sOpt->pcEraseType, "ERASE_USER_CODE"))
         {
    @@ -961,6 +981,7 @@ void StdUseCase_Erase(sDefOptions_t* sOpt)
                 }
             }
         }
    +    elapsed_time(' ');
     }
     
     /*****************************************************************************/
    @@ -1119,10 +1140,12 @@ void StdUseCase_ReadWrite(sDefOptions_t* sOpt, sRTE_t* RTE)
                 }
             }
     
    +    elapsed_time(0);
             Print_N_Log(REPORT_MSG,"* Loading file into device...");
    -
    +	fflush(stdout);
             // program target code into MSP430 memory without verify
             Ret_ProgramFile = MSP430_ProgramFile(sOpt->pcFile, lEraseType, false);
    +	elapsed_time(' ');
     
             if(Ret_ProgramFile != STATUS_OK)
             {
    @@ -1166,6 +1189,7 @@ void StdUseCase_ReadWrite(sDefOptions_t* sOpt, sRTE_t* RTE)
                 StdUseCase_Exit(EXIT_CONFIGURE, 0);
             }
         }
    +    elapsed_time(' ');
     }
     
     /*****************************************************************************/
    

  • My flasher under Linux with 5 target devices in slow mode:

    Programmer MCLK 12 MHz, target device MCLK 3 MHz
    Max SBW+ bus clock: PIO 1 MHz, TEST 2 MHz, RESET 3 MHz
    MSP430x2xx flash clock: 3 MHz / 8 = 375000 Hz
    Write: 39.0 KByte/s Verify: 109.9 KByte/s

    ThinkPad:~/msp430$ flash -p /dev/ttyACM0 -f alcor.txt -e -w -v

    File: "alcor.txt"
    Address: 0E000  Words: 2921
    Address: 0FFE4  Words: 2
    Address: 0FFEC  Words: 5
    Address: 0FFF8  Words: 4
    Size: 5864 bytes

    Get Device
    # JTID Fuse Device Proc
    0  89   OK   2955  00A0
    1  89   OK   F227  5040
    2  89   OK   2955  00A0
    3  89   OK   F227  80A0
    4  89   OK   2553  0060

    Erase

    Write
    Time: 180 ms  Speed: 31.8 KB/s

    Verify
    Time: 91 ms  Speed: 62.9 KB/s

    Release Device

    Total Time: 401 ms

    ThinkPad:~/msp430$

  • Rob,

    What I measured was the durations of the calls to the MSP Debug Stack (libmsp430.so) done by MSP430 Flasher (i.e. MSP430_ProgramFile()). This seems to match with what you measured.

    Some remarks:

    • You mentioned a total Flasher execution time of up to 14 seconds. Assuming that the file to be programmed didn’t change, it must have been setting VCC that took this long. When setting target VCC with the MSP-FET, calibration data for EnergyTrace is generated which can take a couple of seconds. This data is stored in the MSP-FET’s RAM and will be reused unless a different target VCC level is selected, or the MSP-FET is unplugged. Thus, the first MSP430 Flasher run after an MSP-FET power cycle might take significantly longer than the following ones.
    • We’ve just released a new version of MSP430 Flasher (v1.3.4), which allows for increasing the JTAG/Spy-Bi-Wire frequency of the MSP-FET. I can’t fully quantify the improvement since this is entirely dependent on the implementation within the MSP Debug Stack, but I’d encourage you to just give it a try with MSP430 Flasher v1.3.4 and see if the result is acceptable. Download it here: http://www.ti.com/tool/msp430-flasher

    Best regards,

    Robert

  • Robert, what is highest possible fequency for new MSP-FET (constants are from FET firmware)?

    #define SBW1200KHz              0x800A
    #define SBW600KHz               0x600A
    #define SBW400KHz               0x400A
    #define SBW200KHz               0x200A
    #define SBW100KHz               0x100A

    #define JTAG10MHz               1
    #define JTAG8MHz                2
    #define JTAG4MHz                4
    #define JTAG2MHz                8
    #define JTAG1MHz                16
    #define JTAG500KHz              32
    #define JTAG250KHz              64
    #define JTAG750KHz              128

    Rob, just to have complete picture, you can also post here results for MSP430 Flasher with Elprotronic programmer.

  • Zrno,

    This is the correlation between the speed settings and MSP-FET JTAG/SBW frequencies in the latest MSP Debug Stack (v3.5.0.1 - also included in MSP430 Flasher v1.3.4):

    4-wire JTAG 2-wire Spy-Bi-Wire
    slow 1 MHz 200 kHz
    medium 4 MHz 400 kHz
    fast 8 MHz 600 kHz

    Best regards,

    Robert

  • Robert, AFAIK this can not be found anywhere (in any TI document), so thank you very much for clarification.
  • Much thanks, Robert, for having done this extensive work. Compiling in Linux doesn't even prodiuce warnings now ;)

    BTW: I was very much involved in other things, the past weeks - therefore my response delay. Now I have had the time to also merge my benchmarking code into 1.3.4.

    Regarding Vcc setup: I'm aware of this, and made my time measurements always upon at least the second iteration after powering the MSP-FET. I dit measurements (SBW-mode) in slow, medium and fast mode.

    At first as a reference the relevant part of my benchmarking with V1.3.3:

    * Reading FW version... v:560 msec done
    * Setting VCC to 3000 mV... s:26 msec done
    * Accessing device...done
    * Reading device information... (649 ms) c:649 msec (0 ms) e:0 msec done
    * Loading file into device... (3967 ms) done
    * Verifying memory (alcor.txt)... (462 ms) p:4430 msec

    >:6198 msec done

    V1.3.4  -j medium:

    * Reading FW version... v:563 msec done
    * Setting VCC to 3000 mV... s:25 msec done
    * Accessing device...done
    * Reading device information... (645 ms) c:645 msec (0 ms) e:0 msec done
    * Loading file into device... (3961 ms) done
    * Verifying memory (alcor.txt)... (420 ms) p:4381 msec

     >:6148 msec done
     >:5634 msec done (result when -a (non-intrusive))

    -j fast:

    * Reading FW version... v:561 msec done
    * Setting VCC to 3000 mV... s:25 msec done
    * Accessing device...done
    * Reading device information... (626 ms) c:626 msec (0 ms) e:0 msec done
    * Loading file into device... (3084 ms) done
    * Verifying memory (alcor.txt)... (391 ms) p:3475 msec

     >:5212 msec done
     >:4661 msec done (result when -a)

    Slow results in:

    * Reading device information... (699 ms) c:699 msec (0 ms) e:0 msec done
    * Loading file into device... (7986 ms) done
    * Verifying memory (alcor.txt)... (556 ms) p:8542 msec

    >:10406 msec done

    It's going to get quite acceptable, with pure programming time 3.1 seconds.

    More about this in next post..

  • Rob, thank you for benchmarks. Send me PM if you want to try my SBW+ flasher.

**Attention** This is a public forum