Difference between revisions of "SEGGER Flash Loader"

From SEGGER Wiki
Jump to: navigation, search
(Open Flash Loader)
(Create a Flash Loader)
Line 351: Line 351:
   
 
=Create a Flash Loader=
 
=Create a Flash Loader=
This article describes how to create a flash loader using the template projects (Cortex-M and Cortex-A/R) for SEGGER Embedded Studio. The created algorithm can be used to add support for custom flash banks to the J-Link software using the JLinkDevices.xml file.
+
This article describes how to add support for new devices / flash banks to the J-Link DLL so that they can be used with any J-Link DLL based application like for example J-Flash, J-Link Commander, IDEs, etc...The description is based on the template projects (Cortex-M and Cortex-A/R) for SEGGER Embedded Studio. This article assumes that there is already a basic understanding of the method of adding new devices using the Open Flashloader concept. If this is not the case, we recommend to read the article above. In general, there are two possibilities to add support for a new device:
  +
  +
#Use a pre-compiled flash loader
  +
#Compile / create the flash loader on your own
  +
##Using Keil uVision (a license is required, no trial available; Supports Cortex-M, only)
  +
##SEGGER Embedded Studio (can be evaluated without license; Supports Cortex-M and Cortex-A/R)<br>How to create a flash loader on your own using Embedded Studio is described below.
  +
 
'''Supported cores:'''
 
'''Supported cores:'''
 
*Cortex-M
 
*Cortex-M
 
*Cortex-A
 
*Cortex-A
 
*Cortex-R
 
*Cortex-R
  +
  +
'''Note:''' The Open Flashloader concept replaces the previous RAMCode SDK.
   
 
== Debug Configurations ==
 
== Debug Configurations ==

Revision as of 14:07, 4 April 2019

// EL TBD:

  • Add description of the max. sectors / sector layout
  • Call tree of Verify / Compare
  • Explain compare() process
  • FAQ


Open Flash Loader

Introduction

As the number of devices being available is steadily growing and sometimes in an early stage of the MCU development only a few samples/boards are available that may not be provided to third parties (e.g. SEGGER) to add support for a new device. Also the existence of the device may have confidential status, so it might not be mentioned as being supported in public releases yet. Therefore it might be desirable to be able to add support for new devices on your own, without depending on SEGGER and a new release of the J-Link Software & Documentation package being available.

The J-Link DLL allows customers to add support for new devices on their own. It is also possible to edit / extend existing device support by for example adding new flash banks (e.g. to add support for internal EEPROM programming or SPIFI programming). This article explains how new devices can be added to the DLL and how existing ones can be edited / extended.

General Procedure

By default, the J-Link DLL comes with a build-in device database that defines which device names are known and therefore officially supported by the J-Link DLL and software that uses the J-Link DLL. This list can also be viewed on our website: https://www.segger.com/downloads/supported-devices.php

Additionally, the build-in device database can be extended by specifying devices in an XML file, named JLinkDevices.xml. It is also possible to edit / extend an device from the built-in device database via this XML file. There are different places where the JLinkDevices.xml can be referenced from (see list below). In case of several JLinkDevices.xml files are used, supplement each other as in the order specified below:

  1. In the same directory as the J-Link DLL (JLinkARM.dll)
  2. In the same directory as the J-Link settings file. The location of the settings file depends on the IDE / software being used.
  3. In the directory specified using the J-Link Command String JLinkDevicsXMLPath = <Path>

Extending an Existing Device

In order to edit/extend a device that is already in the built-in device database of the J-Link DLL, the following needs to be added to the JLinkDevices.xml:

<Database>
  <Device>
    <ChipInfo Vendor="..." Name="..." />
    <FlashBankInfo Name="..." BaseAddr="..." MaxSize="..." Loader="..." LoaderType="..." AlwaysPresent="..." />
  </Device>
</Database>

