📄 xllp_camera.c
字号:
des_physical,
camera_context->dma_channels[1],
CAMERA_DMA_DEVICE[1],
XLLP_DMAC_ALIGNMENT_OFF
);
OS_DmaStartTransfer( camera_context->dma_channels[1] );
}
// start channel 2
if ( camera_context->fifo2_descriptors_virtual ) {
des_virtual = (P_XLLP_DMAC_DESCRIPTOR_T)camera_context->fifo2_descriptors_virtual + block_id * camera_context->fifo2_num_descriptors;
des_physical = (P_XLLP_DMAC_DESCRIPTOR_T)camera_context->fifo2_descriptors_physical + block_id * camera_context->fifo2_num_descriptors;
OS_DmaCfgChannelDescTransfer( des_virtual,
des_physical,
camera_context->dma_channels[2],
CAMERA_DMA_DEVICE[2],
XLLP_DMAC_ALIGNMENT_OFF
);
OS_DmaStartTransfer( camera_context->dma_channels[2] );
}
}
void PrvStopDMATransfer( P_XLLP_Camera_Context_T camera_context )
{
// stop channel 0
OS_DmaStopTransfer( camera_context->dma_channels[0] );
// stop channel 1
if ( camera_context->fifo1_descriptors_virtual )
OS_DmaStopTransfer( camera_context->dma_channels[1] );
// stop channel 2
if ( camera_context->fifo2_descriptors_virtual )
OS_DmaStopTransfer( camera_context->dma_channels[2] );
}
XLLP_STATUS_T PrvStartCapture( P_XLLP_Camera_Context_T camera_context, unsigned int block_id, unsigned int frames )
{
XLLP_STATUS_T status;
// clear ci fifo
XllpCIResetFIFO(camera_context->ci_reg_base);
XllpCIClearInterruptStatus(camera_context->ci_reg_base, 0xFFFFFFFF);
// start dma
PrvStartDMATransfer(camera_context, block_id);
// start capture
status = camera_context->camera_functions->start_capture(camera_context, frames);
return status;
}
/***********************************************************************
*
* Init/Deinit APIs
*
***********************************************************************/
XLLP_STATUS_T XllpCameraInit( P_XLLP_Camera_Context_T camera_context )
{
XLLP_STATUS_T status = XLLP_STATUS_SUCCESS;
P_XLLP_GPIO_T pGPIO = (P_XLLP_GPIO_T)camera_context->gpio_reg_base;
int i;
// parameter check
if (camera_context->buffer_virtual == NULL || camera_context->buffer_physical == NULL || camera_context->buf_size == 0)
return XLLP_STATUS_WRONG_PARAMETER;
if (camera_context->dma_descriptors_virtual == NULL || camera_context->dma_descriptors_physical == NULL ||
camera_context->dma_descriptors_size == 0)
return XLLP_STATUS_WRONG_PARAMETER;
if (camera_context->sensor_type > XLLP_CAMERA_TYPE_MAX)
return XLLP_STATUS_WRONG_PARAMETER;
if (camera_context->capture_input_format > XLLP_CAMERA_IMAGE_FORMAT_MAX ||
camera_context->capture_output_format > XLLP_CAMERA_IMAGE_FORMAT_MAX)
return XLLP_STATUS_WRONG_PARAMETER;
// check the function dispatch table according to the sensor type
if ( !camera_context->camera_functions )
return XLLP_STATUS_WRONG_PARAMETER;
if ( !camera_context->camera_functions->init ||
!camera_context->camera_functions->deinit ||
!camera_context->camera_functions->set_capture_format ||
!camera_context->camera_functions->start_capture ||
!camera_context->camera_functions->stop_capture )
return XLLP_STATUS_WRONG_PARAMETER;
// init context status
for(i=0; i<3; i++)
camera_context->dma_channels[i] = 0xFF;
camera_context->fifo0_descriptors_virtual = camera_context->fifo1_descriptors_virtual = camera_context->fifo2_descriptors_virtual = NULL;
camera_context->fifo0_descriptors_physical = camera_context->fifo1_descriptors_physical = camera_context->fifo2_descriptors_physical = NULL;
camera_context->fifo0_num_descriptors = camera_context->fifo1_num_descriptors = camera_context->fifo2_num_descriptors = 0;
camera_context->fifo0_transfer_size = camera_context->fifo1_transfer_size = camera_context->fifo2_transfer_size = 0;
camera_context->block_number = camera_context->block_size = 0;
camera_context->block_header = camera_context->block_tail = 0;
// gpio pins init
{
// the first entry is size
static const XLLP_UINT32_T lowpins[]= {12, 27, 114, 116, 115, 90, 91, 17, 12, 23, 26, 24, 25};
static const XLLP_UINT32_T inpins[] = {11, 27, 114, 116, 115, 90, 91, 17, 12, 26, 25, 24};
static const XLLP_UINT32_T outpins[] = {1, 23};
static const XLLP_UINT32_T altpins[] = {12, 27, 114, 116, 115, 90, 91, 17, 12, 23, 26, 25, 24};
static const XLLP_UINT32_T altfunc[] = {12, 3, 1, 1, 2, 3, 3, 2, 2, 1, 2, 1, 1};
// configure processor pins
// Mux Pin GPIO Alt Direction
// CIF_DD[0]: SSP_EXTCLK 27 alt3 in
// CIF_DD[1]: USIM_VS0 114 alt1 in
// CIF_DD[2]: USIM_DET 116 alt1 in
// CIF_DD[3]: USIM_EN 115 alt2 in
// CIF_DD[4]: nUSIM_RST 90 alt3 in
// CIF_DD[5]: USIM_CLK 91 alt3 in
// CIF_DD[6]: PWM1 17 alt2 in
// CIF_DD[7]: GPIO12 12 alt2 in
// CIF_MCLK: SSP_SCLK 23 alt1 out
// CIF_PCLK: SSP_RxD 26 alt2 in
// CIF_LV: SSP_TxD 25 alt1 in
// CIF_FV: SSP_SFRM 24 alt1 in
XllpGpioSetOutput0(pGPIO, (XLLP_UINT32_T*)lowpins);
XllpGpioSetDirectionIn (pGPIO, (XLLP_UINT32_T*)inpins);
XllpGpioSetDirectionOut(pGPIO, (XLLP_UINT32_T*)outpins);
XllpGpioSetAlternateFn (pGPIO, (XLLP_UINT32_T*)altpins, (XLLP_UINT32_T*)altfunc);
}
// capture interface init
XllpCIInit(camera_context->ci_reg_base, camera_context->clk_reg_base);
// sensor init
status = camera_context->camera_functions->init(camera_context);
if (status)
goto camera_init_err;
// dma channel allocation
for(i=0; i<3; i++) {
status = OS_DmaAllocChannel(&camera_context->dma_channels[i], XLLP_DMAC_CHANNEL_PRIORITY_HIGH);
if (status)
goto camera_init_err;
}
// set capture format
status = XllpCameraSetCaptureFormat(camera_context);
if (status)
goto camera_init_err;
// set frame rate
XllpCameraSetCaptureFrameRate(camera_context);
return XLLP_STATUS_SUCCESS;
camera_init_err:
XllpCameraDeInit(camera_context);
return XLLP_STATUS_FAILURE;
}
XLLP_STATUS_T XllpCameraDeInit( P_XLLP_Camera_Context_T camera_context )
{
XLLP_STATUS_T status;
int i;
// free dma channel
for(i=0; i<3; i++)
if (camera_context->dma_channels[i] != 0xFF)
OS_DmaFreeChannel(camera_context->dma_channels[i], CAMERA_DMA_DEVICE[i]);
// deinit sensor
status = camera_context->camera_functions->deinit(camera_context);
// capture interface deinit
XllpCIDeInit(camera_context->ci_reg_base, camera_context->clk_reg_base);
return status;
}
/***********************************************************************
*
* Capture APIs
*
***********************************************************************/
// Set the image format
XLLP_STATUS_T XllpCameraSetCaptureFormat( P_XLLP_Camera_Context_T camera_context )
{
XLLP_STATUS_T status;
int ret;
unsigned frame_size;
XLLP_CI_IMAGE_FORMAT ci_input_format, ci_output_format;
XLLP_CI_MP_TIMING timing;
// set capture interface
if (camera_context->capture_input_format > XLLP_CAMERA_IMAGE_FORMAT_MAX ||
camera_context->capture_output_format > XLLP_CAMERA_IMAGE_FORMAT_MAX )
return XLLP_STATUS_WRONG_PARAMETER;
ci_input_format = FORMAT_MAPPINGS[camera_context->capture_input_format];
ci_output_format = FORMAT_MAPPINGS[camera_context->capture_output_format];
if (ci_input_format == XLLP_CI_INVALID_FORMAT || ci_output_format == XLLP_CI_INVALID_FORMAT)
return XLLP_STATUS_WRONG_PARAMETER;
XllpCISetImageFormat(camera_context->ci_reg_base, ci_input_format, ci_output_format);
timing.BFW = timing.BLW = 0;
XllpCIConfigureMP(camera_context->ci_reg_base, camera_context->capture_width-1, camera_context->capture_height-1, &timing);
// set sensor setting
status = camera_context->camera_functions->set_capture_format(camera_context);
if (status)
return status;
// ring buffer init
switch(camera_context->capture_output_format) {
case XLLP_CAMERA_IMAGE_FORMAT_RGB565:
frame_size = camera_context->capture_width * camera_context->capture_height * 2;
camera_context->fifo0_transfer_size = frame_size;
camera_context->fifo1_transfer_size = 0;
camera_context->fifo2_transfer_size = 0;
break;
case XLLP_CAMERA_IMAGE_FORMAT_YCBCR422_PACKED:
frame_size = camera_context->capture_width * camera_context->capture_height * 2;
camera_context->fifo0_transfer_size = frame_size;
camera_context->fifo1_transfer_size = 0;
camera_context->fifo2_transfer_size = 0;
break;
case XLLP_CAMERA_IMAGE_FORMAT_YCBCR422_PLANAR:
frame_size = camera_context->capture_width * camera_context->capture_height * 2;
camera_context->fifo0_transfer_size = frame_size / 2;
camera_context->fifo1_transfer_size = frame_size / 4;
camera_context->fifo2_transfer_size = frame_size / 4;
break;
default:
return XLLP_STATUS_WRONG_PARAMETER;
break;
}
camera_context->block_size = frame_size;
camera_context->block_number = camera_context->buf_size / frame_size;
camera_context->block_header = camera_context->block_tail = 0;
// generate dma descriptor chain
ret = PrvUpdateDMAChain(camera_context);
if (ret)
return XLLP_STATUS_FAILURE;
return XLLP_STATUS_SUCCESS;
}
// take a picture and copy it into the ring buffer
XLLP_STATUS_T XllpCameraCaptureStillImage( P_XLLP_Camera_Context_T camera_context, unsigned int block_id )
{
XLLP_STATUS_T status;
// init buffer status & capture
camera_context->block_header = camera_context->block_tail = block_id;
camera_context->capture_status = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -