You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
1.9 KiB
C++
102 lines
1.9 KiB
C++
#include <stddef.h>
|
|
#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<uint32_t>(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;
|
|
}
|
|
|