board.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "board.h"
  2. #include <string.h>
  3. #include "xparameters.h"
  4. #include "xtmrctr.h"
  5. #include "xintc.h"
  6. #include "xgpio.h"
  7. #define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID
  8. #define TMRCTR_BASEADDR XPAR_TMRCTR_0_BASEADDR
  9. #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID
  10. #define TMRCTR_INTERRUPT_ID XPAR_MICROBLAZE_0_AXI_INTC_AXI_TIMER_0_INTERRUPT_INTR
  11. #define TIMER_CNTR_0 0
  12. #define GPIO_OUTPUT_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
  13. #define LED_CHANNEL 1
  14. // reset after 1 sec
  15. #define RESET_VALUE (0xFFFFFFFF - XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ)
  16. XIntc InterruptController;
  17. XTmrCtr xil_timer;
  18. XGpio GpioOutput;
  19. void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber);
  20. static uint32_t gpio_flag = 0xFFFF;
  21. std::uint64_t gpt_system_tick = 0;
  22. void Board::toggle_led() {
  23. XGpio_Out32(GpioOutput.BaseAddress + XGPIO_DATA_OFFSET, gpio_flag);
  24. gpio_flag ^= 0xFFFF;
  25. }
  26. void Board::init_start() {
  27. XGpio_Initialize(&GpioOutput, GPIO_OUTPUT_DEVICE_ID);
  28. XGpio_SetDataDirection(&GpioOutput, LED_CHANNEL, 0x0);
  29. XTmrCtr_Initialize(&xil_timer, TMRCTR_DEVICE_ID);
  30. XTmrCtr_SelfTest(&xil_timer, TIMER_CNTR_0);
  31. XIntc_Initialize(&InterruptController, INTC_DEVICE_ID);
  32. XIntc_Connect(&InterruptController,
  33. TMRCTR_INTERRUPT_ID,
  34. (XInterruptHandler)XTmrCtr_InterruptHandler,
  35. (void*) &xil_timer);
  36. Xil_ExceptionInit();
  37. Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  38. (Xil_ExceptionHandler) XIntc_InterruptHandler,
  39. &InterruptController);
  40. XTmrCtr_SetHandler(&xil_timer,
  41. TimerCounterHandler,
  42. &xil_timer);
  43. XTmrCtr_SetOptions(&xil_timer,
  44. TIMER_CNTR_0,
  45. XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION);
  46. XTmrCtr_SetResetValue(&xil_timer, TIMER_CNTR_0, RESET_VALUE);
  47. }
  48. void Board::enable_interrupts() {
  49. microblaze_enable_interrupts();
  50. XIntc_Start(&InterruptController, XIN_REAL_MODE);
  51. XIntc_Enable(&InterruptController, TMRCTR_INTERRUPT_ID);
  52. Xil_ExceptionEnable();
  53. }
  54. void Board::disable_interrupts() {
  55. microblaze_disable_interrupts();
  56. }
  57. void Board::enable_timer() {
  58. XTmrCtr_Start(&xil_timer, TIMER_CNTR_0);
  59. }
  60. void Board::disable_timer() {
  61. XTmrCtr_Stop(&xil_timer, TIMER_CNTR_0);
  62. XIntc_Disable(&InterruptController, TMRCTR_INTERRUPT_ID);
  63. }
  64. rl::TimePoint Board::get_now() {
  65. return gpt_system_tick;
  66. }
  67. void adjust_timer(const rotor_light::Duration &value) {
  68. gpt_system_tick += value;
  69. }
  70. void Board::delay() {}
  71. // on interrupt add 1 second
  72. void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber)
  73. {
  74. gpt_system_tick ++;
  75. }