sys_api.c 3.5 KB

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