Spru 095 C
Spru 095 C
Spru 095 C
Boot ROM
Reference Guide
IMPORTANT NOTICE
Texas Instruments Incorporated and its subsidiaries (TI) reserve the right to make corrections,
modifications, enhancements, improvements, and other changes to its products and services at any
time and to discontinue any product or service without notice. Customers should obtain the latest
relevant information before placing orders and should verify that such information is current and
complete. All products are sold subject to TIs terms and conditions of sale supplied at the time of order
acknowledgment.
TI warrants performance of its hardware products to the specifications applicable at the time of sale
in accordance with TIs standard warranty. Testing and other quality control techniques are used to the
extent TI deems necessary to support this warranty. Except where mandated by government
requirements, testing of all parameters of each product is not necessarily performed.
TI assumes no liability for applications assistance or customer product design. Customers are
responsible for their products and applications using TI components. To minimize the risks associated
with customer products and applications, customers should provide adequate design and operating
safeguards.
TI does not warrant or represent that any license, either express or implied, is granted under any TI
patent right, copyright, mask work right, or other TI intellectual property right relating to any
combination, machine, or process in which TI products or services are used. Information published by
TI regarding third-party products or services does not constitute a license from TI to use such products
or services or a warranty or endorsement thereof. Use of such information may require a license from
a third party under the patents or other intellectual property of the third party, or a license from TI under
the patents or other intellectual property of TI.
Reproduction of information in TI data books or data sheets is permissible only if reproduction is without
alteration and is accompanied by all associated warranties, conditions, limitations, and notices.
Reproduction of this information with alteration is an unfair and deceptive business practice. TI is not
responsible or liable for such altered documentation.
Resale of TI products or services with statements different from or beyond the parameters stated by
TI for that product or service voids all express and any implied warranties for the associated TI product
or service and is an unfair and deceptive business practice. TI is not responsible or liable for any such
statements.
Following are URLs where you can obtain information on other Texas Instruments products and
application solutions:
Products
Applications
Amplifiers
amplifier.ti.com
Audio
www.ti.com/audio
Data Converters
dataconverter.ti.com
Automotive
www.ti.com/automotive
DSP
dsp.ti.com
Broadband
www.ti.com/broadband
Interface
interface.ti.com
Digital Control
www.ti.com/digitalcontrol
Logic
logic.ti.com
Military
www.ti.com/military
Power Mgmt
power.ti.com
Optical Networking
www.ti.com/opticalnetwork
Microcontrollers
microcontroller.ti.com
Security
www.ti.com/security
www.ti.com/lpw
Telephony
www.ti.com/telephony
Mailing Address:
www.ti.com/video
Wireless
www.ti.com/wireless
Texas Instruments
Post Office Box 655303 Dallas, Texas 75265
Contents
Contents
1
Bootloader Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1
Bootloader Functional Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2
Bootloader Device Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1 PLL Multiplier Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.2 Watchdog Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.3 PIE Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.4 Reserved Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3
Bootloader Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4
Bootloader Data Stream Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5
General Structure of Source Program Data Stream in 8-Bit Mode . . . . . . . . . . . . . . . . . .
4.6
Basic Transfer Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7
InitBoot Assembly Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.8
SelectBootMode Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.9
SCI_Boot Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.10 Parallel_Boot Function (GPIO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.11 SPI_Boot Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.12 ExitBoot Assembly Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
14
16
17
17
17
17
17
21
25
28
30
30
34
37
43
47
Figures
Figures
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
10
12
15
19
20
20
20
29
30
33
34
35
36
37
37
38
39
40
41
42
43
45
46
47
48
Tables
Tables
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Memory Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vector Locations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configuration for Device Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Boot Mode Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
General Structure Of Source Program Data Stream In 16-Bit Mode . . . . . . . . . . . . . . . . . . . . .
LSB/MSB Loading Sequence in 8-Bit Data Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
GPIO Pin Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SPI 8-Bit Data Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CPU Register Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Boot-Loader Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contents
11
13
17
18
22
25
31
43
49
51
Boot ROM
This reference guide is applicable for the Boot ROM found on the
TMS320x281x generation of processors in the TMS320C2000 platform and
includes associated code in a separate file (spru095c.zip). This includes all
Flash-based, ROM-based, and RAM-based devices within the 281x
generation.
The Boot ROM is factory-programmed with boot-loading software. Boot-mode
signals (general purpose I/Os) are used to tell the bootloader software what
mode to use on power up. The 281x Boot ROM also contains standard math
tables, such as SIN/COS waveforms for use in IQ math related algorithms.
This guide describes the purpose and features of the bootloader. It also
describes other contents of the device on-chip boot ROM and identifies where
all of the information is located within that memory.
1.1
1.2
Bootloader functions
Version number, release date and checksum
Reset vector
CPU vector table (Used for test purposes only)
IQmath Tables
3K x 16 of boot ROM memory is reserved for math tables and future upgrades. These math tables and in the future math functions are intended to
help with performance and save RAM space.
Boot ROM
SPRU095C
The 281x boot ROM includes math tables that are used by the Texas Instrumentst TMS320C28xt IQmath Library. The 28x IQmath Library is a
collection of highly optimized and high precision mathematical functions
for C/C++ programmers to seamlessly port a floating-point algorithm into
fixed-point code on TMS320C28x devices.
These routines are typically used in computational-intensive real-time applications where optimal execution speed and high accuracy is critical. By
using these routines you can achieve execution speeds that are considerably faster than equivalent code written in standard ANSI C language. In
addition, by providing ready-to-use high precision functions, the TI IQmath
Library can shorten significantly your DSP application development time.
The 28x IQmath Library (literature number SPRC087), can be downloaded from the TI website.
The following math tables are included in the 281x Boot ROM.
J
Sin/Cos Table:
Table size:
1282 words
Q format:
Q30
Contents:
This is useful for accurate sin wave generation and 32-bit FFTs. This
can also be used for 16-bit math, just skip over every second value.
J
528 words
Q format:
Q29
Contents:
This table is used as an initial estimate in the Newton-Raphson inverse algorithm. By using a more accurate estimate the convergence
is quicker and hence cycle time is faster.
J
274 words
Q format:
Q30
Contents:
Boot ROM
452 words
Q format:
Q30
Contents
This table is used as an initial estimate in the Arctan iterative algorithm. By using a more accurate estimate the convergence is quicker
and hence cycle time is faster.
J
360 words
Q format:
Q30
Contents
Figure 1 shows the memory map of the on-chip ROM for the F2810/12. The
memory block is 4Kx16 in size and is located at 0x3F F000 0x3F FFFF in both
program and data space when the MPNMC status bit is low.
Figure 1.
Section start
address
Prog space
Sin/Cos
(644 x 16)
0x3F F000
Normalized inverse
(528 x 16)
0x3F F502
0x3F F712
Normalized actan
(452 x 16)
0x3F F834
0x3F F9E8
Reserved
0x3F FB50
0x3F FC00
Bootloader functions
1K x 16
ROM version
ROM checksum
Reset vector
CPU vector table
(64 x 16)
0x3F FFC0
0x3F FFFF
10
Boot ROM
SPRU095C
Table 1.
SPRU095C
Memory Addresses
Address
Contents
0x3F FFBA
0x3F FFBB
0x3F FFBC
0x3F FFBD
...
0x3F FFBE
...
0x3F FFBF
Boot ROM
11
Figure 2.
Reset vector
CPU vector table
0x3F F000
0x3F FC00
0x3F FFC0
0x3F FFFF
Notes:
1) The VMAP bit is located in Status Register 1 (ST1). On the 281x devices, VMAP is always 1 on reset. It can be
changed after reset by software, however the normal operating mode will be to leave VMAP = 1.
2) On the 2812, XMPNMC is available externally; on the 2810 and 2811, it is tied low internally. On reset, the state of
the XMPNMC input signal is latched into the MPNMC status bit in the XINTCNF2 register where it can be changed
by software.
3) The ENPIE bit is located in the PIECTRL register. The default state of this bit at reset is 0, which disables the Peripheral Interrupt Expansion block (PIE).
The only vector that will normally be handled from the internal boot ROM
memory is the reset vector located at 0x3F FFC0. The reset vector is factory
programmed to point to the InitBoot function. This function starts the boot load
process. A series of checking operations is performed on General Purpose I/O
(GPIO I/O) pins to determine which boot mode to use. This boot mode
selection is described in the next section of this document.
The remaining vectors in the ROM are not used during normal operation on
the 281x devices. After the boot process is complete, you should initialize the
Peripheral Interrupt Expansion (PIE) vector table and enable the PIE block.
From that point on, all vectors, except reset, will be fetched from the PIE
module and not the CPU vector table shown here.
For TI silicon debug and test purposes the vectors located in the boot ROM
memory point to locations in the M0 SARAM block as described in the following
table. During silicon debug, you can program the specified locations in M0 with
branch instructions to catch any vectors fetched from boot ROM. This is not
required for normal device operation.
12
Boot ROM
SPRU095C
Table 2.
Vector Locations
Vector
Location in
Boot ROM
RESET
0x3F FFC0
INT1
Contents
(i.e., points
to)
Vector
Location in
Boot ROM
Contents
(ie points to)
InitBoot
(0x3F FC00)
RTOSINT
0x3F FFE0
0x00 0060
0x3F FFC2
0x00 0042
Reserved
0x3F FFE2
0x00 0062
INT2
0x3F FFC4
0x00 0044
NMI
0x3F FFE4
0x00 0064
INT3
0x3F FFC6
0x00 0046
ILLEGAL
0x3F FFE6
0x00 0066
INT4
0x3F FFC8
0x00 0048
USER1
0x3F FFE8
0x00 0068
INT5
0x3F FFCA
0x00 004A
USER2
0x3F FFEA
0x00 006A
INT6
0x3F FFCC
0x00 004C
USER3
0x3F FFEC
0x00 006C
INT7
0x3F FFCE
0x00 004E
USER4
0x3F FFEE
0x00 006E
INT8
0x3F FFD0
0x00 0050
USER5
0x3F FFF0
0x00 0070
INT9
0x3F FFD2
0x00 0052
USER6
0x3F FFF2
0x00 0072
INT10
0x3F FFD4
0x00 0054
USER7
0x3F FFF4
0x00 0074
INT11
0x3F FFD6
0x00 0056
USER8
0x3F FFF6
0x00 0076
INT12
0x3F FFD8
0x00 0058
USER9
0x3F FFF8
0x00 0078
INT13
0x3F FFDA
0x00 005A
USER10
0x3F FFFA
0x00 007A
INT14
0x3F FFDC
0x00 005C
USER11
0x3F FFFC
0x00 007C
DLOGINT
0x3F FFDE
0x00 005E
USER12
0x3F FFFE
0x00 007E
SPRU095C
Boot ROM
13
Bootloader Features
Bootloader Features
This section describes in detail the boot mode selection process, as well as
the specifics of boot loader operation.
4.1
14
Boot ROM
SPRU095C
Bootloader Features
Figure 3.
Reset
(power-on reset
or warm reset
Silicon sets the following:
PIE disabled (ENPIE0)
VMAP=1
OBJMODE=0
AMODE=0
MOM1MAP=1
XMPNMC
input signal=0
?
No
(2812 only)
Reset vector fetched
from XINTF zone 7
address 0x3FFFC0
Boot determined by
your application
You must configure
proper operating mode
of the device
SelectBootMode
function
Boot determined by
the state of
I/O pins
Begin execution at
EntryPoint as
determined by
selected boot mode
Yes
Boot ROM
Reset vector fetched
from boot ROM address
0x3F FFC0
Jump to InitBoot
function to start
boot process
Note:
On the F2810 the XMPNMC input signal is tied low internally on the device, and therefore boot from reset is always from
the internal boot ROM.
At reset, the value of the XMPNMC pin is sampled. The state of this pin
determines whether boot ROM or XINTF Zone 7 is enabled at reset.
If XMPNMC = 1 (Micro-Processor Mode) then Zone 7 is enabled and the reset
vector will be fetched from external memory. In this case, you must ensure that
the reset vector points to a valid memory location for code execution. This
option is only available on devices with an XINTF.
If XMPNMC = 0 (Micro-Computer Mode) then the boot ROM memory is
enabled and XINTF Zone 7 is disabled. In this case, the reset vector is fetched
from the internal boot ROM memory. All devices without an XINTF module
have the XMPNMC signal tied low internal to the device such that the boot
ROM memory is always enabled at reset.
The reset vector in boot ROM redirects program execution to the InitBoot
function. After performing device initialization the boot loader will check the
state of GPIO pins to determine which boot mode you want to execute. Options
include: Jump to Flash, Jump to H0 SARAM, Jump to OTP or call one of the
on-chip boot loading routines.
SPRU095C
Boot ROM
15
Bootloader Features
After the selection process and if required boot loading is complete, the
processor will continue execution at an entry point determined by the boot
mode selected. If a boot loader was called, then the input stream loaded by
the peripheral determines this entry address. This data stream is described in
section 2.4.3. If, instead, you choose to boot directly to Flash, OTP, or H0
SARAM, the entry address is predefined for each of these memory blocks.
The following sections discuss in detail the different boot modes available and
the process used for loading data code into the device.
4.2
configure the device for 28x operating mode or C2xLP source compatible
mode as appropriate.
The configuration required for each operating mode is summarized in Table 3.
16
Boot ROM
SPRU095C
Bootloader Features
Table 3.
28x Mode
C2xLP Source
Compatible Mode
OBJMODE
AMODE
PAGE0
M0M1MAP
Other Settings
SXM = 1
C=1
SPM = 0
Normally for 27x compatibility, the M0M1MAP would be 0. On the 281x; however, it is tied off high
internally. Thus at reset M0M1MAP is always configured for 28x mode on these devices.
4.2.1
4.2.2
Watchdog Module
When branching directly to flash, H0 single-access RAM (SARAM), or
one-time-programmable (OTP) memory, the watchdog will not be touched. In
the other boot modes, the watchdog will be disabled before booting and then
re-enabled and cleared before branching to the final destination address.
4.2.3
PIE Configuration
The boot modes do not enable the PIE. It is left in its default state, which is
disabled.
4.2.4
Reserved Memory
The first 80 words of the M1 memory block (address 0x400 0x44F) are
reserved for stack use during the boot load process. If code is bootloaded into
this region there is no error checking to prevent it from corrupting the Boot
ROM stack.
4.3
Bootloader Modes
To accommodate different system requirements, the 281x boot ROM offers a
variety of different boot modes. This section describes the different boot
SPRU095C
Boot ROM
17
Bootloader Features
modes and gives brief summary of their functional operation. The state of four
GPIO pins are used to determine the boot mode desired as shown in Table 4.
Table 4.
GPIOF4
GPIOF12
GPIOF3
GPIOF2
(SCITXDA)
(MDXA)
(SPISTEA)
(SPICLK)
PU
No PU
No PU
No PU
Mode Selected
Jump to Flash address 0x3F 7FF6
You must have programmed a branch instruction
here prior to reset to re-direct code execution as
desired.
Notes:
1) PU = pin has an internal pullup No PU = pin does not have an internal pullup
2) You must take extra care due to any affect toggling SPICLK in order to select a boot mode may have on external
logic.
3) If the boot mode selected is Flash, H0 or OTP, then no external code is loaded by the bootloader.
18
Boot ROM
SPRU095C
Bootloader Features
Figure 4.
InitBoot
Call
SelectBootMode
Call
Boot Loader
?
Yes
Call
Boot Loader
SCI, SPI or
parallel I/O
Read
Entry Point
and load
data/code
No
EntryPoint determined
directly from state of
I/O pins
Call
ExitBoot
Begin execution
at EntryPoint
The following boot modes do not call a boot loader. Instead, they jump to a
predefined location in memory:
- Jump to branch instruction in Flash Memory:
In this mode, the boot ROM software will configure the device for 28x operation and then branch directly to location 0x3F 7FF6 in Flash memory.
This location is just before the 128-bit code security module (CSM) password locations. You are required to have previously programmed a branch
instruction at location 0x3F 7FF6 that will redirect code execution to either
a custom boot-loader or the application code.
On 281x RAM devices, the boot-to-Flash option jumps to reserved
memory and should not be used. On 281x ROM devices, the boot-to-Flash
option jumps to the location 0x3F 7FF6 in ROM.
SPRU095C
Boot ROM
19
Bootloader Features
Figure 5.
Reset
InitBoot
SelectBootMode
Select jump
to flash
ExitBoot
Jump to
0x3F 7FF6
User
programmed
branch to
desired
location
- Jump to H0 SARAM
In this mode, the boot ROM software will configure the device for 28x operation and then branch directly to 0x3F 8000; the first address in the H0
SARAM memory block.
Figure 6.
Reset
InitBoot
SelectBootMode
Select jump
to HO SARAM
ExitBoot
Jump to
0x3F 8000
Execution
continues
In this mode, the boot ROM software will configure the device for C28x operation and then branch directly to at 0x3D 7800; the first address in the
OTP memory block.
On 281x ROM devices, the boot-to-OTP option jumps to address
0x3D 7800 in OTP. On 281x RAM devices, the boot-to-OTP option jumps
to reserved memory and should not be used.
Figure 7.
Reset
InitBoot
SelectBootMode
Select jump
to OTP
ExitBoot
Jump to
0x3D 7800
Execute
preprogrammed
OTP code
In this mode, the boot ROM will load code to be executed into on-chip
memory via the SCI-A port.
- SPI EEPROM Boot Mode:
In this mode, the boot ROM will load code and data into on-chip memory
from an external EEPROM via the SPI port.
- Boot from GPIO Port:
In this mode, the boot ROM uses a GPIO port B to load code and data from
an external source. This mode supports both 8-bit and 16-bit data
20
Boot ROM
SPRU095C
Bootloader Features
4.4
SPRU095C
Boot ROM
21
Bootloader Features
loader will return the entry point address to the calling routine which in turn will
cleanup and exit. Execution will then continue at the entry point address as
determined by the input data stream contents.
Table 5.
Word
Contents
10
11
12
Block size (number of words) of the first block of data to load. If the block size is 0, this
indicates the end of the source program. Otherwise another section follows.
13
14
15
22
Boot ROM
SPRU095C
Bootloader Features
Table 5.
Word
SPRU095C
Boot ROM
23
Bootloader Features
After load has completed the following memory values will have been
initialized as follows:
Location Value
0x3F9010 0x0001
0x3F9011 0x0002
0x3F9012 0x0003
0x3F9013 0x0004
0x3F9014 0x0005
0x3F8000 0x7700
0x3F8001 0x7625
PC
Begins execution at 0x3F8000
24
Boot ROM
SPRU095C
Bootloader Features
4.5
Table 6.
Byte
17
18
19
20
21
22
23
LSB: Block size in words of the first block to load. If the block size is 0, this indicates the
end of the source program. Otherwise another block follows. For example, a block size
of 0x000A would indicate 10 words or 20 bytes in the block.
24
25
26
27
28
29
30
SPRU095C
LSB: Last word of the first block of the source being loaded
Boot ROM
25
Bootloader Features
Table 6.
Byte
26
Contents
MSB: Last word of the first block of the source being loaded
LSB: Last word of the second block of the source being loaded
MSB: Last word of the second block of the source being loaded
Boot ROM
SPRU095C
Bootloader Features
Table 6.
Byte
LSB: Last word of the last block of the source being loaded
MSB: Last word of the last block of the source being loaded
LSB: 00h
n+1
SPRU095C
Boot ROM
27
Bootloader Features
02
00
3F
00
00
80
00
77
25
76
00
00
After load has completed the following memory values will have been
initialized as follows:
Location
0x3F9010
0x3F9011
0x3F9012
0x3F9013
0x3F9014
0x3F8000
0x3F8001
PC
4.6
Value
0x0001
0x0002
0x0003
0x0004
0x0005
0x7700
0x7625
Begins execution at 0x3F8000
28
Boot ROM
SPRU095C
Bootloader Features
Figure 8.
W1=
0x10AA
?
No
Yes
W2:W1=
0x08AA
?
8-bit
DataSize
No
Yes
R=0
?
Yes
Return
EntryPoint
No
Read BlockAddress
Transfer R words of
data from source to
destination
Notes:
1) 8-bit and 16-bit transfers are not valid for all boot modes. Refer to the info specific to a particular boot loader for any
limitations.
2) In 8-bit mode the LSB of the 16-bit word is read first followed by the MSB.
SPRU095C
Boot ROM
29
Bootloader Features
4.7
Figure 9.
Initialize device
OBJMODE=1
AMODE=0
MOM1MAP=1
DP=0
OVM=0
SPM=0
SP=0x400
4.8
Dummy read of
CSM password
locations
Call
SelectBootMode
Call
ExitBoot
SelectBootMode Function
To determine the desired boot mode, the SelectBootMode function examines
the state of 4 GPIO pins as shown in Table 7. These pins are all part of GPIO
Port F and are normally output pins when used in their peripheral function
(shown in parenthesis).
30
Boot ROM
SPRU095C
Bootloader Features
Table 7.
GPIOF4
GPIOF12
GPIOF3
GPIOF2
(SCITXDA)
(MDXA)
(SPISTEA)
(SPICLK)
PU
No PU
No PU
No PU
Mode Selected
Jump to Flash address 0x3F 7FF6
You must have programmed a branch instruction
here prior to reset to redirect code execution as
desired
Notes:
1) When booting directly to Flash is assumed that you have previously programmed a branch statement at 0x3F 7FF6
to redirect program flow as desired.
2) When booting directly to OTP or H0, it is assumed that you have previously programmed or loaded code starting
at the entry point location.
3) x = dont care
4) You must take extra care due to any affect toggling SPICLK in order to select a boot mode may have on external
logic.
5) PU = pin has an internal pull-up resister. No PU = pin does not have an internal pull-up resistor
For a boot mode to be selected, the pins corresponding to the desired boot
mode have to be pulled low or high until the selection process completes. Note
that the state of the selection pins is not latched at reset; they are sampled
some cycles later in the SelectBootMode function.
The SelectBootMode routine disables the watchdog before calling the SCI,
SPI or Parallel boot loader. If a boot loader is not going to be called, then the
watchdog is left untouched. The boot loaders do not service the watchdog
and assume that it is disabled. Before exiting the SelectBootMode routine
will re-enable the watchdog and reset its timer.
When selecting a boot mode, the pins should be pulled high or low through a
weak pulldown or weak pull-up such that the DSP can drive them to a new state
when required. For example, if you wanted to boot from the SCI one of the pins
you pull low is the SCITXDA pin. This pulldown must be weak so that when the
SCI boot process begins the DSP will be able to properly transmit through the
TX pin. Likewise for the remaining boot mode selection pins.
SPRU095C
Boot ROM
31
Bootloader Features
You must take extra care if you use SPICLK to select a boot mode. Toggling
of this signal may have an affect on external logic and this must be taken into
account.
32
Boot ROM
SPRU095C
Bootloader Features
Figure 10.
SelectBootMode
FLASH
boot
?
Yes
Return
FLASH_ENTRY_POINT
EntryAddr: 0x3F 7FF6
No
HO
boot
?
Yes
Return
HO_ENTRY_POINT
EntryAddr: 0x3F 8000
Yes
Return
OTP_ENTRY_POINT
EntryAddr: 0x3F 7800
Yes
Call
SCI_Boot
No
OTP
boot
?
No
Call
WatchDogDisable
SCI
boot
?
No
SPI
boot
?
No
Call
Parallel_Boot
SPRU095C
Yes
Call
SPI_Boot
Return EntryAddr as
determined by boot
loader called
Boot ROM
33
Bootloader Features
4.9
SCI_Boot Function
The SCI boot mode asynchronously transfers code from SCI-A to internal or
XINTF memory. This boot mode only supports an incoming 8-bit data stream
and follows the same data flow as outlined in Example 1.
Figure 11.
SCITXDA
Host
(Data and program
source)
34
Boot ROM
SPRU095C
Bootloader Features
Figure 12.
Read KeyValue
Enable the SCIA TX and
RX pin functionality
Valid
KeyValue
(0x08AA)
?
No
Yes
Call SCIA_CopyData
No
Autobaud
lock
?
Yes
SPRU095C
Return
FLASH_ENTRY_POINT
Return
EntryPoint
Boot ROM
35
Bootloader Features
Figure 13.
Call SCIA_GetWordData
to read
BlockHeader.BlockSize
BlockSize=
0x0000
?
Yes
Return
No
Call SCIA_GetLongData
to read
BlockHeader.DestAddr
Transfer
BlockHeader.BlockSize
words of data from
SCIA port to memory
starting at DestAddr
36
Boot ROM
SPRU095C
Bootloader Features
Figure 14.
SCIA_GetWordData
Data
Received
?
No
Yes
Read LSB
Data
Received
?
Echoback LSB
to host
No
Yes
Read MSB
Echoback MSB
to host
4.10
Return MSB:LSB
Figure 15.
281x
Host
(Data and program
source)
The 28x communicates with the external host device by polling/driving the
GPIOD5 and GPIOD6 lines. The handshake protocol shown in Figure 16 must
be used to successfully transfer each word via GPIO port B. This protocol is
very robust and allows for a slower or faster host to communicate with the 281x
device.
If the 8-bit mode is selected, two consecutive 8-bit words are read to form a
single 16-bit word. The most significant byte (MSB) is read first followed by the
SPRU095C
Boot ROM
37
Bootloader Features
least significant byte (LSB). In this case, data is read from the lower eight lines
of GPIO port B ignoring the higher byte.
The DSP first signals the host that the DSP is ready to begin data transfer by
pulling the GPIOD6 pin low. The host load then initiates the data transfer by
pulling the GPIOD5 pin low. The complete protocol is shown in the diagram
below:
Figure 16.
Host control
GPIOD5
DSP control
GPIOD6
1) The DSP indicates it is ready to start receiving data by pulling the GPIOD6
pin low.
2) The boot loader waits until the host puts data on GPIO port B. The host
signals to the DSP that data is ready by pulling the GPIOD5 pin low.
3) The DSP reads the data and signals the host that the read is complete by
pulling GPIOD6 high.
4) The Boot loader waits until the Host acknowledges the DSP by pulling
GPIOD5 high.
5) The DSP again indicates it is ready for more data by pulling the GPIOD6
pin low.
This process is repeated for each data value to be sent.
Figure 17 shows an overview of the Parallel GPIO boot loader flow.
38
Boot ROM
SPRU095C
Bootloader Features
Figure 17.
Read EntryPoint
address
Read KeyValue to
determine DataSize
Call
Parallel_CopyData
Return
FLASH_ENTRY_POINT
No
Valid
KeyValue
(0x08AA or
0x10AA)
?
Yes
Return
EntryPoint
Figure 18 shows the transfer flow from the Host side. The operating speed of
the CPU and Host are not critical in this mode as the host will wait for the DSP
and the DSP will in turn wait for the host. In this manner the protocol will work
with both a host running faster and a host running slower then the DSP.
SPRU095C
Boot ROM
39
Bootloader Features
Figure 18.
No
DSP ready
(GPIOD6=0)
?
Yes
No
DSP ack
(GPIOD6=1)
?
Yes
Acknowledge DSP
(GPIOD5=1)
More
data
?
Yes
No
End transfer
40
Boot ROM
SPRU095C
Bootloader Features
Figure 19.
Parallel_CopyData
Call
Parallel_GetWordData
to read
BlockHeader.BlockSize
BlockSize=
0x0000
?
Yes
Return
No
Call
Parallel_GetLongData
to read
BlockHeader.DestAddr
Transfer
BlockHeader.BlockSize
words of data from
GPIO B port to memory
starting at DestAddr
Figure 20 shows the flow for fetching a single word of data from the parallel
port.
The routine is passed a DataSize parameter of 8 bits or 16 bits. The routine
follows the previously defined protocol flow to read 16 bits from the GPIO B
port. If the DataSize is 16 bits, then the routine will pass this 16-bit value back
to the calling routine.
If the DataSize parameter is 8 bits, then the routine will and discard the upper
8 bits of the first read and treat the lower 8 bits as the least significant byte
(LSB) of the word to be fetched. The routine will then perform a 2nd fetch to
read the most significant byte (MSB). It then combines the MSB and LSB into
a single 16-bit value to be passed back to the calling routine.
SPRU095C
Boot ROM
41
Bootloader Features
Figure 20.
Data
ready
(GPIO5=0)
?
No
Data
ready
(GPIO5=0)
?
Yes
Yes
Host
Ack
(GPIO5=1)
?
No
No
Host
Ack
(GPIO5=1)
?
No
Yes
Yes
Data
size=8 bits
?
Yes
WordData=MSB;LSB
A
No
Return WordData
42
Boot ROM
SPRU095C
Bootloader Features
4.11
SPI_Boot Function
The SPI loader expects an 8-bit wide SPI-compatible serial EEPROM device
to be present on the SPI pins as indicated in Figure 21. The SPI bootloader
does not support a 16-bit data stream.
Figure 21.
SPI Loader
SPISIMOA
281x
SPISOMIA
SPICLKA
SPIESTEA/GPIOF3
Serial SPI
EEPROM
DIN
DOUT
CLK
CS
The SPI boot ROM loader initializes the SPI module to interface to a serial SPI
EEPROM. Devices of this type include, but are not limited to, the Xicor X25320
(4Kx8) and Xicor X25256 (32Kx8) SPI serial SPI EEPROMs.
The SPI boot ROM loader initializes the SPI with the following settings: FIFO
enabled, 8-bit character, internal SPICLK master mode and talk mode, clock
phase = 0, polarity = 0, using the slowest baud rate.
If the download is to be preformed from an SPI port on another device, then
that device must be setup to operate in the slave mode and mimic a serial SPI
EEPROM. Immediately after entering the SPI_Boot function, the pin functions
for the SPI pins are set to primary and the SPI is initialized. The initialization
is done at the slowest speed possible. Once the SPI is initialized and the key
value read, you could specify a change in baud rate or low speed peripheral
clock.
Table 8.
Byte
LSB = LOSPCP
MSB= SPIBRR
LSB = reserved
MSB = reserved
SPRU095C
Boot ROM
43
Bootloader Features
Table 8.
Byte
Contents
17
18
19
20
21
22
The data transfer is done in burst mode from the serial SPI EEPROM. The
transfer is carried out entirely in byte mode (SPI at 8 bits/character). A step-by
step description of the sequence follows:
1) The SPI-A port is initialized
2) The GPIOF3 pin is now used as a chip-select for the serial SPI EEPROM
3) The SPI-A outputs a read command for the serial SPI EEPROM
4) The SPI-A sends the serial SPI EEPROM an address 0x0000; that is, the
host requires that the EEPROM must have the downloadable packet starting at address 0x0000 in the EEPROM.
5) The next word fetched must match the key value for an 8-bit data stream
(0x08AA).
The least significant byte of this word is the byte read first and the most
significant byte is the next byte fetched. This is true of all word transfers on
the SPI.
If the key value does not match then the load is aborted and the entry point
for the Flash (0x3F 7FF6) is returned to the calling routine.
6) The next 2 bytes fetched can be used to change the value of the low speed
peripheral clock register (LOSPCP) and the SPI Baud rate register
(SPIBRR). The first byte read is the LOSPCP value and the 2nd byte read
is the SPIBRR value.
The next 7 words are reserved for future enhancements. The SPI boot
loader reads these 7 words and discards them.
44
Boot ROM
SPRU095C
Bootloader Features
7) The next 2 words makeup the 32-bit entry point address where execution
will continue after the boot load process is complete. This is typically the
entry point for the program being downloaded through the SPI port.
8) Multiple blocks of code and data are then copied into memory from the external serial SPI EEPROM through the SPI port. The blocks of code are
organized in the standard data stream structure presented earlier. This is
done until a block size of 0x0000 is encountered. At that point in time the
entry point address is returned to the calling routine that then exits the boot
loader and resumes execution at the address specified.
Figure 22.
SPI_Boot
Enable SPISIMOA,
SPISOMI and SPICLKA
pin functionality
Valid
KeyValue
(0x08AA)
?
No
Return
FLASH_ENTRY_POINT
Yes
Read LOSPCP value
Requested
LOSPCP !=2
?
No
Change LOSPCP
Yes
Requested
SPIBRR !=
0x7F?
No
Change SPIBRR
Yes
Enable EEPROM
Send read command and
start at EEPROM address
0x0000
Read KeyValue
Read EntryPoint
address
SPRU095C
Call SPIA_CopyData
Return
EntryPoint
Boot ROM
45
Bootloader Features
Figure 23.
Call
SPIA_GetWordData
to read
BlockHeader.BlockSize
BlockSize=
0x0000
?
Yes
Return
No
Call
SPIA_GetLongData
to read
BlockHeader.DestAddr
Transfer
BlockHeader.BlockSize
words of data from
SPIA port to memory
starting at DestAddr
46
Boot ROM
SPRU095C
Bootloader Features
Figure 24.
SPIA_GetWordData
Send dummy
character
Data
Received
?
No
Yes
Read LSB
Send dummy
character
Data
Received
?
No
Yes
Read MSB
Return MSB:LSB
4.12
SPRU095C
Boot ROM
47
Bootloader Features
Figure 25.
Call
BootLoader
?
Yes
No
Call ExitBoot
Cleanup CPU
registers to default
value after reset*
Dealocate stack
(SP=0x400)
Branch to EntryPoint
Begin execution
at EntryPoint
48
Boot ROM
SPRU095C
Bootloader Features
After the ExitBoot routine completes and the program flow is redirected to the
entry point address, the CPU registers will have the following values:
Table 9.
Register
Value
Register
Value
ACC
0x0000 0000
0x0000 0000
XT
0x0000 0000
RPC
0x00 0000
XAR0XAR7
0x0000 0000
DP
0x0000
ST0
0x0000
15:10 OVC = 0
9:7 PM = 0
6
V = 0
5
N = 0
4
Z = 0
3
C = 0
2 TC = 0
1 OVM = 0
0 SXM = 0
ST1
0x0A0B
15:13 ARP = 0
12
XF = 0
11 M0M1MAP = 1
SPRU095C
10
reserved
9 OBJMODE = 1
8
AMODE = 0
7 IDLESTAT = 0
6
EALLOW = 0
5
LOOP = 0
4
SPA = 0
3
VMAP = 1
2
PAGE0 = 0
1
DBGM = 1
0
INTM = 1
Boot ROM
49
50
Boot ROM
SPRU095C
Description
boot
Convert all sections into bootable form (use instead of a SECTIONS directive)
sci8
Specify the source of the boot loader table as the SCI-A port, 8-bit mode
spi8
Specify the source of the boot loader table as the SPI-A port, 8-bit mode
gpio8
Specify the source of the boot loader table as the GP I/O port, 8-bit mode
gpio16
Specify the source of the boot loader table as the GP I/O port, 16-bit mode
bootorg value
lospcp value
Specify the initial value for the LOSPCP register. This value is used only for the spi8
boot table format and ignored for all other formats. If the value is greater than 0x7F,
the value is truncated to 0x7F.
spibrr value
Specify the initial value for the SPIBRR register. This value is used only for the spi8
boot table format and ignored for all other formats. If the value is greater than 0x7F,
the value is truncated to 0x7F.
e value
Specify the entry point at which to begin execution after boot loading. The value can
be an address or a global symbol. This value is optional. The entry point can be
defined at compile time using the linker e option to assign the entry point to a
global symbol. The entry point for a C program is normally c.intOO unless defined
otherwise by the e linker option.
SPRU095C
Boot ROM
51
//###########################################################################
//
// FILE:
F2812_Boot.h
//
// TITLE:
F2812 Boot ROM Definitions.
//
//###########################################################################
//
// Ver | dd mmm yyyy |
Who
| Description of changes
// =====|=============|==============|=======================================
// 0.1 | 30 Jan 2002 | LH
| Original Release.
// |||
//
|
|
|
//
//###########################################################################
#ifndef F2812_BOOT_H
#define F2812_BOOT_H
//
// Fixed boot entry points:
//
#define FLASH_ENTRY_POINT 0x3F7FF6
#define OTP_ENTRY_POINT
0x3D7800
#define H0_ENTRY_POINT
0x3F8000
#define PASSWORD_LOCATION 0x3F7FF8
// Misc definitions
#define ERROR
1
#define NO_ERROR
0
#define EIGHT_BIT
8
#define SIXTEEN_BIT
16
#define EIGHT_BIT_HEADER
0x08AA
#define SIXTEEN_BIT_HEADER 0x10AA
//
// Common CPU Definitions:
//
#define
EALLOW
asm( EALLOW);
#define
EDIS
asm( EDIS);
typedef int
i16;
typedef long
i32;
typedef unsigned int
ui16;
typedef unsigned long
ui32;
//
// Include Peripheral Header Files:
//
#include SysCtrl_Boot.h
#include SPI_Boot.h
#include SCI_Boot.h
#include Parallel_Boot.h
#endif // end of DSP28_DEVICE_H definition
;;###########################################################################
;;
;; FILE:
Init_Boot.asm
52
Boot ROM
SPRU095C
;;
;; TITLE:
F2810/12 Boot Rom Initialization and Exit routines.
;;
;; Functions:
;;
;;
_InitBoot
;;
_ExitBoot
;;
;; Notes:
;;
;;###########################################################################
;;
;; Ver | dd mmm yyyy |
Who
| Description of changes
;; =====|=============|==============|=======================================
;; 1.0 | 12 Mar 2002 | LH
| PG Release.
;;
|
|
|
;;###########################################################################
.def _InitBoot
.ref _SelectBootMode
.sect .Version
.word 0x0001
; F2810/12 Boot ROM Version 1
.word 0x0302
; Month/Year: 3/02
.sect .Checksum ; 64-bit Checksum
.long 0x70F3099C ; least significant 32-bits
.long 0x00000402 ; most significant 32-bits
.sect .InitBoot
;
; _InitBoot
;
;
; This function performs the initial boot routine
; for the F2810/12 boot ROM.
;
; This module performs the following actions:
;
;
1) Initializes the stack pointer
;
2) Sets the device for C28x operating mode
;
3) Calls the main boot functions
;
4) Calls an exit routine
;
_InitBoot:
; Initialize the stack pointer.
__stack:
.usect .stack,0
MOV SP, #__stack ; Initialize the stack pointer
; Initialize the device for running in C28x mode.
C28OBJ
; Select C28x object mode
C28ADDR
; Select C27x/C28x addressing
C28MAP
; Set blocks M0/M1 for C28x mode
CLRC PAGE0
; Always use stack addressing mode
MOVW DP,#0
; Initialize DP to point to the low 64 K
CLRC OVM
SPRU095C
Boot ROM
53
; Set PM shift of 0
SPM 0
; Read the password locations this will unlock the
; CSM only if the passwords are erased. Otherwise it
; will not have an effect.
MOVL XAR1,#0x3F7FF8;
MOVL XAR0,*XAR1++
MOVL XAR0,*XAR1++
MOVL XAR0,*XAR1++
MOVL XAR0,*XAR1
; Decide which boot mode to use
LCR _SelectBootMode
; Cleanup and exit. At this point the EntryAddr
; is located in the ACC register
BF _ExitBoot,UNC
;
; _ExitBoot
;
;
;This module cleans up after the boot loader
;
; 1) Make sure the stack is deallocated.
;
SP = 0x400 after exiting the boot
;
loader
; 2) Push 0 onto the stack so RPC will be
;
0 after using LRETR to jump to the
;
entry point
; 2) Load RPC with the entry point
; 3) Clear all XARn registers
; 4) Clear ACC, P and XT registers
; 5) LRETR this will also clear the RPC
;
register since 0 was on the stack
;
_ExitBoot:
;
;
Ensure that the stack is deallocated
;
MOV SP,#__stack
;
; Clear the bottom of the stack. This will endup
; in RPC when we are finished
;
MOV *SP++,#0
MOV *SP++,#0
;
; Load RPC with the entry point as determined
; by the boot mode. This address will be returned
; in the ACC register.
;
PUSH ACC
POP RPC
;
; Put registers back in their reset state.
54
Boot ROM
SPRU095C
;
; Clear all the XARn, ACC, XT, and P and DP
; registers
;
; NOTE: Leave the device in C28x operating mode
;
(OBJMODE = 1, AMODE = 0)
;
ZAPA
MOVL XT,ACC
MOVZ AR0,AL
MOVZ AR1,AL
MOVZ AR2,AL
MOVZ AR3,AL
MOVZ AR4,AL
MOVZ AR5,AL
MOVZ AR6,AL
MOVZ AR7,AL
MOVW DP, #0
;
;
Restore ST0 and ST1. Note OBJMODE is
;
the only bit not restored to its reset state.
;
OBJMODE is left set for C28x object operating
;
mode.
;
; ST0 = 0x0000
ST1 = 0x0A0B
; 15:10 OVC = 0
15:13
ARP = 0
;
9: 7 PM = 0
12
XF = 0
;
6
V = 0
11 M0M1MAP = 1
;
5
N = 0
10 reserved
;
4
Z = 0
9 OBJMODE = 1
;
3
C = 0
8
AMODE = 0
;
2 TC = 0
7 IDLESTAT = 0
;
1 OVM = 0
6
EALLOW = 0
;
0 SXM = 0
5
LOOP = 0
;
4
SPA = 0
;
3
VMAP = 1
;
2
PAGE0 = 0
;
1
DBGM = 1
;
0
INTM = 1
;
MOV *SP++,#0
MOV *SP++,#0x0A0B
POP ST1
POP ST0
;
;
Jump to the EntryAddr as defined by the
;
boot mode selected and continue execution
;
LRETR
;eof
//###########################################################################
SPRU095C
Boot ROM
55
//
// FILE:
SelectMode_Boot.c
//
// TITLE:
F2810/12 Boot Mode selection routines
//
// Functions:
//
//
ui32
SelectBootMode(void)
//
inline void SelectMode_GPOISelect(void)
//
// Notes:
//
//###########################################################################
//
// Ver | dd mmm yyyy |
Who
| Description of changes
// =====|=============|==============|=======================================
// 1.0 | 12 Mar 2002 | LH
| PG Release.
//
|
|
|
//###########################################################################
#include F2812_Boot.h
inline void SelectMode_GPIOSelect(void);
// Define mask for mode selection
// all mode select pins are on GPIOF
// These definitions define which pins
// are used:
//GPIOF4
GPIOF12 GPIOF3
GPIOF2
//(SCITXDA) (MDXA) (SPISTEA) (SPICLKA) Mode Selected
//
1
x
x
x
Jump to Flash address 0x3F 7FF6
//
0
1
x
x
Call SPI_Boot
//
0
0
1
1
Call SCI_Boot
//
0
0
1
0
Jump to H0 SARAM
//
0
0
0
1
Jump to OTP
//
0
0
0
0
Call Parallel_Boot
#define MODE_PIN1
0x0010 // GPIOF4
#define MODE_PIN2
0x1000 // GPIOF12
#define MODE_PIN3
0x0008 // GPIOF3
#define MODE_PIN4
0x0004 // GPIOF2
// On GP I/O port F use only the following pins to determine the boot mode
#define MODE_MASK
(MODE_PIN1 | MODE_PIN2 | MODE_PIN3 | MODE_PIN4)
// Define which pins matter to which modes. Note that some modes
// do not check the state of all 4 pins.
#define FLASH_MASK
(MODE_PIN1)
#define SPI_MASK
(MODE_PIN1 | MODE_PIN2)
#define SCI_MASK
(MODE_PIN1 | MODE_PIN2 | MODE_PIN3 | MODE_PIN4)
#define H0_MASK
(MODE_PIN1 | MODE_PIN2 | MODE_PIN3 | MODE_PIN4)
#define OTP_MASK
(MODE_PIN1 | MODE_PIN2 | MODE_PIN3 | MODE_PIN4)
#define PARALLEL_MASK (MODE_PIN1 | MODE_PIN2 | MODE_PIN3 | MODE_PIN4)
// Define which pins (out of the ones being examined) must be set
// to boot to a particular mode
#define FLASH_MODE
(MODE_PIN1)
#define SPI_MODE
(MODE_PIN2)
#define SCI_MODE
(MODE_PIN3 | MODE_PIN4)
#define H0_MODE
(MODE_PIN3)
56
Boot ROM
SPRU095C
#define OTP_MODE
#define PARALLEL_MODE
ui32 SelectBootMode()
{
ui32 EntryAddr;
ui16 BootMode;
(MODE_PIN4)
0x0000
SelectMode_GPIOSelect();
BootMode = GPIODataRegs.GPFDAT.all & MODE_MASK;
// First check for modes which do not require
// a boot loader (Flash/H0/OTP)
if( (BootMode & FLASH_MASK) == FLASH_MODE ) return FLASH_ENTRY_POINT;
if( (BootMode & H0_MASK) == H0_MODE) return H0_ENTRY_POINT;
if( (BootMode & OTP_MASK) == OTP_MODE) return OTP_ENTRY_POINT;
// Otherwise, disable the watchdog and check for the
// other boot modes that requre loaders
WatchDogDisable();
if( (BootMode & SCI_MASK) == SCI_MODE) EntryAddr = SCI_Boot();
else if( (BootMode & SPI_MASK) == SPI_MODE) EntryAddr = SPI_Boot();
else EntryAddr = Parallel_Boot();
WatchDogEnable();
return EntryAddr;
}
//#################################################
// inline void SelectMode_GPIOSelect(void)
//
// Enable GP I/O port F as an input port.
//
inline void SelectMode_GPIOSelect()
{
EALLOW;
// GPIO Port F is all I/O pins
// 0 = I/O pin 1 = Peripheral pin
GPIOMuxRegs.GPFMUX.all = 0x0000;
// Port F is all input
// 0 = input
1 = output
GPIOMuxRegs.GPFDIR.all = 0x0000;
EDIS;
}
;EOF
//###########################################################################
//
// FILE:
SCI_Boot.c
//
// TITLE:
F2810/12 SCI Boot mode routines
//
// Functions:
//
SPRU095C
Boot ROM
57
//
ui32 SCI_Boot(void)
//
inline void SCIA_GPIOSelect(void)
//
inline void SCIA_SysClockEnable(void)
//
inline void SCIA_Init(void)
//
inline void SCIA_AutobaudLock(void)
//
inline ui16 SCIA_CheckKeyVal(void)
//
inline void SCIA_ReservedFn(void)
//
ui32 SCIA_GetLongData(void)
//
ui32 SCIA_GetWordData(void)
//
void SCIA_CopyData(void)
//
// Notes:
//
//###########################################################################
//
// Ver | dd mmm yyyy |
Who
| Description of changes
// =====|=============|==============|=======================================
// 1.0 | 12 Mar 2002 | LH
| PG Release.
//
|
|
|
//###########################################################################
#include F2812_Boot.h
// Private functions
inline void SCIA_GPIOSelect(void);
inline void SCIA_Init(void);
inline void SCIA_AutobaudLock(void);
inline ui16 SCIA_CheckKeyVal(void);
inline void SCIA_ReservedFn(void);
inline void SCIA_SysClockEnable(void);
ui32 SCIA_GetLongData(void);
ui16 SCIA_GetWordData(void);
void SCIA_CopyData(void);
// Data section where SCIA control registers
// reside
#pragma DATA_SECTION(SCIARegs,.SCIARegs);
volatile struct SCI_REGS SCIARegs;
//#################################################
// ui32 SCI_Boot(void)
//
// This module is the main SCI boot routine.
// It will load code via the SCI-A port.
//
// It will return a entry point address back
// to the InitBoot routine which in turn calls
// the ExitBoot routine.
//
ui32 SCI_Boot()
{
ui32 EntryAddr;
ui16 ErrorFlag;
SCIA_SysClockEnable();
SCIA_GPIOSelect();
SCIA_Init();
SCIA_AutobaudLock();
58
Boot ROM
SPRU095C
SPRU095C
Boot ROM
59
ui16 byteData;
// Must prime baud register with >= 1
SCIARegs.SCILBAUD = 1;
// Prepare for autobaud detection
// Set the CDC bit to enable autobaud detection
// and clear the ABD bit
SCIARegs.SCIFFCT.all = 0x2000;
// Wait until we correctly read an
// A or a and lock
while(SCIARegs.SCIFFCT.bit.ABD != 1) {}
// After autobaud lock, clear the CDC bit
SCIARegs.SCIFFCT.bit.CDC = 0;
while(SCIARegs.SCIRXST.bit.RXRDY != 1) { }
byteData = SCIARegs.SCIRXBUF.bit.RXDT;
SCIARegs.SCITXBUF = byteData;
return;
}
//#################################################
// ui16 SCIA_CheckKeyVal(void)
//
// The header of the datafile should have a proper
// key value of 0x08 0xAA. If it does not, then
// we either have a bad data file or we are not
// booting properly. If this is the case, return
// an error to the main routine.
//
inline ui16 SCIA_CheckKeyVal()
{
ui16 wordData;
wordData = SCIA_GetWordData();
if(wordData != EIGHT_BIT_HEADER) return ERROR;
// No error found
return NO_ERROR;
}
//#################################################
// void SCIA_ReservedFn(void)
//
// This function reads 8 reserved words in the header.
// None of these reserved words are used by the
// SCI boot loader at this time, they may be used in
// future devices for enhancments.
//
inline void SCIA_ReservedFn()
{
ui16 i;
// Read and discard the 8 reserved words.
for(i = 1; i <= 8; i++)
{
SCIA_GetWordData();
}
return;
}
//#################################################
60
Boot ROM
SPRU095C
// ui32 SCIA_GetLongData(void)
//
// This routine fetches two words from the SCI-A
// port and puts them together to form a single
// 32-bit value. It is assumed that the host is
// sending the data in the form MSW:LSW.
//
ui32 SCIA_GetLongData()
{
ui32 longData = (ui32)0x00000000;
// Fetch the upper 1/2 of the 32-bit value
longData = ( (ui32)SCIA_GetWordData() << 16);
// Fetch the lower 1/2 of the 32-bit value
longData |= (ui32)SCIA_GetWordData();
return longData;
}
//#################################################
// ui16 SCIA_GetWordData(void)
//
// This routine fetches two bytes from the SCI-A
// port and puts them together to form a single
// 16-bit value. It is assumed that the host is
// sending the data in the order LSB followed by MSB.
//
ui16 SCIA_GetWordData()
{
ui16 wordData;
ui16 byteData;
wordData = 0x0000;
byteData = 0x0000;
// Fetch the LSB and verify back to the host
while(SCIARegs.SCIRXST.bit.RXRDY != 1) { }
wordData = (ui16)SCIARegs.SCIRXBUF.bit.RXDT;
SCIARegs.SCITXBUF = wordData;
// Fetch the MSB and verify back to the host
while(SCIARegs.SCIRXST.bit.RXRDY != 1) { }
byteData = (ui16)SCIARegs.SCIRXBUF.bit.RXDT;
SCIARegs.SCITXBUF = byteData;
// form the wordData from the MSB:LSB
wordData |= (byteData << 8);
return wordData;
}
//#################################################
// void SCIA_CopyData(void)
//
// This routine copies multiple blocks of data from the host
There is no error
SPRU095C
Boot ROM
61
//
// Multiple blocks of data are copied until a block
// size of 00 00 is encountered.
//
//
void SCIA_CopyData()
{
struct HEADER {
ui16 BlockSize;
ui32 DestAddr;
} BlockHeader;
ui16 wordData;
ui16 i;
// Get the size in words of the first block
BlockHeader.BlockSize = SCIA_GetWordData();
//
//
//
//
while(BlockHeader.BlockSize != (ui16)0x0000)
{
BlockHeader.DestAddr = SCIA_GetLongData();
for(i = 1; i <= BlockHeader.BlockSize; i++)
{
wordData = SCIA_GetWordData();
*(ui16 *)BlockHeader.DestAddr++ = wordData;
}
// Get the size of the next block
BlockHeader.BlockSize = SCIA_GetWordData();
}
return;
}
//#################################################
// inline void SCIA_SysClockEnable(void)
//
// This routine enables the clocks to the SCIA Port.
//
inline void SCIA_SysClockEnable()
{
EALLOW;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
SysCtrlRegs.LOSPCP.all = 0x0002;
EDIS;
}
// EOF
//###########################################################################
//
62
Boot ROM
SPRU095C
// FILE:
Parallel_Boot.c
//
// TITLE:
F2810/12 Parallel Port I/O boot routines
//
// Functions:
//
//
ui32 Parallel_Boot(void)
//
inline void Parallel_GPIOSelect(void)
//
inline ui16 Parallel_CheckKeyVal(void)
//
invline void Parallel_ReservedFn(void)
//
ui32 Parallel_GetLongData(ui16 DataSize)
//
ui16 Parallel_GetWordData(ui16 DataSize)
//
void Parallel_CopyData(ui16 DataSize)
//
void Parallel_WaitHostRdy(void)
//
void Parallel_HostHandshake(void)
// Notes:
//
//###########################################################################
//
// Ver | dd mmm yyyy |
Who
| Description of changes
// =====|=============|==============|=======================================
// 1.0 | 12 Mar 2002 | LH
| PG Release.
//
|
|
|
//###########################################################################
#include F2812_Boot.h
// Private function definitions
inline void Parallel_GPIOSelect(void);
inline ui16 Parallel_CheckKeyVal(void);
inline void Parallel_ReservedFn();
ui32 Parallel_GetLongData(ui16 DataSize);
ui16 Parallel_GetWordData(ui16 DataSize);
void Parallel_CopyData(ui16 DataSize);
void Parallel_WaitHostRdy(void);
void Parallel_HostHandshake(void);
#define HOST_DATA_NOT_RDY GPIODataRegs.GPDDAT.bit.GPIOD5!=0
#define WAIT_HOST_ACK
GPIODataRegs.GPDDAT.bit.GPIOD5!=1
// Set (DSP_ACK) or Clear (DSP_RDY) GPIOD6
#define DSP_ACK
GPIODataRegs.GPDSET.all
= 0x0040
#define DSP_RDY
GPIODataRegs.GPDCLEAR.all = 0x0040
#define DATA
GPIODataRegs.GPBDAT.all
// Data section where GPIO control and data registers
// reside
#pragma DATA_SECTION(GPIODataRegs,.GPIODataRegs);
volatile struct GPIO_DATA_REGS GPIODataRegs;
#pragma DATA_SECTION(GPIOMuxRegs,.GPIOMuxRegs);
volatile struct GPIO_MUX_REGS GPIOMuxRegs;
#endif
//#################################################
// ui32 Parallel_Boot(void)
//
// This module is the main Parallel boot routine.
// It will load code via GP I/O port B.
SPRU095C
Boot ROM
63
//
// This boot mode accepts 8-bit or 16-bit data.
// 8-bit data is expected to be the order LSB
// followed by MSB.
//
// This function returns a entry point address back
// to the InitBoot routine which in turn calls
// the ExitBoot routine.
//
ui32 Parallel_Boot()
{
ui32 EntryAddr;
ui16 DataSize;
Parallel_GPIOSelect();
DataSize = Parallel_CheckKeyVal();
if (DataSize == ERROR) return FLASH_ENTRY_POINT;
Parallel_ReservedFn(DataSize);
EntryAddr = Parallel_GetLongData(DataSize);
Parallel_CopyData(DataSize);
return EntryAddr;
}
//#################################################
// void Parallel_GPIOSelect(void)
//
// Enable pins for GP I/O on Port B. Also enable
// the control pins for host ack and DSP ready.
//
inline void Parallel_GPIOSelect()
{
EALLOW;
// GPIO Port B is all I/O pins
// 0 = I/O pin 1 = Peripheral pin
GPIOMuxRegs.GPBMUX.all = 0x0000;
// GPIO Port D pin 5 and 6 are I/O pins
GPIOMuxRegs.GPDMUX.all &= 0xFF9F;
// Port B is all input
// D5 is an input control from the Host Ack/Rdy
// D6 is an output for DSP Ack/Rdy
// 0 = input
1 = output
GPIOMuxRegs.GPDDIR.bit.GPIOD6 = 1;
GPIOMuxRegs.GPDDIR.bit.GPIOD5 = 0;
GPIOMuxRegs.GPBDIR.all = 0x0000;
EDIS;
}
//#################################################
// void Parallel_CheckKeyVal(void)
64
Boot ROM
SPRU095C
//
// Determine if the data we are loading is in
// 8-bit or 16-bit format.
// If neither, return an error.
//
// Note that if the host never responds then
// the code will be stuck here. That is there
// is no timeout mechanism.
//
inline ui16 Parallel_CheckKeyVal()
{
ui16 wordData;
// Fetch a word from the parallel port and compare
// it to the defined 16-bit header format, if not check
// for a 8-bit header format.
wordData = Parallel_GetWordData(SIXTEEN_BIT);
if(wordData == SIXTEEN_BIT_HEADER) return SIXTEEN_BIT;
// If not 16-bit mode, check for 8-bit mode
// Call Parallel_GetWordData with 16-bit mode
// so we only fetch the MSB of the KeyValue and not
// two bytes. We will ignore the upper 8-bits and combine
// the result with the previous byte to form the
// header KeyValue.
wordData = wordData & 0x00FF;
wordData |= Parallel_GetWordData(SIXTEEN_BIT) << 8;
if(wordData == EIGHT_BIT_HEADER) return EIGHT_BIT;
// Didnt find a 16-bit or an 8-bit KeyVal header so return an error.
else return ERROR;
}
//#################################################
// void Parallel_ReservedFn(void)
//
// This function reads 8 reserved words in the header.
// None of these reserved words are used by the
// Parallel boot loader at this time, they may be used in
// future devices for enhancments.
//
inline void Parallel_ReservedFn(ui16 DataSize)
{
ui16 i;
// Read and discard the 8 reserved words.
for(i = 1; i <= 8; i++)
{
Parallel_GetWordData(DataSize);
}
return;
}
//#################################################
// void Parallel_CopyData(void)
//
SPRU095C
Boot ROM
65
while(BlockHeader.BlockSize != (ui16)0x0000)
{
BlockHeader.DestAddr = Parallel_GetLongData(DataSize);
for(i = 1; i <= BlockHeader.BlockSize; i++)
{
wordData = Parallel_GetWordData(DataSize);
*(ui16 *)BlockHeader.DestAddr++ = wordData;
}
// Get the size of the next block
BlockHeader.BlockSize = Parallel_GetWordData(DataSize);
}
return;
}
//#################################################
// ui16 Parallel_GetWordData(ui16 DataSize)
//
// This routine fetches a 16-bit word from the
// GP I/O port. The function is passed a DataSize
// value. If the DataSize is 16, then the input
// stream is 16-bits and the function fetches a
// signle word and returns it to the host.
//
// If the DataSize is 8, then the input stream is
// an 8-bit input stream and the upper 8-bits of the
66
Boot ROM
SPRU095C
DSP_RDY;
SPRU095C
Boot ROM
67
while(HOST_DATA_NOT_RDY) { }
}
//#################################################
// void Parallel_HostHandshake(void)
//
// This routine tells the host that the DSP has recieved
// the data. The DSP then waits for the host to acknowledge
// the reciept before continuing.
//
void Parallel_HostHandshake()
{
DSP_ACK;
while(WAIT_HOST_ACK) { }
}
// EOF
//###########################################################################
//
// FILE:
SPI_Boot.c
//
// TITLE:
F2810/12 SPI Boot mode routines
//
// Functions:
//
//
ui32 SPI_Boot(void)
//
inline void SPIA_GPIOSelect(void)
//
inline void SPIA_SysClockEnable(void)
//
inline void SPIA_Init(void)
//
inline void SPIA_Transmit(u16 cmdData)
//
inline ui16 SPIA_CheckKeyVal(void)
//
inline void SPIA_ReservedFn(void);
//
ui32 SPIA_GetLongData(void)
//
ui32 SPIA_GetWordData(void)
//
void SPIA_CopyData(void)
//
// Notes:
//
//###########################################################################
//
// Ver | dd mmm yyyy |
Who
| Description of changes
// =====|=============|==============|=======================================
// 1.0 | 12 Mar 2002 | SS
| PG Release.
//
|
|
|
//###########################################################################
#include F2812_Boot.h
#pragma DATA_SECTION(SPIARegs,.SPIARegs);
volatile struct SPI_REGS SPIARegs;
// Private functions
inline void SPIA_GPIOSelect(void);
inline void SPIA_Init(void);
inline ui16 SPIA_Transmit(ui16 cmdData);
inline ui16 SPIA_CheckKeyVal(void);
inline void SPIA_ReservedFn(void);
inline void SPIA_SysClockEnable(void);
68
Boot ROM
SPRU095C
ui32 SPIA_GetLongData(void);
ui16 SPIA_GetWordData(void);
void SPIA_CopyData(void);
//#################################################
// ui32 SPI_Boot(void)
//
// This module is the main SPI boot routine.
// It will load code via the SPI-A port.
//
// It will return a entry point address back
// to the ExitBoot routine.
//
ui32 SPI_Boot()
{
ui32 EntryAddr;
ui16 ErrorFlag;
SPIA_SysClockEnable();
SPIA_GPIOSelect();
SPIA_Init();
// 1. Enable EEPROM chip enable low Bit 5 for the IOPORT
// Chip enable high
GPIODataRegs.GPFCLEAR.bit.GPIOF3 =1;
// 2. Enable EEPROM and send EEPROM Read Command
SPIA_Transmit(0x0300);
// 3. Send Starting for the EEPROM address 16bit
// Sending 0x0000,0000 will work for address and data packets
SPIA_GetWordData();
// 4. Check for 0x08AA data header, else go to flash
ErrorFlag = SPIA_CheckKeyVal();
if (ErrorFlag != 0) return FLASH_ENTRY_POINT;
// 4a.Check for Clock speed change and reserved words
SPIA_ReservedFn();
// 5. Get point of Entry address after load
EntryAddr = SPIA_GetLongData();
// 6. Receive and copy one or more code sections to destination addresses
SPIA_CopyData();
// 7. Disable EEPROM chip enable high
// Chip enable high
GPIODataRegs.GPFSET.bit.GPIOF3 =1;
return EntryAddr;
}
//#################################################
// void SPIA_GPIOSelect(void)
//
// Enable pins for the SPIA module for SPI
// peripheral functionality.
//
inline void SPIA_GPIOSelect()
{
EALLOW
// Enable SPISIMO/SPISOMI/SPICLK pins
GPIOMuxRegs.GPFMUX.all = 0x0007;
SPRU095C
Boot ROM
69
Boot ROM
SPRU095C
SPRU095C
Boot ROM
71
Boot ROM
SPRU095C
while(BlockHeader.BlockSize != (ui16)0x0000)
{
BlockHeader.DestAddr = SPIA_GetLongData();
for(i = 1; i <= BlockHeader.BlockSize; i++)
{
wordData = SPIA_GetWordData();
*(ui16 *)BlockHeader.DestAddr++ = wordData;
}
// Get the size of the next block
BlockHeader.BlockSize = SPIA_GetWordData();
}
return;
}
//#################################################
// inline void SPIA_SysClockEnable(void)
//
// This routine enables the clocks to the SPIA Port.
//
inline void SPIA_SysClockEnable()
{
EALLOW;
SysCtrlRegs.PCLKCR.bit.SPIAENCLK=1;
SysCtrlRegs.LOSPCP.all = 0x0002;
EDIS;
}
SPRU095C
Boot ROM
73
74
Boot ROM
SPRU095C
Appendix
AppendixAA
Revision History
This document was revised to SPRU095C from SPR095B. The scope of the
revisions was limited to technical changes as described in Section A.1. This
appendix lists only revisions made in the most recent version.
A.1
Page
17
Additions/Modifications/Deletions
Changed address of the M1 Memory Block from 0x400 0x450 to 0x400 0x44F in Section
4.2.4.
A-1