sys_api.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 "rtc.h"
  8. #include <string.h>
  9. #include <stdio.h>
  10. //
  11. bool sys_set_default(sys_settings_t *settings)
  12. {
  13. settings->sn = 0;
  14. settings->prod_date = 0;
  15. settings->test_state = 0;
  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. TM_RTC_t data;
  75. printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
  76. printf(" Системные настройки:\r\n");
  77. printf("\tСерийный номер: %u\r\n", settings->sn);
  78. TM_RTC_GetDateTimeFromUnix(&data, settings->prod_date);
  79. printf("\tДата производства: ");
  80. printf("%02d.%02d.%02d %02d:%02d:%02d\r\n", data.date, data.month, data.year,
  81. data.hours, data.minutes, data.seconds);
  82. printf("\tСтатус тестирования: ");
  83. switch (settings->test_state) {
  84. case 0 : printf("NO Test\r\n"); break;
  85. case 1 : printf("Test OK\r\n"); break;
  86. case 2 : printf("Test FAIL\r\n"); break;
  87. default : break;
  88. }
  89. printf("\tКонтрольное слово: ");
  90. printf("%u\r\n", settings->control_word);
  91. printf("\tCRC: ");
  92. printf("0x%X\r\n", settings->crc);
  93. printf("\r\n\n");
  94. }
  95. // Очистить сектор системных настроек
  96. void sys_clear(void)
  97. {
  98. flash_unlock();
  99. SYS_EraseFlashSector();
  100. flash_lock();
  101. }