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.

141 lines
4.3 KiB

2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
11 months ago
9 months ago
11 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
11 months ago
2 years ago
2 years ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months 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
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 "fpga_if.h"
  2. #include "xsync_regs.hpp"
  3. /**
  4. * @brief fpga_ifʼ
  5. */
  6. #define TAG "fpga_if"
  7. static fpga_if_t fpga_if;
  8. xs_gpio_t spi2_cs;
  9. SemaphoreHandle_t m_spilock;
  10. void fpga_if_init() { //
  11. // fpga_if.spi1 = &hspi1;
  12. // fpga_if.spi2 = &hspi2;
  13. uint8_t rxbuf[1];
  14. m_spilock = xSemaphoreCreateRecursiveMutex();
  15. /**
  16. * @brief SPIδһ֮֡ǰʱǵ͵ƽ(ӦΪ)
  17. * ٴһ֡ݣʹʱ߱Ϊߵƽ
  18. */
  19. /**
  20. * @brief
  21. *
  22. * CPOL:1
  23. * CPHA:1
  24. * LSB-FIRST
  25. */
  26. fpga_if.spi2 = &hspi1;
  27. xs_gpio_init_as_output(&spi2_cs, PA4, kxs_gpio_pullup, false, true);
  28. HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
  29. // fpga_if.spi2 = &hspi1;
  30. // HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
  31. fpga_if.timecode_irq_pin = PD6;
  32. fpga_if.camera_sync_code_irq_pin = PD4;
  33. fpga_if.xsync_workstate_start_sig_irq_io_pin = PD5;
  34. fpga_if.reset_pin = PD7;
  35. #if 1
  36. xs_gpio_init_as_input(&fpga_if.camera_sync_code_irq_io, fpga_if.camera_sync_code_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
  37. xs_gpio_init_as_input(&fpga_if.timecode_irq_io, fpga_if.timecode_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
  38. xs_gpio_init_as_input(&fpga_if.xsync_workstate_start_sig_irq_io, fpga_if.xsync_workstate_start_sig_irq_io_pin, kxs_gpio_pulldown, kxs_gpio_rising_and_falling_irq, false);
  39. xs_gpio_init_as_output(&fpga_if.reset_pin_io, fpga_if.reset_pin, kxs_gpio_pullup, false, false);
  40. xs_gpio_write(&fpga_if.reset_pin_io, false);
  41. xs_delay_ms(10);
  42. xs_gpio_write(&fpga_if.reset_pin_io, true);
  43. #endif
  44. while (true) {
  45. uint32_t rxdata = 0;
  46. /**
  47. * @brief
  48. * 0x100 FPGA TTLIN ģĵַõֵַַһֵ
  49. */
  50. fpga_if_spi_read_data_02(0x0100, &rxdata);
  51. if (rxdata == 0x0100) {
  52. break;
  53. }
  54. ZLOGI(TAG, "waiting for fpga init..... %x, %x", 0x0100, rxdata);
  55. osDelay(50);
  56. }
  57. }
  58. void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) {
  59. fpga_if_spi_read_data_02(sys_timecode_data0, timecode0);
  60. fpga_if_spi_read_data_02(sys_timecode_data1, timecode1);
  61. return;
  62. }
  63. void fpga_if_get_record_state(uint32_t *recordstate) {
  64. fpga_if_spi_read_data_02(record_sig_gen_record_state, recordstate);
  65. return;
  66. }
  67. /**
  68. * @brief SPIĴдָ
  69. *
  70. * @param add
  71. * @param txdata
  72. * @param rxdata
  73. */
  74. static void _fpga_if_spi_write_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t txdata, uint32_t *rxdata) {
  75. uint8_t txbuf[2 + 5] = {0};
  76. uint8_t rxbuf[2 + 5] = {0};
  77. txbuf[0] = add & 0xFF;
  78. txbuf[1] = (add >> 8) & 0xFF;
  79. txbuf[1] |= 0x80; // write flag
  80. txbuf[2] = txdata & 0xFF;
  81. txbuf[3] = (txdata >> 8) & 0xFF;
  82. txbuf[4] = (txdata >> 16) & 0xFF;
  83. txbuf[5] = (txdata >> 24) & 0xFF;
  84. HAL_SPI_TransmitReceive_DMA(hspi, txbuf, rxbuf, 2 + 5);
  85. while (HAL_SPI_GetState(hspi) != HAL_SPI_STATE_READY) {
  86. }
  87. // HAL_SPI_Transmit(hspi, txbuf, 2 + 4, 1000);
  88. *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24);
  89. }
  90. /**
  91. * @brief SPIĴָ
  92. *
  93. * @param add
  94. * @param rxdata
  95. */
  96. static void _fpga_if_spi_read_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t *rxdata) {
  97. uint8_t txbuf[2 + 5] = {0};
  98. uint8_t rxbuf[2 + 5] = {0};
  99. txbuf[0] = add & 0xFF;
  100. txbuf[1] = (add >> 8) & 0xFF;
  101. txbuf[2] = 0;
  102. txbuf[3] = 0;
  103. txbuf[4] = 0;
  104. txbuf[5] = 0;
  105. HAL_SPI_TransmitReceive_DMA(hspi, txbuf, rxbuf, 2 + 5);
  106. while (HAL_SPI_GetState(hspi) != HAL_SPI_STATE_READY) {
  107. }
  108. *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24);
  109. }
  110. void fpga_if_spi_write_data_02(uint32_t add, uint32_t txdata, uint32_t *rxdata) {
  111. xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY);
  112. xs_gpio_write(&spi2_cs, false);
  113. _fpga_if_spi_write_data(fpga_if.spi2, add, txdata, rxdata);
  114. xs_gpio_write(&spi2_cs, true);
  115. xs_delay_us(1);
  116. xs_gpio_write(&spi2_cs, false);
  117. _fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
  118. xs_gpio_write(&spi2_cs, true);
  119. xSemaphoreGiveRecursive(m_spilock);
  120. }
  121. void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) {
  122. xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY);
  123. xs_gpio_write(&spi2_cs, false);
  124. _fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
  125. xs_gpio_write(&spi2_cs, true);
  126. xSemaphoreGiveRecursive(m_spilock);
  127. }
  128. fpga_if_t *fpga_if_get_instance() { return &fpga_if; }