sys_api.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include <stdint.h>
  2. #include "sys_api.h"
  3. #include "sys_hal.h"
  4. #include "settings_api.h"
  5. #include "common_config.h"
  6. #include "common.h"
  7. #include <string.h>
  8. #include <stdio.h>
  9. //static bool backup_done = false;
  10. //
  11. bool sys_set_default(sys_settings_t *settings)
  12. {
  13. memcpy(settings->sn, SN_DEFAULT, SN_LEN);
  14. snprintf(settings->prod_date, PROD_LEN, "00.00.00");
  15. memset(settings->test_state, 0, TS_LEN);
  16. settings->control_word = SETTINGS_CONTROL_WORD;
  17. settings->crc = SYS_GetCRC(settings);
  18. return true;
  19. }
  20. //
  21. uint32_t SYS_GetCRC(sys_settings_t *settings)
  22. {
  23. crc_data_reset();
  24. return crc_block_calculate((uint32_t *)settings, sizeof(*settings)/4 - 1);
  25. }
  26. //
  27. bool sys_settings_load(sys_settings_t *settings)
  28. {
  29. uint32_t loadCRC; // CRC из flash
  30. uint32_t newCRC; // CRC загруженной структуры настроек
  31. bool need_default = false;
  32. if (!settings)
  33. return false;
  34. SYS_ReadFromFlash((uint8_t*)settings, sizeof(*settings), SYS_SECTOR);
  35. // Считываем CRC из флеш памяти
  36. loadCRC = (*(uint32_t*)SYS_CRC_ADDRESS);
  37. // Рассчитываем CRC для структуры настроек
  38. newCRC = SYS_GetCRC(settings);
  39. // Если CRC не совпадают нужно прошивать дефолтные настройки
  40. if (loadCRC != newCRC)
  41. {
  42. DBG printf("Bad system sector CRC. Factory defaults restored.\r\n");
  43. need_default = true;
  44. }
  45. // CRC совпала, проверяем контрольное слово если слово не совпадает
  46. // то это значит, что поплыла структура нстроек, прошиваем дефолт */
  47. else if (settings->control_word != SETTINGS_CONTROL_WORD)
  48. {
  49. DBG printf("Bad system sector control word. Factory defaults restored.\r\n");
  50. need_default = true;
  51. }
  52. // Прошиваем дефолтные настройки если нужно
  53. if (need_default)
  54. {
  55. sys_set_default(settings);
  56. sys_save(settings);
  57. }
  58. DBG sys_print(settings);
  59. return true;
  60. }
  61. // Запись структуры настроек во flash
  62. bool sys_save(sys_settings_t *settings)
  63. {
  64. uint32_t crc_user = 0;
  65. if (!settings)
  66. return false;
  67. crc_user = SYS_GetCRC(settings);
  68. SYS_WriteToFlash((uint8_t*)settings, sizeof(*settings), crc_user);
  69. return true;
  70. }
  71. //
  72. void sys_print(sys_settings_t *settings)
  73. {
  74. char str[20];
  75. printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
  76. printf(" Системные настройки:\r\n");
  77. memset(str, 0, 20);
  78. memcpy(str, settings->sn, SN_LEN);
  79. printf("\tСерийный номер: %s\r\n", str);
  80. printf("\tДата производства: ");
  81. printf("%s\r\n", settings->prod_date);
  82. printf("\tСтатус тестирования: ");
  83. printf("%s\r\n", settings->test_state);
  84. printf("\tКонтрольное слово: ");
  85. printf("%u\r\n", settings->control_word);
  86. printf("\tCRC: ");
  87. printf("0x%X\r\n", settings->crc);
  88. printf("\r\n\n");
  89. }
  90. // Очистить сектор системных настроек
  91. void sys_clear(void)
  92. {
  93. flash_unlock();
  94. SYS_EraseFlashSector();
  95. flash_lock();
  96. }