231 lines
6.7 KiB
C
Raw Permalink Normal View History

2023-05-05 11:53:54 +08:00
#include "boot_macrodriver.h"
#include "pfdl.h"
#include "pfdl_types.h"
#include "pfdl_user.h"
/***********************************************************************************************************************
* Function Name: WriteDataflash
* Description :
* Arguments : buffer: to be writed data; Addr:Target absolute address,must be check for different mcu;lenth:to be writed number,<=1024
* Return Value : PFDL_OK -
Success
PFDL_IDLE -
Idling statement
PFDL_ERR_MARGIN -
Blank check error
other//if(Addr>=FLASH_START_ADDRESS&&Addr<FLASH_END_ADDRESS){
***********************************************************************************************************************/
/************************************************************************************
// <20><>ȡdata Flash<73><68><EFBFBD>ݴ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> code : //
// 0 : <20><>ȡAPP<50>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 1 : <20><>ȡ2E<32><45><EFBFBD><EFBFBD>0xF110<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 2 : <20><>ȡ2E<32><45><EFBFBD><EFBFBD>0xF190<39><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 3 : <20><>ȡ2E<32><45><EFBFBD><EFBFBD>0xF197<39><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 4 : <20><>ȡ2E<32><45><EFBFBD><EFBFBD>0xF198<39><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 5 : <20><>ȡ2E<32><45><EFBFBD><EFBFBD>0xF199<39><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 6 : <20><>ȡ2E<32><45><EFBFBD><EFBFBD>0xF19D<39><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 7 : <20><>ȡ2E<32><45><EFBFBD><EFBFBD>0xF112<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// 8 : <20><>ȡ19<31><39><EFBFBD><EFBFBD>0xF00616<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 9 : <20><>ȡ19<31><39><EFBFBD><EFBFBD>0xF00617<31><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 10: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918112<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 11: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918114<31><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 12: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918171<37><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 13: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918312<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 14: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918314<31><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 15: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918371<37><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 16: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918412<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 17: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918414<31><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 18: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918471<37><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 19: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918611<31><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 20: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0x918614<31><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 21: <20><>ȡ19<31><39><EFBFBD><EFBFBD>0xC07300<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5> //
// 2E <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// //
************************************************************************************/
const fdl_index_t DF_INDEX_TAB[]={
/*
{0x000F1000, 8 + 1,}, // byte Power lost memory 0
{0x000F1200, 4 + 1,},
{0x000F1400, 4 + 1,}, // byte APP REProgrammer Request 1
{0x000F1405, 8 + 1,}, // byte BLOCK_0xF110, 2
{0x000F1408, 17 + 1,}, // byte BLOCK_0xF190,Z 3
{0x000F1420, 8 + 1,}, // byte BLOCK_0xF197, 4
{0x000F1800, 16 + 1,}, // byte BLOCK_0xF198,Z 5
{0x000F1810, 4 + 1,}, // byte BLOCK_0xF199,Z 6
{0x000F1814, 4 + 1,}, // byte BLOCK_0xF19D,Z 7
{0x000F1444, 8 + 1,}, // byte BLOCK_0xF112,
*/
{0x000F1000, 8 + 1,}, // byte Power lost memory
{0x000F1400, 4 + 1,}, // byte APP REProgrammer Request
{0x000F1410, 8 + 1,}, // byte BLOCK_0xF110,
{0x000F1420, 17 + 1,}, // byte BLOCK_0xF190,
{0x000F1440, 8 + 1,}, // byte BLOCK_0xF197,
{0x000F1450, 16 + 1,}, // byte BLOCK_0xF198,
{0x000F1460, 4 + 1,}, // byte BLOCK_0xF199,
{0x000F1470, 4 + 1,}, // byte BLOCK_0xF19D,
{0x000F1480, 8 + 1,}, // byte BLOCK_0xF112,
{0x000F1803, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0xF00616
{0x000F1806, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0xF00617
{0x000F1809, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918112
{0x000F180C, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918114
{0x000F180F, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918171
{0x000F1812, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918312
{0x000F1815, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918314
{0x000F1818, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918371
{0x000F181B, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918412
{0x000F181E, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918414
{0x000F1821, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918471
{0x000F1824, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918611
{0x000F1827, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0x918614
{0x000F182A, 2 + 1,}, // byte 19<31><39><EFBFBD><EFBFBD>0xC07300
};
unsigned long GetDataFlashAddress(unsigned char code)
{
return(DF_INDEX_TAB[code].addr);
}
unsigned char DF_Write(unsigned char* write_buf,unsigned char data_num,unsigned char len)
{
unsigned char DF_Buf[128];
unsigned char block_num,block_use,buf_addr;
unsigned char sum,i = 0;
unsigned long addr;
addr = GetDataFlashAddress(data_num);
block_num = (unsigned char)((addr - 0xF1000)>>10);
if(0==block_num){
block_use = DF_BLOCK0_USE;
}
else if(1==block_num){
block_use = DF_BLOCK1_USE;
}
else if(2==block_num){
block_use = DF_BLOCK2_USE;
}
else{
block_use = 0xFF;
}
if(2 >= block_num){
ReadFlashData(DF_Buf,(0x000F1000 + block_num*0x400),block_use);
buf_addr = (unsigned char)(addr - (0x000F1000 + block_num*0x400));
for(sum=0,i=0;i<len;i++)
{
DF_Buf[buf_addr + i] = *(write_buf+i);
sum += *(write_buf+i);
}
sum = (sum^0xFF)+1;
DF_Buf[buf_addr + i] = sum;
if(WriteDataflash(DF_Buf,(0x000F1000 + block_num*0x400),block_use) == 0x11)
{
return 0;
}
else{
return 0xFF;
}
}
else{
return 0xFF;
}
}
unsigned char DF_Read(unsigned char* read_buf,unsigned char data_num,unsigned char len)
{
unsigned char DF_Buf[128];
unsigned char block_num,block_use,buf_addr;
unsigned char sum,i = 0;
unsigned long addr;
addr = GetDataFlashAddress(data_num);
block_num = (unsigned char)((addr - 0x000F1000)/0x400);
if(0==block_num){
block_use = DF_BLOCK0_USE;
}
else if(1==block_num){
block_use = DF_BLOCK1_USE;
}
else if(2==block_num){
block_use = DF_BLOCK2_USE;
}
else{
block_use = 0xFF;
}
if(2 >= block_num){
ReadFlashData(DF_Buf,(0x000F1000 + block_num*0x400),block_use);
buf_addr = (unsigned char)(addr - (0x000F1000 + block_num*0x400));
for(sum=0,i=0;i<len;i++)
{
sum += DF_Buf[buf_addr + i];
}
sum = (sum^0xFF)+1;
if(DF_Buf[buf_addr + i] == sum){
for(i=0;i<len;i++)
{
read_buf[i] = DF_Buf[buf_addr + i];
}
return 0;
}
else{
return 0xFF;
}
}
else{
return 0xFF;
}
}
unsigned char DF_Write_All_DTC(unsigned char* write_buf,unsigned long addr,unsigned char len)
{
uint8_t ret;
ret = WriteDataflash(write_buf,addr,len);
if(0x11 == ret){
return (0);
}
else{
return (ret);
}
}
unsigned char DF_Read_All_DTC(unsigned char* read_buf,unsigned long addr,unsigned char len)
{
ReadFlashData(read_buf,addr,len);
return 0;
}
unsigned char GetProgrammingCounter(void)
{
return *((__far uint8_t *)DID_0200_ADDR);
}
unsigned char GetProgrammingAttempCounter(void)
{
return *((__far uint8_t *)DID_0201_ADDR);
}