The attribute Name of the tag <ChipInfo> must specify exactly the same name as the device in the built-in device database specifies. In case the value of the attribute BaseAddr specifies an address of an existing flash bank for the existing device, in the built-in device database, the flash bank from the built-in database is replaced by the one from the XML file.

When adding new flash banks or if the device in the built-in database does not specify any flash banks so far, the same attribute requirements as for adding a new device, apply. For more information, please refer to Adding a new device.

In order to add more than one flash bank, just repeat the <FlashBankInfo … /> tag structure from above, inside the same <Device> tag. For more information about the tags and their attributes, please refer to XML Tags and Attributes.

Adding a New Device

In order to add support for a new device to the J-Link DLL, the following needs to be added to the JLinkDevices.xml :

<Database>
  <Device>
    <ChipInfo Vendor="..." Name="..." WorkRAMAddr="..." WorkRAMSize="..." Core="..." />
    <FlashBankInfo Name="..." BaseAddr="..." MaxSize="..." Loader="..." LoaderType="..." AlwaysPresent="..." />
  </Device>
</Database>

When adding a new device, the following attributes for the <ChipInfo> tag are mandatory:

  • Vendor
  • Name
  • Core

In case a <FlashBankInfo> tag is also added, the following attributes in addition to the ones mentioned before, become mandatory: ChipInfo-Tag

  • WorkRAMAddr
  • WorkRAMSize
  • FlashBankInfo

FlashBankInfo-Tag

  • Name
  • BaseAddr
  • MaxSize
  • Loader
  • LoaderType
  • AlwaysPresent

For more information about the tags and their attributes, please refer to XML Tags and Attributes . In order to add more than one device to the device database, just repeat the <Device> … </Device> tag structure from above for each device.

Adding a New Flash Bank

In general, there are two possibilities to add a new flash bank for a new or existing device:

  1. Use a pre-compiled flash loader
  2. Compile / create the flash loader on your own
    1. Using Keil uVision (a license is required, no trial available; Supports Cortex-M, only)
    2. SEGGER Embedded Studio (can be evaluated without license; Supports Cortex-M and Cortex-A/R)
      How to create a flash loader on your own using Embedded Studio is described below.

Note: The Open Flashloader concept replaces the previous RAMCode SDK.

JLinkDevices.xml Tags and Attributes

XML Tags and Attributes In the following, the valid XML tags and their possible attributes are explained. General rules • Attributes may only occur inside an opening tag • Attribute values must be enclosed by quotation marks Tag Description

Tag Description
<Database> Opens the XML file top-level tag.
<Device> Opens the description for a new device.
<ChipInfo> Specifies basic information about the device to be added, like the core it incorporates etc.
<FlashBankInfo> Specifies a flash bank for the device.

<Database>

Opens the XML file top-level tag. Only present once per XML file. Valid attributes This tag has no attributes Notes

  • Must only occur once per XML file
  • Must be closed via </Database>

<Device>

Opens the description for a new device. Valid attributes This tag has no attributes Notes

  • Must be closed via </Device> .
  • May occur multiple times in an XML file

<ChipInfo>

Specifies basic information about the device to be added, like the core it incorporates etc. Valid attributes


Parameter Meaning
Vendor String that specifies the name of the vendor of the device. This attribute is mandatory. E.g. Vendor=“ST”.
Name Name of the device. This attribute is mandatory. E.g. Name=“STM32F407IE”
WorkRAMAddr Hexadecimal value that specifies the address of a RAM area that can be used by J-Link during flash programming etc. Should not be used by any DMAs on the device. Cannot exist without also specifying WorkRAMSize. If no flash banks are added for the new device, this attribute is optional. E.g. WorkRAMAddr=“ 0x20000000 ”
WorkRAMSize Hexadecimal value that specifies the size of the RAM area that can be used by J-Link during flash programming etc. Cannot exist without also specifying WorkRAMAddr. If no flash banks are added for the new device, this attribute is optional. E.g. WorkRAMSize=“ 0x10000 ”
Core Specifies the core that the device incorporates. If a new device added, this attribute is mandatory. E.g. Core=“ JLINK_CORE_CORTEX_M0 ”For a list of valid attribute values, please refer to Attribute values - Core.
JLinkScriptFile String that specifies the path to a J-Link script file if required for the device. Path can be relative or absolute. If path is

