231 lines
6.7 KiB
C
231 lines
6.7 KiB
C
|
#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);
|
|||
|
}
|
|||
|
|