Explorar el Código

1)add secttion for sys settings
2)add crc for iap

balbekova hace 7 años
padre
commit
5ab14b30b0

+ 1 - 1
Makefile

@@ -1,4 +1,4 @@
-TARGETS = iap projects/gcc/tools modules 
+TARGETS = projects/gcc/tools iap modules 
 BUILDDIR = build
 
 .PHONY: all config $(TARGETS) tools distclean

+ 17 - 7
config/common_config.h

@@ -16,20 +16,18 @@
 
 
 /**
-  * @brief  Серийный номер
+  * @brief  Маркер ревизии платы для валидации *.bin файла
   */
-#define SERIAL                         "KN-03-00003"
+#define HW_REV                          "BT6702"
 
+#define HW_REV_LEN                      16
+
+#define HW_REV_OFFSET                   0x1F0
 
 /**
   * @brief  Версия прошивки
   */
 #define VERSION                         "1.0"
-
-/**
-  * @brief  Пароль для входа в режим bootloader
-  */   
-#define BOOTLOADER_PASWORD              "rotekups"
    
 /**
   * @brief  Адрес сектора настроек
@@ -41,6 +39,15 @@
   */ 	
 #define CRC_ADDRESS             0x08005F9C
 
+/**
+  * @brief  Адрес сектора системных настроек
+  */
+#define SYS_SECTOR         		0x08008000
+
+/**
+  * @brief  Адрес CRC системных настроек
+  */
+#define SYS_CRC_ADDRESS         0x0800BF9C
 
 /**
   * @brief  Слово для контроля целостности структуры настроек
@@ -61,6 +68,9 @@
 #define USER_FLASH_LAST_PAGE_ADDRESS  0x08060000
 #define USER_FLASH_END_ADDRESS        0x0807FFFF
 #define USER_FLASH_CRC_ADDRESS        0x0807FFFC
+
+#define IAP_FLASH_FIRST_PAGE_ADDRESS  0x08000000 /* Only as example see comment */
+#define IAP_FLASH_CRC_ADDRESS         0x0801FFFC
 	
 	
 /**

+ 6 - 0
iap/Makefile

@@ -65,6 +65,9 @@ endif
 
 BUILDDIR = ../build/iap/$(TARGET)
 
+FW_FLASH_START = $(shell awk '/IAP_FLASH_FIRST_PAGE_ADDRESS/{print $$3}' ../config/common_config.h )
+FW_FLASH_CRC = $(shell awk '/IAP_FLASH_CRC_ADDRESS/{print $$3}' ../config/common_config.h )
+
 -include ../Makefile.inc.stm32
 
 prebuild:
@@ -73,4 +76,7 @@ prebuild:
 	
 postbuild:
 	@echo "Device MAC address: $(MAC)"
+	@echo "FW start address: $(FW_FLASH_START)"
+	@echo "FW CRC address: $(FW_FLASH_CRC)"
+	@$(BUILDDIR)/../../tools/cortex_crc $(OUTPUTDIR)/$(TARGET).bin $(FW_FLASH_START) $(FW_FLASH_CRC)
 

+ 4 - 2
iap/User/main.c

@@ -17,8 +17,10 @@
 #include "stm32f4x7_eth.h"
 #include "netconf.h"
 
-
-#define FW_FILE_NAME "stm32prs.bin"
+/* Секция размещения СRC прошивки */
+#if defined ( __GNUC__ )
+uint32_t crc __attribute__ ((section (".crc"))) = 0xAABBCCDD;
+#endif
 
 bool IAPviaETH = false;
 uint8_t fDoneReset = 0;

+ 17 - 3
modules/settings_api.c

@@ -16,6 +16,7 @@
 #include "snmp_api.h"
 #include "trap_api.h"
 #include "log.h"
+#include "sys_api.h"
 
 #include "FreeRTOS.h"
 #include "task.h"
