You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
6.9 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "reg_manager.h"
  2. #include "base_service/config_service.h"
  3. #include "base_service/fpga_if.h"
  4. #include "device_info.hpp"
  5. #include "iflytop_xsync_protocol/iflytop_xsync_protocol.h"
  6. #include "service/report_generator_service.h"
  7. uint32_t m_action_val0;
  8. uint32_t m_action_receipt;
  9. void reg_manager_init() {}
  10. /*******************************************************************************
  11. * ACTION *
  12. *******************************************************************************/
  13. static uint32_t doaction(uint32_t action, uint32_t val) {
  14. if (action == xsync_stm32_action_generator_new_mac) {
  15. config_generate_random_mac();
  16. config_flush();
  17. return 0;
  18. } else if (action == xsync_stm32_action_factory_reset) {
  19. config_factory_reset();
  20. return 0;
  21. } else if (action == xsync_stm32_action_reboot) {
  22. NVIC_SystemReset();
  23. return 0;
  24. } else if (action == xsync_stm32_action_storage_cfg) {
  25. config_flush();
  26. return 0;
  27. }
  28. return 0;
  29. }
  30. uint32_t reg_manager_read_reg(uint32_t addr) {
  31. uint32_t readbak = 0;
  32. static sn_t sncode;
  33. if (addr == kxsync_reg_software_version) { // read only
  34. readbak = PC_VERSION;
  35. } else if (addr == kxsync_reg_manufacturer0) { // read only
  36. readbak = PC_MANUFACTURER0;
  37. } else if (addr == kxsync_reg_manufacturer1) { // read only
  38. readbak = PC_MANUFACTURER1;
  39. } else if (addr == kxsync_reg_product_type_id) { // read only
  40. readbak = kxsync_device_type_xsync;
  41. } else if (addr == kxsync_reg_sn_id0) { // read only
  42. device_info_get_sn(&sncode);
  43. readbak = sncode.sn0;
  44. } else if (addr == kxsync_reg_sn_id1) { // read only
  45. device_info_get_sn(&sncode);
  46. readbak = sncode.sn1;
  47. } else if (addr == kxsync_reg_sn_id2) { // read only
  48. device_info_get_sn(&sncode);
  49. readbak = sncode.sn2;
  50. } else if (addr == kxsync_reg_mac0) { // read only
  51. memcpy(&readbak, config_get()->mac, 4);
  52. } else if (addr == kxsync_reg_mac1) { // read only
  53. memcpy(&readbak, config_get()->mac + 4, 4);
  54. }
  55. /*******************************************************************************
  56. * CONFIG *
  57. *******************************************************************************/
  58. else if (addr == kxsync_reg_stm32_obtaining_ip_mode) {
  59. readbak = config_get()->obtaining_ip_mode;
  60. } else if (addr == kxsync_reg_stm32_ip) {
  61. readbak = config_get()->ip;
  62. } else if (addr == kxsync_reg_stm32_gw) {
  63. readbak = config_get()->gw;
  64. } else if (addr == kxsync_reg_stm32_netmask) {
  65. readbak = config_get()->netmask;
  66. } else if (addr == kxsync_reg_stm32_config0) {
  67. readbak = config_get()->config0;
  68. } else if (addr == kxsync_reg_stm32_camera_sync_signal_count) {
  69. readbak = ReportGeneratorService_xsync_get_count();
  70. } else if (addr == kxsync_reg_stm32_camera_sync_signal_report_period) {
  71. readbak = ReportGeneratorService_get_camera_sync_code_report_period();
  72. }
  73. /*******************************************************************************
  74. * ACTION *
  75. *******************************************************************************/
  76. else if (addr == kxsync_reg_stm32_action0) {
  77. readbak = m_action_receipt;
  78. } else if (addr == kxsync_reg_stm32_action_val0) {
  79. readbak = m_action_val0;
  80. }
  81. /*******************************************************************************
  82. * FPGAоƬĴд *
  83. *******************************************************************************/
  84. else if (addr >= XYSNC_REG_FPGA_REG_START) {
  85. fpga_if_spi_read_data_02(addr, &readbak);
  86. }
  87. return readbak;
  88. }
  89. uint32_t reg_manager_write_reg(uint32_t addr, uint32_t value) {
  90. uint32_t readbak = 0;
  91. /*******************************************************************************
  92. * INFO *
  93. *******************************************************************************/
  94. if (addr == kxsync_reg_software_version) { // read only
  95. readbak = reg_manager_read_reg(addr);
  96. } else if (addr == kxsync_reg_manufacturer0) { // read only
  97. readbak = reg_manager_read_reg(addr);
  98. } else if (addr == kxsync_reg_manufacturer1) { // read only
  99. readbak = reg_manager_read_reg(addr);
  100. } else if (addr == kxsync_reg_product_type_id) { // read only
  101. readbak = reg_manager_read_reg(addr);
  102. }
  103. /*******************************************************************************
  104. * CONFIG *
  105. *******************************************************************************/
  106. else if (addr == kxsync_reg_stm32_obtaining_ip_mode) {
  107. config_get()->obtaining_ip_mode = value;
  108. readbak = config_get()->obtaining_ip_mode;
  109. } else if (addr == kxsync_reg_stm32_ip) {
  110. config_get()->ip = value;
  111. readbak = config_get()->ip;
  112. } else if (addr == kxsync_reg_stm32_gw) {
  113. config_get()->gw = value;
  114. readbak = config_get()->gw;
  115. } else if (addr == kxsync_reg_stm32_netmask) {
  116. config_get()->netmask = value;
  117. readbak = config_get()->netmask;
  118. } else if (addr == kxsync_reg_stm32_config0) {
  119. readbak = config_get()->config0;
  120. } else if (addr == kxsync_reg_stm32_camera_sync_signal_count) {
  121. ReportGeneratorService_xsync_set_count(value);
  122. readbak = ReportGeneratorService_xsync_get_count();
  123. } else if (addr == kxsync_reg_stm32_camera_sync_signal_report_period) {
  124. readbak = ReportGeneratorService_set_camera_sync_code_report_period(value);
  125. }
  126. /*******************************************************************************
  127. * ACTION *
  128. *******************************************************************************/
  129. else if (addr == kxsync_reg_stm32_action0) {
  130. readbak = doaction(value, m_action_val0);
  131. m_action_receipt = readbak;
  132. } else if (addr == kxsync_reg_stm32_action_val0) {
  133. m_action_val0 = value;
  134. readbak = value;
  135. }
  136. /*******************************************************************************
  137. * FPGAоƬĴд *
  138. *******************************************************************************/
  139. else if (addr >= XYSNC_REG_FPGA_REG_START) {
  140. fpga_if_spi_write_data_02(addr, value, &readbak);
  141. }
  142. return readbak;
  143. }
  144. void reg_manager_read_regs(uint32_t start_addr, uint32_t nreg, uint32_t* datacache, uint32_t* len) {
  145. uint32_t _nreg = nreg;
  146. if (start_addr + nreg > MAX_REG_NUM) {
  147. _nreg = MAX_REG_NUM - start_addr;
  148. }
  149. if (*len < _nreg) {
  150. _nreg = *len;
  151. }
  152. for (size_t i = start_addr; i < _nreg; i++) {
  153. datacache[i] = reg_manager_read_reg(i);
  154. }
  155. *len = _nreg;
  156. return;
  157. }