css_cmake_test/f2833x/examples/f28335_flash_kernel/Shared_Boot.c

327 lines
8.8 KiB
C
Raw Normal View History

2024-01-19 12:18:27 +03:00
//###########################################################################
//
// FILE: Shared_Boot.c
//
// TITLE: Boot loader shared functions
//
// Functions:
//
// void CopyData(void)
// Uint32 GetLongData(void)
// void ReadReservedFn(void)
//
//###########################################################################
// $TI Release: $
// $Release Date: $
// $Copyright:
// Copyright (C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//###########################################################################
//
// Included Files
//
#include "Boot.h"
#include "Flash2833x_API_Library.h"
//
// Defines
//
#ifndef NULL
#define NULL 0
#endif
//#pragma DATA_SECTION(EmuKey,"EmuKeyVar");
//#pragma DATA_SECTION(EmuBMode,"EmuBModeVar");
//Uint16 EmuKey;
//Uint16 EmuBMode;
//
// GetWordData is a pointer to the function that interfaces to the peripheral.
// Each loader assigns this pointer to it's particular GetWordData function.
//
uint16fptr GetOnlyWordData;
//
// Function prototypes
//
Uint32 GetLongData();
//void CopyData(void);
void ReadReservedFn(void);
//
// After flash_program, send checksum to PC
//
void SendCheckSum();
#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
#pragma CODE_SECTION(CopyData, ".TI.ramfunc");
#else
#pragma CODE_SECTION(CopyData, "ramfuncs");
#endif
#endif
//
// Programming Buffer
//
Uint16 progBuf[PROG_BUFFER_LENGTH];
//
// Flash Status Structure
//
FLASH_ST FlashStatus;
extern Uint32 Flash_CPUScaleFactor;
extern void (*Flash_CallbackPtr) (void);
unsigned int checksum;
Uint32 status1;
//
// CopyData - This routine copies multiple blocks of data from the host to the
// specified RAM locations. There is no error checking on any of the
// destination addresses. That is it is assumed all addresses and block size
// values are correct.
//
// Multiple blocks of data are copied until a block size of 00 00 is
// encountered.
//
void
CopyData()
{
struct HEADER
{
Uint16 BlockSize;
Uint32 DestAddr;
Uint32 ProgBuffAddr;
} BlockHeader;
Uint16 wordData;
Uint16 status;
Uint16 i,j;
//
// Make sure code security is disabled
//
CsmUnlock();
EALLOW;
Flash_CPUScaleFactor = SCALE_FACTOR;
Flash_CallbackPtr = NULL;
EDIS;
status = Flash_Erase((SECTORA | SECTORB | SECTORC | SECTORD),
&FlashStatus);
status1=status;
if(status != STATUS_SUCCESS)
{
return ;
}
//
// After Flash Erase, send the checksum to PC program.
//
SendCheckSum();
//
// Get the size in words of the first block
//
BlockHeader.BlockSize = (*GetOnlyWordData)();
//
// While the block size is > 0 copy the data to the DestAddr. There is no
// error checking as it is assumed the DestAddr is a valid memory location
//
while(BlockHeader.BlockSize != (Uint16)0x0000)
{
if(BlockHeader.BlockSize > PROG_BUFFER_LENGTH)
{
//
// Block is to big to fit into our buffer so we must program
// it in chunks
//
BlockHeader.DestAddr = GetLongData();
//
// Program as many full buffers as possible
//
for(j = 0; j < (BlockHeader.BlockSize / PROG_BUFFER_LENGTH); j++)
{
BlockHeader.ProgBuffAddr = (Uint32)progBuf;
for(i = 1; i <= PROG_BUFFER_LENGTH; i++)
{
wordData = (*GetOnlyWordData)();
*(Uint16 *)BlockHeader.ProgBuffAddr++ = wordData;
}
status = Flash_Program((Uint16 *) BlockHeader.DestAddr,
(Uint16 *)progBuf, PROG_BUFFER_LENGTH,
&FlashStatus);
if(status != STATUS_SUCCESS)
{
return ;
}
BlockHeader.DestAddr += PROG_BUFFER_LENGTH;
//
// After Flash program, send the checksum to PC program.
//
SendCheckSum();
}
//
// Program the leftovers
//
BlockHeader.ProgBuffAddr = (Uint32)progBuf;
for(i = 1; i <= (BlockHeader.BlockSize % PROG_BUFFER_LENGTH); i++)
{
wordData = (*GetOnlyWordData)();
*(Uint16 *)BlockHeader.ProgBuffAddr++ = wordData;
}
status = Flash_Program((Uint16 *) BlockHeader.DestAddr,
(Uint16 *)progBuf,
(BlockHeader.BlockSize % PROG_BUFFER_LENGTH)
, &FlashStatus);
if(status != STATUS_SUCCESS)
{
return ;
}
//
// After Flash program, send the checksum to PC program.
//
SendCheckSum();
}
else
{
//
// Block will fit into our buffer so we'll program it all at once
//
BlockHeader.DestAddr = GetLongData();
BlockHeader.ProgBuffAddr = (Uint32)progBuf;
for(i = 1; i <= BlockHeader.BlockSize; i++)
{
wordData = (*GetOnlyWordData)();
*(Uint16 *)BlockHeader.ProgBuffAddr++ = wordData;
}
status = Flash_Program((Uint16 *) BlockHeader.DestAddr,
(Uint16 *)progBuf, BlockHeader.BlockSize,
&FlashStatus);
if(status != STATUS_SUCCESS)
{
return ;
}
//
// After Flash program, send the checksum to PC program.
//
SendCheckSum();
}
//
// Get the size of the next block
//
BlockHeader.BlockSize = (*GetOnlyWordData)();
}
return;
}
//
// GetLongData - This routine fetches a 32-bit value from the peripheral
// input stream.
//
Uint32
GetLongData()
{
Uint32 longData;
//
// Fetch the upper 1/2 of the 32-bit value
//
longData = ( (Uint32)(*GetOnlyWordData)() << 16);
//
// Fetch the lower 1/2 of the 32-bit value
//
longData |= (Uint32)(*GetOnlyWordData)();
return longData;
}
//
// Read_ReservedFn - This function reads 8 reserved words in the header.
// None of these reserved words are used by the this boot loader at this time,
// they may be used in future devices for enhancements. Loaders that use
// these words use their own read function.
//
void
ReadReservedFn()
{
Uint16 i;
//
// Read and discard the 8 reserved words.
//
for(i = 1; i <= 8; i++)
{
GetOnlyWordData();
}
return;
}
//
// SendCheckSum - This function sends checksum to PC program.
// After flash memory erases or writes something, this functions will be
// running
//
void
SendCheckSum()
{
while(!SciaRegs.SCICTL2.bit.TXRDY)
{
}
SciaRegs.SCITXBUF = checksum & 0xFF;
while(!SciaRegs.SCICTL2.bit.TXRDY)
{
}
SciaRegs.SCITXBUF = (checksum >> 8) & 0xFF;
checksum = 0;
return;
}
//
// End of File
//