VideoInterrupt.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stddef.h>
  2. #include "video_drv.h"
  3. #include "arm_vsi.h"
  4. #ifdef _RTE_
  5. #include "RTE_Components.h"
  6. #endif
  7. #include CMSIS_device_header
  8. #include "cmsis_os2.h"
  9. #include "RingBuffer.h"
  10. #include "arm_math.h"
  11. #include "SchedEvents.h"
  12. #include "VideoConfig.h"
  13. #include "RingConfig.h"
  14. #include "RingInit.h"
  15. extern osThreadId_t gStreamingThreadID;
  16. // Number of bytes read by DMA
  17. #define VIDEO_BLOCK_SIZE RING_BUFSIZE_RX
  18. // Number of DMA blocks
  19. #define VIDEO_DMA_NB_BLOCKS RING_NBBUFS
  20. extern int32_t VideoDrv_Setup(void);
  21. extern ring_config_t ringConfigRX;
  22. #ifdef __FVP_PY
  23. __attribute__((section(".ARM.__at_0x90000000")))
  24. #endif
  25. __ALIGNED(16) static uint8_t video_bufferRX[VIDEO_DMA_NB_BLOCKS*VIDEO_BLOCK_SIZE];
  26. static uint8_t *reservedBufRX=NULL;
  27. uint8_t* VideoRXBuffer()
  28. {
  29. return(video_bufferRX);
  30. }
  31. static void VideoEvent (uint32_t event) {
  32. if (event & VIDEO_DRV_EVENT_RX_DATA)
  33. {
  34. ringInterruptReleaseBuffer(&ringConfigRX,(void *)gStreamingThreadID);
  35. int reservedRX=ringInterruptReserveBuffer(&ringConfigRX);
  36. reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX);
  37. }
  38. }
  39. int32_t VideoDrv_Setup(void) {
  40. int32_t ret;
  41. ret = VideoDrv_Initialize(VideoEvent);
  42. if (ret != 0) {
  43. return ret;
  44. }
  45. ret = VideoDrv_Configure(VIDEO_DRV_INTERFACE_RX,
  46. 8U * VIDEO_DRV_PIXEL_SIZE, /* 16 sample bits */
  47. static_cast<uint32_t>(VIDEO_DRV_FRAME_RATE*VIDEO_DRV_WIDTH*VIDEO_DRV_HEIGHT));
  48. if (ret != 0) {
  49. return ret;
  50. }
  51. /* Work because user process not started yet
  52. */
  53. int reservedRX=ringInterruptReserveBuffer(&ringConfigRX);
  54. reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX);
  55. ret = VideoDrv_SetBuf(VIDEO_DRV_INTERFACE_RX,
  56. video_bufferRX, VIDEO_DMA_NB_BLOCKS,VIDEO_BLOCK_SIZE);
  57. if (ret != 0) {
  58. return ret;
  59. }
  60. ret = VideoDrv_Control(VIDEO_DRV_CONTROL_RX_ENABLE);
  61. if (ret != 0) {
  62. return ret;
  63. }
  64. return 0;
  65. }