relative, is relative to the location of the JLinkDevices.xml file. This attribute is mandatory. E.g. JLinkScriptFile=“ST/Example.jlinkscript”

Notes

  • No separate closing tag.

Directly closed after attributes have been specified: <ChipInfo … />

  • Must not occur outside a <Device> tag.

Attribute values - Core

For a list of all available values for the Core attribute, please expand the following list:

<FlashBankInfo>

Specifies a flash bank for the device. This allows to use the J-Link flash download functionality with IDEs, debuggers and other software that uses the J-Link DLL (e.g. J-Link Commander) for this device. The flash bank can then be programmed via the normal flash download functionality of the J-Link DLL. For more information about flash download, please refer to Flash download . For possible limitations etc. regarding newly added flash banks, please refer to Add. Info / Considerations / Limitations . Valid attributes

Parameter Meaning
Name String that specifies the name of the flash bank. Only used for visualization. Can be freely chosen. This attribute is mandatory. E.g. Name=“SPIFI flash”
BaseAddr Hexadecimal value that specifies the start address of the flash bank. The J-Link DLL uses this attribute together with MaxSize to determine which memory write accesses performed by the debugger, shall be redirected to the flash loader instead of being written directly to the target as normal memory access. This attribute is mandatory. E.g. BaseAddr=“ 0x08000000 ”
MaxSize Hexadecimal value that specifies the max. size of the flash bank in bytes. For many flash loader types the real bank size may depend on the actual flash being connected (e.g. SPIFI flash where the loader can handle different SPIFI flashes so size may differ from hardware to hardware). Also, for some flash loaders the sectorization is extracted from the flash loader at runtime. The real size of the flash bank may be smaller than MaxSize but must never be bigger. The J-Link DLL uses this attribute together with BaseAddr to determine which memory write accesses performed by the debugger, shall be redirected to the flash loader instead of being written directly to the target as normal memory access. This attribute is mandatory. E.g. MaxSize=“ 0x80000 ”
Loader String that specifies path to the ELF file that holds the flash loader. Path can be relative or absolute. If path is relative, it

is relative to the location of the JLinkDevices.xml file. This attribute is mandatory. E.g. Loader=“ST/MyFlashLoader.elf” For CMSIS flash loaders the file extension is usually FLM, however any extension is accepted by the J-Link DLL.

LoaderType Specifies the type of the loader specified by Loader. This attribute is mandatory. E.g. LoaderType=“ FLASH_ALGO_TYPE_OPEN ” For a list of valid attribute values, please refer to Attribute values LoaderType.
AlwaysPresent Specifies if a flash bank is always present (e.g. internal flash). If this element is set to one, this flash bank will be affected by the “erase” command. This attribute is optional. E.g. AlwaysPresent=“1”.

Notes

  • No separate closing tag. Directly closed after attributes have been specified:

<FlashBankInfo … />

  • Must not occur outside a <Device> tag

Attribute values - LoaderType

The following values are valid for the LoaderType attribute:

  • FLASH_ALGO_TYPE_OPEN

Describes that the used algorithm is an Open Flashloader algorithm. CMSIS based algorithms are also supported via the Open Flashloader concept. For additional information, see Add. Info / Considerations / Limitations .

Example JLinkDevices.xml file

Add. Information / Considerations / Limitations

Create a Flash Loader

