399 lines
14 KiB
C
399 lines
14 KiB
C
/*
|
|
* ipc_init.c
|
|
*
|
|
* Created on: 7 íîÿá. 2023 ã.
|
|
* Author: seklyuts
|
|
*/
|
|
|
|
|
|
//
|
|
// Included Files
|
|
|
|
#include "f28x_project.h"
|
|
#include "hw_memmap.h"
|
|
#include "ipc.h"
|
|
#include "flash_programming_f2838x_c28x.h"
|
|
#include "internal_flash.h"
|
|
#ifdef CPU1
|
|
#include "ZD24C02A.h"
|
|
#include "BL25CM1A.h"
|
|
#include "GD25Q16ETIGR.h"
|
|
#include "emif_init.h"
|
|
#endif
|
|
//#pragma DATA_SECTION(readData, "MSGRAM_CPU_TO_CM")
|
|
//uint32_t readData[10];
|
|
|
|
|
|
#define WRONG_COMMAND 0x10
|
|
#define ERROR_VERIFY 0x11
|
|
#define FLASH_ERR 0x12
|
|
#define FLASH_FAIL 0x13
|
|
#define FLASH_ECC_FAIL 0x14
|
|
#define WRONG_LENGHT 0x15
|
|
#define WRONG_ADDR 0x16
|
|
#define WRONG_ID 0x17
|
|
|
|
#define COMMAND_ACCEPTED 0x20
|
|
#define DONE_SUCCESS 0x21
|
|
|
|
#define INT_FLASH 0xA0
|
|
#define EMIF 0xA1
|
|
#define BL25CM1A_1M_bit_SPI 0xA2
|
|
#define GD25Q16E_16M_bit_SPI 0xA3
|
|
#define ZD24C02A_2K_I2C 0xA4
|
|
|
|
typedef enum
|
|
{
|
|
READ,
|
|
WRITE,
|
|
VERIFY,
|
|
END = 0xFF
|
|
} Command_Type_t;
|
|
|
|
|
|
uint32_t pass, WriteToCm=0, ReadFromCm=0;
|
|
|
|
IPC_MessageQueue_t messageQueue;
|
|
IPC_Message_t TxMsg, RxMsg;
|
|
uint16_t IntNum = 0;
|
|
|
|
uint16_t GetMes[16];
|
|
uint16_t PutMes[16] = {2,5,6,8,9,4,2,5,4,3,1,6,4,2,8,6};
|
|
|
|
uint32_t Command, StartAddr, Data;
|
|
uint32_t InCommand,InAddr,InData;
|
|
|
|
|
|
|
|
uint16_t BlockWasErased[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
|
|
|
uint16_t * FlashAddress = (uint16_t *)Bzero_Sector0_start;
|
|
|
|
|
|
|
|
|
|
void putFlashMessage_to_Cm(uint32_t ReadAddress, uint16_t Num)
|
|
{
|
|
uint16_t * PutToCmBuff;
|
|
uint16_t i;
|
|
PutToCmBuff = (uint16_t *)CPUXTOCMMSGRAM0_BASE;
|
|
FlashAddress = (uint16_t *)(ReadAddress);
|
|
for(i=0; i < Num; i++)
|
|
{
|
|
PutToCmBuff[i] = FlashAddress[i];
|
|
}
|
|
}
|
|
|
|
|
|
uint16_t verifyFlashMessage_to_Cm(uint32_t ReadAddress, uint16_t Num)
|
|
{
|
|
uint16_t * GetFromCmBuff;
|
|
uint16_t i, Err = 0;
|
|
GetFromCmBuff = (uint16_t *)CMTOCPUXMSGRAM0_BASE;
|
|
FlashAddress = (uint16_t *)(ReadAddress);
|
|
for(i=0; i < Num; i++)
|
|
{
|
|
if(GetFromCmBuff[i] != FlashAddress[i]) Err++;
|
|
}
|
|
return Err;
|
|
}
|
|
|
|
|
|
void clear_BlockWasErased(void)
|
|
{
|
|
uint16_t i;
|
|
for(i=0; i < 14; i++)
|
|
{
|
|
BlockWasErased[i] = 0;
|
|
}
|
|
}
|
|
|
|
void getMessage_from_Cm_Flash(void)
|
|
{
|
|
uint16_t FlashSektorStart = 0;
|
|
uint16_t FlashSektorEnd = 0;
|
|
uint32_t FactAddressFlash = Bzero_Sector0_start;
|
|
uint32_t block1, block2;
|
|
uint16_t MemOperationError = 0;
|
|
|
|
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, INT_FLASH, 0, 0); return;}
|
|
if((InAddr+InData) > 0x40000) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, INT_FLASH, 0, 0); return;}
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, INT_FLASH, 0, 0);
|
|
|
|
FactAddressFlash = InAddr + Bzero_Sector0_start;
|
|
|
|
switch(InCommand >> 16)
|
|
{
|
|
case READ:
|
|
putFlashMessage_to_Cm(FactAddressFlash, InData);
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0);
|
|
break;
|
|
case WRITE:
|
|
FlashSektorStart = Internal_flash_Sektor_Addr(FactAddressFlash); //ñåêòîð ñ êîòîðîãî íà÷èíàåòñÿ çàïèñü
|
|
FlashSektorEnd = Internal_flash_Sektor_Addr(FactAddressFlash + InData - 1); //ñåêòîð â êîòîðîì êîíåö çàïèñè (òîò æå èëè ñëåäóþùèé, òàê êàê ðàçìåð ñåêòîðà áîëüøå ðàçìåðà áóôåðà)
|
|
if(!BlockWasErased[FlashSektorStart])
|
|
{
|
|
MemOperationError = Internal_flash_Erase(FactAddressFlash); // åñëè ñåêòîð ñ êîòîðîãî íà÷èíàåì çàïèñü íå áûë ñò¸ðò, òî ñòèðàåì åãî
|
|
if(!MemOperationError) BlockWasErased[FlashSektorStart] = 1;
|
|
else {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
|
|
}
|
|
if(FlashSektorEnd == FlashSektorStart) //åñëè çàêàí÷èâàåì â ýòîì æå ñåêòîðå ÷òî è íà÷àëè, òî ïðîñòî ïèøåì åãî
|
|
{
|
|
MemOperationError = Internal_flash_lib_ProgramUsingDataAndECC(FactAddressFlash, InData);
|
|
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
|
|
}
|
|
else //åñëè íà÷àëè â îäíîì ñåêòîðå, à çàêàí÷èâàåì â äðóãîì òî
|
|
{
|
|
if(!BlockWasErased[FlashSektorEnd])//ñòèðàåì âòîðîé ñåêòîð åñëè îí íå áûë ñò¸ðò ðàíåå
|
|
{
|
|
MemOperationError = Internal_flash_Erase(FactAddressFlash+InData);
|
|
if(!MemOperationError)BlockWasErased[FlashSektorEnd] = 1;
|
|
else {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
|
|
}
|
|
block1 = internal_flash_FlashBankStartAddr(FlashSektorEnd)-FactAddressFlash; //âû÷èñëÿåì ðàçìåð ïåðâîãî êóñêà
|
|
block2 = InData - block1; //è ðàçìåð êóñêà äëÿ âòîðîãî ñåêòîðà
|
|
MemOperationError = Internal_flash_lib_ProgramUsingDataAndECC(FactAddressFlash, block1); // è ïèøåì ñïåðâà êóñîê â ïåðâûé ñåêòîð,
|
|
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
|
|
MemOperationError = Internal_flash_lib_ProgramUsingDataAndECC(internal_flash_FlashBankStartAddr(FlashSektorEnd), block2); // ïîòîì êóñîê âî âòîðîé
|
|
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
|
|
}
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0);
|
|
break;
|
|
case VERIFY:
|
|
MemOperationError = verifyFlashMessage_to_Cm(FactAddressFlash, InData);
|
|
if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, INT_FLASH, MemOperationError, 0);
|
|
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0);
|
|
break;
|
|
case END:
|
|
clear_BlockWasErased();
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, INT_FLASH, 0, 0);
|
|
break;
|
|
default:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, INT_FLASH, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
#ifdef CPU1
|
|
void getMessage_from_Cm_EMIF(void)
|
|
{
|
|
uint16_t MemOperationError = 0;
|
|
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, EMIF, 0, 0); return;}
|
|
if((InAddr+InData) > 0x100000) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, EMIF, 0, 0); return;}
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, EMIF, 0, 0);
|
|
|
|
switch(InCommand >> 16)
|
|
{
|
|
case READ:
|
|
|
|
break;
|
|
case WRITE:
|
|
|
|
break;
|
|
case VERIFY:
|
|
|
|
break;
|
|
case END:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, EMIF, 0, 0);
|
|
break;
|
|
default:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, EMIF, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void getMessage_from_Cm_BL25CM1A(void)
|
|
{
|
|
uint16_t MemOperationError = 0;
|
|
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, BL25CM1A_1M_bit_SPI, 0, 0); return;}
|
|
if((InAddr+InData) > BL25CM1A0_SIZE) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, BL25CM1A_1M_bit_SPI, 0, 0); return;}
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, BL25CM1A_1M_bit_SPI, 0, 0);
|
|
|
|
spi_TurnOffCS1_GD25Q16E();
|
|
switch(InCommand >> 16)
|
|
{
|
|
case READ:
|
|
Bl25cm1a_read_data(2*InAddr, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE);
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0);
|
|
break;
|
|
case WRITE:
|
|
Bl25cm1a_write_data(2*InAddr, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0);
|
|
break;
|
|
case VERIFY:
|
|
MemOperationError = Bl25cm1a_verify_data(2*InAddr, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
|
if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, BL25CM1A_1M_bit_SPI, 0, 0);
|
|
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0);
|
|
break;
|
|
case END:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, BL25CM1A_1M_bit_SPI, 0, 0);
|
|
break;
|
|
default:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, BL25CM1A_1M_bit_SPI, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void getMessage_from_Cm_GD25Q16E(void)
|
|
{
|
|
uint16_t MemOperationError = 0;
|
|
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, GD25Q16E_16M_bit_SPI, 0, 0); return;}
|
|
if((InAddr+InData) > GD25Q16E_SIZE) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, GD25Q16E_16M_bit_SPI, 0, 0); return;}
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, GD25Q16E_16M_bit_SPI, 0, 0);
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(1);
|
|
spi_TurnOnCS1_GD25Q16E();
|
|
|
|
switch(InCommand >> 16)
|
|
{
|
|
case READ:
|
|
GD25Q16ETIGR_read_data(InAddr*2, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE);
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0);
|
|
break;
|
|
case WRITE:
|
|
GD25Q16ETIGR_write_data(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0);
|
|
break;
|
|
case VERIFY:
|
|
MemOperationError = GD25Q16ETIGR_verify_data(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
|
if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, GD25Q16E_16M_bit_SPI, 0, 0);
|
|
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0);
|
|
break;
|
|
case END:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, GD25Q16E_16M_bit_SPI, 0, 0);
|
|
break;
|
|
default:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, GD25Q16E_16M_bit_SPI, 0, 0);
|
|
GD25Q16ETIGR_clean_SectorWasErraised();
|
|
break;
|
|
}
|
|
spi_TurnOffCS1_GD25Q16E();
|
|
}
|
|
|
|
void getMessage_from_Cm_ZD24C02A(void)
|
|
{
|
|
uint16_t MemOperationError = 0;
|
|
uint16_t I2CErr = 0;
|
|
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, ZD24C02A_2K_I2C, 0, 0); return;}
|
|
if((InAddr+InData) > ZD24C02A_SIZE) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, ZD24C02A_2K_I2C, 0, 0); return;}
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, ZD24C02A_2K_I2C, 0, 0);
|
|
|
|
switch(InCommand >> 16)
|
|
{
|
|
case READ:
|
|
I2CErr = ZD24C02A_read(InAddr*2, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE);
|
|
if(I2CErr) IPC_sendCommand(IPC_CPU1_L_CM_R, FLASH_ERR, ZD24C02A_2K_I2C, 0, 0);
|
|
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, ZD24C02A_2K_I2C, 0, 0);
|
|
break;
|
|
case WRITE:
|
|
I2CErr = ZD24C02A_write(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
|
if(I2CErr) IPC_sendCommand(IPC_CPU1_L_CM_R, FLASH_ERR, ZD24C02A_2K_I2C, 0, 0);
|
|
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, ZD24C02A_2K_I2C, 0, 0);
|
|
break;
|
|
case VERIFY:
|
|
MemOperationError = ZD24C02A_verify(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
|
if(MemOperationError == 2) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, ZD24C02A_2K_I2C, 0, 0);
|
|
else if(MemOperationError == 1) IPC_sendCommand(IPC_CPU1_L_CM_R, FLASH_ERR, ZD24C02A_2K_I2C, 0, 0);
|
|
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, ZD24C02A_2K_I2C, 0, 0);
|
|
break;
|
|
case END:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, ZD24C02A_2K_I2C, 0, 0);
|
|
break;
|
|
default:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, ZD24C02A_2K_I2C, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
__interrupt void IPC_ISR0()
|
|
{
|
|
IPC_ackFlagRtoL(IPC_CPU1_L_CM_R, (1<<0));
|
|
PieCtrlRegs.PIEACK.all = PIEACK_GROUP11;
|
|
if(ReadFromCm == 0) ReadFromCm = 1;
|
|
}
|
|
|
|
|
|
//__interrupt void IPC_ISR1()
|
|
//{
|
|
|
|
// getMessage_from_Cm();
|
|
|
|
|
|
// if(WriteToCm != 2)
|
|
// {
|
|
//putMessage_to_Cm();
|
|
//IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, Command, Address, Data);
|
|
// }
|
|
// else WriteToCm = 0;
|
|
//
|
|
// Acknowledge the flag
|
|
//
|
|
// IPC_ackFlagRtoL(IPC_CPU1_L_CM_R, (1<<1));
|
|
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP11;
|
|
//}
|
|
|
|
|
|
void ipc_init(void)
|
|
{
|
|
//
|
|
// Clear any IPC flags if set already
|
|
//
|
|
IPC_clearFlagLtoR(IPC_CPU1_L_CM_R, IPC_FLAG_ALL);
|
|
|
|
EALLOW;
|
|
PieVectTable.CMTOCPUXIPC0_INT = &IPC_ISR0;
|
|
// PieVectTable.CMTOCPUXIPC1_INT = &IPC_ISR1;
|
|
EDIS;
|
|
|
|
|
|
IER |= M_INT11;
|
|
PieCtrlRegs.PIEIER11.bit.INTx9 = 1;
|
|
// PieCtrlRegs.PIEIER11.bit.INTx10 = 1;
|
|
|
|
//
|
|
// Initialize message queue
|
|
//
|
|
IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT1, IPC_INT1);
|
|
IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT0, IPC_INT0);
|
|
|
|
GD25Q16ETIGR_clean_SectorWasErraised();
|
|
clear_BlockWasErased();
|
|
}
|
|
|
|
void ipc_run(void)
|
|
{
|
|
if(ReadFromCm == 1)
|
|
{
|
|
ReadFromCm = 2;
|
|
IPC_readCommand(IPC_CPU1_L_CM_R, 0, 0, &InCommand, &InAddr, &InData );
|
|
switch(InCommand & 0xFFFF)
|
|
{
|
|
case INT_FLASH:
|
|
getMessage_from_Cm_Flash();
|
|
break;
|
|
#ifdef CPU1
|
|
case EMIF:
|
|
getMessage_from_Cm_EMIF();
|
|
break;
|
|
case BL25CM1A_1M_bit_SPI:
|
|
getMessage_from_Cm_BL25CM1A();
|
|
break;
|
|
case GD25Q16E_16M_bit_SPI:
|
|
getMessage_from_Cm_GD25Q16E();
|
|
break;
|
|
case ZD24C02A_2K_I2C:
|
|
getMessage_from_Cm_ZD24C02A();
|
|
break;
|
|
#endif
|
|
default:
|
|
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ID, 0, 0, 0);
|
|
break;
|
|
}
|
|
|
|
IPC_setFlagLtoR(IPC_CPU1_L_CM_R,(1<<0));
|
|
ReadFromCm = 0;
|
|
}
|
|
}
|
|
|