⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xllp_camera.c

📁 PXA270硬件测试源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
                                   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 + -