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.

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