This article describes how to add support for new devices / flash banks to the J-Link DLL so that they can be used with any J-Link DLL based application like for example J-Flash, J-Link Commander, IDEs, etc...The description is based on the template projects (Cortex-M and Cortex-A/R) for SEGGER Embedded Studio. This article assumes that there is already a basic understanding of the method of adding new devices using the Open Flashloader concept. If this is not the case, we recommend to read the article above. In general, there are two possibilities to add support for a new device:

  1. Use a pre-compiled flash loader
  2. Compile / create the flash loader on your own
    1. Using Keil uVision (a license is required, no trial available; Supports Cortex-M, only)
    2. SEGGER Embedded Studio (can be evaluated without license; Supports Cortex-M and Cortex-A/R)
      How to create a flash loader on your own using Embedded Studio is described below.

Supported cores:

  • Cortex-M
  • Cortex-A
  • Cortex-R

Note: The Open Flashloader concept replaces the previous RAMCode SDK.

Debug Configurations

The example project contains two debug configurations:

  • Debug
  • Release

Debug configuration

This configuration allows to debug the flash algorithm in Embedded Studio. The configuration includes a main.c containing the typical function call order, executed by the J-Link DLL during flash programming. The optimization level for this configuration is set to "none".

Release configuration

This configuration does not allow debugging but creates the output elf file which can be referenced from within the JLinkDevices.xml file as "Loader". The optimization level is set to 3 (highest).

Included files

