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.

128 lines
4.8 KiB

1 year 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. uint32_t m_action_val0;
  6. uint32_t m_action_receipt;
  7. void reg_manager_init() {}
  8. uint32_t reg_manager_read_reg(uint32_t addr) {
  9. uint32_t readbak = 0;
  10. static sn_t sncode;
  11. if (addr == kreg_software_version) { // read only
  12. readbak = PC_VERSION;
  13. } else if (addr == kreg_manufacturer0) { // read only
  14. readbak = PC_MANUFACTURER0;
  15. } else if (addr == kreg_manufacturer1) { // read only
  16. readbak = PC_MANUFACTURER1;
  17. } else if (addr == kreg_product_type_id) { // read only
  18. readbak = PC_DEVICE_TYPE;
  19. } else if (addr == kreg_sn_id0) { // read only
  20. device_info_get_sn(&sncode);
  21. readbak = sncode.sn0;
  22. } else if (addr == kreg_sn_id1) { // read only
  23. device_info_get_sn(&sncode);
  24. readbak = sncode.sn1;
  25. } else if (addr == kreg_sn_id2) { // read only
  26. device_info_get_sn(&sncode);
  27. readbak = sncode.sn2;
  28. } else if (addr == kreg_mac0) { // read only
  29. memcpy(&readbak, config_get()->mac, 4);
  30. } else if (addr == kreg_mac1) { // read only
  31. memcpy(&readbak, config_get()->mac + 4, 4);
  32. }
  33. /*******************************************************************************
  34. * CONFIG *
  35. *******************************************************************************/
  36. else if (addr == kreg_stm32_obtaining_ip_mode) {
  37. readbak = config_get()->obtaining_ip_mode;
  38. } else if (addr == kreg_stm32_ip) {
  39. readbak = config_get()->ip;
  40. } else if (addr == kreg_stm32_gw) {
  41. readbak = config_get()->gw;
  42. } else if (addr == kreg_stm32_netmask) {
  43. readbak = config_get()->netmask;
  44. } else if (addr == kreg_stm32_config0) {
  45. readbak = config_get()->config0;
  46. }
  47. /*******************************************************************************
  48. * ACTION *
  49. *******************************************************************************/
  50. else if (addr == kreg_stm32_action0) {
  51. readbak = m_action_receipt;
  52. } else if (addr == kreg_stm32_action_val0) {
  53. readbak = m_action_val0;
  54. }
  55. /*******************************************************************************
  56. * FPGAоƬĴд *
  57. *******************************************************************************/
  58. else if (addr >= REGADD__FPGA_START) {
  59. fpga_if_spi_read_data(addr, &readbak);
  60. }
  61. return readbak;
  62. }
  63. uint32_t reg_manager_write_reg(uint32_t addr, uint32_t value) {
  64. uint32_t readbak = 0;
  65. /*******************************************************************************
  66. * INFO *
  67. *******************************************************************************/
  68. if (addr == kreg_software_version) { // read only
  69. readbak = reg_manager_read_reg(addr);
  70. } else if (addr == kreg_manufacturer0) { // read only
  71. readbak = reg_manager_read_reg(addr);
  72. } else if (addr == kreg_manufacturer1) { // read only
  73. readbak = reg_manager_read_reg(addr);
  74. } else if (addr == kreg_product_type_id) { // read only
  75. readbak = reg_manager_read_reg(addr);
  76. }
  77. /*******************************************************************************
  78. * CONFIG *
  79. *******************************************************************************/
  80. else if (addr == kreg_stm32_obtaining_ip_mode) {
  81. config_get()->obtaining_ip_mode = value;
  82. readbak = config_get()->obtaining_ip_mode;
  83. } else if (addr == kreg_stm32_ip) {
  84. config_get()->ip = value;
  85. readbak = config_get()->ip;
  86. } else if (addr == kreg_stm32_gw) {
  87. config_get()->gw = value;
  88. readbak = config_get()->gw;
  89. } else if (addr == kreg_stm32_netmask) {
  90. config_get()->netmask = value;
  91. readbak = config_get()->netmask;
  92. } else if (addr == kreg_stm32_config0) {
  93. readbak = config_get()->config0;
  94. }
  95. /*******************************************************************************
  96. * FPGAоƬĴд *
  97. *******************************************************************************/
  98. else if (addr >= REGADD__FPGA_START) {
  99. fpga_if_spi_write_data(addr, value, &readbak);
  100. config_update_reg(addr, value);
  101. }
  102. return readbak;
  103. }
  104. void reg_manager_read_regs(uint32_t start_addr, uint32_t nreg, uint32_t* datacache, uint32_t* len) {
  105. uint32_t _nreg = nreg;
  106. if (start_addr + nreg > MAX_REG_NUM) {
  107. _nreg = MAX_REG_NUM - start_addr;
  108. }
  109. if (*len < _nreg) {
  110. _nreg = *len;
  111. }
  112. for (size_t i = start_addr; i < _nreg; i++) {
  113. datacache[i] = reg_manager_read_reg(i);
  114. }
  115. *len = _nreg;
  116. return;
  117. }