From a7c0d42a6590c26d37c17b082aef52925b466569 Mon Sep 17 00:00:00 2001
From: tao_z <tzj0429@163.com>
Date: Sun, 29 May 2022 10:03:04 +0800
Subject: [PATCH] bootloader运行,烧录流程尚未测试
---
/dev/null | 82 -------------
Application/source/uds_modules/did.c | 43 ++++++
Cmsis/Startup/startup_XL6600.S | 82 -------------
xl6600_flash.ld | 2
Application/source/main.c | 3
Application/source/uds_modules/uds.c | 84 +++++++------
Application/source/nvm.c | 8
Application/source/uds_modules/did.h | 4
8 files changed, 98 insertions(+), 210 deletions(-)
diff --git a/Application/include/cali.h b/Application/include/cali.h
deleted file mode 100644
index 398c2c0..0000000
--- a/Application/include/cali.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * @file cali.h
- * @author Ethan.Tao (tzj0429@163.com)
- * @brief
- * @version 0.1
- * @date 2022-05-07
- *
- * @copyright Copyright (c) 2022 �������������㲿������˾
- *
- */
-
-#ifndef CALI_H
-#define CALI_H
-#include "typedef.h"
-#define GEAR_ALPHA (0)
-#define GEAR_BETA (1)
-#define AUTO_GEAR_USED (GEAR_BETA)
-#define MANUAL_GEAR_USED (GEAR_ALPHA)
-
-#define VA_Z_CALA (36u) // 4B
-#define VA_M_CALA (40u) // 4B
-#define VA_MP_CALA (44u) // 4B
-#define VA_MN_CALA (48u) // 4B
-#define VA_X2_CALA (52u) // 4B
-#define VA_X1_CALA (56u) // 4B
-#define VA_Y1_CALA (60u) // 4B
-#define VA_Y2_CALA (64u) // 4B
-#define VA_GearGapAuto (68u) // 4B
-#define VA_GearGapManu (72u) // 4B
-#define VA_CALIBRATED_FLAG (76u) // 4B
-
-typedef struct
-{
- unsigned short alpha;
- unsigned short beta;
-} Angle_t;
-
-typedef struct cali
-{
-
- Angle_t Z;
- Angle_t M;
- Angle_t MP;
- Angle_t MN;
- Angle_t X2;
- Angle_t X1;
- Angle_t Y1;
- Angle_t Y2;
- Angle_t Auto_delta;
- Angle_t Manu_delta;
- uint32_t CalibratedFlag;
-} CaliData_t;
-
-typedef enum DCAL_CalCmd
-{
- CAL_INIT = 0x0000,
- CAL_Zero = 0x0001,
- CAL_M = 0x0002,
- CAL_MP = 0x0003,
- CAL_MN = 0x0004,
- CAL_X2 = 0x0005,
- CAL_X1 = 0x0006,
- CAL_Y1 = 0x0007,
- CAL_Y2 = 0x0008,
- CAL_GAP = 0x0009,
- CAL_FINISH = 0x000A
-} CAL_Cmd_e;
-typedef enum DCAL_CalStatus
-{
- CAL_IDLE = 0,
- CAL_In_Progress,
- CAL_Current_Done,
- Cal_Complete
-} CAL_CalStatus_e;
-
-extern CaliData_t Cali_O_AngleData;
-extern void Cali_Init(void);
-extern void Cali_Task(void *p);
-extern uint8_t Cali_GetDataLoadFlag(void);
-extern uint8_t Cali_SetCalibrationCmd(uint32_t cmd);
-extern uint8_t Cali_GetSaveCalibrationDataFlag(uint8_t cmd);
-#endif
diff --git a/Application/source/main.c b/Application/source/main.c
index 39d2bfb..1e5a2c3 100644
--- a/Application/source/main.c
+++ b/Application/source/main.c
@@ -37,9 +37,10 @@
Hal_CANConfig();
Hal_CrcInit(); // CRC FOR FLASH
UDS_Init();
- did_init();
+
NVM_Init();
light_init();
+ did_init();
}
/**
diff --git a/Application/source/nvm.c b/Application/source/nvm.c
index 2c087ad..9be73eb 100644
--- a/Application/source/nvm.c
+++ b/Application/source/nvm.c
@@ -55,8 +55,8 @@
extern int8_t Fbl_CheckPresent()
{
- int8_t rtn = 0;
- uint8_t i = 0;
+ int8_t rtn = 1;
+ uint8_t i = 1;
uint8_t prensnttemp[8] = {0};
uint8_t prensntmasktemp[8] = {0};
FblReadPattern(prensnttemp, APP_PRESENT_ADDR);
@@ -65,7 +65,7 @@
{
if ((prensnttemp[i] + prensntmasktemp[i]) != 0xff)
{
- rtn = 1;
+ rtn = 0;
break;
}
}
@@ -88,7 +88,7 @@
if ((retValue1 == EE_OK) && (retValue2 == EE_OK))
{
// rtn = OP_STATUS_OK;
- rtn = FblWriteProgramBlock();
+ rtn = DID_SaveProgamDataToNvm();
}
return rtn;
}
diff --git a/Application/source/uds_modules/did.c b/Application/source/uds_modules/did.c
index 08a918f..e73fcce 100644
--- a/Application/source/uds_modules/did.c
+++ b/Application/source/uds_modules/did.c
@@ -44,16 +44,51 @@
uint16_t DIDTable_Entry_Count_u16 = 0;
UDS_DIDtableEntry DIDtable[UDS_DID_TABLE_SIZE];
-static uint8_t DID_LoaderWaitTimer = 0;
+// static uint8_t DID_LoaderWaitTimer = 0;
+static uint8_t DID_NeedtoSaveFlag = 0;
void did_init(void)
{
+ DID_NeedtoSaveFlag = 0;
UDS_InitDIDMapRW(DID_NS_ProgrammingCounter, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.ProgrammingCounter, 1);
UDS_InitDIDMapRW(DID_NS_ProAtpCounter, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.ProgrammingAttempCounter, 1);
UDS_InitDIDMapRW(DID_NS_ReadFingerPrint, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.FingerPrint_W, 9);
UDS_InitDIDMapRW(DID_NS_RepairShopCodeOrTester, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.RepairShopCodeOrTesterSerialNumber, 16);
UDS_InitDIDMapRW(DID_NS_ECUProgtammingDate, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.UDS_NS_ProgrammingDate.ProgrammingDate_YY_H, 4);
UDS_InitDIDMapRW(DID_NS_WriteFingerPrint, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.FingerPrint_W, 10);
+
+ FblReadProgramBlock(); // load program data.must after ee_init()
+}
+
+extern void DID_SetWriteSaveFlag(void)
+{
+ DID_NeedtoSaveFlag = 1;
+}
+
+extern int8_t DID_SaveProgamDataToNvm(void)
+{
+ int8_t rtn = OP_STATUS_FAIL;
+
+ if (DID_NeedtoSaveFlag == 1)
+ {
+ rtn = FblWriteProgramBlock();
+ }
+ else
+ {
+ rtn = OP_STATUS_OK;
+ }
+}
+
+extern void DID_UpdateProgramCnt(void)
+{
+ NVM_ProgramBLOCK.ProgrammingCounter += 1;
+ DID_NeedtoSaveFlag = 1;
+}
+
+extern void DID_UpdateAtpProgramCnt(void)
+{
+ NVM_ProgramBLOCK.ProgrammingAttempCounter += 1;
+ DID_NeedtoSaveFlag = 1;
}
extern int8_t FblReadProgramBlock(void)
@@ -61,13 +96,14 @@
uint32_t *p_dest = (uint32_t *)(&NVM_ProgramBLOCK);
uint8_t i = 0;
- int8_t rtn = OP_STATUS_FAIL;
+ int8_t rtn = OP_STATUS_OK;
EE_Status retValue1 = EE_WRITE_ERROR;
for (i = 0; i < (ProgramBlockLenth >> 2); i++)
{
if (EE_OK != EE_ReadVariable32bits(VA_PROGRAM_DATA + i * 4, (p_dest + i)))
{
+ rtn = OP_STATUS_FAIL;
break;
}
}
@@ -78,13 +114,14 @@
{
uint32_t *p_dest = (uint32_t *)(&NVM_ProgramBLOCK);
uint8_t i = 0;
- int8_t rtn = OP_STATUS_FAIL;
+ int8_t rtn = OP_STATUS_OK;
EE_Status retValue1 = EE_WRITE_ERROR;
for (i = 0; i < (ProgramBlockLenth >> 2); i++)
{
if (EE_OK != EE_WriteVariable32bits(VA_PROGRAM_DATA + i * 4, *(p_dest + i)))
{
+ rtn = OP_STATUS_FAIL;
break;
}
}
diff --git a/Application/source/uds_modules/did.h b/Application/source/uds_modules/did.h
index ffe8a3d..6f0b45f 100644
--- a/Application/source/uds_modules/did.h
+++ b/Application/source/uds_modules/did.h
@@ -76,4 +76,8 @@
void did_init(void);
extern int8_t FblReadProgramBlock(void);
extern int8_t FblWriteProgramBlock(void);
+extern void DID_UpdateProgramCnt(void);
+extern void DID_UpdateAtpProgramCnt(void);
+extern int8_t DID_SaveProgamDataToNvm(void);
+extern void DID_SetWriteSaveFlag(void);
#endif /* DID_H */
diff --git a/Application/source/uds_modules/uds.c b/Application/source/uds_modules/uds.c
index 904fbc6..7f1040c 100644
--- a/Application/source/uds_modules/uds.c
+++ b/Application/source/uds_modules/uds.c
@@ -9,6 +9,7 @@
#include "cantp_user.h"
#include "xl_mcan.h"
#include "uds.h"
+#include "did.h"
#include "fbl_ap.h"
#include "fbl_def.h"
#include "nvm.h"
@@ -308,7 +309,7 @@
/* Build DID data set */
static bool UDS_BuildDidSet(uint8_t *payload);
/* Switch to default session */
-static void UDS_SwitchtoDefaultSession(void);
+static void UDS_SwitchtoDefaultSession(uint8_t resetcmd);
/*Security access*/
static void UDS_ControlDTCSetting(uint8_t *payload);
@@ -376,7 +377,7 @@
{ECU_RESET, UDS_ECURest, false, true, false, true, SECURITY_ACCESS_LOCKED},
{READ_DATA_BY_IDENTIFIER, UDS_ReadData, true, true, false, false, SECURITY_ACCESS_LOCKED},
{SECURITY_ACCESS, UDS_SecurityAccess, false, true, false, false, SECURITY_ACCESS_LOCKED},
- {COMMUNICATION_CONTROL, UDS_CommunicationControl, false, true, true, true, SECURITY_ACCESS_LOCKED},
+ // {COMMUNICATION_CONTROL, UDS_CommunicationControl, false, true, true, true, SECURITY_ACCESS_LOCKED},
{WRITE_DATA_BY_IDENTIFIER, UDS_WriteDataByIdentifier, false, true, false, false, SECURITY_ACCESS_UNLOCK_LEVEL_1},
{ROUTINE_CONTROL, UDS_RoutineControl, false, true, false, false, SECURITY_ACCESS_UNLOCK_LEVEL_2},
{TESTER_PRESENT, UDS_TesterPresent, true, true, true, true, SECURITY_ACCESS_LOCKED},
@@ -1030,23 +1031,17 @@
if (CDT_HASEXPIRED(TesterPresentTimer_u16) != false)
{
- UDS_SwitchtoDefaultSession();
+ UDS_SwitchtoDefaultSession(true);
}
}
else
{
- UDS_SwitchtoDefaultSession();
+ UDS_SwitchtoDefaultSession(true);
}
}
else
{
CDT_RESET(TesterPresentTimer_u16, 0);
-#if 0
- if(CDT_EXPIRED(EntrySleepModeTimer_u16)==true)
- {
- //SBC_shutdown();
- }
-#endif
}
}
@@ -1204,29 +1199,14 @@
}
else
{
- if ((DID_u16 & 0xff00u) == 0xF100u)
- {
- /* UDS_WriteF1DIDdata(&payload[3], Index_to_be_written); */
- memcpy(DIDtable[Index_to_be_written].address, &payload[3],
- DIDtable[Index_to_be_written].size);
- }
- else
- {
- /* Flip the data contents in rx buffer */
- UDS_FlipEndian(&payload[3], DIDtable[Index_to_be_written].size);
-
- /* not sure this should be done... */
- /* memory copy the data into DID data location */
- memcpy(DIDtable[Index_to_be_written].address, &payload[3],
- DIDtable[Index_to_be_written].size);
- }
+ /* UDS_WriteF1DIDdata(&payload[3], Index_to_be_written); */
+ memcpy(DIDtable[Index_to_be_written].address, &payload[3],
+ DIDtable[Index_to_be_written].size);
/* Write the change to NVM */
if (DIDtable[Index_to_be_written].nvBlockID != 0xFF)
{
- // todo
- // CAL_Save_Calibration_Block(
- // DIDtable[Index_to_be_written].nvBlockID);
+ DID_SetWriteSaveFlag();
}
UDS_L_tx_msg_buffer[0] = GET_RESPONSE_SERVICE_ID(WRITE_DATA_BY_IDENTIFIER);
@@ -1446,6 +1426,7 @@
/*****************************************************************************/
static void UDS_SessionControl(uint8_t *payload)
{
+ uint16_t cnt = 5000u;
/* Change session based on CAN message request */
bool UDS_SessionSetOk_b = false;
uint8_t sub_func = UDS_GET_SUB_FUNCTION(payload[UDS_RQ_BYTE1]);
@@ -1473,6 +1454,7 @@
{
/**/
UDS_L_Diag_session_e = PROGRAMMING;
+ UDS_SessionSetOk_b = true;
FblSetFblProgramRequestFlag();
}
else if ((UDS_L_Diag_session_e == DEFAULT) || (UDS_L_ProgrammingPreconditionCheckOK_b == false)) /*DEFAULT session can not trans to PROGRAMMING*/
@@ -1484,7 +1466,35 @@
}
break;
case DEFAULT:
- UDS_SwitchtoDefaultSession();
+ if (UDS_L_Diag_session_e == PROGRAMMING)
+ {
+ UDS_L_tx_msg_buffer[0] = GET_RESPONSE_SERVICE_ID(SESSION_CONTROL);
+ UDS_L_tx_msg_buffer[1] = UDS_L_Diag_session_e;
+ UDS_L_tx_msg_buffer[2] = 0;
+ UDS_L_tx_msg_buffer[3] = 0;
+ UDS_L_tx_msg_buffer[4] = 0;
+ UDS_L_tx_msg_buffer[5] = 0;
+
+ /* Specify the send payload size */
+ UDS_L_tx_msg_size = 0x06;
+
+ /* Compose a response message and send a positive */
+ /* response with the request data */
+ UDS_RespTxMessage();
+ while (cnt--)
+ {
+ ; /// wait send command send out and then reset
+ }
+
+ UDS_SwitchtoDefaultSession(true);
+ while (1)
+ ;
+ }
+ else
+ {
+ UDS_SwitchtoDefaultSession(false);
+ }
+
TesterPresentTimer_u16 = 0;
break;
default:
@@ -1508,12 +1518,6 @@
/* response with the request data */
UDS_RespTxMessage();
}
-#ifdef ENABLE_BOOTLOADER
- if (UDS_L_Diag_session_e == PROGRAMMING)
- { /*reset es*/
- CPU_HardReset();
- }
-#endif
}
/*****************************************************************************/
@@ -2076,6 +2080,7 @@
{
}
}
+ DID_UpdateAtpProgramCnt();
/*always from buff 0*/
currentbuffId = 0;
UDS_L_TransferDataState_e = TRANFER_START;
@@ -2245,6 +2250,7 @@
/* Compose a response message and send a positive */
/* response with the request data */
UDS_RespTxMessage();
+ DID_UpdateProgramCnt();
}
/*****************************************************************************/
@@ -2404,10 +2410,14 @@
/* (1) Date: 10/30/2014 Fogbugz: case#: 2283 */
/* Initial release by Tom Tao */
/*****************************************************************************/
-static void UDS_SwitchtoDefaultSession(void)
+static void UDS_SwitchtoDefaultSession(uint8_t restcmd)
{
UDS_L_Diag_session_e = DEFAULT;
UDS_L_ProgrammingPreconditionCheckOK_b = false;
+ if (restcmd == true)
+ {
+ CPU_HardReset();
+ }
}
static void UDS_StringCopy(char *p_src, char *p_dest, uint8_t max_size)
diff --git a/Cmsis/Startup/startup_XL6600.S b/Cmsis/Startup/startup_XL6600.S
index fab7396..bb60df2 100644
--- a/Cmsis/Startup/startup_XL6600.S
+++ b/Cmsis/Startup/startup_XL6600.S
@@ -258,88 +258,6 @@
.word Reserved21_IRQHandler
.word BootRAM /* @0x1E0. This is for boot in RAM mode for
xl6600d High Density devices. */
-
-/******************************************************************************
-*
-* The minimal vector table for a Cortex M3. Note that the proper constructs
-* must be placed on this to ensure that it ends up at physical address
-* 0x0000.0000.
-*
-******************************************************************************/
- .section .isr_vector_dup,"a",%progbits
- .align 4
- .type g_pfnVectors_dup, %object
- .size g_pfnVectors_dup, .-g_pfnVectors_dup
-
-
-g_pfnVectors_dup:
- .word _estack
- .word Reset_Handler
- .word NMI_Handler
- .word HardFault_Handler
- .word MemManage_Handler
- .word BusFault_Handler
- .word UsageFault_Handler
- .word 0
- .word 0
- .word 0
- .word 0
- .word SVC_Handler
- .word DebugMon_Handler
- .word 0
- .word PendSV_Handler
- .word SysTick_Handler
- .word Reserved16_IRQHandler
- .word Reserved17_IRQHandler
- .word Reserved18_IRQHandler
- .word Reserved19_IRQHandler
- .word Reserved20_IRQHandler
- .word FMC_IRQHandler
- .word PMC_IRQHandler
- .word DMA_IRQHandler
- .word I2C0_IRQHandler
- .word I2C1_IRQHandler
- .word SPI0_IRQHandler
- .word SPI1_IRQHandler
- .word UART0_IRQHandler
- .word UART1_IRQHandler
- .word UART2_IRQHandler
- .word ADC0_IRQHandler
- .word ACMP0_IRQHandler
- .word FTM0_IRQHandler
- .word FTM1_IRQHandler
- .word FTM2_IRQHandler
- .word RTC_IRQHandler
- .word ACMP1_IRQHandler
- .word PIT_CH0_IRQHandler
- .word PIT_CH1_IRQHandler
- .word KBI0_IRQHandler
- .word KBI1_IRQHandler
- .word Reserved42_IRQHandler
- .word ICS_IRQHandler
- .word WDOG_IRQHandler
- .word PWT_IRQHandler
- .word MCAN_IRQHandler
- .word EXTI0_IRQHandler
- .word EXTI1_IRQHandler
- .word EXTI2_IRQHandler
- .word EXTI3_IRQHandler
- .word EXTI4_IRQHandler
- .word EXTI5_IRQHandler
- .word EXTI6_IRQHandler
- .word EXTI7_IRQHandler
- .word EXTI8_IRQHandler
- .word EXTI9_IRQHandler
- .word EXTI10_IRQHandler
- .word EXTI11_IRQHandler
- .word EXTI12_IRQHandler
- .word EXTI13_IRQHandler
- .word EXTI14_IRQHandler
- .word EXTI15_IRQHandler
- .word EWM_IRQHandler
- .word Reserved21_IRQHandler
- .word BootRAM /* @0x1E0. This is for boot in RAM mode for
- xl6600d High Density devices. */
GPIOA:
.word 0x40100000
GPIOB:
diff --git a/xl6600_flash.ld b/xl6600_flash.ld
index 1d01fb0..072b2d4 100644
--- a/xl6600_flash.ld
+++ b/xl6600_flash.ld
@@ -45,7 +45,7 @@
DRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 18K
RAM_VECT_TBL (xrw) : ORIGIN = 0x20000000, LENGTH = 0x200
FALSH_DRIVER_RAM (xrw):ORIGIN = 0x20000200, LENGTH = 0x100
- BOOTFLAG (xrw) : ORIGIN = 0x20004700, LENGTH = 0x100
+ BOOTFLAG (xrw) : ORIGIN = 0x20000300, LENGTH = 0x100
FLASH_BOOT (rx) : ORIGIN = 0x0000000, LENGTH = 48K
FLASH_APP (rx) : ORIGIN = 0x000C100, LENGTH = 256K -48K -8K-0x100
--
Gitblit v1.8.0