Adding a new DSPLink DSP Executable loader
From Texas Instruments Embedded Processors Wiki
DSP/BIOSTM LINK allows the user to create and add a new DSP executable loader into the system.
Contents |
Default loader support
By default, the following loaders are supported:
- COFF loader
- Static loader (On PrOS and Davinci-like platforms having same memory map on GPP and DSP)
- Binary loader (On PrOS only)
Adding a new loader
In addition to these, if the user wishes to use a special kind of loader, it can be added in DSPLink. The steps to add a new loader are documented below.
1. Use an existing loader implementation for reference. An implementation of the defined loader interface needs to be created:
typedef struct LOADER_Interface_tag { FnLoaderInit init; FnLoaderExit exit; FnLoad load; FnLoadSection loadSection; FnGetSymbolAddress getSymbolAddress; } LOADER_Interface;
Of these, the loadSection API can simply return DSP_ENOTIMPL and does not need to have any specific implementation.
2. If the loader requires specific parameters to be passed to PROC_load() instead of the base image, the structure can be defined in $(DSPLINK)/gpp/inc/loaderdefs.h
3. The file $(DSPLINK)/gpp/src/ldrv/[PLATFORM]/CFG_map.c needs to be modified to add support for this new loader into DSPLink. For example, add the following into the CFGMAP_LoaderObjects object.
{ "NEWLOADER", // NAME : Name of the loader &NEWLOADER_Interface // INTERFACE : Loader interface table }
4. Change the $(DSPLINK)/config/all/CFG_[PLATFORM].c to use the NEWLOADER instead of the COFF loader, which is default. This is indicated by the following field in the LINKCFG_dspObjects object:
"MYLOADER", // LOADERNAME : Name of the DSP executable loader
This configures DSPLink to use this new loader.
Example
As an example, consider a new loader MYLOADER to be added.
Loader requirements
The requirements of this new type of loader are:
- A DSP executable is to be pre-loaded by the GPP operating system boot-loader into the DSP memory.
- The information about the DSP executable required by DSPLink is provided to DSPLink through the
PROC_load()API, but the API must not perform any actual load into DSP memory, and must assume that the DSP is already loaded and ready to run. PROC_start()starts the DSP running as always.
Steps to add the loader
1. Copy-paste an existing loader:
- Copy files $(DSPLINK)/gpp/src/gen/PrOS/Davinci/static_loader.* into $(DSPLINK)/gpp/src/gen folder.
- Rename these files as myloader.c and myloader.h
- Update SOURCES file within the $(DSPLINK)/gpp/src/gen folder to include myloader.c for build.
- Now, modify file $(DSPLINK)/gpp/src/ldrv/Jacinto/CFG_map.c to add support for this new loader into DSPLink. Add the following into the CFGMAP_LoaderObjects object.
- Modify the file $(DSPLINK)/gpp/src/ldrv/[PLATFORM]/CFG_map.c to add support for this new loader into DSPLink. Add the following into the CFGMAP_LoaderObjects object.
{ "MYLOADER", // NAME : Name of the loader <br> &MYLOADER_Interface // INTERFACE : Loader interface table <br> }
2. Change the $(DSPLINK)/config/all/CFG_[PLATFORM].c to use the MYLOADER instead of the COFF loader, which is default. This is indicated by the following field in the LINKCFG_dspObjects object:
"MYLOADER", // LOADERNAME : Name of the DSP executable loader
This configures DSPLink to use this new loader.
3. Now the loader must be written. For this, the following functions need to be implemented:
MYLOADER_init()MYLOADER_exit()MYLOADER_load()MYLOADER_getSymbolAddress()MYLOADER_loadSection(): This function can be implemented to directly returnDSP_ENOTIMPLerror code, as this functionality is not currently supported within DSPLink.
4. Open the file myloader.h. Search-replace all instances of STATICLOADER -> MYLOADER
5. Open the file myloader.c. Search-replace all instances of STATICLOADER -> MYLOADER
6. Now the structure must be defined, which is used to pass information to PROC_load about the pre-loaded DSP executable file. This structure must contain at least the following information, which is required by DSPLink:
dspRunAddr: DSP address from where the binary file execution is to be started.argsAddr: Address of the.argssection within the DSP executable.argsSize: Size of the.argssection within the DSP executable.shmBaseAddr: Address of the symbol where the DSPLink shared memory base address is stored.
This structure can be defined within the $(DSPLINK)/gpp/inc/loaderdefs.h file. For example, refer to the STATICLOADER_ImageInfo structure within this file.
The information in this structure can be filled by the application by parsing the DSP COFF executable. Tools/utilities are available for getting this information from a COFF file.
7. Implement MYLOADER_load() function to use the provided parameters with PROC_load() and:
- Fill the .args section in required format with user specified arguments. The information needed for this is argsAddr and argsSize received from
PROC_load()parameters. - Store the address of the symbol where the DSPLink shared memory base address is stored, within a local array (similar to how it is done currently in the static loader). This information
shmBaseAddris also received fromPROC_load()parameters. This is the address of the DSPLINK_shmBaseAddress symbol within the DSP COFF file. - Return the entryPt of the DSP executable. This information
dspRunAddris also received fromPROC_load()parameters.
8. Build the DSPLink GPP-side after these changes.
9. Make any required changes to the operating system bootloader to pre-load the DSP executable.

