Part Number: TMS570LS3137
Other Parts Discussed in Thread: UNIFLASH
Hello
Team
I want to write data into the TMS570 CPU. Now I use the jtag .and uniflash
can you give me some demo,or some paper . I want to develop software for writing data in flash
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Part Number: TMS570LS3137
Other Parts Discussed in Thread: UNIFLASH
Hello
Team
I want to write data into the TMS570 CPU. Now I use the jtag .and uniflash
can you give me some demo,or some paper . I want to develop software for writing data in flash
The user guide is located in Flash API installation directory: C:\ti\Hercules\F021 Flash API\02.01.01
The attached file is an example of using flash API for flash erase and program:
/*****************************************************************************
*
* bl_flash.c : The file holds the main control loop of the boot loader.
* Author : QJ Wang. qjwang@ti.com
* Date : 4-19-2019
*/
/* Copyright (C) 2013-2019 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.
*/
//*****************************************************************************
#include "bl_config.h"
#include "bl_flash.h"
#include "F021.h"
#include "flash_defines.h"
//#define Freq_In_MHz = SYS_CLK_FREQ;
uint8_t g_ucStartBank, g_ucEndBank, g_ucStartSector, g_ucEndSector;
uint32_t g_ulBankInitialized = 0;
//*****************************************************************************
//
// Returns the size of the ist sector size of the flash in bytes.
//
//*****************************************************************************
uint32_t
BLInternalFlashFirstSectorSizeGet(void)
{
uint32_t firstSectorSize;
firstSectorSize = (uint32_t)(flash_sector[0].start) + flash_sector[0].length;
return (firstSectorSize);
}
//*****************************************************************************
//
// Returns the size of the internal flash in bytes.
//
// This function returns the total number of bytes of internal flash in the
// current part. No adjustment is made for any sections reserved via
// options defined in bl_config.h.
//
// \return Returns the total number of bytes of internal flash.
//
//*****************************************************************************
uint32_t
BLInternalFlashSizeGet(void)
{
uint32_t flashSize;
flashSize = (uint32_t)flash_sector[NUMBEROFSECTORS-1].start + flash_sector[NUMBEROFSECTORS-1].length;
return (flashSize);
}
//*****************************************************************************
//
// Checks whether a given start address is valid for a download.
//
// This function checks to determine whether the given address is a valid
// download image start address given the options defined in bl_config.h.
//
// \return Returns non-zero if the address is valid or 0 otherwise.
//
//*****************************************************************************
uint32_t
BLInternalFlashStartAddrCheck(uint32_t ulAddr, uint32_t ulImgSize)
{
uint32_t count=0, i;
uint32_t ulWholeFlashSize;
//
// Determine the size of the flash available on the part in use.
//
ulWholeFlashSize = (uint32_t)flash_sector[NUMBEROFSECTORS-1].start + flash_sector[NUMBEROFSECTORS-1].length;
/* The start address must be at the beginning of the sector */
for (i = 0; i < NUMBEROFSECTORS; i++){
if ((ulAddr >= (uint32_t)(flash_sector[i].start)) && (ulAddr < ((uint32_t)flash_sector[i].start + flash_sector[i].length)))
{
count++;
}
}
if (count == 0){
return(0);
}
//
// Is the address we were passed a valid start address? We allow:
//
// 1. Address 0 if configured to update the boot loader.
// 2. The start of the reserved block if parameter space is reserved (to
// allow a download of the parameter block contents).
// 3. The application start address specified in bl_config.h.
//
// The function fails if the address is not one of these, if the image
// size is larger than the available space or if the address is not word
// aligned.
//
if((
#ifdef ENABLE_BL_UPDATE
(ulAddr != 0) &&
#endif
(ulAddr != APP_START_ADDRESS)) ||
((ulAddr + ulImgSize) > ulWholeFlashSize) ||
((ulAddr & 3) != 0))
{
return(0);
}
else {
return(1);
}
}
/* Initialize the flash bank and activate the sectors */
uint32_t Fapi_Init(uint32_t ucStartBank, uint32_t ucEndBank)
{
uint32_t i;
/*SYS_CLK_FREQ is defined in bl_config.h */
if ((Fapi_initializeFlashBanks((uint32_t)SYS_CLK_FREQ)) == Fapi_Status_Success){
for (i = ucStartBank; i < ( ucEndBank + 1); i++){
(void)Fapi_setActiveFlashBank((Fapi_FlashBankType)i);
(void)Fapi_enableMainBankSectors(0xFFFF); /* used for API 2.01*/
while( FAPI_CHECK_FSM_READY_BUSY != Fapi_Status_FsmReady );
while( FAPI_GET_FSM_STATUS != Fapi_Status_Success ); /* don't have to include this one*/
}
g_ulBankInitialized = 1;
}else {
return (1);
}
return (0); //success
}
/* ulAddr must be starting address of one flash sector*/
uint32_t Fapi_BlockErase(uint32_t ulAddr, uint32_t Size)
{
uint8_t i=0, ucStartSector, ucEndSector;
uint32_t EndAddr, status;
EndAddr = ulAddr + Size;
for (i = 0; i < NUMBEROFSECTORS; i++){
if (ulAddr < (uint32_t)(flash_sector[i].start))
{
g_ucStartBank = flash_sector[i-1].bankNumber;
ucStartSector = i-1;
break;
}
}
for (i = ucStartSector; i < NUMBEROFSECTORS; i++){
if (EndAddr <= (((uint32_t)flash_sector[i].start) + flash_sector[i].length))
{
g_ucEndBank = flash_sector[i].bankNumber;
ucEndSector = i;
break;
}
}
status = Fapi_Init(g_ucStartBank, g_ucEndBank);
for (i=ucStartSector; i<(ucEndSector+1); i++){
Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, flash_sector[i].start);
while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy );
while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
}
#if defined (RM57) || defined (TMS570LC43)
status = 0;
#else
status = Flash_Erase_Check((uint32_t)ulAddr, Size);
#endif
return (status);
}
//Bank here is not used. We calculate the bank in the function based on the Flash-Start-addr
uint32_t Fapi_BlockProgram(uint32_t Flash_Address, uint32_t Data_Address, uint32_t SizeInBytes)
{
register uint32_t src = Data_Address;
register uint32_t dst = Flash_Address;
uint32_t bytes;
if (SizeInBytes < 16)
bytes = SizeInBytes;
else
bytes = 16;
/* The flash bank has been initialized in flash erase function */
if (g_ulBankInitialized |= 1 ){
Fapi_Init(g_ucStartBank, g_ucEndBank);
}
while( SizeInBytes > 0)
{
Fapi_issueProgrammingCommand((uint32_t *)dst,
(uint8_t *)src,
(uint32_t) bytes,
0,
0,
Fapi_AutoEccGeneration);
while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy );
while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
src += bytes;
dst += bytes;
SizeInBytes -= bytes;
if ( SizeInBytes < 32){
bytes = SizeInBytes;
}
}
return (0);
}
uint32_t Fapi_UpdateStatusProgram(uint32_t Flash_Start_Address, uint32_t Data_Start_Address, uint32_t Size_In_Bytes)
{
register uint32_t src = Data_Start_Address;
register uint32_t dst = Flash_Start_Address;
unsigned int bytes;
if (Size_In_Bytes < 16)
bytes = Size_In_Bytes;
else
bytes = 16;
Fapi_issueProgrammingCommand((uint32_t *)dst,
(uint8_t *)src,
(uint32_t) bytes,
0,
0,
Fapi_AutoEccGeneration);
while( Fapi_checkFsmForReady() == Fapi_Status_FsmBusy );
while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
return (0);
}
uint32_t Flash_Program_Check(uint32_t Program_Start_Address, uint32_t Source_Start_Address, uint32_t No_Of_Bytes)
{
register uint32_t *src1 = (uint32_t *) Source_Start_Address;
register uint32_t *dst1 = (uint32_t *) Program_Start_Address;
register uint32_t bytes = No_Of_Bytes;
while(bytes > 0)
{
if(*dst1++ != *src1++)
return (1); //error
bytes -= 0x4;
}
return(0);
}
uint32_t Flash_Erase_Check(uint32_t Start_Address, uint32_t Bytes)
{
uint32_t error=0;
register uint32_t *dst1 = (uint32_t *) Start_Address;
register uint32_t bytes = Bytes;
while(bytes > 0)
{
if(*dst1++ != 0xFFFFFFFF){
error = 2;
}
bytes -= 0x4;
}
return(error);
}
uint32_t Fapi_BlockRead( uint32_t Flash_Start_Address, uint32_t Data_Start_Address, uint32_t Size_In_Bytes)
{
register uint32_t src = Data_Start_Address;
register uint32_t dst = Flash_Start_Address;
register uint32_t bytes_remain = Size_In_Bytes;
int bytes;
if (Size_In_Bytes < 16)
bytes = Size_In_Bytes;
else
bytes = 16;
while( bytes_remain > 0)
{
Fapi_doMarginReadByByte((uint8_t *)src,
(uint8_t *)dst,
(uint32_t) bytes, //16
Fapi_NormalRead);
src += bytes;
dst += bytes;
bytes_remain -= bytes;
}
return (0);
}