@@ -99,9 +100,22 @@ void SETTINGS_SetSnmpDef(void)
   */
 void SETTINGS_SetInfoDef(void)
 {
-  strcpy(sSettings.sInfo.productionData, "09.10.2015");
-  strcpy(sSettings.sInfo.mac, DEVICE_MAC);
-  strcpy(sSettings.sInfo.serialNumber, SERIAL);
+  SYS_t *sSys = NULL;
+
+  sSys = pvPortMalloc(sizeof(*sSys));
+  if (sSys) {
+	  SYS_Load(sSys);
+	  strcpy(sSettings.sInfo.mac, sSys->mac);
+	  strcpy(sSettings.sInfo.serialNumber, sSys->serial);
+	  strcpy(sSettings.sInfo.productionData, sSys->proddate);
+	  vPortFree(sSys);
+  }
+  else {
+	  strcpy(sSettings.sInfo.productionData, "09.07.2017");
+	  strcpy(sSettings.sInfo.mac, DEVICE_MAC);
+	  strcpy(sSettings.sInfo.serialNumber, DEVICE_SERIAL);
+  }
+
   strcpy(sSettings.sInfo.comments, "");
 }  
 

+ 4 - 3
modules/startup/stm32_flash.ld

@@ -44,9 +44,10 @@ MEMORY
 {
   BOOTLOADER_P1 (rx) : ORIGIN = 0x08000000, LENGTH = 16K
   SETTINGS      (rx) : ORIGIN = 0x08004000, LENGTH = 16K
-  BOOTLOADER    (rx) : ORIGIN = 0x08008000, LENGTH = 96K
-  FLASH         (rx) : ORIGIN = 0x08020000, LENGTH = 640K
-  CRC           (rx) : ORIGIN = 0x080BFFFC, LENGTH = 4
+  SETTINGS_SYS  (rx) : ORIGIN = 0x08008000, LENGTH = 16K
+  BOOTLOADER    (rx) : ORIGIN = 0x0800C000, LENGTH = 80K
+  FLASH         (rx) : ORIGIN = 0x08020000, LENGTH = 384K
+  CRC           (rx) : ORIGIN = 0x0807FFFC, LENGTH = 4
   RAM           (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
   MEMORY_B1     (rx) : ORIGIN = 0x10000000, LENGTH = 64K
 }

+ 163 - 0
modules/sys_api.c

@@ -0,0 +1,163 @@
+/*
+ * sys_api.c
+ *
+ *  Created on: 12.03.2017
+ *      Author: jesstr
+ */
+#include <stdint.h>
+#include "sys_api.h"
+#include "sys_hal.h"
+#include "settings_api.h"
+#include "common_config.h"
+#ifdef PRINTF_STDLIB
+#include <stdio.h>
+#endif
+#ifdef PRINTF_CUSTOM
+#include "tinystdio.h"
+#endif
+#include "main.h"
+
+
+/* Backup old style device mac and serial */
+/* TODO Remove when all old devices will be updated */
+#define BACKUP_OLD_SYS
+
+
+static char mac_backup[MAC_LEN];
+static char serial_backup[MAC_LEN];
+static bool backup_done = false;
+
+/**
+  * @brief  Общая структура настроек
+  */
+extern SETTINGS_t sSettings;
+
+#ifdef BACKUP_OLD_SYS
+bool SYS_BackupInfo(char *mac, char *serial) {
+	snprintf(mac_backup, MAC_LEN, mac);
+	snprintf(serial_backup, SER_LEN, serial);
+	backup_done = true;
+
+	return backup_done;
+}
+
+
+bool SYS_RestoreInfo(SYS_t *settings) {
+	if (backup_done) {
+		snprintf(settings->mac, MAC_LEN, mac_backup);
+		snprintf(settings->serial, SER_LEN, serial_backup);
+		return true;
+	}
+
+	return false;
+}
+#endif
+
+bool SYS_SetDefault(SYS_t *settings) {
+	if (!settings)
+		return false;
+
+#ifdef BACKUP_OLD_SYS
+	/* Try to backup device MAC and serial. */
+	if (sSettings.CritSecCRC == SETTINGS_GetCritSecCRC()) {
+	  if (SYS_BackupInfo(sSettings.sInfo.mac, sSettings.sInfo.serialNumber)) {
+		  DBG printf("Sys info backupped\r\n");
+		  DBG printf("MAC: %s\r\n", sSettings.sInfo.mac);
+		  DBG printf("Serial: %s\r\n", sSettings.sInfo.serialNumber);
+	  }
+	  else {
+		  DBG printf("Sys info back up error!\r\n");
+	  }
+	}
+
+	/* Try to restore device MAC and serial.
+	 * If not, store defaults */
+	if (!SYS_RestoreInfo(settings)) {
+		snprintf(settings->mac, MAC_LEN, SYS_MAC);
+		snprintf(settings->serial, SER_LEN, SYS_SERIAL);
+		DBG printf("Sys info restore error! Defaults used.\r\n");
+	}
+	else {
+		DBG printf("Sys info restored!\r\n");
+	}
+#endif
+
+	snprintf(settings->customer, CUST_LEN, SYS_CUSTOMER);
+	snprintf(settings->proddate, PROD_LEN, "00.00.00");
+	settings->controlword = SETTINGS_CONTROL_WORD;
+
+	return true;
+}
+
+/**
+  * @brief
+  * @retval
+  */
+uint32_t SYS_GetCRC(SYS_t *settings)
+{
+  CRC_ResetDR();
+  return CRC_CalcBlockCRC((uint32_t *)settings, sizeof(*settings)/4 - 1);
+}
+
+
+/**
+  * @brief  Загрузка структуры системных настроек из flash
+  */
+bool SYS_Load(SYS_t *settings)
+{
+  uint32_t loadCRC;  // CRC из flash
+  uint32_t newCRC;   // CRC загруженной структуры настроек
+  bool need_default = false;
+
+  if (!settings)
+  		return false;
+
+  SYS_ReadFromFlash((uint8_t*)settings, sizeof(*settings), SYS_SECTOR);
+
+  /* Считываем CRC из флеш памяти */
+  loadCRC = (*(uint32_t*)SYS_CRC_ADDRESS);
+
+  /* Рассчитываем CRC для структуры настроек */
+  newCRC = SYS_GetCRC(settings);
+
+  /* Если CRC не совпадают нужно прошивать дефолтные настройки */
+  if (loadCRC != newCRC)
+  {
+	DBG printf("Bad system sector CRC. Factory defaults restored.\r\n");
+	need_default = true;
+  }
+  /* CRC совпала, проверяем контрольное слово если слово не совпадает
+	 то это значит, что поплыла структура нстроек, прошиваем дефолт */
+  else if (settings->controlword != SETTINGS_CONTROL_WORD)
+  {
+	DBG printf("Bad system sector control word. Factory defaults restored.\r\n");
+	need_default = true;
+  }
+
+  /* Прошиваем дефолтные настройки если нужно */
+  if (need_default) {
+	SYS_SetDefault(settings);
+	SYS_Save(settings);
+  }
+
+  return true;
+}
+
+
+/**
+  * @brief  Запись структуры настроек во flash
+  */
+bool SYS_Save(SYS_t *settings)
+{
+	uint32_t crc_user = 0;
+
+	if (!settings)
+		return false;
+
+	crc_user = SYS_GetCRC(settings);
+
+	SYS_WriteToFlash((uint8_t*)settings, sizeof(*settings), crc_user);
+
+	return true;
+}
+

+ 68 - 0
modules/sys_api.h

@@ -0,0 +1,68 @@
+/*
+ * sys_api.h
+ *
+ *  Created on: 12.03.2017
+ *      Author: jesstr
+ */
+
+#ifndef SYS_API_H_
+#define SYS_API_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#ifndef DEVICE_MAC
+#define DEVICE_MAC "EC-4C-4D-00-C7-FF"
+#endif
+
+#ifndef DEVICE_SERIAL
+#define DEVICE_SERIAL "7020000"
+#endif
+
+
+#define SYS_MAC 		DEVICE_MAC
+#define SYS_SERIAL 		DEVICE_SERIAL
+#define SYS_CUSTOMER 	"Rotek"
+
+
+#define MAC_LEN		18
+#define SER_LEN		16
+#define CUST_LEN	16
+#define PROD_LEN	20
+
+/**
+  * @brief  Cтруктура системных настроек
+  */
+typedef struct
+{
+  char  mac[MAC_LEN];    	// MAC адрес
+  char  serial[SER_LEN];	// Серийный номер
+  char  customer[CUST_LEN];	// Заказчик
+  char 	proddate[PROD_LEN];	// Дата производства
+  uint32_t controlword;
+  uint32_t crc;
+} SYS_t;
+
+
+bool SYS_BackupInfo(char *mac, char *serial);
+
+bool SYS_RestoreInfo(SYS_t *settings);
+
+/**
+  * @brief
+  * @retval
+  */
+uint32_t SYS_GetCRC(SYS_t *settings);
+
+/**
+  * @brief  Загрузка структуры системных настроек из flash
+  */
+bool SYS_Load(SYS_t *settings);
+
+/**
+  * @brief  Запись структуры настроек во flash
+  */
+bool SYS_Save(SYS_t *settings);
+
+
+#endif /* SYS_API_H_ */

+ 96 - 0
modules/sys_hal.c

@@ -0,0 +1,96 @@
+/*
+ * sys_hal.c
+ *
+ *  Created on: 12.03.2017
+ *      Author: pavel
+ */
+
+#include <stdint.h>
+#include "sys_hal.h"
+#include "sys_api.h"
+#include "common_config.h"
+#include "main.h"
+#include "hal.h"
+#ifdef PRINTF_STDLIB
+#include <stdio.h>
+#endif
+#ifdef PRINTF_CUSTOM
+#include "tinystdio.h"
+#endif
+
+/**
+  * @brief
+  */
+void SYS_ReadFromFlash(uint8_t *data, uint32_t size, uint32_t baseAddress)
+{
+  for (uint32_t i = 0; i < size; i++)
+    *data++ = (*(uint32_t*)baseAddress++);
+}
+
+/**
+  * @brief
+  */
+void SYS_WriteToFlash(uint8_t *data, uint32_t size, uint32_t crc)
+{
+  uint32_t baseAddress = SYS_SECTOR;
+  uint32_t checkCrc = 0;
+  bool fAlarm = 0;
+  FLASH_Status status;
+  uint8_t *pdata = data;
+
+  for (uint8_t i = 0; i < 3; i++)
+  {
+    fAlarm = 0;
+    FLASH_Unlock();
+
+    SYS_EraseFlashSector();
+
+    for (uint32_t i = 0; i < size; i++)
+        if ((status = FLASH_ProgramByte(baseAddress++, *pdata++)) != FLASH_COMPLETE) {
+             DBG printf("FLASH_ProgramByte error: %d\r\n", status);
+             break;
+         }
+
+    if ((status = FLASH_ProgramWord((uint32_t)SYS_CRC_ADDRESS, crc)) != FLASH_COMPLETE) {
+         DBG printf("FLASH_ProgramWord error: %d\r\n", status);
+     }
+
+    FLASH_Lock();
+
+//    /* Считываем что записали */
+//    SYS_ReadFromFlash((uint8_t*)data, size, SYS_SECTOR);
+//
+//    checkCrc = SYS_GetCRC(data);
+
+    checkCrc = SYS_GetCRC((SYS_t *)SYS_SECTOR);
+
+    /* Проверяем  CRC того что было записано */
+    if (checkCrc == crc) {
+      DBG printf("SYS write OK\r\n");
+      break;
+    }
+    else
+      fAlarm = 1; // Авария
+  }
+
+  /* Произошел сбой при записи - заносим ошибку в лог и перезагружаемся */
+  if (fAlarm) {
+    DBG printf("Flash write error: 1%d", (uint8_t)status);;
+    NVIC_SystemReset();
+//    while (1)
+//    {};
+  }
+}
+
+/**
+  * @brief  Очистка сектора настроек
+  * @retval
+  */
+void SYS_EraseFlashSector(void)
+{
+  FLASH_Status status;
+
+  if ((status = FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3)) != FLASH_COMPLETE) {
+      DBG printf("SYS_EraseFlashSector error: %d\r\n", status);
+  }
+}

+ 29 - 0
modules/sys_hal.h

@@ -0,0 +1,29 @@
+/*
+ * sys_hal.h
+ *
+ *  Created on: 12.03.2017
+ *      Author: pavel
+ */
+
+#ifndef SYS_HAL_H_
+#define SYS_HAL_H_
+
+
+/**
+  * @brief
+  */
+void SYS_ReadFromFlash(uint8_t *data, uint32_t size, uint32_t baseAddress);
+
+/**
+  * @brief
+  */
+void SYS_WriteToFlash(uint8_t *data, uint32_t size, uint32_t crc);
+
+/**
+  * @brief  Очистка системного сектора настроек
+  * @retval
+  */
+void SYS_EraseFlashSector(void);
+
+
+#endif /* SYS_HAL_H_ */

+ 13 - 4
projects/gcc/stm32_flash.ld

@@ -44,9 +44,10 @@ MEMORY
 {
   BOOTLOADER_P1 (rx) : ORIGIN = 0x08000000, LENGTH = 16K
   SETTINGS      (rx) : ORIGIN = 0x08004000, LENGTH = 16K
-  BOOTLOADER    (rx) : ORIGIN = 0x08008000, LENGTH = 96K
+  SETTINGS_SYS  (rx) : ORIGIN = 0x08008000, LENGTH = 16K
+  BOOTLOADER    (rx) : ORIGIN = 0x0800C000, LENGTH = 80K
+  CRC           (rx) : ORIGIN = 0x0801FFFC, LENGTH = 4
   FLASH         (rx) : ORIGIN = 0x08020000, LENGTH = 384K
-  CRC           (rx) : ORIGIN = 0x0807FFFC, LENGTH = 4
   RAM          (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
   MEMORY_B1     (rx) : ORIGIN = 0x10000000, LENGTH = 64K
 }
@@ -130,11 +131,11 @@ SECTIONS
    .fill LOADADDR(.data) + SIZEOF(.data) :
   {
     FILL(0xFFFFFFFF);
-    /* . = ORIGIN(FLASH) + LENGTH(FLASH) - 4 - 1; */
+    /* . = ORIGIN(BOOTLOADER) + LENGTH(BOOTLOADER) - 4 - 1; */
     . = ORIGIN(CRC) - 1;
     BYTE(0xFF)
     /* PROVIDE_HIDDEN (__fini_array_end = .); */
-  } > FLASH
+  } > BOOTLOADER
   .crc :
   {
    . = ALIGN(4);
@@ -194,6 +195,14 @@ SECTIONS
     . = ORIGIN(SETTINGS) + LENGTH(SETTINGS) - 1;
     BYTE(0xFF)
   } >SETTINGS
+  
+  .settings_sys :
+  {
+    . = ALIGN(4);
+    FILL(0xFF);
+    . = ORIGIN(SETTINGS_SYS) + LENGTH(SETTINGS_SYS) - 1;
+    BYTE(0xFF)
+  } >SETTINGS_SYS
 
   .ARM.attributes 0 : { *(.ARM.attributes) }
 }