Filename Content
FlashDev.c Flash device description for the ST STM32F205RC
FlashOS.h Function prototypes, definitions and structures
FlashPrg.c Flash algorithm itself (e.g. ProgramPage(), EraseSector()
main.c Flash algorithm debug code (used by debug configuration, only)
Cortex_M_Startup.s
ARM_Startup.s
Cortex-M startup code (used by debug configuration, only)
Cortex-A/R startup code (used by debug configuration, only)
MemoryMap.xml Memory map of the ST STM32F205RC
Placement_debug.xml Debug configuration section placement file.
Placement_release.xml Release configuration section placement file.
thumb_crt0.s
crt0.s
Initialization file for Cortex-M (used by debug configuration, only)
Initialization file for Cortex-A/R(used by debug configuration, only)

Embedded Studio Template Projects

The template projects below have been tested with SEGGER Embedded Studio V3.10.

Step-By-Step Instruction

This step-by-step instruction explains how to create your own flash loader using the template projects for Embedded Studio.

  1. Adapt the template project
    1. FlashDev.c: Modify the FlashDevice structure according to your device
    2. FlashPrg.c: Implement the flash routines Init(), UnInit(), EraseSector() and ProgramPage()
    3. MemoryMap.xml: Enter RAM base address and RAM size
    4. Placement_debug.xml: Enter RAM address in the program section element.
    5. main.c: Make sure that the define _FLASH_BASE_ADDR defines the correct flash base address
  2. Test the debug configuration
    1. Connect the target to the J-Link and the J-Link to the PC
    2. Switch to the Debug configuration in Embedded Studio (Build -> Set Active Build Configuration -> Debug)
    3. Build the project by pressing F7
    4. Start the debug session by pressing F5
    5. PC should be halted at main. Now debug the flash algorithm and make sure that it behaves as expected.
  3. Build the flash loader using the release configuration
    1. Switch to the Release configuration in Embedded Studio (Build -> Set Active Build Configuration -> Release)
    2. Build the project by pressing F7 --> The flash loader file can be found here: $PROJ_DIR$\Output\Release\Exe\*.elf
  4. JLinkDevices.xml
    1. Create or adapt the JLinkDevices.xml (described in the J-Link User Manual (UM08001)).
    2. Place the JLinkDevices.xml file at the correct location (described in the J-Link User Manual (UM08001)).

Now you can select and use the created or adapted device which uses the new flash bank in any J-Link DLL based application (e.g. J-Link Commander / IDE / ...).

FAQ

// EL xxx look here Question #1: In which order does the J-Link DLL call the function during flash programming?

  1. Compare
    1. Init()
    2. Compare()
      Memory is accessed so it has to be initialized during Init() so that it can be memory mapped accessed here. If it is not initialized correctly, the read access may results in confusing the MCU.
    3. UnInit()
  2. Erase
    1. Init()
    2. Erase()
    3. UnInit()
  3. Program
    1. Init()
    2. Program()
    3. UnInit()

How much stack is reserved by the J-Link software for the RAMCode?

256 bytes are reserved for the stack. The stack size is fixed and cannot be configured.

Question #3:

Troubleshoot

This section provides assistance in case of issues pops up when using custom added flash bank. The section assumes that the functionality has been verified using the debug configuration in Embedded Studio.

  1. Get the latest version of the template project
  2. Follow the Step-By-Step instructions except of 2.1 FlashPrg.c --> Functions should not contain any code that accesses any SFRs
  3. Build the flash loader using the release configuration
  4. Perform a flash download using J-Link Commander. Flash download should report an error during verify
  5. Implement EraseSector() and retry the flash download test. J-Link Commander should still report verify failed but effected flash memory region should be empty. If not, check EraseSector().
  6. Implement ProgramPage() and retry the flash download test. Expected result: Test reports O.K. --> Programmed successfully. If not, check ProgramPage() code.

Frequently Problems

PC has unexpected value after flash download

This error may have different root causes:

  • Watchdog is enabled but not fed in the flash loader functions. This may result in a watchdog timeout pops up during RAMCode execution. The behavior is different but usually a reset will be triggered.
  • Accessing not enabled / clocked special function registers / peripherals
  • Accessing invalid memory regions (reserved)

(Q)SPI flashes

  • The Init() code has to make sure that the (Q)SPI pins as well as the (Q)SPI controller are configured so that the flash can be memory mapped (read) accessed. This is necessary as the J-Link DLL reads the data before programming to check if flash content does already match. This can be validated by setting the compare method in J-Link Commander to "skip" (exec SetCompareMode 0). Now start flash download. J-Link Commander should report a verify error but the flash should be memmory mapped accessible from now. If not, check the Init() code.

Information for Silicon Vendors

SEGGER offers the opportunity to hand in custom created flash algorithms which will then be included in the official J-Link Software and Documentation Package hence distributed to any J-Link customer who is using the latest software package. The following files and hardware need to be provided to SEGGER:

  • All required source files + the project which can be used to rebuild the algorithm of the flashloader
  • JLinkDevices.xml - including the device entry / entries
  • Flash loader file - referenced in the JLinkDevices.xml (which is based on the provided source files)
  • Two hardware samples which can be used to verify the functionality of the compiled flashloader
  • Readme.txt which may includes additional information or at least a contact e-mail address which can be used by customers in case support is needed.

This applies to all new flashloaders which should be shipped with the J-Link package. If a silicon vendor cannot meet the requirements, the alternative option is to deliver the flashloader to the customers manually.

Algorithm Functions

The following tables provide an overview of all available functions. The tables are split into mandatory and optional functions.

Following functions are mandatory:

Function Name Description
Init Handles the initialization of the flash module.
UnInit Handles the de-initialization of the flash module.
EraseSector Erases one flash sector.
ProgramPage Programs one flash page.

Following functions are optional:

Function Name Description
BlankCheck Checks if a memory region is blank
EraseChip Erases the entire chip (flash bank)
Verify Compares a specified number of bytes of a provided data buffer with the content of the device
SEGGER_OPEN_Read Reads the target memory (e.g. can be used to read data from non-memory mapped flashes)

// EL xxxxxx Add SEGGER_Open_Program


Flash Erase Procedure

This procedure is executed to erase the flash before programming it.

Flash Erase Procedure.svg

Flash Program Procedure

This procedure is executed to program the flash. The DLL makes sure that the effected sectors are erased.

Flash Verify Procedure

This procedure verifies that the programmed data have been programmed successfully.

Flash Read Procedure

This procedure reads back the flash content. Please note that this sequence is executed in case of SEGGER_OPEN_Read() has been implemented. If this function is not available, the read back is done using memory mapped read accesses to the specified address.

Function Overview

Init

Prototype

1 int Init(U32 Addr, U32 Freq, U32 Func);

Function description

Handles the initialization of the flash module. This function will be called prior any flash action (read, program, erase, etc...).

Parameters

  • Addr: Specifies the base address of the flash.
  • Freq: Specifies the CPU clock frequency.
  • Func: Specifies the action followed by Init() (e.g.: 1 - Erase, 2 - Program, 3 - Verify / Read)

Return values

  • 0: O.K.
  • 1: Error

Code Example

 1  int Init(U32 Addr, U32 Freq, U32 Func) {
 2    (void)Addr;
 3    (void)Freq;
 4    (void)Func;
 5    //
 6    // Init code
 7    //
 8    FLASH->ACR = 7; // Disable all caches and set wait-states to 7
 9    do {
10      v = FLASH->ACR;
11      if ((v & 0x00001F07) == 7) {  // Wait until write has completely succeeded
12        break;
13      }
14    } while (1);
15    FLASH->ACR = (1 << 11) | (1 << 12) | 7;  // Reset data and instruction cache
16    FLASH->ACR = 7;                          // Invalidate reset of data and instruction cache
17    return 0;
18  }

UnInit

Prototype

1 int UnInit(U32 Func);

Function description

Handles the de-initialization of the flash module.

Parameters

  • Func: Specifies the previous flash action before the call of UniInit() (e.g.: 1 - Erase, 2 - Program, 3 - Verify / Read)

Return values

  • 0: O.K.
  • 1: Error

Code Example

1 int UnInit(U32 Func) {
2   (void)Func;
3   //
4   // Uninit code
5   //
6   return 0;
7 }

EraseSector

Prototype

1 int EraseSector(U32 SectorAddr)

Function description

Erases one flash sector.

Parameters

  • Addr: Address of the sector to be erased

Return values

  • 0: O.K.
  • 1: Error

Code Example

1 int EraseSector(U32 SectorAddr) {
2   //
3   // Erase sector code
4   //
5   _FeedWatchdog();
6   return 0;
7 }

ProgramPage

Prototype

1 int EraseSector(U32 SectorAddr)

Function description

Programs one flash page.

Parameters

  • DestAddr: Destination address
  • NumBytes: Number of bytes to be programmed (always a multiple of program page size, defined in FlashDev.c)
  • pSrcBuff: Point to the source buffer

Return values

  • 0: O.K.
  • 1: Error

Code Example

 1 int ProgramPage(U32 DestAddr, U32 NumBytes, U8 *pSrcBuff) {
 2   volatile U8 * pSrc;
 3   volatile U8 * pDest;
 4   U8 AccessWidth;
 5   U32 Status;
 6   U32 NumPages;
 7   U32 NumBytesAtOnce;
 8   int r;
 9 
10   r           = -1;
11   pSrc        = (volatile U8*)pSrcBuff;
12   pDest       = (volatile U8*)DestAddr;
13   //
14   // RAMCode is able to program multiple pages
15   //
16   NumPages    = NumBytes >> PAGE_SIZE_SHIFT;
17   //
18   // Program page-wise
19   //
20   if (NumPages) {
21     r = 0;
22     do {
23       NumBytesAtOnce = (1 << PAGE_SIZE_SHIFT);
24       _FeedWatchdog();
25       //
26       // Program one page
27       //
28       do {
29         // 
30         // Program page code
31         //
32         *pDest++ = *pSrc++;
33       } while(--NumBytesAtOnce);
34     } while (--NumPages);
35   }
36   return r;
37 }

BlankCheck

Prototype

1 int BlankCheck(U32 Addr, U32 NumBytes, U8 BlankData)

Function description

Checks if a memory region is blank

Parameters

  • Addr: Blank check start address
  • NumBytes: Number of bytes to be checked
  • BlankData: Pointer to the destination data

Return values

  • 0: O.K., blank
  • 1: O.K., *not* blank
  • < 0: Error

Code Example

 1 int BlankCheck(U32 Addr, U32 NumBytes, U8 BlankData) {
 2   U8* pData;
 3   
 4   pData = (U8 *)Addr;
 5   do {
 6     if (*pData++ != BlankData) {
 7       return 1;
 8     }
 9   } while (--NumBytes);
10   return 0;
11 }

EraseChip

Prototype

1 int EraseChip(void)

Function description

Erases the entire flash

Return values

  • 0: O.K.
  • 1: Error

Code Example

1 int EraseChip(void) {
2   //
3   // Erase chip code
4   //
5   *(volatile U32*)(0x000000) = SectorAddr;  // Dummy code, needs to be replaced with erase chip code
6   _FeedWatchdog();
7   return 0;
8 }

Verify

Prototype

1 U32 Verify(U32 Addr, U32 NumBytes, U8 *pBuff)

Function description

Compares a specified number of bytes of a provided data buffer with the content of the device

Parameters

  • Addr: Start address in memory which should be compared
  • NumBytes: Number of bytes to be compared
  • pBuff: Pointer to the data to be compared

Return values

  • == (Addr + NumBytes): O.K.
  • != (Addr + NumBytes): *not* O.K. (ideally the fail address is returned)

Code Example

 1 U32 Verify(U32 Addr, U32 NumBytes, U8 *pBuff) {
 2   unsigned char *pFlash;
 3   unsigned long r;
 4 
 5   pFlash = (unsigned char *)Addr;
 6   r = Addr + NumBytes;
 7   do {
 8       if (*pFlash != *pBuff) {
 9         r = (unsigned long)pFlash;
10         break;
11       }
12       pFlash++;
13       pBuff++;
14   } while (--NumBytes);
15   return r;
16 }

SEGGER_OPEN_Read

Prototype

1 int SEGGER_OPEN_Read(U32 Addr, U32 NumBytes, U8 *pDestBuff)

Function description

Reads a specified number of bytes into the provided buffer

Parameters

  • Addr: Start read address
  • NumBytes: Number of bytes to be read
  • pBuff: Pointer to the destination data

Return values

  • >= 0: O.K., NumBytes read
  • < 0: Error

Code Example

1 int SEGGER_OPEN_Read(U32 Addr, U32 NumBytes, U8 *pDestBuff) {
2   //
3   // Read function
4   // Add your code here...
5   //
6   return NumBytes;
7 }

Using a Precompiled Flashloader

  1. Make sure that J-Link software V6.16f or later is installed:
    https://www.segger.com/downloads/jlink/
  2. Browse to the installation of the J-Link software package.
    You should now see JFlash.exe, JLinkDevices.xml, ...
  3. Open JLinkDevices.xml in a text editor and add the device entry at the beginning, right after the <Database> opening tag.
    Example:
  4.  <!-- This entry will overwrite the existing device entry in the J-Link software, so that a custom flash algorithm is used for the internal flash -->
       <ChipInfo Vendor="ST" Name="STM32F767ZI" Core="JLINK_CORE_CORTEX_M7" />
       <FlashBankInfo Name="Internes Flash" BaseAddr="0x08000000" MaxSize="0x00200000 " Loader="ST_STM32F7xxxx_2MB_DualBank.elf" LoaderType="FLASH_ALGO_TYPE_OPEN" />
     </Device>
    
  5. Copy the flashloader file, referenced in the JLinkDevices.xml entry, into the same directory where also the JLinkDevices.xml is located (in this example ST_STM32F7xxxx_2MB_DualBank.elf).
  6. Start JFlash.exe (or any other application which supports J-Link) and select the device