#include #include "video_drv.h" #include "arm_vsi.h" #ifdef _RTE_ #include "RTE_Components.h" #endif #include CMSIS_device_header #include "cmsis_os2.h" #include "RingBuffer.h" #include "arm_math.h" #include "SchedEvents.h" #include "VideoConfig.h" #include "RingConfig.h" #include "RingInit.h" extern osThreadId_t gStreamingThreadID; // Number of bytes read by DMA #define VIDEO_BLOCK_SIZE RING_BUFSIZE_RX // Number of DMA blocks #define VIDEO_DMA_NB_BLOCKS RING_NBBUFS extern int32_t VideoDrv_Setup(void); extern ring_config_t ringConfigRX; #ifdef __FVP_PY __attribute__((section(".ARM.__at_0x90000000"))) #endif __ALIGNED(16) static uint8_t video_bufferRX[VIDEO_DMA_NB_BLOCKS*VIDEO_BLOCK_SIZE]; static uint8_t *reservedBufRX=NULL; uint8_t* VideoRXBuffer() { return(video_bufferRX); } static void VideoEvent (uint32_t event) { if (event & VIDEO_DRV_EVENT_RX_DATA) { ringInterruptReleaseBuffer(&ringConfigRX,(void *)gStreamingThreadID); int reservedRX=ringInterruptReserveBuffer(&ringConfigRX); reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX); } } int32_t VideoDrv_Setup(void) { int32_t ret; ret = VideoDrv_Initialize(VideoEvent); if (ret != 0) { return ret; } ret = VideoDrv_Configure(VIDEO_DRV_INTERFACE_RX, 8U * VIDEO_DRV_PIXEL_SIZE, /* 16 sample bits */ static_cast(VIDEO_DRV_FRAME_RATE*VIDEO_DRV_WIDTH*VIDEO_DRV_HEIGHT)); if (ret != 0) { return ret; } /* Work because user process not started yet */ int reservedRX=ringInterruptReserveBuffer(&ringConfigRX); reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX); ret = VideoDrv_SetBuf(VIDEO_DRV_INTERFACE_RX, video_bufferRX, VIDEO_DMA_NB_BLOCKS,VIDEO_BLOCK_SIZE); if (ret != 0) { return ret; } ret = VideoDrv_Control(VIDEO_DRV_CONTROL_RX_ENABLE); if (ret != 0) { return ret; } return 0; }