- Docs »
- 4. Foundational Components
-
4. Foundational Components
4.5. Boot
Overview
This page provides an overview about the Secondary Bootloader support
provided in Processor SDK RTOS.
The Secondary Bootloader (SBL) sets-up the PLL clocks, powers on the
I/O Peripherals, initializes the DDR, loads the application image into
DDR & brings the slave cores for applicable SOCs out of reset.
Additional details including execution boot flow is covered in more
elaborate detail under individual SOC section.
Boot Modes
MMCSD
MMCSD bootloader is required to boot target using an SD card containing
bootloader and application images. When the board is powered ON the ROM
bootloader detects the MMCSD bootloader image and loads it to the
internal memory.The bootloader initializes the board, copies the
application image from SD card to the DDR memory and gives control to
the application.
QSPI
A flash device interfaced with QSPI is flashed with QSPI bootloader and
application images. When the board is powered ON the ROM bootloader
detects the bootloader image from flash device and loads it to the
internal memory. The Bootloader initializes the board, copies the
application image from QSPI device to the DDR memory and gives control
to the application.
UART
A Serial connection is used for transferring the bootloader binary from
PC to target board through XMODEM protocol. The bootloader on execution
prompts for application image to transfer through XMODEM. On providing
the path, the application binary is transferred through serial
connection to DDR memory and the control is passed to application to
execute.
MCSPI/SPI
A SPI flash device flashed with MCSPI/SPI bootloader and application
images is used for booting the board. When the board is powered ON the
ROM bootloader detects the bootloader image from flash device and loads
it to the internal memory. The Bootloader initializes the board, copies
the application image from flash to the DDR memory and gives control to
the application.
NAND
NAND flash with bootloader and and application images is used for
booting the board. When the board is powered ON the ROM bootloader
detects the bootloader image from flash device and loads it to the
internal memory. The bootloader initializes the board, copies the
application image from flash to the DDR memory and gives control to the
application.
4.5.1. AM335x/AM437x
Overview
Bootloader supports power-on-reset bootstraps for the board. It
initializes board, loads application from the memory device to DDR and
transfers control to application. Section provides additional details
including flashing and booting instructions across different media.
Source Reference
< BASE_DIR = PDK_INSTALL_DIR\packages\ti\starterware>
Bootloader build files for AM335x/AM437x
Source files:
- BASE_DIRbootloadersrc: Common source files for bootloader
functionality
- BASE_DIRbootloadersrc<device>: Files specific to device to
initialize platform features like PLL, pinmux and DDR
Build Files:
- BASE_DIR/build/makerules/rules_a8.mk: Common Compiler flags used
for A8 cores. Applies to AMIC110 and AM335x
- BASE_DIR/build/makerules/rules_a8.mk: Common Compiler flags used
for A9 cores. Applies to AM437x devices
- BASE_DIR/build/makerules/platform.mk: Global settings for all
components for a particular platform.
- BASE_DIR/build/makerules/components.mk: Specific settings for
components in starterware
- BASE_DIR/build/makerules/build_cfg.mk: Flags to enable features
in the build
- BASE_DIR/bootloader/Makefile: Makefile for bootloader that
provides list of source files and library to create bootloader
binary.
Boot and flashing tools:
- BASE_DIR/tools Contains tools to create boot images and flashing
tools to program the boot binary on the boot media.
Bootloader execution sequence
The Processor SDK RTOS boot loader uses a two stage boot process. The
different stages of the application boot sequence using Processor SDK
RTOS bootloader are shown below:
Boot Sequence
- Power on Reset
- ROM Bootloader (RBL)
- Platform configuration and initialization.
- DPLL and clock settings for MPU, I2C, MMCSD, USB, SPI, QSPI,
Ethernet etc.
- Checks Sysboot pins and choose booting device
- If no valid bootloader found on booting device, RBL checks for
next booting device. The sequence depends on RBL execution flow
and Sysboot pins.
- RBL gets image size and load address by checking TI Image Header
appended on bootloader binary(.bin). Check binary
formats.
- Loads the binary to internal OCMC memory at the Load address
fetched from TI Image Header
- Passes control to Secondary Bootloader(SBL)
- Secondary Bootloader(SBL)
- Configure PLL and Initialize DDR
- Configure PRCM and PinMux for Boot Peripherals
- Copies application image to DDR
- Passes execution control to Application
- Application execution
Tools and Binary formats
Binary format |
Requirement |
Details |
.bin |
QSPI bootloader,
UART bootloader and
app
|
QSPI bootloader
binary should in .bin
format and
Application binary
should be in _ti.bin
format.
UART bootloader and
applications are
loaded in .bin format
through XMODEM in
terminal.
|
_ti.bin |
MMCSD bootloader
and app,
NAND bootloader and
app,
MCSPI boot loader and
app,
QSPI app.
|
.bin binaries are
converted to
_ti.bin format by
adding Image
size(4bytes) and
Image load
address(4bytes) as
image header.
Refer to Image
format section in
Initialization
chapter of AM437x
TRM
MMCSD, NAND and MCSPI
boot loaders and
application binaries
should be appended
with ti image header.
|
TI Boot image
Offset |
Binary value |
0x00000000 |
Size |
0x00000004 |
Entry Point (Location) |
0x00000008 |
Binary (.bin) |
NOTE
* For bootloader Entry point is usually 0x402f0000
- For the app the entry point is usually 0x80000000.
Binary format conversion procedure
Binary format conversion in Linux
- To convert from .out -> .bin
TOOLCHAIN_PATH_<A8/A9>/bin/arm-none-eabi-objcopy -O binary <application>.out <application>.bin
- Build tiimage.out. Go to starterware/tools/ti_image/
gcc tiimage.c –o tiimage.out
- To convert from .bin -> _ti.bin
tiimage.out <Image Load Address> NONE <application>.bin <application>_ti.bin
Binary format conversion in Windows
- To convert from .out -> .bin
TOOLCHAIN_PATH_<A8/A9>/bin/arm-none-eabi-objcopy -O binary <application>.out <application>.bin
2) To convert from .bin -> _ti.bin. tiimage.exe is provided as prebuilt
binary in starterware/tools/ti_image.
tiimage.exe <Image Load Address> NONE <application>.bin <application>_ti.bin
Boot Modes supported
Following are the Boot Modes supported through AM335x/AM437x bootloader
for the various EVMs.
|
MMCSD |
NAND |
McSPI |
QSPI |
UART |
AM335x
GPEVM |
YES |
YES |
YES |
NO |
YES |
AM335x
ICEv2 |
YES |
NO |
YES |
NO |
NO |
AM335x
StarterKi
t |
YES |
NO |
NO |
NO |
YES |
AM335x
BeagleBon
eBlack |
YES |
NO |
NO |
NO |
YES |
AM437x
GPEVM |
YES |
NO |
NO |
NO |
YES |
AM437x
IDK |
YES |
NO |
NO |
YES |
NO |
AM437x
StarterKi
t |
YES |
NO |
NO |
NO |
NO |
Building the Bootloader
- Pre-requisite: Setup SDK build environment as described in article
- Setup_Environment
Normal Operation of Bootloader:
Bootloading an application from flash into DDR memory as in case of TI
evaluation platforms is described as normal operation mode for the
bootloader. This is the default behaviour of the bootloader and can be
built using the following command in starterware.
gmake bootloader BUILDCFG=boot BOOTMODE=<BOOT_MODE> PLATFORM=<EVM> PROFILE=<BUILD_PROFILE> -s KW_BUILD=no
- BOOT_MODE: mcspi, nand, qspi, mmcsd, uart (Check supported boot modes
for your evaluation platform)
- EVM: am335x-evm, am43xx-evm, amic110-ddrless
- BUILD_PROFILE: debug, release
Additional Build options (currently support only for
AMIC110/AM335x ICE Users)
- DDR less Application boot setup
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=amic110-ddrless PROFILE=debug -s KW_BUILD=no USE_DDR=no
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=amic110-ddrless PROFILE=release -s KW_BUILD=no USE_DDR=no
This option builds an ultra light weight (<10 KB) bootloader for cost
optimized application that don`t external DDR memory.
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=am335x-evm PROFILE=debug -s KW_BUILD=no ENABLE_PRU=yes
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=am335x-evm PROFILE=release -s KW_BUILD=no ENABLE_PRU=yes
This feature is required in application that need to quick wake up of
ICSS/PRU cores. The PRU cores can be woken up and loaded from the SBL by
combining the ENABLE_PRU and BIN_LOAD arguments.
- Load additional binaries from flash
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=am335x-evm PROFILE=debug -s KW_BUILD=no BIN_LOAD=yes
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=am335x-evm PROFILE=release -s KW_BUILD=no BIN_LOAD=yes
The location of binaries in offset is configured using
sbl_flash_offset_cfg.h in the bootloader source. Users are required to
use TIIMAGE tool to append an header to the binary so that the
bootloader knows the loction and size of the binary to be loaded.
Industrial DDRless Booting
The AMIC110 DDRLESS platform provides a superset flag to enable all the
above features and build the bootloader . The superset build is invoked
using BUILD_ICSS_DDRLESS_BOOT=yes as shown below:
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=amic110-ddrless PROFILE=debug -s KW_BUILD=no BUILD_ICSS_DDRLESS_BOOT=yes
gmake bootloader BUILDCFG=boot BOOTMODE=mcspi PLATFORM=amic110-ddrless PROFILE=release -s KW_BUILD=no BUILD_ICSS_DDRLESS_BOOT=yes
Prebuilt binaries inside the Processor SDK RTOS for AMIC110-DDRLESS will
be configured using this option to allow for testing of cost optimized
industrial use case.
Boot Mode settings
Boot mode settings for all supported AM335x and AM437x boards are
here
Boot Modes
Booting Via SD Card
Booting from SD Card involves two steps.
- Preparing SD card.
- Booting target.
Preparing SD card
- To boot target the SD card should be bootable. Follow the steps at
Creating bootable SD card in
windows
or Creating bootable SD card in
Linux.
- Delete the “MLO” and “app” in the bootable SD card which are
created in the process of making the SD bootable.
- Bootloader images with ti header (<mmcsd_bootloader>_ti.bin)should be
renamed to “MLO”. Bootloader images are located at
<PDK_INSTALL_DIRpackagestistarterwarestarterwarebinarybootloaderbin<TargetType>
- Similarly the converted application binary image has to be renamed to
“app” from “<app_name>_ti.bin“
- Copy both the boot loader image “MLO” and the application image
“app” to the SD card.
- The SD card is ready for use on target.
Booting target
- Insert SD card to the base board SD slot. Connect a UART cable to a
host running a serial terminal application (teraterm/hyperterminal)
with 115200 baud, 8bit, No parity and 1 STOP bit configuration.
- Configure the board for SD Boot mode
- SD instance 0 (on base board) is available in all profiles.
- SD instance 0 boot mode needs to appropriately set. For SD boot to
be selected first, SD boot should appear first in the boot device
list in the boot mode. If any other boot mode is selected, even if
a SD boot card is inserted, and does not appear first in the list,
the first available sane boot image (like NAND or SPI etc) is
booted and SD is not selected. Only if no sane boot image is found
in the first devices, SD boot image will be selected.
- Once SD boot image is chosen, the MLO is first detected and copied
and executed from the OCMC0 RAM. The MLO then copies the
application image (app) from the card to the SDRAM and passes the
control to the application. If the process is succesful, messages
identifying board and SoC will appear on the serial console.
After this the application will take control and execute.
NOTE: If board have BootMode selection pins choose proper Boot
Selection pins from hardware reference manuals.
If the boards have no boot mode selection pins and a valid boot image
is present on McSPI flash, Booting will happen from McSPI flash. Erase
McSPI flash in such cases to boot from SD card
McSPI flash
erase
. The boot sequence depends on ROM bootloader.
Booting Via QSPI
Booting from QSPI flash involves two steps-
- Preparing Flash Device
- Booting target.
Preparing Flash Device
Procedure relies on contents being copied to SD card. Additional
details below:
- Copy bootloader image(bootloader_boot_qspi_a9host_debug.bin rename)
and app image(“<app_name>_ti.bin”) into the SD card.
The file names have to be renamed in such a way that the length of
name is less than 9 characters. Any file name less than 9 characters
can be used.
Rename the bootloader file to ‘boot’ and application image to ‘app’
with no extensions.
- Copy the ‘config’ file into the SD card which will contain the names
of the image to be flashed and the offset.
A sample config file can be found at
<PDK_INSTALL_DIRpackagestistarterwarestarterwaretoolsqspiconfig>
directory. Do not change name of the config file.
NOTE: “config” file can be used without any modifications if
bootloader and application images are renamed to “boot” and “app”.
NOTE: Do not rename bootloader to be copied to SD card as
“MLO”, as MMCSD bootloader expects “MLO” and “app” to boot.
- Now SD card contains 1)boot 2)app 3)config files.
config file contains the address of boot image as 0x0 and app
image as 0x80000.
Insert it into the SD card slot.
- Connect the board with CCS and load the prebuilt qspi flash writer
application from
<PDK_INSTALL_DIRpackagestistarterwarestarterwarebinaryqspi_app_flash_writerbinm43xx-evm>
- Run the QSPI flash writer application. Following logs expected on
console.
StarterWare QSPI Flash Writer!!
BOARDInit status [0x0]
SoC : [AM43XX]
Core : [A9]
Board Detected : [IDKEVM]
Base Board Revision : [UNKNOWN]
Daughter Card Revision: [UNKNOWN]
Copying boot to QSPI Flash
Copying app to QSPI Flash
Changing read to quad mode
Read mode has been changed to Quad mode
SUCCESS!!!
Flashing completed
Booting the target.
- Connect UART cable to a host running serial terminal application
(teraterm/hyperterminal) with 115200 baud, 8bit, No parity and 1 STOP
bit configuration.
- After flashing successfully remove SD card and reboot to see
following logs
StarterWare Boot Loader
BOARDInit status [0x0]
SoC : [AM43XX]
Core : [A9]
Board Detected : [IDKEVM]
Base Board Revision : [UNKNOWN]
Daughter Card Revision: [UNKNOWN]
Copying Header of the application image
Copying image from flash to DDR
Jumping to StarterWare Application...
NOTE: Boot logs will appear approximately after 25 seconds on reset.
NOTE:If there is no boot mode selection present on board, boot image will be loaded depending on ROM boot sequence
Example: If QSPI flash and MMCSD has valid bootloaders, on reset MMCSD boot image will be loaded following ROM Boot sequence.
Booting Via UART
ROM and Bootloader supports XMODEM protocol with images being binary
not requiring any additional headers. Following are steps for boot:
- Configure board for UART boot mode :
UART boot need to be first in the boot device list. Note: In case if
any other boot mode is selected, the first available boot image
(eg:NAND or MMCSD etc) will override. In case of no valid images,
UART boot will be selected.
- Select View->Memory Browser through CCS.
- Select address 0x44e10040.
- Write 0x19 to last 2 bytes of this memory address.(UART boot)
- Soft reset the board. This is a volatile bit which gets reset
after power on.
- ROM code will print “CC..” on UART console expecting Bootloader via
XMODEM. File can be sent via xmodem through tera-term File-> Transfer
-> XMODEM -> Send.
- On transmitting bootloader
image, bootloader_boot_uart_a9host_debug.bin via XMODEM, following
message will be expected on serial console.
CCCCCCCCCCCCCCCCCCCCCCCCCCCC
StarterWare Boot Loader
BOARDInit status [0x0]
SoC : [AM43XX]
Core : [A9]
Board Detected : [IDKEVM]
Base Board Revision : [UNKNOWN]
Daughter Card Revision: [UNKNOWN]
GPIO Instance number: 0
Pin number: 22
Please transfer file:
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
4. As a next step application binary (without header) can be sent
via XMODEM which will lead to application start executing.
Booting Via McSPI
Booting from McSPI involves two steps.
- Preparing Flash Device
- Booting the target.
Preparing Flash Device
- Set the appropriate bootmode if applicable for EVM.Refer Boot mode
settings.
Note: Most of the boards may not have switch settings.
- Add a required target configuration in CCS depending on emulator and
board connected.
- Connect target to required core. Ex: A8.
- Load the flash writer from
<PDK_INSTALL_DIRpackagestistarterwarestarterwaretoolsflash_writerspi_flash_writer_AM335X.out
onto the EVM.
- Run the application and observe the logs on CCS console.
Starting SPIWriter.
Choose Operation:
Enter 1 ----> To FLASH an Image
Enter 2 ----> To ERASE Flash
Enter 3 ----> To EXIT
- When Flash option is chosen program prompts to enter file name.
- Provide the complete path of file
bootloader_boot_mcspi_a8host_release_ti.bin at directory
“binary/bootloader/bin/<PLATFORM>/<gcc/ccs>/” and hit Enter.
Enter the Offset in bytes (in HEX)
- Provide 0x00000 to flash bootloader.
- To flash application binary image <app_name>_a8host_ti.bin, provide
0x20000.
- Wait for few miniuits as flashing is a slower process.
Erasing flash at byte offset: xx, byte length: xxxx
SF: Successfully erased xxxx bytes @ xxxx
Writing flash at page offset: x, number of pages: xxxx
Flashing is in progress...
Verifying... Success.
- Once SPI flash writing completes disconnect target.
Booting the target
- Connect a serial cable to a host running a serial terminal
application (teraterm/hyperterminal) with 115200 baud, 8bit, No
parity and 1 STOP bit configuration.
- Configure the board for SPI boot mode.
- On reset, ROM bootloder copies the bootloader from flash to internal
memory. The bootloader then copies the application image from flash
to DDR and passes the control to the application.
Booting Via NAND
Booting from NAND involves two steps.
- Preparing Flash Device
- Booting the target.
Preparing Flash Device
- Configure BOOT pins for NAND Boot mode
settings
- Connect target with CCS.
- Load the
<PDK_INSTALL_DIRpackagestistarterwarestarterwaretoolsflash_writernand_flash_writer_AM335X.out>
to target and Run. Flash writer will output messages to CCS console.
When it prompts for inputs, proper inputs shall be given via CCS
console.
- When prompted for binary file name, update file with proper path.
- Select option for flashing.
Choose your operation
Enter 1 ---> To Flash an Image
Enter 2 ---> To ERASE the whole NAND
Enter 3 ---> To EXIT
- If Option 1 is selected, enter image path to flash when prompted as
shown below.
Provide the complete path (e.g.
<PDK_INSTALL_DIRpackagestistarterwarestarterwarebinarybootloaderbin<am335x/am437x-evm><compiler>bootloader_boot_nand_a8host_<debug/release>_ti.bin)
- Enter offset when prompted as shown below.
This offset is start location from where the image should be
flashed.
NOTE:
- Use hex format
- If bootloader is to be flashed, provide 0x00000. For application
binary, provide 0x80000.
Choose the ECC scheme from given options
Enter 1 ---> BCH 8 bit
Enter 2 ---> HAM
Enter 3 ---> T0 EXIT
Please enter ECC scheme type:
Always select BCH8 for bootloader and application as ROM code and
bootloader uses the BCH8 ECC scheme.
- Ensure that flash info displayed by tool matches NAND flash in EVM.
- After this tool should first erase the required region in flash and
then start flashing new image.
- If flashing procedure is complete following message should be
displayed.
Application is successfully flashed
NAND flashing successful!
- Once NAND flash writing completes, disconnect from CCS.
Booting the target
- Connect a UART cable to a host running a serial terminal application
(teraterm/hyperterminal) with 115200 baud, 8bit, No parity and 1 STOP
bit configuration.
- Configure the board for NAND boot mode. Refer Boot mode
settings
- On reset, ROM detects bootloader from NAND and copies it to internal
memory. Bootloader then copies application image from the NAND to DDR
and passes control to application. If the process is succesful,
following messages appear in serial console.
StarterWare Boot Loader
BOARDInit status [0x0]
SoC : [AM335X]
Core : [A8]
Board Detected : [GPEVM]
Base Board Revision : [1.5]
Daughter Card Revision: [UNKNOWN]
NAND flash is connected to GPMC on this board
Jumping to StarterWare Application...
After this application should take control and execute.
Test Application
The section explains steps for building and booting a sample pdk
application for am335x or am437x using MMCSD bootloader.
Test Application Image Creation
Follow below steps to generate the bootable application image.
- Generate .out files using steps for Rebuilding
PDK. Locate .out file in directory
<PDK_INSTALL_PATH/MyExampleProjects/<ExampleProjectDirectory>/Debug>
- Convert files to support MMCSD boot using steps as per Binary format
conversion
procedure.
- Rename generated <Application>_ti.bin to “app”.
Loading Test application
Usage Notes
The bootloader code runs from internal OCMC memory and occupies certain
amount of OCMC memory that is not available for application to use
during booting.
Refer to the map file for the boot loader to check for latest
information on the memory utilization in the boot loader.
Location of linker command file:
BASE_DIR\binary\bootloader\bin\<platform>\gcc
After SBL execution is complete, this region can be used as per
application requirement.
- Configuring entry point for SBL
The three files that help setup the entry point in the bootloader build
are “PDK_INSTALL_PATHpackagestistarterwaresocarmv7agccsbl_init.S”
and the linker command file
“PDK_INSTALL_PATHpackagestistarterwareexamplesgcc<device>_boot.lds”.
The global symbol Entry is used to provide the entry point to the
bootloader. The Base address of the memory section OCMCRAM (starts at 1K
offset in OCMC RAM as defined in TRM) is then used by the tiimage or
GPHEader tool to provide RBL the guidance to find the entry point to
pass control. After MLO is created check the TI image format file(
_ti.bin) to confirm that the entry point matches the location of Entry
symbol in the .map file.
NOTE
The object file created by sbl_init.S should always be the first object
file in the link order for the symbol Entry to be placed at the BASE
address of the memory section SBL_MEM
- Boot image creation tools generates a large boot image if load
sections are fragmented
Please note that when using objcopy the compiler generates a contiguous
binary that gets loaded by the bootloader at the location specified in
the header appended by TIIMAGE boot utility. IF you have some code
sections in OCMC or SRAM and some section in DDR the compiler will
generates a binary that spans across full memory range which would be in
order of MB or even GB size so it is recommended that you create compact
binaries that can be loaded into memory or implement a ELF parser to
bootloader memory sections that may be fragmented in the address space.
you can also load separate binaries for OCMC sections and DDR memory and
load the sections separately
- Removing Heap section from application binary to speed up boot
times
A common issue reported with the ARM GCC compiler is that it appends
Heap section associated with the binary to the binary image used to
boot. The Heap section is usually filled with zeros so can cause
significant delay in boot times. Essentially the bootloader will be
writing a bunch of zeros in memory so is inefficient. Following work
around has been used to circumvent the issue
Option 1: Eliminate the heap by using the compiler option
“–remove-section” as described in the E2E post below:
Refer: E2E post to configure Heap in ARM application binary by
adding
“–remove-section”
Example BIOS configuration:
var heap1 = HeapMem.create();
heap1.size = 256 * 1024 * 1024;
heap1.sectionName = ".stack";
Memory.defaultHeapInstance = heap1;
Compiler Setting : –remove-section=.stack
Option 2 Configure Segment type to be “NO LOAD” in .cfg and use
excludeSections
SYSBIOS Memory map configurations allows user to specify the section
name, length and type. by configuring the section type to “NOLOAD” and
using excludeSection option the heap memory can be eliminated from the
final binary.
Example BIOS configuration:
Program.sectMap[".biosheap"] = new Program.SectionSpec();
Program.sectMap[".biosheap"].runSegment = "DDR2"
Program.sectMap[".biosheap"].type = "NOLOAD";
Program.sectionsExclude = ".biosheap"
Alternate approach using linker command file:
.ddr3Heap (NOLOAD):
{
*(.ddr3Heap)
} > HOST_DDR3
NOTE
The approach described above helps improve boot times but Users are
recommended to initialize the HEAP sections to zeros post boot during
initialization to avoid any undesired behavior during normal operation
of the app
Debugging application boot
Steps to debug application boot using Processor SDK RTOS bootloader are
discussed in the article `Common steps to debug application
boot <https://processors.wiki.ti.com/index.php/Processor_SDK_RTOS_Boot#Common_steps_to_debug_application_boot>`__
4.5.2. AM57x
Overview
The Secondary Bootloader (SBL) for AM57xx device initializes the
execution environment for multi-core application and this can be used to
demonstrate an out-of-box experience.The section covers additional
details including execution sequence, tools and additional flashing
instructions.
Bootloader Execution Sequence
- Power On Reset
- ROM Bootloader (RBL)
- Software pre-programmed in ROM memory starts executing
- Checks Sysboot pins and choose booting device
- If no valid bootloader found on booting device, RBL checks for
next booting device.
- Platform configuration and initialization.
- Configures DPLL and clock settings for MPU, and boot media like
I2C, MMCSD, SD/MMC, SPI, QSPI, Ethernet etc for reliable boot.
- The sequence depends on RBL execution flow and Sysboot pins.
- RBL gets image size and load address by checking TI Image Header
appended on bootloader binary(.bin). Check binary formats.
- Loads the binary to internal memory at the Load address fetched
from TI Image Header
- Passes control to Secondary Bootloader(SBL)
- Secondary bootloader(SBL)
- User level secondary bootloader(SBL) begins execution from
internal memory by running basic initialization routines like
setting up Stack, BSS and then jumps to main() to begin Board
Initialization.
- Board Initialization is done by a call to Board_init() API.For
additional details refer Processor SDK Board
Support.
- It includes setting up PLLs, enabling clocks to all interfaces and
modules, performing pinmux and setting up UART console.
- Once Board Initialization is complete, it enables clocks to the
slave cores like C66x/DSP, IPU, etc and brings them out of reset.
- Parses Multicore Application image located in memory device and
copies it to DDR memory based on load address for different
sections.
- Once copy is successful it transfers control to application.
- Application then starts executing from DDR.
NOTE
- RBL requires boot loader to be in a special format with a header
appended to the binary image. The header shall contain the load
address of the bootloader and size of the bootloader image.
- For more information on the TI header refer TRM document
Directory structure
Makefiles:
- PDK_INSTALL_PATH/tibootsblboard<EVAL_BOARD>build: Makefile
for bootloader that provides list of source files and library and
compiler options to create bootloader binary.
Source Files:
- PDK_INSTALL_PATH/tibootsblboard<EVAL_BOARD>: Source to SBL
main function that consolidates all features
- PDK_INSTALL_PATH/tibootsblsoc: Source to SOC specific
initialization used in the SBL.
- PDK_INSTALL_PATH/tibootsblsrc: Source to boot media specific
initialization used in the SBL.
Tools and Binary Formats
This section lists out the various tools and scripts used by SBL for
different boot modes and those required to create a bootable application
image.
SBL/MLO image format:
To generate the
MLO, SBL uses tiImageGen tool to prepend the sbl.bin
image with the TI header information. The image format has been
described in detail in the Image Format Section of the
AM57xx
Technical Reference manual
Application image format:
A bootable application image can be created by using the Am57xImageGen
script provided under tools folder as part of sbl. It can be located at
<PDK_INSTALL_DIR>packagestibootsbltoolsscripts folder.
The Am57xImageGen script uses out2rprc and multicoreImageGen format
conversion tools to create the final application image. Graphical view
of the multicore application image is provided below:
The script creates the bootable image in 2 steps
Step 1: Conversion to RPRC format conversion
- Firstly, application executable is converted from ELF/COFF format
(.out) to custom TI Rprc binary image using out2rprc tool. This tool
strips out the initialized sections from the executable file (i.e.
*.out) and places them in a compact format that the SBL can
understand. The output (bin) file is typically much smaller than the
original executable (out) file.
- The rprc files are intermediate files in a format that is consumed by
MulticoreImageGen tool that generates the final binary.
RPRC File Header Format
Offset |
Binary value |
0x00000000 |
Magic Word(43525052) |
0x00000004 |
Entry Point (Location) |
0x00000008 |
Reserved Addr |
0x0000000C |
Section Count |
0x00000010 |
Version |
RPRC Section Header Format
Offset |
Binary value |
0x00000000 |
Section start Address |
0x00000004 |
Reserved Addr |
0x00000008 |
Size |
0x0000000C |
Reserved CRC |
0x00000010 |
Reserved |
Step 2: Multicore Image file generation
- RPRC files for each cores is combined into a single multicore
bootable application image.
Multicore boot image format
Meta Header Start
Offset |
Binary value |
0x00000000 |
Magic String (0x5254534D) |
0x00000004 |
Number of Files |
0x00000008 |
Device ID |
0x0000000C |
Reserved |
Meta Header per Core
Offset |
Binary value |
0x00000000 |
Core ID |
0x00000004 |
Image Offset |
Core ID and Device ID for specific devices can be located in the file
sbl_slave_core_boot.h in the boot/sbl/soc/<SOC_NAME> folder
Refer section App Image
Creation
for more details on usage of this script and application image creation.
Flashing Tools
SBL provides a CCS based qspi flash writer utility to flash image and
multicore AppImage from a SD card to onboard QSPI device. It
is located
at <PDK_INSTALL_DIR>packagestibootsbltoolsflashWriterqspi
Building the SBL
Pre-requisites to Building
- Set your environment using pdksetupenv.bat or pdksetupenv.sh. Refer
to the Processor SDK RTOS Building page for information on setting up
your build environment
- The SBL has following dependencies and will need the following
libraries built
- Board
- UART
- I2C
- SPI
- CSL
- OSAL
- MMCSD
- PM
NOTE
Refer to the makefile for the board you are using for the latest driver
dependency. These libraries should come pre-built with any fresh
installation of the Processor SDK RTOS but may be removed if a gmake
clean is invoked
Compiling the SBL Components
To build the SBL components:
- cd <PDK>/packages/ti/board/diag
- make all BOARD=<BOARD_NAME> SOC=<SOC_NAME> BOOTMODE=<BOOTMEDIA>
- BOARD_NAME : idkAM572x, idkAM571x, evmAM572x, idkAM574x
- SOC_NAME : AM572x, AM571x, AM574x
This will make the SBL for a specific $BOARD and $BOOT_MEDIA. Output
files will be located in: <PDK>/packages/ti/boot/sbl/binary/<BOARD>
NOTE
Refer <PDK>/packages/ti/boot/sbl/sbl_<DEVICE>.sh for more build
options
Building SBL using CCS project
The SBL build in the Processor SDK RTOS is designed to be built using
Makefile. Users can also choose to create a CCS project for the
bootloader if they prefer the IDE environment by converting the make
file based build to CCS project by linking the appropriate source files
to the project and using the same compiler options.
Example: The wiki article
“Creating_a_CCS_Project_for_SBL_on_AM572x_GP_EVM”
demonstrates creation of SBL in CCS for AM572x GP EVM.
Boot Modes
This Release of SBL supports MMCSD and QSPI Boot modes. The different
boot modes supported for all the boards is tabulated in the table below.
|
MMCSD |
QSPI |
AM572x GPEVM |
YES |
NO |
AM572x IDKEVM |
YES |
YES |
AM571x IDKEVM |
YES |
YES |
AM574x IDKEVM |
YES |
YES |
Booting Via SD Card
- Preparing the SD card.
- Booting the target.
Preparing the SD card
- To boot the target the SD card should be bootable. Follow the steps
at Creating bootable SD card in
windows
or Creating bootable SD card in
Linux.
- Delete the “MLO” and “app” in the bootable SD card which are created
in the process of making the SD bootable.
- Copy the sbl binary(MLO) to the SD card.
- Copy the Application image(app) generated using the
Script
to the SD card.
Booting the target
- Insert micro SD card into the SD card slot of the board.
- Open a serial communication terminal like TeraTerm, MiniCom on host
PC and connect to the UART console port
- Do a power reset of the board to boot the appliation from the SD
card.
Booting Via QSPI
Booting from QSPI flash involves two steps-
- Flashing bootloader and app image to QSPI flash.
- Booting the target.
Preparing Flash Device
Use the CCS based qspi_flash_writer.out utility provided in
<TI_PDK_INSTALL_DIR>packagestibootsbltoolsflashwriterqspi<Board>’
to flash the SBL image at offset 0 and application image at offset
0x80000 to the QSPI device.
QSPI device Memory Map:
Offset 0x00 |
SBL |
Offset 0x80000 |
Application Multicore Image |
The images can be flashed into QSPI flash by following steps given
below.
- Copy QSPI mode SBL image
TI_PDK_INSTALL_DIRpackagestibootsblbinary<BoardName>qspibinMLO
and application image(app) generated using the Script into the SD
card.
Rename the bootloader file to ‘boot’ and application image to ‘app’
with no extensions.
- Copy ‘config’ file into the SD card, the config file should contain
names of the image to be flashed and the offset.
A sample config file can be found at
TI_PDK_INSTALL_DIRpackagestibootsbltoolsflashWriterqspiconfig.
Do not change the name of the config file.
NOTE: “config” file can be used without any modifications if
bootloader and application images are renamed to “boot” and “app”.
NOTE: Do not rename the bootloader to be copied to SD card as
“MLO”, as MMCSD bootloader expects “MLO” and “app” to boot.
- Now SD card contains 3 files 1)boot 2)app 3)config files.
config file contains the address of boot image as 0x0 and app image
as 0x80000.
Insert it into the SD card slot.
- Connect the board with CCS and and load the prebuilt qspi flash
writer application from
$(TI_PDK_INSTALL_DIR)packagestibootsbltoolsflashWriterqspibin<BoardName>\
- Run the QSPI flash writer application. You will see the following
logs on the EVM’s UART console.
- After the images have been flashed to the QSPI device disconnect from
CCS and do a power reset to boot from the QSPI memory.
PDK QSPI Flash Writer!!
Copying boot to QSPI Flash
Copying app to QSPI Flash
Changing read to quad mode
Read mode has been changed to Quad mode
SUCCESS!!!
Flashing completed
NOTE
- The file names have to be renamed in such a way that the length of
name is less than 9 characters. Any file name less than 9 characters
can be used.
- This application will flash the image at required offset without
taking into consideration any overwriting to previously flashed
image.
- It is the responsibility of the user to provide proper offsets.
Test Application
SBL provides a test application to demonstrate booting of multicore
application image on A15 and DSP cores.The multicore sample
application uses mailbox for inter-processor communication. It is used
to validate the multi-core boot-up use case.
Master application sends wake-up message to the DSP slave cores & waits
for acknowledgement message from the slave cores in an infinite
loop.Each slave DSP core waits for wake-up message from the master core
responds back with an acknowledgement message.
Application Image Creation
Application Image creation involves two steps.
- Generating the .outs of applications for individual cores
- Combining the .outs of individual cores to create a bootable
multicore image
The steps to create the bootable image in Linux and Windows environment
are listed below.
NOTE
- Valid SOC settings are AM571x/AM572x
- Valid BOARD settings are evmAM572x/idkAM571x/idkAM572x
Linux Environment:
Command to build the test application.
Go to cd (TI_PDK_INSTALL_DIR)\packages\ti\boot\sbl
make example BOARD=<BOARD> SOC=<SOC> to build the application
make example_clean BOARD=<BOARD>
Example:
make example BOARD=idkAM572x SOC=AM572x
To create the final bootable application image use the AM57xImageGen
script and follow these steps
1. Set the following environment variable in the shell. BIN_PATH:
Pointing to the path where the AppImage needs to be generated
Ex: export BIN_PATH=$(TI_PDK_INSTALL_DIR)/packages/ti/boot/sbl/binary
2. Edit the script file to point to the application elf files by setting
the input application variables.
App_MPU_CPU0: Point to the path where the application .out for A15
MPU is located
App_DSP1: Point to the path where the dsp core 1 application is
located
App_DSP2: Point to the path where the dsp core 2 application is
located
export APP_MPU_CPU0=$(TI_PDK_INSTALL_DIR)/packages/ti/boot/sbl/binary/idkAM572x/example/armv7/bin/sbl_app.out
export APP_DSP1=$(TI_PDK_INSTALL_DIR)/packages/ti/boot/sbl/binary/idkAM572x/example/c66/dsp1/bin/sbl_app.xe66
export APP_DSP2=$(TI_PDK_INSTALL_DIR)/packages/ti/boot/sbl/binary/idkAM572x/example/c66/dsp2/bin/sbl_app.xe663
export APP_IPU1_CPU0=$(TI_PDK_INSTALL_DIR)/packages/ti/boot/sbl/binary/idkAM572x/example/m4/ipu1/bin/sbl_app.xem4
export APP_IPU1_CPU0=$(TI_PDK_INSTALL_DIR)/packages/ti/boot/sbl/binary/idkAM572x/example/m4/ipu2/bin/sbl_app.xem4
3. If it is not required to load an application on specific core leave
the variable blank.
- Run the script file
5. An application image by name app is created in the path pointed by
BIN_PATH variable
6. Copy the Bootlaoder image(MLO) and application(app) in the SD card to
boot using MMCSD boot mode.
NOTE
- The AM57xImageGen.sh script depends on tools like mono to execute the
out2rprc.exe.
- The linux host environment needs to have this tool installed to
execute this script.
- Refer this link to download the
mono tool
Windows environment:
Command to build the test application.
Go to cd (TI_PDK_INSTALL_DIR)\packages\ti\boot\sbl
gmake example BOARD=<BOARD> SOC=<SOC> to build the application
gmake example_clean BOARD=<BOARD>
Example:
gmake example BOARD=idkAM572x SOC=AM572x
To create the final bootable application image use the AM57xImageGen
script and follow these steps
- Set the following environment variable in windows command prompt
BIN_PATH: Pointing to the path where the AppImage needs to be generated
Ex: set BIN_PATH=%TI_PDK_INSTALL_DIR%\packages\ti\boot\sbl\binary
2. Edit the batch file to point to the application elf files by setting
the input application variables.
App_MPU_CPU0: Point to the path where the application .out for A15
MPU is located
App_DSP1: Point to the path where the dsp core 1 application is
located
App_DSP2: Point to the path where the dsp core 2 application is
located
set App_MPU_CPU0=%TI_PDK_INSTALL_DIR%\packages\ti\boot\sbl\binary\idkAM572x\example\armv7\bin\sbl_app.out
set App_DSP1=%TI_PDK_INSTALL_DIR%\packages\ti\boot\sbl\binary\idkAM572x\example\c66\dsp1\bin\sbl_app.xe66
set App_DSP2=%TI_PDK_INSTALL_DIR%\packages\ti\boot\sbl\binary\idkAM572x\example\c66\dsp2\bin\sbl_app.xe66
set App_IPU1_CPU0=%TI_PDK_INSTALL_DIR%\packages\ti\boot\sbl\binary\idkAM572x\example\m4\ipu1\bin\sbl_app.xem4
set App_IPU2_CPU0=%TI_PDK_INSTALL_DIR%\packages\ti\boot\sbl\binary\idkAM572x\example\m4\ipu2\bin\sbl_app.xem4
3. If it is not required to load an application on specific core leave
the variable blank.
- Run the batch file
5. Follow the steps 4 to 6 listed above for Linux environment.
Setup Requirements
For information on board specific requirements like power supply, UART
console port connections refer the Hardware User guide of the respective
boards.
The configurations needed to setup UART console through a serial
terminal application on host PC are listed in the next section.
UART Console Setup
PDK SBL prints messages on the UART Serial Console running on the host.
Hence, a serial terminal application (like Tera
Term/HyperTerminal/minicom) should be running on the host.
The host serial port must be configured at 115200 baud, no parity, 1
stop bit and no flow control.
Please ensure that the local echo setting for the terminal is turned
off.
Loading the test application
Follow these steps to load the test application using a SD card on the
target
copy the MLO to your SD card (located
at %TI_PDK_INSTALL_DIR%packagestibootsblbinary[BOARD]mmcsd)
- copy the example app located at path pointed to by BIN_PATH to your
SD card
- insert your SD card into your board and power on your board
- open teraterm to connect to the board’s UART console
- press the “Hard Reset” button on your board
On Successful bootup you should see the following logs on the UART
console for a AM572x based board.
NOTE
MPU Core 0 example does a sequential check of mailbox messages sent from
the other cores. On rare occasions, the check happens before the message
is sent - the “<core> boot-up Successful” message might not be displayed
even though the core(s) were booted successfully.
Application Integration
Memory Map
Table indicated below provides memory map details for SBL image in
OCMC_RAM1. For more details on pinmux and IO delay requirements refer
this link Processor SDK Board
Support
We recommend that users should refer to the linker command file and the
map file for the boot loader to check for latest information on the
memory utilization in the boot loader.
Location of linker command file:
<PDK_INSTALL_PATH>packagestibootsblboard<BOARD>build
The SBL memory map is shown below
NOTE
- After the application boots and is running on the SOC, it is free to
use the SBL_MEM region.
- The pinmux data from the board library and MMU Table are part of the
SBL_MEM region indicated in the figure above. If pinmux data needs to
be placed at a specific location then users can update the SBL linker
command file to add the BOARD_IO_DELAY_CODE and BOARD_IO_DELAY_DATA
as described in Application Integration of board library for
AM5x
SBL Customization
Changing boot media offsets
The location at which SBL resides on the flash is predefined by the ROM
bootloader spec and so these defaults can`t be changed. However the SBL
is a user defined bootloader so many of the defaults can easily be
modified to meet application requirements. For example the flash offset
location from which the bootloader reads the application is configured
in the source files located under
PDK_INSTALL_PATHpackagestibootsblsrc<BOOT_MEDIA>
Examples of customization that can be changed:
- QSPI/SPI flash offsets: These offsets are configured in sbl_qspi.c
and sbl_spi.c
- MMCSD: The name of the application is hard coded as app in function
SBL_MMCBootImage in the sbl_mmcsd.c
Speeding up boot by increasing speed of the boot interface
The SBL for AM57xx devices uses LLD drivers to read and write from boot
media supported. The SBL uses the default SOC configuration of the
drivers and the speeds setup. For example, the SPI driver default SPI
bitrate is 1 MHz (Refer
PDK_INSTALL_PATHpackagestidrvspisrcSPI_drv.c) so if you wish to
speed up boot you can update the SPI parameter in the SBL as shown
below:
SPI_Params_init(&spiParams);
spiParams.bitRate = 24000000U;
The configuration of the driver is usually done in the
boot/sbl/soc/<device>/sbl_soc.c file.
- For SD/MMC: You can configure higher speed and change bus width
using MMCSD_v1_HwAttrs_s or MMCSD_v0_HwAttrs_s
- For QSPI: 2 pin and 4 pin mode, and input frequency is configured
using QSPI_HwAttrs in the QSPI driver. Check driver for defaults.
Also, check to see if the CACHE and MMU settings for the ARM core are
setup to enable fast boot.
NOTE
SYSBOOT settings for AM57xx
The SYSBOOT configuration in your hardware using Sitara devices
(AM3/AM4/AM5) can play a big role in the time required to boot
successfully. On these devices the boot pins configure a boot sequence
for the ROM bootloader to check for valid boot image so if you have a
preferred boot mode designers are required to use SYSBOOT setup such
that the preferred boot media is first in the boot sequence. If the
preferred boot media occurs later boot sequence, the boot is likely to
add the time required by RBL to check other boot media for an valid
image. For example if QSPI is the preferred boot media on your AM57xx
hardware then you should have system configure SYSBOOT to boot of QSPI
first using SYSBOOT setting for QSPI_1 or QSPI4 for Memory preferred
booting or Production booting (Refer: Initialization chapter in
TRM).Incorrect SYSBOOT configuration can causes long delays especially
if peripheral boot is configured to be one of the preferred boot modes
in the boot order
Reducing size of SBL and application
Another way to optimize boot times is to reduce the size of the binary
that needs to be loaded by the bootloader by building the app with
optimization for code size using -Os (GNU GCC) and for -O<level> when
using TI compilers.
Other than compiler based optimizations developers can actively shutdown
non-essential modules and features to reduce code size. For example if
UART logging is not required or DDR memory is not connected in the
system, the initialization functions can be removed to reduce code size.
Usage Notes
AVS and ABB configuration is mandated for normal operation of AM57xx
devices. All Processor SDK RTOS releases v3.3 and later contain SBL that
sets up AVS and ABB configuration features using PM LLD APIs The
complete details of PMIC configuration and AVS and ABB configuration
required by the chip for different OPP has been implemented in the file:
PDK_INSTALL_PATHpackagestibootsblboardsrcsbl_avs_config.c If you
are using the same PMIC as GP EVM or IDK platform then you can reuse the
settings as is in SBL for your custom platform
- Configuring entry point for SBL
The two key files that help setup the entry point in the SBL build are
“sbl/soc/<SOC_NAME>/sbl_init.S” and the linker command file
“sbl/soc/<SOC_NAME>/linker.cmd”. The global symbol Entry is used to
provide the entry point to the SBL. The Base address of the memory
section SBL_MEM is then used by the tiimage and GP Header tool to
provide RBL the guidance to find the entry point to pass control. After
MLO is created check the TI image format file(MLO or _ti.bin) or the GP
Header file to confirm that the entry point matches the location of
Entry symbol in the sbl.map
NOTE
The object file created by sbl_init.S should always be the first object
file in the link order for the symbol Entry to be placed at the BASE
address of the memory section SBL_MEM
Debugging application boot
Steps to debug application boot using Processor SDK RTOS bootloader are
discussed in the article `Common steps to debug application
boot <https://processors.wiki.ti.com/index.php/Processor_SDK_RTOS_Boot#Common_steps_to_debug_application_boot>`__
4.5.3. C66x
Overview
C66x SOCs use the Intermediate Boot-Loader (IBL) to initialize and setup
the SOC for specific boot modes. The table below illustrates the
supported bootmodes:
Boot Mode |
TMDSEVM6678 |
TMDXEVM6657 |
NOR boot via IBL over I2C1 |
Yes |
Yes |
NAND boot via IBL over I2C1 |
Yes |
Yes |
TFTP boot via IBL over I2C1 |
Yes |
Yes |
I2C POST boot2 |
Yes |
Yes |
Ethernet boot |
Yes |
Yes |
SRIO boot |
Yes |
Yes |
PCIe boot |
Yes |
Yes |
Note:
- Support boot over I2C bus address 0x51
- Support POST boot over I2C bus address 0x50
- Only ELF and BBLOB images are supported for booting
- IBL is using the first 128KB L2 local memory, any application booting
from IBL should NOT use the first 128KB L2 memory, OR should only use
the first 128KB L2 memory for uninitialized data section
Flashing the Bootloader
IBL needs to be flashed into EEPROM address 0x51.
Refer to Processor SDK RTOS Flashing Bootable
Images] for
instructions on using the script, program_evm.js, to automatically flash
your device.
Bootloader Execution Sequence
IBL is flashed into I2C EEPROM bus address 0x51. IBL provides a
workaround for the PLL lockup issue (please refer to C6678 errata
document, February 2011, advisory 8 for details on the PLL lockup
issue). For ROM boot modes (EMAC,SRIO,PCIe,Hyperlink etc) and I2C boot
mode with bus address 0x50, DSP will initially boot from I2C EEPROM bus
address 0x51 which does the PLL reset workaround, updates the DEVSTAT
for appropriate values based on the DIP switch settings (SW3 through SW6
settings) and then re enters the ROM to accomplish the desired boot
mode. Please note that the re entry is done for all boot modes except
for PCIe boot mode and I2C boot mode with bus address 0x51.
Below are the steps done in the IBL:
- FPGA samples the bootmode pins
- FPGA forces the DSP to boot via I2C bus address 0x51
- PLL is initialized correctly by the IBL on the I2C.
- IBL reads the sampled bootmode from an FPGA register.
- IBL checks the bootmode, if it is not I2C boot or it is I2C boot but
with bus address 0x50, IBL writes bootmode into the DEVSTAT register
- IBL then checks if the bootmode is PCIE boot or not. If it is, it
executes some PCIE workaround to configure the PCIE registers (mainly
to accept spread spectrum clock) and stays inside IBL waiting for
PCIe boot.
- If it is not PCIE boot mode, IBL writes the Boot ROM entry address
into the DSP Program Counter, DSP executes the desired internal ROM
boot mode or boot from I2C bus address 0x50 as normal.
Compilation
The recommended rule-of-thumb to compiling projects in the Processor SDK
RTOS package is to use the makefiles provided. The makefiles are usable
after setting up your shell/terminal/command prompt environment with the
setupenv.bat or setupenv.sh script located in
[SDK Install Path]/processor_sdk_rtos_<platform>_<version>
Refer to Processor SDK RTOS Building the
SDK
guide on how to setup your environment for building within any of the
Processor SDK RTOS packages.
Note: C66x projects are supported by C6000 Code Generation
Tools 7.4.x. Make sure your environment variable, C6X_GEN_INSTALL_PATH,
is pointing to a valid C6000 compiler. Compiling IBL invokes the C6000
compiler, cl6x, directly. Your PATH variable will need to have
$C6X_GEN_INSTALL_PATH/bin.
The IBL package can be found in:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/ibl
To build:
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/ibl/src/make
make <IBL_BINARY_NAME> ENDIAN=<BINARY_ENDIANNESS> I2C_BUS_ADDR=0x51
<IBL_BINARY_NAME> can be of values: evm_c6657_i2c or
evm_c6678_i2c. (For C6657 or C6678 platforms, respectively)
<BINARY_ENDIANNESS> can be of values: little or big
I2C_BUS_ADDR specifies the I2C bus address to use, and has to be 0x51
for C66x SOCs to access the EEPROM.
The resulting output will be in [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/ibl/src/make/bin
directory.
NOTE
For developers, who want to build IBL in Windows environment. Please
build this using MinGW environment using the instructions provided in
the build_instructions.txt that can be found under
pdk_c66xx_xx_xxpackagestibootibldocibldoc
Flash Writers
There are three types of flash memory provided with the C66x SOCs:
EEPROM, NOR, and NAND. Each of these flash memory can hold bootable
application binaries. As such, respective flash writers are provided in:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/writer
Note: Please set your EVM to NO BOOT mode before loading
and running any of the flash writers. Flashing in NO BOOT mode is the
safest way since it eliminates any unwarranted interactions with booted
applications.
EEPROM Writer
The EEPROM Writer is used to write a binary into the EEPROM memory.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/writer/eeprom/<platform>/build
make all
Usage
- Set your EVM to NO BOOT. Power on, launch target configuration in
CCS, and connect to Core 0. Be sure the GEL file is used and DDR is
initialized.
- Copy the desired binary you want to flash to [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/writer/eeprom/<platform>/bin
directory.
- Rename the binary you copied in the previous step to “app.bin”.
- In CCS, select Core 0 and open the Memory Browser
- In the Memory Browser window, right click and select “Load Memory”
- Load your app.bin to 0x0C000000. Do so by selecting app.bin for the
file, click Next, and input 0x0C000000 for Start Address (Type-size
selected should be 32-bit)
- Load [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/writer/eeprom/<SOC>/bin/eepromwriter_<platform>.out
- Run Core 0. This will program the flash memory.
If it succeeds, the console will print “EEPROM programming completed
successfully”
NOR Writer
The NOR Writer is used to write a binary into the NOR memory.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/writer/nor/<platform>/build
make all
Usage
- Set your EVM to NO BOOT. Power on, launch target configuration in
CCS, and connect to Core 0. Be sure the GEL file is used and DDR is
initialized.
- Copy the desired binary you want to flash to [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/writer/nor/<platform>/bin
directory.
- Rename the binary you copied in the previous step to “app.bin”.
- In CCS, select Core 0 and open the Memory Browser
- In the Memory Browser window, right click and select “Load Memory”
- Load your app.bin to 0x80000000. Do so by selecting app.bin for the
file, click Next, and input 0x80000000 for Start Address (Type-size
selected should be 32-bit)
- Load [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/writer/nor/<SOC>/bin/norwriter_<platform>.out
- Run Core 0. This will program the flash memory.
If it succeeds, the console will print “NOR programming completed
successfully”
NAND Writer
The NAND Writer is used to write a binary into the NAND memory.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/writer/nand/<platform>/build
make all
Usage
- Set your EVM to NO BOOT. Power on, launch target configuration in
CCS, and connect to Core 0. Be sure the GEL file is used and DDR is
initialized.
- Copy the desired binary you want to flash to [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/writer/nand/<platform>/bin
directory.
- Rename the binary you copied in the previous step to “app.bin”.
- In CCS, select Core 0 and open the Memory Browser
- In the Memory Browser window, right click and select “Load Memory”
- Load your app.bin to 0x80000000. Do so by selecting app.bin for the
file, click Next, and input 0x80000000 for Start Address (Type-size
selected should be 32-bit)
- Load [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/writer/nand/<SOC>/bin/nandwriter_<platform>.out
- Run Core 0. This will program the flash memory.
If it succeeds, the console will print “NAND programming completed
successfully”
Boot Modes
NAND Boot
NAND boot is a multi-stage process which is designed to boot an
application from NAND flash after reset. Figure below illustrates the
elements of the NAND boot process.
On reset the DSP starts execution with the bootrom which transfers
execution to the secondary bootloader from EEPROM using the I2C slave
bus address 0x51. The secondary bootloader loads the application program
from NAND flash then transfers control to the application. To execute
the NAND bootloader you must ensure the DIP switches for your platform
are properly configured for I2C Master Boot and address 0x51, AND
the boot parameter index dip switch should be set to 2 or 3.
NAND boot supports multiple images booting. Depending on the boot
parameter index dip switch, maximum 2 boot images can be supported. By
default NAND boot only supports a BBLOB image format, if the customer
wants to boot an ELF image, the IBL configuration table needs to be
modified and re-programmed to EEPROM.
NOR Boot
NOR boot is a multi-stage process which is designed to boot an
application from NOR flash after reset. Figure below illustrates the
elements of the NOR boot process.
On reset the DSP starts execution with the bootrom which transfers
execution to the secondary bootloader from EEPROM using the I2C slave
address 0x51. The secondary bootloader loads the application program
from NOR flash then transfers control to the application. To execute the
NOR bootloader you must ensure the DIP switches for your platform are
properly configured for I2C Master Boot and address 0x51, AND the boot
parameter index switch should be set to 0 or 1.
NOR boot supports multiple images booting. Depending on the boot
parameter index dip switch, maximum 2 boot images can be supported.
TFTP Boot
EMAC boot is a multi-stage process which is designed to boot an
application from TFTP server after reset. Figure below illustrates the
elements of the EMAC boot process.
On reset the DSP starts execution with the bootrom which transfers
execution to the secondary bootloader from EEPROM using the I2C slave
address 0x51. The secondary bootloader loads the application program
from a remote TFTP server then transfers control to the application. To
execute the EMAC bootloader you must ensure the DIP switches for your
platform are properly configured for I2C Master Boot and address 0x51,
AND the boot parameter index switch should be set to 4. By default EMAC
boot only supports a BBLOB image format, if the customer wants to boot
an ELF image, the IBL configuration table needs to be modified and
re-programmed to EEPROM.
Updating the IBL Ethernet Configurations
There are two ways to update the IBL ethernet configurations for
ethernet boot.
Using CCS
- Turn on and connect to your EVM with the appropriate Target
Configuration file.
- Connect to Core 0.
- Go to Run -> Load Program and select i2cparam_0x51_c667#_le_0x500.out
located in [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/ibl/src/make/bin
- Go to Tools -> GEL Files and then right click on GEL Files window and
Load the i2cConfig.gel GEL file, located in [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/ibl/src/make/bin
- Run the program. The following message will be printed on the CCS
console: Run the GEL for the SOC to be configured, press return to
program the I2C. DO NOT PRESS ENTER UNTIL STEP 6 IS DONE
- Run the GEL script”Scripts -> EVM c6678 IBL” -> setConfig_c6678_main.
- Now press “Enter” in the CCS console window, and the program will
write the boot parameter table to the EEPROM. On success the message
“I2c table write complete” will be printed on the CCS console.
Please note that the i2cConfig.gel file can be modified via a text
editor before loading and running the script in CCS. Please note that
this gel file contains configuration settings for multiple SOCs and
multiple boot modes.
Using iblConfig Utility Program
The second way to update the IBL ethernet configurations is to use
iblConfig.out. This utility program is located under:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/ibl/src/util/iblConfig/build
In command line, use “make” with the given Makefile to generate
iblConfig.out and input.txt. Please be sure to fill in the parameters
for input.txt before running iblConfig.out; below is an example of
input.txt:
file_name = ibl.bin
SOC = 6
offset = 0x500
ethBoot-doBootp = TRUE
ethBoot-bootFormat = ibl_BOOT_FORMAT_ELF
ethBoot-ipAddr = 192.168.1.3
ethBoot-serverIp = 192.168.1.2
ethBoot-gatewayIp = 192.168.1.1
ethBoot-netmask = 255.255.255.0
ethBoot-fileName =
The first 3 parameters must be filled in for iblConfig.out to work:
- file_name refers to the IBL binary file to update. This file must be
in the same directory as iblConfig.out.
- SOC refers to the SOC being used. Please enter 6 for C6678, and 8
for C6657.
- offset refers to an offset space in the IBL. The value is 0x500 for
C6678, and C6657
The ethernet parameters (the entries beginning with ethBoot) refer to
specific ethernet configurations. If they are not specified, they will
be defaulted to the values in the [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/ibl/src/util/iblConfig/src/SOC.h
file. In the example above, the ethernet boot file name will be
defaulted to c6678-le.bin when iblConfig.out is run.
After running iblConfig.out and updating the IBL binary, you must
flash the modified IBL binary to your EVM. You can do this as part of
program_evm (refer to
Processor SDK Flashing Bootable
Images) or
you can flash it individually using eepromwriter (refer to “Flash
Writers” section above).
- Note: If you updated the IBL with iblConfig and flashed it
- with eepromwriter, you should NOT use
i2cparam_0x51_c667#_le_0x500.out and iblConfig.gel - this would
overwrite the changes you made to the IBL.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/i2c/tftp/<platform>/build
make all
Usage
After your IBL ethernet settings are configured correctly and flashed
into EEPROM memory, follow these steps to continue the TFTP booting
process:
- Start a TFTP server on your local PC. Your local PC will be the one
sending the image to be booted, so make sure your PC and EVM are
connected to the same subnet via ethernet
- Copy i2ctftpboot_<platform>.out (refer to compilation step above) to
your base TFTP directory
- Rename i2ctftpboot_<platform>.out to app.out
- Set the IP address of the PC that is running the TFTP server to
192.168.2.101, since by default IBL will set the EVM IP address to
192.168.2.100 and the TFTP server IP address to 192.168.2.101
- Set EVM to TFTP boot mode and power on the EVM
Your PC will send the application image to the EVM to boot. Open an UART
terminal to view the output.
POST Boot
POST (Power On Self Test) Boot is designed to do a quick self-diagnostic
upon boot. The POST application itself is located in
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/post
This application should already be compiled and flashed into EEPROM
out-of-box. Below instructions are for re-compilation or re-flashing
only.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/post/<platform>/build
make all
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/post/<platform>/bin
./post_romparse.sh
Note: You would need to use post_romparse.bat instead of the *.sh
version if your host system is running on Windows.
Usage
To flash the POST binary into EEPROM:
- Refer to above Flash Writers section on flashing EEPROM memory. The
binary you are flashing is “post_i2crom.bin”.
- Before running the last step of the EEPROM flashing instruction to
run the DSP core, modify the eepromwriter_input.txt to use
0x50 for the bus_addr field. The eepromwriter_input.txt file
is located in:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/writers/eeprom/<SOC>/bin
Configure your EVM’s DIP Switches accordingly to I2C POST BOOT mode. The
POST application will be loaded from EEPROM 0x50 and output will be
available over the UART serial console.
ETHERNET Boot
ETHERNET Boot uses Ethernet sockets to transfer a bootable image from a
host to the EVM. After powering on in Ethernet boot mode, the EVM will
send BOOTP packets at regular interval - this gives visibility of the
MAC ID of the EVM to the network.
Below are instructions on compiling and running an example to send a
simple program to the EVM while in Ethernet boot mode.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/ethernet/Utilities
make all
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/ethernet/simple
make all
Usage
- Set the EVM’s DIP switches to Ethernet boot mode. Connect Ethernet
cables such that the EVM and your Host PC are on the same network.
- Power on the EVM. The EVM will start sending BOOTP packets. Read the
packets for the EVM’s MAC ID. You can read the packet by using a
network tool such as Wireshark.
- On your Host PC, add an ARP entry to associate the EVM’s MAC ID with
an IP address on your network.
- Use the pcsendpkt utility provided to send the simple.eth program
compiled in the compilation step to the EVM.
To use pcsendpkt:
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/ethernet/Utilities
pcsendpkt simple.eth <EVM IP ADDRESS>
<EVM IP ADDRESS> is the IP address you assigned the EVM in step 3
Note: If you are on a Linux Host PC, you may need to
recompile pcsendpkt locally with GCC
To verify, connect to the EVM’s Core 0 via CCS and check that the A1
register is set to 0x11223344
SRIO Boot
SRIO boot will attempt to load and run a binary image received via SRIO.
An example can be found in:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/srio
Below are instructions on compiling and running the SRIO boot example.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/srio/srioboot_ddrinit/<platform>/build
make all
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/srio/srioboot_ddrinit/<platform>/bin
./srioboot_ddrinit_elf2HBin.sh
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/srio/srioboot_helloworld/<platform>/build
make all
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/srio/srioboot_helloworld/<platform>/bin
./helloworld_elf2HBin.sh
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/srio/srioboot_example/<platform>/build
make all
Note: You would need to use srioboot_ddrinit_elf2HBin.bat and
helloworld_elf2HBin.bat instead of their *.sh version respectively if
your host system is running on Windows. Compilation of the projects
should be done in the order stated above.
Usage
You will need to have 2 EVMs - both should be set to SRIO boot mode. The
two EVMs will be connected through the AMC breakout board (lane x of one
slot should be connected to lane x of the other breakout slot). One EVM
will be acting as the host (referred to as the HOST EVM) and the other
EVM will be doing the booting (referred to as the BOOTING EVM).
- Compile srioboot_example_evm66XXl.out
- Connect the BOOTING EVM’s UART serial port to your PC using the
RS-232 cable
- Connect a JTAG emulator on the HOST EVM
- Power on both EVMs
- Open an UART terminal to view the BOOTING EVM’s output. (Remember to
set the baud rate to 115.2k bps, 8-bit data, no parity, 1-bit stop,
and no flow control)
- Connect to the HOST EVM via Code Composer Studio (CCS is recommended
to be version 6 or higher). Launch target configuration for your HOST
EVM and connect to DSP0.
- Load and run srioboot_example_evm66xxl.out on your HOST EVM
CCS console for your HOST EVM should display:
[C66xx_0] SRIO Boot Host Example Version 01.00.00.01
[C66xx_0]
[C66xx_0] Transfer DDR init code via SRIO successfully
[C66xx_0] Transfer boot code via SRIO successfully
Terminal for your BOOTING EVM should display:
SRIO Boot Hello World Example Version 01.00.00.01
Booting Hello World image on Core 0 from SRIO ...
Booting Hello World image on Core 1 from Core 0 ...
Booting Hello World image on Core 2 from Core 0 ...
Booting Hello World image on Core 3 from Core 0 ...
Booting Hello World image on Core 4 from Core 0 ...
Booting Hello World image on Core 5 from Core 0 ...
Booting Hello World image on Core 6 from Core 0 ...
Booting Hello World image on Core 7 from Core 0 ...
PCIE Boot
PCIE boot will attempt to load and run a binary image upon enumeration.
Example is located:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/pcie
Below are instructions on compiling and running the PCIE boot example.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/pcie/pcieboot_ddrinit/<platform>/build
make all
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/pcie/pcieboot_helloworld/<platform>/build
make all
Additionally for C6678 EVM:
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/pcie/pcieboot_interrupt/<platform>/build
make all
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/examples/pcie/pcieboot_localreset/<platform>/build
make all
The POST application can also be used as a PCIE Boot example. Run the
corresponding *_elf2HBin.bat (or .sh) to convert the .out files into
PCIE bootable binaries.
Usage
An AMC to PCIE adaptor card, a TMS320C66xxL EVM card and a Linux PC are
required to do the test. The test is verified on both TMS320C6670L and
TMS320C6678L cards, with both 32-bit and 64-Linux PCs running Ubuntu
10.04. Other Linux OS are expected to work as well.
- Before connect the system, please update IBL with the latest from
Processor SDK
- Set EVM card to PCIE boot (refer to hardware page)
- Assemble the EVM card into the adaptor card
- Connect the URAT cable from EVM card to a Linux PC’s USB port or
serial port
- Completely shut off the PC power supply (by disconnecting the power
cord), insert the AMC adaptor card (with EVM mounted) into an open
PCIE slot in PC’s motherboard
- Supply the power to PC, wait for a few seconds and power on the PC.
- Make sure the PCIE device is correctly enumerated by PC by checking
below, note DEVICE_ID field is changed from 0x8888 to 0xb005 which is
programmed in IBL.
- Either enter PC’s BIOS setting when PC is booting up, a new PCIE
device should be populated in the PCIE slot where card is inserted,
shown as a “Multimedia device”.
- Or, type “lspci –n” under Linux command shell after Linux OS is
loaded, a TI device (VENDOR_ID: 0x104c) should be in the list:
local-ubuntu:~$ lspci -n
00:00.0 0600: 8086:2774
00:1b.0 0403: 8086:27d8 (rev 01)
….
00:1f.3 0c05: 8086:27da (rev 01)
01:00.0 0480: 104c:b005 (rev 01)
03:00.0 0200: 14e4:1677 (rev 01)
Similarly, one can type “lspci”,
local-ubuntu:~$ lspci
….
00:1f.3 SMBus: Intel Corporation N10/ICH 7 Family SMBus Controller (rev
01)
01:00.0 Multimedia controller: Texas Instruments Device b005 (rev 01)
....
- The PCIE BARn (n = 0, 1, 2, … , 5) registers are written by Linux PC
after enumeration, they should be non-zero. Optionally, if a JTAG
emulator is available, one can verify this by looking at address
starting from 0x21801010 for 6 32-bit word.
- Prepare pciedemo.ko in the Linux PC
- On the Linux PC open a new terminal window to run minicom. First run
“sudo minicom –s” to set the correct configuration: 115200bps, 8-N-1,
Hardware flow control: OFF, Software flow control: OFF, and select
the correct Serial Device. Save then run “sudo minicom” to monitor
the port.
- Type “sudo insmod pciedemo.ko”
- If a JTAG emulator is available, one can verify that the PC registers
for cores other than core 0 should be inside DDR; and magic address
for cores other than core 0 should be written with 0xBABEFACE.
Procedure to build and run Linux host loader
- Create a folder (e.g. pcie_test) in a Linux machine. Copy pciedemo.c,
Makefile, pcieDdrInit_66xx.h, pcieBootCode_66xx.h,
pcieInterrupt_66xx.h and post_66xx.h from
toolsboot_loaderexamplespcielinux_host_loader to the folder.
- Type “make”, a pciedemo.ko file should be created
- By default, this will build the “HelloWorld” demo on little endian
6678, which is controlled by the following Marcos in pciedemo.c:
#define BIG_ENDIAN 0
#define HELLO_WORLD_DEMO 1
#define POST_DEMO 0
#define EDMA_INTC_DEMO 0
#define EVMC6678L 1
#define EVMC6670L 0
One must select the endianness, demo program and target type by toggling
between 0 and 1 accordingly. Then, type “make clean” and type “make” to
rebuild the pciedemo.ko.
Note: “HelloWorld” and EDMA_INTC demos can be run on both endianness.
POST demo can be run on little endian only.
- To insert the module into kernel, type “sudo insmod pciedemo.ko”; to
view the kernel message, type “dmesg”; to remove the module from
kernel, type “sudo rmmod
pciedemo.ko”
The role of IBL in PCIE boot mode
The Intermediate Boot Loader (IBL) is flashed into I2C EEPROM bus
address 0x51. IBL provides a workaround for the PLL lockup issue (please
refer to C6678 errata document, February 2011, advisory 8 for details on
the PLL lockup issue). For ROM boot modes (EMAC, SRIO, PCIE, Hyperlink,
etc) and I2C boot mode with bus address 0x50, DSP will initially boot
from I2C EEPROM bus address 0x51 which does the PLL reset workaround,
updates the DEVSTAT for appropriate values based on the DIP switch
settings (SW3 through SW6 settings) and then re-enters the ROM to
accomplish the desired boot mode. Please note that the re-entry is done
for all boot modes except for PCIE boot mode and I2C boot mode with bus
address 0x51.
Below are the steps done in the IBL in PCIE boot mode:
- FPGA samples the boot mode pins
- FPGA forces the DSP to boot via I2C bus address 0x51
- PLL is initialized correctly by the IBL on the I2C.
- IBL reads the sampled boot mode from an FPGA register.
- IBL checks the boot mode, if it is not I2C boot or it is I2C boot but
with bus address 0x50, IBL writes boot mode into the DEVSTAT register
- IBL then checks if the boot mode is PCIE boot or not. If it is, it
executes some PCIE workaround to configure the PCIE registers (mainly
to accept spread spectrum clock) and stays inside IBL by first
clearing the magic address and then monitoring it for PCIE boot.
For PCIE demos with DDR memory is used, proper DDR configuration is
required, this doesn’t need the full IBL functionality. Typically DDR
can be initialized in two ways:
- The Linux host initializes the DDR registers directly through PCIE
link.
- A DDR initialization image is downloaded in the L2 first to
initialize the DDR and then reset the magic address with value 0. And
then the application image is downloaded in
the DDR. In Processor SDK, the second approach is used.
How HelloWorld boot example works
The Linux host first pushes the DDR init boot image data to L2 memory of
core 0, then writes the boot entry address of the DDR init boot image to
the magic address on core 0, both via PCIE. When the EVM is in PCIE boot
mode, the IBL code running on the DSP core 0 polls the entry address and
jumps to that address and starts to boot (initialize the DDR). After DDR
is properly initialized, the DDR init code clears the magic address and
keeps on polling it.
Linux host then pushes the HelloWorld boot image data to DDR memory,
then writes the boot entry address of the HelloWorld boot image to the
magic address on core 0 to boot core 0. Core 0 starts to boot and print
the “Hello World” booting information, and then boot all the other cores
by writing the address of _c_int00 to the magic address on other cores
and sending an IPC interrupt to other cores. The RBL running on other
cores will jump to _c_int00 and start to boot, each core will write
0xBABEFACE to its magic address by running a function
write_boot_magic_number().
Note that host boot application needs to wait for some time after
pushing the DDR init boot image and before pushing the HelloWorld boot
image to the DDR, this will ensure DDR is properly initialized.
How POST boot example works
The POST example uses L2 only. The Linux host first pushes the POST boot
image data to L2 memory of core 0, then writes the boot entry address of
the POST to the magic address on core 0, both via PCIE. The IBL code
running on the DSP core 0 polls the entry address and jumps to that
address and starts to boot.
How DSP local reset example works
A user may want to re-run a PCIE demo without power cycle the Linux PC.
There is a need to reset the DSP chip from host software. There are
several types of resets: hard reset, soft reset and CPU local reset.
Hard reset will reset everything on the device except the PLLs, test,
emulation logic, and reset isolation modules. Since PCIE doesn’t support
reset isolation, a hard reset will reset PCIE module as well and all the
configured PCIE registers (PCIE MMRs) will be lost. Soft reset will
behave like a hard reset except that the stick bits of PCIE MMRs are
retained. The PC can’t communicate with PCIE card anymore in both hard
reset and soft reset cases.
To reset the DSP while keeping the PCIE untouched, the local reset
example does the following:
- Put all cores in reset via PSC
- Disable all modules except PCIE and cores via PSC
- Configure chip level registers DSP_BOOT_ADDRn and IPCGRn: Here the
header array converted from DSP local reset example is loaded into
each core via PCIE; the _c_int00 is then written to each
DSP_BOOT_ADDRn; finally IPCGRn is written to jump start the DSP local
reset example program, which simply polls magic address for a
secondary boot.
- Enable all modules previous disabled via PSC
- Pull all cores out of reset via PSC
Note: It is IBL (in local L2) that monitors magic address
and boots the DDR init (in local L2) or POST (in local L2) or
EDMA-interrupt (in local L2) in those demos. If one wants to load
his/her own boot demo code, then it shouldn’t overlap with the IBL
code. As a guideline, the IBL uses memory from 0x00800000 to
0x0081BDFF. To check the exact memory usage, you can re-build the IBL
by following the instructions in
toolsboot_loaderibldocbuild_instructions.txt and check the
resulting ibl_c66x_init.map file. In addition, following local L2 is
reserved by RBL and shouldn’t be used: for 6678 ROM PG 1.0, 0x00872DC0
– 0x0087FFFF; for 6670 ROM PG 1.0, 0x008F2DC0 – 0x008FFFFF.
4.5.4. K2G
Overview
The Secondary Bootloader (SBL) for K2G does basic hardware
initialization for the board to load and run applications.
Bootloader Execution Sequence
- Power On Reset occurs
- ROM Bootloader (RBL) executes. It checks for bootmode and attempts to
load+run the SBL from that bootmode.
- SBL begins execution from internal memory (MSMC RAM)
- Board Initialization is done by a call to Board_init() API.
For additional details refer to Processor SDK Board
Support.
- SBL setup includes configuring Pinmux, enable peripheral clocks,
set up PLLs, and configure EMIF for DDR.
- SBL finishes setup and looks for “app” to execute next. This
user-modifiable application may reside in SD card or QSPI memory
depending on the bootmode chosen.
- Once located, app will be loaded into memory and execution will be
branched to the application’s entry address
Tools and Binary Formats
Making Bootable SBL image (MLO)
RBL loads and runs “MLO”, which is a .out executable formatted by TI
tools. To make a .out, such as SBL, bootable by ROM, you must follow
these steps:
- armhex [.out file] [.rmd file]
- .out file is the file you want to boot, such as sbl.out
- .rmd file is an input file to specify sections information. An
example can be found in:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/board/evmK2G/build/sbl.rmd
- armhex is a tool in TI ARM CGT compiler. This generates a [hex
file], name of which is specified by the .rmd file
- b2ccs [hex file] [ccs file]
- hex file is the output from the previous step
- ccs file can be name of your choosing
- ccsAddGphdr -infile [ccs file] -outfile [gphdr file] -headerEndian
BE
- gphdr file can be the name of your choosing
- ccsAddGptlr -infile [gphdr file] -outfile [gptlr file]
- gptlr file can be the name of your choosing
- byteswapccs [gptlr file] [MLO ccs file]
- MLO ccs file can be the name of your choosing
- ccs2bin -swap [MLO ccs file] MLO
- MLO will be created after this step
Armhex is part of TI ARM CGT, in
<CCS_INSTALL_DIR>/tools/compiler/ti-cgt-arm_x.x.x/bin. The rest of
the tools can be found in:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools
Making Loadable User Application image (app)
For converting the compiled .out files to a format loadable by TI’s
Secondary Boot Loader (SBL), you must follow these two steps:
- out2rprc.exe [.out file] [rprc output]
- MulticoreImageGen.exe LE 55 [output name] 0 [rprc output]
Out2rprc.exe and MulticoreImageGen.exe are tools supplied by TI and can
be located in the <PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools
folder. “rprc output” can be any spare name of your choosing. “output
name” can also be any name of your choosing.
The ‘0’ used in step 2 refers to the Core ID to boot. By default, ‘0’ is
MPU (Cortex A15) core 0. You can input a different value to boot to
other cores. Valid values are:
Core |
Value |
MPU Core 0 |
0 |
DSP Core 0 |
5 |
If MPU SMP is chosen, the same boot image and entry will be used for all
MPU cores. SBL can also parse multiple boot images that are concatenated
together. Simply use MulticoreImageGen as such:
MulticoreImageGen.exe LE 55 [output name] [Core ID a] [rprc output a]
[Core ID b] [rprc output b] [Core ID c] [rprc output c] ...
Boot Modes
This release of SBL supports MMCSD and QSPI boot modes.
MMCSD Boot Mode
Preparing the SD card
- To boot the target, the SD card needs to be bootable. Follow the
steps at Creating bootable SD card in
windows
or Creating bootable SD card in
Linux.
- Copy “MLO” and “app” to your SD card.
- MLO is the SBL formatted by the aforementioned tools. A pre-built
MLO can be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/binary/evmK2G/mmcsd/bin
- app is the target application to be booted and also formatted by
the aforementioned tools. (Note that the tools for making the
bootable MLO and the loadable app are different).
Booting via SD Card
- Insert micro SD card into the SD card slot of the board
- Set the board to MMC/SD bootmode by configuring the DIP switches to
‘0111’. Verify the bootmode on the LCD display on your board
- Open a serial communication terminal (such as TeraTerm, MiniCom,
etc.) on host PC and connect to the UART console port
- Power on the board
Below is an example of K2G SBL successfully booting the diagnostic
application:
QSPI Boot Mode
Preparing QSPI Flash
MLO and app needs to be flashed into QSPI memory so that they can be
booted. MLO will reside at offset 0 and app will reside at offset
0x80000. QSPI flash memory map:
Offset 0x0 |
MLO |
Offset 0x80000 |
app |
The images can be flashed into QSPI flash by following steps given
below:
- Copy MLO, app, and config to SD card
- MLO is the SBL formatted by the aforementioned tools. A pre-built
MLO can be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/binary/evmK2G/qspi/bin
- app is the target application to be booted and also formatted by
the aforementioned tools. (Note that the tools for making the
bootable MLO and the loadable app are different).
- config helps specify the memory map. The default config file can
be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/qspi.
This config file may be altered to custom user settings if needed.
- In the SD card, rename MLO to “boot”. This is the default name
specified by the config file.
- Insert the SD card into the SD card slot on the board
- Connect to the board with CCS. Launch target configuration and
connect to the ARM A15 core. GEL file will run on-connect and do
basic board-level initialization
- Load the flash writer, qspi_flash_writer.out, to the connected core
- A pre-built qspi_flash_writer.out can be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/qspi/bin/evmK2G
- Run the QSPI flash writer application. You will see the following
logs on the EVM’s UART console:
*** PDK QSPI Flash Writer ***
Copying 'boot' to local memory
Begin flashing 'boot' into QSPI
Finished flashing 'boot' with size 20010 at offset 0
Copying 'app' to local memory
Begin flashing 'app' into QSPI
Finished flashing 'app' with size 19398 at offset 80000
Flashing completed!
NOTE
This application will flash the image at required offset without taking
into consideration any overwriting to previously flashed image.
Booting via QSPI
- Set the board to QSPI-48 bootmode by configuring the DIP switches to
‘1111’. Verify the bootmode on the LCD display on your board
- Open a serial communication terminal (such as TeraTerm, MiniCom,
etc.) on host PC and connect to the UART console port
- Power on the board
Memory Usage
SBL uses the last 0x40000 memory from MSMC RAM memory.
The SBL memory map is shown below:
NOTE
app should not have loadable sections residing in SBL memory region to
prevent overwriting SBL during load time. It is, however, free to use
SBL memory after it is loaded and running.
4.5.5. K2H/K2E/K2L
Overview
K2H/K2E/K2L EVMs uses the Secondary Boot Loader (SBL) to configure
board-related settings and execute a user application. The user
application can be single core or multicore, and execute on either DSP
cores or ARM cores. The only restriction is that the load sections must
not overlap the memory space that SBL uses.
The K2H/K2E/K2L SBL supports ARM master boot using SPI NOR. Please refer
to the boot mode dip switch settings in the respective EVM hardware page
(link)
to configure your EVM for NOR boot.
Flashing the Bootloader
SBL and user application needs to be flashed into SPI NOR.
Refer to Program EVM Guide for
instructions on using the script, program_evm.js, to automatically flash
your device.
Usage
- Flash the bootloader and user application. This can be done
automatically with default files by using program_evm.js
- Set the EVM to ARM SPI boot mode
- Connect UART serial debug cable from EVM to your computer. Open a
terminal such as HyperTerminal or TeraTerm to see console output
- Power on the EVM
Compilation
The recommended rule-of-thumb to compiling projects in the Processor SDK
RTOS package is to use the makefiles provided. The makefiles are usable
after setting up your shell/terminal/command prompt environment with the
setupenv.bat or setupenv.sh script located in
[SDK Install Path]/processor_sdk_rtos_<platform>_<version>
Refer to Building RTOS
SDK page on how to
setup your environment for building within any of the Processor SDK RTOS
packages.
The SBL package can be found in:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/sbl
To build:
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/sbl
make all BOOTMODE=spi BOARD=<EVM> SOC=<platform>
<EVM> can be of values: evmK2H, evmK2E, evmK2L, or
evmK2K
<platform> can be of values: K2H, K2E, K2L, or K2K
The resulting output will be in [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/sbl/binary/<platform>/spi/bin
directory.
Making Loadable User Application image (app)
For converting the compiled .out files to a format loadable by TI’s
Secondary Boot Loader (SBL), you must follow these two steps:
- out2rprc.exe [.out file] [rprc output]
- MulticoreImageGen.exe LE 55 [output name] 0 [rprc output]
Out2rprc.exe and MulticoreImageGen.exe are tools supplied by TI and can
be located in the <PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools
folder. “rprc output” can be any spare name of your choosing. “output
name” can also be any name of your choosing.
The ‘0’ used in step 2 refers to the Core ID to boot. By default, ‘0’ is
MPU (Cortex A15) core 0. You can input a different value to boot to
other cores. Valid values are:
K2H |
K2E |
K2L |
Core |
Value |
Core |
Value |
Core |
Value |
MPU Core 0 |
0 |
MPU Core 0 |
0 |
MPU Core 0 |
0 |
MPU Core 1 |
1 |
MPU Core 1 |
1 |
MPU Core 1 |
1 |
MPU Core 2 |
2 |
MPU Core 2 |
2 |
MPU SMP |
4 |
MPU Core 3 |
3 |
MPU Core 3 |
3 |
DSP Core 0 |
5 |
MPU SMP |
4 |
MPU SMP |
4 |
DSP Core 1 |
6 |
DSP Core 0 |
5 |
DSP Core 0 |
5 |
DSP Core 2 |
7 |
DSP Core 1 |
6 |
|
|
DSP Core 3 |
8 |
DSP Core 2 |
7 |
|
|
|
|
DSP Core 3 |
8 |
|
|
|
|
DSP Core 4 |
9 |
|
|
|
|
DSP Core 5 |
10 |
|
|
|
|
DSP Core 6 |
11 |
|
|
|
|
DSP Core 7 |
12 |
|
|
|
|
If MPU SMP is chosen, the same boot image and entry will be used for all
MPU cores. SBL can also parse multiple boot images that are concatenated
together. Simply use MulticoreImageGen as such:
MulticoreImageGen.exe LE 55 [output name] [Core ID a] [rprc output a]
[Core ID b] [rprc output b] [Core ID c] [rprc output c] ...
Flash Writers
SPI Writer
The SPI flash writer, spi_flash_writer.out, is a part of the SBL package
and allows users to flash multiple images at different offsets into the
board’s SPI NOR flash memory.
Compilation
cd [SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/sbl/
make spi_flashwriter BOARD=<EVM> SOC=<platform>
The binary output will be at:
[SDK Install Path]/pdk_<platform>_<version>/packages/ti/boot/sbl/tools/flashWriter/spi/bin/<platform>
Usage
- Copy the binaries that you want to flash to: [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/sbl/tools/flashWriter/spi/bin/<platform>
- In that same directory, there is a file named config. Edit that
file such that each line has 2 parameters: [name of binary to flash]
[SPI NOR offset to flash to]
- Set your EVM to NO BOOT. Power on, launch target configuration in
CCS, and connect to DSP Core 0
- Load and run [SDK Install
Path]/pdk_<platform>_<version>/packages/ti/boot/sbl/tools/flashWriter/spi/bin/<platform>/spi_flash_writer.out
- You should see the flash progress output on UART terminal
Boot Example
Below is an example output of evmK2H booting after having images flashed
in by program_evm.js:
**** PDK SBL ****
Boot succesful!
Begin parsing user application
Jumping to user application...
TMDXEVM6636K2H POST Version 01.00.00.08
------------------------------------------
SOC Information
BMC Version: 0000
EFUSE MAC ID is: B4 99 4C B6 E2 5B
SA is enabled on this board.
PLL Reset Type Status Register: 0x00000001
Platform init return code: 0x00000000
Power On Self Test
POST running in progress ...
POST I2C EEPROM read test started!
POST I2C EEPROM read test passed!
POST SPI NOR read test started!
POST SPI NOR read test passed!
POST EMIF16 NAND read test started!
POST EMIF16 NAND read test passed!
POST external memory test started!
POST external memory test passed!
POST done successfully!
POST result: PASS
4.5.6. OMAPL137/OMAPL138/C6748
Overview
The Secondary Bootloader (SBL) for OMAPL137/OMAPL138/C6748 does basic
hardware initialization for the board to load and run applications.
Processor SDK boot support for each of these SoC is shown below
Device |
Cores |
Boot Master |
Supported
Boot
modes in
SBL |
HW
Platforms |
OMAPL137 |
ARM (ARM9)
DSP (C674x) |
DSP |
SPI |
OMAPL137
EVM |
OMAPL138 |
ARM (ARM9)
DSP (C674x) |
ARM |
MMCSD |
OMAPL138
LCDK |
C6748 |
DSP (C674x) |
DSP |
MMCSD |
C6748 LCDK |
Bootloader Execution Sequence
- Power On Reset occurs
- ROM Bootloader (RBL) executes. It checks for bootmode and attempts to
load+run the SBL from that bootmode.
- SBL begins execution from internal memory (Shared RAM)
- Board Initialization is done by a call to Board_init() API.
For additional details refer to Processor SDK Board
Support.
- SBL setup includes configuring Pinmux, enable peripheral clocks,
set up PLLs, and configure EMIF for SDRAM/DDR.
- SBL finishes setup and looks for “app” to execute next. This
user-modifiable application shall reside on the boot media.
- Once located, app will be loaded into memory and execution will be
branched to the application’s entry address
Tools and Binary Formats
Making Bootable SBL image (MLO)
RBL loads and runs “MLO”, which is a .out executable formatted by TI
tools. HexAIS tool should be used to convert the .out into MLO using the
below command.
Windows Host
<HexAIS_Tool> -o <output file> -ini <ini file> <input file>
Linux Host
HexAIS executable can be run on Linux PC by using mono tool as shown
below
mono <HexAIS_Tool> -o <output file> -ini <ini file> <input file>
- <HexAIS_Tool> is HexAIS_OMAP-L137.exe for OMAPL137 and
HexAIS_OMAP-L138.exe for OMAPL138/C6748
- ‘output file’ is name of the output file. MLO in this case
- ‘ini file’ is configuration file for defining the boot parameters.
This file provides option to instruct RBL to take certain actions
before loading the MLO into internal memory. Sample ini file is
available at < PDK_INSTALL_DIR
>/packages/ti/boot/sbl/soc/<device>
<device> can be omapl137, omapl138 or c6748
- ‘input file’ is the input .out file name which needs to be converted
into MLO
OMAPL137 HexAIS tool is available at < PDK_INSTALL_DIR
>/packages/ti/boot/sbl/tools/omapl13x_boot_utils/OMAP-L137/GNU/AISUtils.
OMAPL138/C6748 HexAIS tool is available at < PDK_INSTALL_DIR
>/packages/ti/boot/sbl/tools/omapl13x_boot_utils/OMAP-L138/GNU/AISUtils
Making Loadable User Application image (app)
For converting the compiled .out files to a format loadable by TI’s
Secondary Boot Loader (SBL), you must follow these two steps:
- out2rprc.exe [.out file] [rprc output]
- MulticoreImageGen.exe LE 55 [output name] <Core ID> [rprc output]
Out2rprc.exe and MulticoreImageGen.exe are tools supplied by TI and can
be located in the <PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools
folder. “rprc output” can be any spare name of your choosing. “output
name” can also be any name of your choosing.
The <Core ID> used in step 2 refers to the Core ID to boot. Use ‘0’ as
Core ID for ARM core and ‘1’ for DSP core. Valid values are:. You can
input a different value to boot to other cores. Valid values are:
Core |
Value |
ARM Core |
0 |
DSP Core |
1 |
Note: Program entry point of DSP app images on OMAPL138 platform should be 1KByte aligned for loading and executing the DSP images from
ARM core. GPIO LLD LED blink example for C674x core can be used as reference for aligning the DSP entry point to run the DSP code from
SBL. Other LLD examples does not work from SBL as is.
Boot Modes
This release of SBL supports SPI and MMCSD boot modes.
SPI Boot Mode
Preparing SPI Flash
MLO and app needs to be flashed into SPI memory so that they can be
booted. MLO will reside at offset 0 and app will reside at offset
0x80000. SPI flash memory map:
Offset 0x0 |
MLO |
Offset 0x80000 |
app |
The images can be flashed into SPI flash by following steps given below:
- Copy MLO and app to SPI flash writer binary folder -
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/spi/bin/evmOMAPL137.
Make sure config file also present in the SPI flash writer binary
folder.
- MLO is the SBL formatted by the aforementioned tools. A pre-built
MLO can be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/binary/evmOMAPL137/spi/bin
- app is the target application to be booted and also formatted by
the aforementioned tools. (Note that the tools for making the
bootable MLO and the loadable app are different).
- config helps specify the memory map. The default config file can
be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/spi/bin/evmOMAPL137.
This config file may be altered to custom user settings if needed.
- Connect the DB9 port of the EVM to host PC. Open serial communication
applications like TeraTerm, MiniCom, etc and configure for ‘115200
8N1’.
- Connect to the board with CCS. Launch target configuration and
connect to the DSP C674x core. GEL file will run on-connect and do
basic board-level initialization
- Load the flash writer, spi_flash_writer.out, to the connected core
- A pre-built spi_flash_writer.out can be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/spi/bin/evmOMAPL137
- Run the SPI flash writer application. You will see the following logs
on the EVM’s UART console:
*** PDK SPI Flash Writer ***
Opening SPI handle...
SPI handle opened!
Parsing config file and flashing content to SPI NOR...
Parsed config line, received parameters: filename = MLO, address = 0x0
Size of MLO is 0xc81c
Loading binary to memory ...
Finished loading binary to memory!
Flashed MLO to offset 0x0!
Read flash memory at 0x0, checking flashed content...
Verified flash data equal expected data!
Parsed config line, received parameters: filename = app, address = 0x80000
Size of app is 0x16144
Loading binary to memory ...
Finished loading binary to memory!
Flashed app to offset 0x80000!
Read flash memory at 0x80000, checking flashed content...
Verified flash data equal expected data!
Successfully flashed memory content!
NOTE
This application will flash the image at required offset without taking
into consideration any overwriting to previously flashed image.
Booting via SPI
- Set the OMAPL137 EVM to SPI bootmode by configuring the SW2 DIP
switches 1-4 to ‘OFF ON OFF ON’. Other switch positions on SW2 are
don’t care for SPI boot.
- Connect the DB9 port of the EVM to host PC. Open serial communication
applications like TeraTerm, MiniCom, etc and configure for ‘115200
8N1’
- Power on the board
Below is an example of OMAPL137 SBL successfully booting the GPIO LED
blink application
MMCSD Boot Mode
OMAPL138/C6848 RBL does not support reading the boot images as files
from SD card. Secondary Boot loader image should be written to SD card
as raw data. Special formatting is needed for SD card to create
un-formatted area at the beginning of the card to store SBL.
Formatting the SD Card
SD card for booting OMAPL138/C6748 needs to be formatted from Linux PC
due to un-formatted area requirement. Formatting the SD card from
Windows PC is not supported in this release.
Connect the SD card to Linux PC and use below command to format the SD
card
sudo sh create-sdcard-omapl13x.sh <Drive Name>
- <Drive Name> is name of the drive on which SD card is mounted. Be
cautious while selecting the drive name. Running the script with
system drive name will corrupt the file system.
- create-sdcard-omapl13x.sh script is available at
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/omapl13x_sd_card_format
Preparing the SD Card
For both OMAPL138 and C6748, MLO needs to be flashed onto SD card
un-formatted area and app should be copied onto SD card.
MLO can be flashed into SD card un-formatted area by following steps
given below:
- Build the MMCSD flash writer using below commands
- cd <PDK_INSTALL_DIR>/packages/ti/boot/sbl
- gmake mmcsd_flashwriter SOC=OMAPL138 BOARD=lcdkOMAPL138
BOOTMODE=mmcsd
- Copy ‘app’ to SD card and insert the card into MMCSD slot of the
board
- Copy MLO to MMCSD flash writer binary folder -
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/mmcsd/bin/lcdkOMAPL138.
Make sure config file also present in the MMCSD flash writer binary
folder.
- MLO is the SBL formatted by the aforementioned tools. A pre-built
MLO can be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/binary/lcdkOMAPL138/mmcsd/bin
- app is the target application to be booted and also formatted by
the aforementioned tools. (Note that the tools for making the
bootable MLO and the loadable app are different).
- config helps specify the memory map. The default config file can
be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/mmcsd/bin/lcdkOMAPL138.
This config file may be altered to custom user settings if needed.
- Connect the USB serial port of the EVM to host PC. Open serial
communication applications like TeraTerm, MiniCom, etc and configure
for ‘115200 8N1’.
- Connect to the board with CCS. Launch target configuration, connect
to ARM core first (not needed for C6748) and then connect to the DSP
C674x core. GEL file will run on-connect and do basic board-level
initialization
- Load the flash writer, mmcsd_flash_writer.out, to the connected core
- mmcsd_flash_writer.out can be found at:
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/mmcsd/bin/lcdkOMAPL138
- Run the MMCSD flash writer application. You will see the following
logs on the EVM’s UART console:
Opening MMCSD handle...
MMCSD handle opened!
Parsing config file and flashing content to MMCSD...
Parsed config line, received parameters: filename = MLO, address = 0x200
Size of MLO is 0xb9b8
Loading binary to memory ...
Finished loading binary to memory!
Flashed MLO to offset 0x200!
Read flash memory at 0x200, checking flashed content...
Verified flash data equal expected data!
Successfully flashed memory content!
Procedure to flash the MLO described above is applicable to C6748 also.
Use C6748 for OMAPL138 and lcdkC6748 for lcdkOMAPL138 in all the paths
mentioned above.
MLO offset in config file is set to 200 by default which indicates that MLO will be written to second sector of the SD card. MLO offset can be any non-
zero value which is multiple of 512 and should be within first 2Mbytes of SD card memory. DO NOT set the MLO offset to '0' which will corrupt the file
system on the card.
NOTE
This application will flash the image at required offset without taking
into consideration any overwriting to previously flashed image.
Booting via MMCSD
- Set the OMAPL138/C6748 LCDK to MMCSD bootmode by configuring the SW1
DIP switches 1-4 to ‘OFF OFF OFF ON’. Other switch positions on SW1
are don’t care for MMCSD boot.
- Connect the USB serial port of the EVM to host PC. Open serial
communication applications like TeraTerm, MiniCom, etc and configure
for ‘115200 8N1’
- Power on the board
Below is an example of OMAPL138 SBL successfully booting the GPIO LED
blink application
Memory Usage
SBL uses 0x20000 bytes from shared RAM (0x80000000 to 0x8001FFFF).
NOTE
app should not have loadable sections residing in SBL memory region to
prevent overwriting SBL during load time. It is, however, free to use
SBL memory after it is loaded and running.
Additional Details
Use below commands to clean and build the SBL and associated tools.
Initial Steps
Setup the environment variables to configure the build tools
cd <PDK_INSTALL_DIR>/packages
Run pdksetupenv script
cd ti/boot/sbl
Cleaning SBL
gmake clean SOC=<SoC Name> BOARD=<Board Name> BOOTMODE=<Boot Mode>
Building SBL
gmake SOC=<SoC Name> BOARD=<Board Name> BOOTMODE=<Boot Mode>
Cleaning Flash Writer
gmake <Flash Writer>_clean SOC=<SoC Name> BOARD=<Board Name>
BOOTMODE=<Boot Mode>
Building Flash Writer
gmake <Flash Writer> SOC=<SoC Name> BOARD=<Board Name> BOOTMODE=<Boot
Mode>
- use ‘make’ instead of ‘gmake’ on Linux host
- <SoC Name> - OMAPL137, OMAPL138 or C6748
- <Board Name> - evmOMAPL137, lcdkOMAPL138 or lcdkC6748
- <Boot Mode> - spi or mmcsd as supported by the device
- <Flash Writer> - spi_flashwriter for spi boot mmcsd_flashwriter for
mmcsd boot
Examples:
Cleaning & Building OMAPL137 SBL
gmake clean SOC=OMAPL137 BOARD=evmOMAPL137 BOOTMODE=spi
gmake SOC=OMAPL137 BOARD=evmOMAPL137 BOOTMODE=spi
Cleaning & Building OMAPL137 flash writer
gmake spi_flashwriter_clean SOC=OMAPL137 BOARD=evmOMAPL137 BOOTMODE=spi
gmake spi_flashwriter SOC=OMAPL137 BOARD=evmOMAPL137 BOOTMODE=spi
On successful build, SBL .out and MLO will be created at
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/binary/<Board Name>/<Boot
Mode>/bin and flash writer binary will be created at
<PDK_INSTALL_DIR>/packages/ti/boot/sbl/tools/flashWriter/<Boot
Mode>/bin/<Board Name>
4.5.7. Bootloader Debugging
Common Steps to debug application boot
Bootloading an application is a system level issue which is impacted by
hardware as well as software setup. There are some common steps that
users are expected to check while debugging boot related issues. This
section discusses common issues to checkout when debugging application
boot.
Hardware Debug Steps
Input clocks and power sequencing
- Ensure that correct power sequencing is occurring on your board.
Power sequencing specifications can be found in the data manual.
- Check the system clock and ensure this is outputting the expected
frequency and the signal is swinging rail to rail (should be a 1.8V
signal). If you have an external oscillator, it should be outputting
a square wave at the desired frequency. If you are using a crystal ,
you should have a sine wave at the desired frequency at XTALIN.
XTALOUT should be similar (may be distorted a little).
- Check the power on reset signal PORZ. This signal should stay low
throughout the power sequencing and go high when the power AND high
frequency clock are stable.
- If the device has an OBSCLK or CLKOUT then ensure that this pin
provides the correct output that matches your software
configurations.
Boot pins:
Best way to confirm what the device ROM bootloader reads from the pins
is to read the register where the Boot pins are latched into the device:
- For AM335x/AM437x: Check the Control_status register
- For AM57xs: Check CTRL_CORE_BOOTSTRAP register
- For C66x/K2X devices: Check the DEVSTAT register
- For OMAPL13x/C674x devices: Check BOOTCFG register
Boot media connectivity
Users are required to test their boot interface by running boot loader
independent diagnostic tests that confirm that the SOC can read and
write from the boot interface. Processor SDK RTOS provides Diagnostic
utilities for K2G/AMXX devices and provides POST utility for keystone
devices with which the TI EVM was tested.
TI Technical documentation like Technical reference manual (AMXX
devices), Bootloader USer guide (for C66x/K2X devices) and Bootloader
Application notes for OMAPLxx/C674x list default behavior or the ROM
bootloader and limitations and constraints for each boot mode.
Application developers need to account for this while designing their
system to ensure smooth bring up process.
Signalling on boot media and reset pins
If software and other hardware debug steps have not helped identify the
issue, you may need to hook up a scope or protocol analyzer to check the
clocks and the data transfers from the boot media to check if there is
any issues that can be identified. Another commonly known issue that
impacts boot is noise on the power lines which may cause the SOC to
reset or cause a hang on the boot core. Provide these scope shots to TI
on E2E forums so TI engineers can confirm that there are no issues.
Software Debug Steps
SBL and app Entry points
If you don`t see your bootloader executing post boot, a good sanity
check is for you to look at the map file for the bootloader and ensure
that the entry point matches with the location in the TI or GPHeader in
the boot image. this can be done by looking at the entry point in the
MLO/_ti.bin/GPheader and ensure that it matches with the location of
symbol Entry in the .out/map file for the bootloader.
SBL and App memory map
The SBL execute from device onchip memory so if your application is also
using Onchip memory in addition to DDR memory, developers need to ensure
that the code sections in the application do not overlap with memory
sections that are used by the SBL. This can cause the SBL to hang during
the application boot process and go into an abort state.
To check what memory region is used by the SBL please locate the map
file created from building the bootloader.
Flash Programming verification
It is essential to understand that the flash programmer that you use has
not just the ability to write the image to flash but should also be able
to verify that the image written to flash matches the image that you
have created on your host machine. you can use TI flash programming
utilities as reference and ensure that the production flashing tools use
a method to erase, write and then verify the boot image that is written
to the flash.
DDR timings and configuration /SBL
The Processor SDK bootloader ships with DDR clock and timing settings
that apply to the external memory devices that have been used in TI
evaluation platforms. When running the code on custom platforms, users
may be required to change these setting to match the timings required by
custom design. We highly recommend that users create a GEL script
similar to one provided by TI and test the memory interface with the new
settings before using them in the secondary bootloader to setup external
memory. **Processor SDK
Diagnostics**
provides a mem_test that can be used to test read and writes to the
entire DDR address space for confirming the SOC EMIF settings.
Emulator based debugging of boot
The processor SDK RTOS bootloader is like any other application that can
be loaded over the emulator and debugged. Steps to connect an emulator
to the EVM have been described in the **Hardware Setup Guides**
that is linked to the Processor SDK RTOS documentation.
Loading the bootloader over emulator can be very useful step in
debugging the system boot. Before generating the final binary for
bootloader, the build generates the .out file for the bootloader which
is then formatted in a boot format that the ROM bootloader(RBL) can
interpret. This .out can be loaded over the emulator similar to any
other application. If you load the debug version of the bootloader, you
can single step through the code that initializes the SOC and also part
of the SBL code that loads the app from the boot media.
NOTE
SBL runs from onchip memory so users can load the SBL.out even without
using the GEL file but using the GEL sometimes helps with putting the
core in a clean state so usage of the GEL is optional
Alternate Approach:
Add a spinlock in SBL main
In some occasions the RBL may load the SBL but there may be some issue
that you need to debug in the SBL. In this case you can add a spinlock
loop at the start of main in SBL and allow the first stage boot to
complete normally and then connect to the core when you connect the core
will be held in the spinlock condition waiting for you to connect.
Example:
volatile int exitSpinLock = 0;
void Debug_spinLock(void)
{
while (exitSpinLock == 0) { }
}
You will then have to “release” the core by toggling the variable which
the while loop is blocking on. You can either do this manually by
halting CCS, examining the variable in the watch window and then
changing the value before continuing execution on the core, or you can
use a GEL script.
Use an IO input to stall the core until user input is received:
printf("Hit enter to continue:");
getchar();
System state at boot failure
A useful data point for TI to debug boot related issues is to isolate
commonly known initialization and to understand how far the bootloader
has executed correctly before it runs into any issues. Users are
required to capture ARM/DSP clocks, Program counter value, Entry points
detected, pinmux configuration and confirm DDR initialization and slave
core states. This helps minimize the number of variables in the system
boot and helps us zero in on the most likely cause for the boot failure.
4.6. MPM
Introduction
The Multiple Proc Manager (MPM) Package distributed with Processor SDK
RTOS installer has multiple software modules.
Broadly the modules can be grouped into two categories:
- Multi Proc Manager Linux module
- Modules that facilitate Interprocess communication between the
multiple cores.
Multi Proc Manager Linux module
The Multi Proc Manager Linux module is used to load and run DSP images
from ARM Linux user space. The download and run operations can be
exercised by using user space API calls. MPM also provides a MPM Client
Application which can be used to load and run DSP through command line.
Interprocessor Communication related packages
The Multi Proc Manager package also includes couple of software modules
that facilitates Inter processor communication between ARM running linux
and DSP running RTOS. These components provide APIs in both ARM linux as
well as on DSP RTOS.
MPM Mailbox module
Mailbox is used for exchanging control messages between the host and
individual DSP cores.
MPM Sync module
Sync Module implements support for Multicore Barriers and Locks.
4.7. OpenMP
Introduction
As of April 2016, this article is out of date. Please visit
here.
This page is intended to be the starting point for all information about
OpenMP on C6000. However, at this writing, that is not the case. The
information in this article is correct if you are using C667x devices
which only contain C66x CorePac DSPs, and not any ARM cores. If you are
using a 66AK2H device, then please see MCSDK HPC 3.x
OpenMP. OpenMP is not supported on
any other C6000 devices.
Still here? After reading this article, you will be able to execute your
own OpenMP code on C6000 under control of Code Composer Studio.
Presumptions
- You are experienced at programming OpenMP applications on hosted
systems like Windows or Linux PC’s.
- You have never programmed anything on an embedded system like those
that use C6000 devices.
- You have never used any TI development tools such as Code Composer
Studio (CCS).
Acronyms Used in This Article
- CCS - Code Composer Studio. Software development environment for
creating code to execute on TI devices.
- SYS/BIOS - Or BIOS for short. Scalable real-time kernel which runs on
the DSP.
- MCSDK - Multicore Software Development Kit. Bundles all the software
supplied by TI which runs on the DSP.
Conceptual Overview
This section discusses, at a high level, how different pieces of
software from TI work together to form the OpenMP solution.
The OpenMP source code, at the level of OpenMP pragmas and function
calls, is the same. Your code must be organized into a project, as
that term is defined by CCS. A central element of this project is the
SYS/BIOS configuration. SYS/BIOS (or BIOS for short) is a scalable
real-time kernel produced by TI. BIOS implements the multi-threading
features of OpenMP. An initial BIOS configuration (*.cfg) is supplied.
Changing this BIOS configuration may never be required. The build is
done within CCS. At the start, system execution is also done within CCS.
Besides BIOS, many other software components execute on the DSP to
comprise the OpenMP solution. All of these components are delivered
together under the name Multicore Software Development Kit (MCSDK).
Installation
Getting the MCSDK installed calls for you to install and configure
everything else, so this section focuses on the MCSDK.
Start with the general download
page for all flavors of the
MCSDK. Follow the link for SYS/BIOS MCSDK for C66x. Get MCSDK version
2.1 or later. That page includes a link to a Getting Started Guide.
That is where you will find directions on hardware setup, installing
CCS, and so on. Follow all the steps in the Getting Started Guide, up to
Running the Demonstration Application. (Actually, go ahead and run the
Demo if you want. But it isn’t required.)
Confidence Test
If you are familiar with CCS, you may skip over this section. But,
installing and configuring all that software may leave you wondering if
you did it all correctly. In this section, simplify things by pretending
your system only has one core. This allows you to check whether you have
installed most of the software correctly, while ignoring many of the
complicated details.
Please check out this set of Getting Started
Guides
just for CCS. You only need to go through one of them. Choose the one
that seems best for you. These guides provide a gentle introduction to
those who are new to CCS.
When you load and run your first program, CCS needs to know which core
to run it on. You see a dialog box similar this one:
Check the box only for core 0.
First OpenMP Project
This section walks through a simple hello world example project. Four
threads run concurrently. Each thread prints hello world and the thread
ID.
Version and HW Information
This section was developed with CCS version 5.2.0.00069, MCSDK version
2.1.0.3, and executed on an C6678 EVM. If your environment differs, you
may have to make a few adjustments.
Project Setup
In this section you create a new CCS project. This project is not
written from scratch, but uses example source files that come with CCS.
Put CCS in the Edit Perspective. Select: Window | Open Perspective |
Other | CCS Edit. To start this new project select: Project | New
CCS Project. Enter a Project Name. For Family select
C6000. For Variant, ignore the first drop-down box, and in the
second choose Generic C66xx Device. In the box just under Project
templates and examples type in hello. Under OMP Examples you will
see some Hello world example projects. Select the best one for your HW
platform. In this screen shot, the selection is for C6678. Select
Next.
The next dialog shows the RTSC Configuration Settings. If only one
version of the MCSDK is installed, then nothing more is required. If
more than one version of the MCSDK is installed, review the version
numbers of the selected packages and insure they are from the desired
MCSDK. Do not forget the drop-down box at the top for the version of the
XDCtools.
Click Finish. CCS creates the project, complete with source code,
and adds an entry to the Project Explorer window.
Project Modifications
One modification to the example project is required.
In the Project Explorer window, expand the set of files available
under the new project. Open the file omp_config.cfg by double-clicking
on it. The edit window has two tabs on the bottom left. Select the
Source tab. Find the source line which begins var OpenMP ...
Change the code as follows ...
var OpenMP = xdc.useModule('ti.omp.utils.OpenMP'); // no change
OpenMP.setNumProcessors(4); // no change
OpenMP.autoDnldCore = false; // add this line
The new line disables the feature called auto-download. A side effect of
auto-download is that printf works only on core 0.
Save the change to the configuration file by entering control+S or
selecting File | Save.
Build and Load
The target configuration that should launch when this OpenMP project is
debugged is the same one used for previous single core projects. To
check on this detail, choose View | Target Configurations. Find
that target configuration and insure it is the default.
In the Project Explorer window, insure the new project is selected.
Select the Debug icon.
Next a dialog will come up which asks which CPU cores to load the
program on. Select cores 0-3, then click OK. It will appear similar
to this ...
The following actions take place automatically:
- CCS changes to the Debug perspective
- The project is built
- The target configuration is launched
- The target connection is made
- The program is loaded on cores 0-3
- The system begins execution and runs to the start of main on core 0
Execute and See Output
Now you are ready to execute. In the Debug window, click the Resume
execution icon.
The console window will show output similar to, but not exactly the same
as, the following ...
[C66xx_0] Hello World from thread = 0
[C66xx_0] Number of threads = 4
[C66xx_1] Hello World from thread = 1
[C66xx_2] Hello World from thread = 2
[C66xx_3] Hello World from thread = 3
Because the threads are executing on the cores concurrently, there is no
control over the order in which the output appears. But you should see
all of these lines.
Tips on System Startup
If things do not go smoothly, please see the article
SystemAnalyzerTutorial7. That
article is about running a tutorial for a tool named Unified
Instrumentation Architecture (UIA). UIA is for analyzing system
performance and behavior. This tutorial contains several tips on how to
use CCS to run OpenMP programs. It is relevant to the versions of the
MCSDK components listed near the beginning.
Second OpenMP Project
Now try another project like hello world, but a bit more complicated. It
will serve as the basis for your future OpenMP projects.
Project Setup
Start it the same way as the hello world project. But give it a
different name, look for matrix among the examples, and choose the
OpenMP matrix vector multiplication example for your system.
Build and Execute
All the remaining steps are the same as with the hello world project.
Upon executing, output in the console window should appear similar to
...
[C66xx_0]
[C66xx_0] Starting values of matrix A and vector b:
[C66xx_0] A[0]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[0]= 1.0
[C66xx_0] A[1]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[1]= 2.0
[C66xx_0] A[2]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[2]= 3.0
[C66xx_0] A[3]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[3]= 4.0
[C66xx_0] A[4]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[4]= 5.0
[C66xx_0] A[5]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[5]= 6.0
[C66xx_0] A[6]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[6]= 7.0
[C66xx_0] A[7]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[7]= 8.0
[C66xx_0] A[8]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[8]= 9.0
[C66xx_0] A[9]= 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 b[9]= 10.0
[C66xx_0]
[C66xx_0] Results by thread/row:
[C66xx_0] thread 0 did row 0 c[0]=55.00 Running total= 55.00
[C66xx_3] thread 3 did row 9 c[9]=550.00 Running total= 605.00
[C66xx_1] thread 1 did row 3 c[3]=220.00 Running total= 825.00
[C66xx_0] thread 0 did row 1 c[1]=110.00 Running total= 935.00
[C66xx_1] thread 1 did row 4 c[4]=275.00 Running total= 1210.00
[C66xx_2] thread 2 did row 6 c[6]=385.00 Running total= 1595.00
[C66xx_0] thread 0 did row 2 c[2]=165.00 Running total= 1760.00
[C66xx_1] thread 1 did row 5 c[5]=330.00 Running total= 2090.00
[C66xx_2] thread 2 did row 7 c[7]=440.00 Running total= 2530.00
[C66xx_2] thread 2 did row 8 c[8]=495.00 Running total= 3025.00
[C66xx_0]
[C66xx_0] Matrix-vector total - sum of all c[] = 3025.00
[C66xx_0]
The parts before and after Results by thread/row should match,
particularly the final result of 3025.00. The thread N lines will
vary, but there should be one line for each row 0-9.
Start Your OpenMP Project
Build your OpenMP project out of the matrix multiply project. In the
Project Explorer window, select the matrix multiply project,
right-click and choose Copy. Right-click again and choose Paste.
Give the new project a name. It starts as a copy of the matrix multiply
project in every respect, except the name. Remove files, add files, and
make the project your own. Modifications to the omp_config.cfg file are
not required for base functionality.
Debugging Tips
Suppose you want to immediately execute one of those example projects
again. You need to reset the CPU cores, reload the program, and run
again. Here is a good way to do that.
In the Debug window, select cores 0-3, right-click and choose
Group Core(s).
Now reset the cores in the newly formed group. Select the group and
click the CPU Reset icon near the top right of the Debug window.
CPU Reset icon
Then reload the program with the menu selection Run | Load | Reload
Program. Now you are ready to resume execution as before. Compare with
the output you got last time, and see how some lines are in a different
order.
How to Obtain Support
Post your questions and suspected bugs to the compiler
forum
with the tag openmp. Please use the tag. Use of the tag triggers an
e-mail to the current support team. Without the tag, the issue may go
unnoticed for some time.
4.8. PKTLIB
Introduction
The packet library (PKTLIB) provides higher layer of abstraction for
underlying CPPI hardware descriptors to application layer.
Functionalities include:
- Zero copy operation for:
- Packet split/merge operations
- Cloning operations
- Headroom/Tail room addition through merge operation
- Allocations of packet buffer and descriptors during startup time
- Allows packet allocation by HW at Rx CPPI DMA
- Efficient recycling of data buffers including the case of buffers
being referenced by multiple CPPI descriptors
Modes of Operation
A pktlib heap can be created in on of the following two modes:
- Private: only visible on the core where the heap was created
- Shared: visible across multiple cores
Driver Configuration
Applications can use Pktlib_createHeap() API to create heap(s) in the
system and heap properties are specified by the Pktlib_HeapCfg
configuration structure. This configuration structure should be
populated by the application and passed to the PKTLIB module when a heap
is being created via the Pktlib_createHeap() API. Multiple heaps can
exist in the system where each heaps properties are specified by the
Pktlib_HeapCfg configuration structure.
For details about individual fields of this structure, see the Doxygen
help by opening
PDK_INSTALL_DIRpackagestiruntimepktlibdocsdoxygenhtmlindex.html.
APIs
API reference for application can be found in below file:
#include <ti/runtime/pktlib/pktlib.h>
Example
Name |
Description |
Expected Results |
pktlibUnitTest
Application |
Unit Test
application to test
all APIs
|
User observes the
output printed over
the CCS console
|
Additional References
Document |
Location |
API Reference Manual |
$(TI_PDK_INSTALL_DIR)packagesti
runtimepktlibdocsdoxygenhtml
index.html |
Release Notes |
$(TI_PDK_INSTALL_DIR)packagesti
runtimepktlibdocsReleaseNotes
_pktlib.pdf |
4.9. NWAL
Introduction
The NWAL (Network Adaptation Layer) driver provides a well-defined set
of APIs which could be used for applications interfacing with NetCP
(Network Coprocessor) module in Keystone family of SOCs (C66x, K2x).
Driver Features
- Initialization of NetCP low level driver resources
- Initialization of Packet DMA related resources associated with NetCP
- Classification of incoming packets based on L2: MAC header fields
- Classification of incoming packets based on L3: IPv4/IPv6 header
fields
- Routing of packets to host based on L4: UDP/TCP/GTP-U
- Unidirectional IPSec SA creation and deletion
- In band offload of IPSec encryption/decryption for the outgoing
packets
- Access to SA data mode acceleration for data plane applications.
- Supports offload of the following features to NETCP Hardware during
transmission of packets:
- IPv4 checksum/L4:TCP/UDP checksum/IPSec Encryption
- Redirection of packets through a specific MAC port
- Software Insertion of L2/L3/L4 header
- Upon reception of packet, module provides additional meta data
details including:
- Status of IP checksum/UDP/TCP checksum results
- Offset to L2/L3/L4 protocol offsets. Appropriate layer offset will
be valid only if classification or routing is enabled at NETCP
- Ingress MAC port information
Modes of Operation
Following modes of operations are supported by NWAL when sending control
configuration request to configure NetCP firmware. BLOCKING Mode: In
this mode, status of API request used to configure NetCP is returned
back in API call context.
Non-BLOCKING Mode: In this mode, application can invoke a separate
poll routine to retrieve status response result.
Driver Configuration
The driver configures the NWAL subsystem using the nwalGlobCfg_t
structure.
This structure must be initialized before the nwal_create() function API
is called and cannot be changed afterwards. For details regarding
individual fields of this structure, see the Doxygen help by opening
PDK_INSTALL_DIRpackagestidrvnwaldocsdoxygenhtmlindex.html.
APIs
API reference for application can be found in below file:
#include <ti/drv/nwal/nwal.h>
Example
Name |
Description |
Expected Results |
nwalUnitTest
Application |
Unit Test
application to test
all APIs
|
User observes the
output printed over
the CCS console
|
Additional References
Document |
Location |
API Reference Manual |
$(TI_PDK_INSTALL_DIR)packagesti
drvnwaldocsdoxygenhtmlindex
.html |
Release Notes |
$(TI_PDK_INSTALL_DIR)packagesti
drvnwaldocsReleaseNotes_NWAL_
LLD.pdf |