linux摄像头驱动的拍照流程分析(针对展讯8810(ARM架构),android平台)

本文介绍了在Linux环境下,针对展讯SC8810(ARM架构)的摄像头驱动如何拍照。通过分析datasheet找到关键寄存器CAP_FRM_SIZE和CAP_IMG_DECI,并在kernel/drivers/media/目录下找到相关源文件,如sc8810_reg_isp.h,dcam_drv_sc8810.c和dcam_service_sc8810.c。驱动中使用dcam_drv_sc8810.c的ISP_DriverStart和ISP_DriverStop函数来启动和停止摄像头,同时dcam_service_sc8810.c中调用这些函数进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

首先,我们根据 展讯 SC8810的datasheet的摄像原理相关章节,找到了摄像相关寄存器的名字(CAP_FRM_SIZE、CAP_IMG_DECI),通过在驱动目录(kernel/drivers/media/),对这些名字的搜索,很幸运的可以找到相关源文件。

$ find kernel/drivers/media/ | xargs grep "CAP_FRM_SIZE"
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:   union _CAP_FRM_SIZE_TAG
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:           struct _CAP_FRM_SIZE_MAP
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:   union _CAP_FRM_SIZE_TAG
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:           struct _CAP_FRM_SIZE_MAP

$ find kernel/drivers/media/ | xargs grep "CAP_IMG_DECI" kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:   union _CAP_IMG_DECI_TAG
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:           struct _CAP_IMG_DECI_MAP
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:   union _CAP_IMG_DECI_TAG
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:           struct _CAP_IMG_DECI_MAP

 

$ vim kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h  (这个文件里定义了摄像头相关的寄存器)

$ find kernel/drivers/media/ | xargs grep "sc8810_reg_isp.h"
kernel/drivers/media/video/sprd_dcam/sc8810/sc8810_reg_isp.h:* drivers/media/video/sprd_dcam/sc8810_reg_isp.h  (这个是源文件的头注释,实际上路径写错了。)
kernel//drivers/media/video/sprd_dcam/sc8810/dcam_drv_sc8810.h:#include "sc8810_reg_isp.h"
kernel/drivers/media/video/sprd_scale/scale_drv_sc8810.h:#include "../sprd_dcam/sc8810/sc8810_reg_isp.h"

我们看到 ,有 “dcam_drv_sc8810.h”和   “scale_drv_sc8810.h” 两个头文件又引用了 “sc8810_reg_isp.h”。

 

我们继续向下追踪:

$ find kernel/drivers/media/ | xargs grep "dcam_drv_sc8810.h"
kernel/drivers/media/video/sprd_dcam/sc8810/dcam_drv_sc8810.c:#include "dcam_drv_sc8810.h"
kernel/drivers/media/video/sprd_dcam/sc8810/dcam_service_sc8810.h:#include "dcam_drv_sc8810.h"
kernel/drivers/media/video/sprd_dcam/sc8810/dcam_drv_sc8810.h:* drivers/media/video/sprd_dcam/sc8810/dcam_drv_sc8810.h(这个是源文件的头注释。)

最后, “dcam_drv_sc8810.c”引用了  “dcam_drv_sc8810.h” ,所以,我们猜想 “dcam_drv_sc8810.c” 肯定是使用了这些寄存器进行编程的。

 

 

另外, “dcam_service_sc8810.h” 除了包含了 “dcam_drv_sc8810.h” 之外,自己还定义了一些枚举类型、结构体和宏,例如:

typedef struct dcam_init_param
{
    DCAM_MODE_TYPE_E mode;
    DCAM_DATA_FORMAT_E format;
    DCAM_YUV_PATTERN_E yuv_pattern;
    RGB_TYPE_E display_rgb_type;
    DCAM_SIZE_T0 input_size;
    DCAM_POLARITY_T polarity;
    DCAM_RECT_T0 input_rect;
    DCAM_RECT_T0 display_rect;
    DCAM_RECT_T0 encoder_rect;
    DCAM_ROTATION_E rotation;
    int skip_frame;
    uint32_t first_buf_addr;
    uint32_t first_u_buf_addr;
    uint32_t zoom_level;
    uint32_t zoom_multiple;
    uint32_t skip_flag;
    uint32_t is_Y_UV;

}DCAM_INIT_PARAM_T;


顺便追踪下,dcam_service的路径:

$ find kernel/drivers/media/ | xargs grep "dcam_service_sc8810.h"
kernel/drivers/media/video/sprd_dcam/sc8810/dcam_service_sc8810.c:#include "dcam_service_sc8810.h"
kernel/drivers/media/video/sprd_dcam/sc8810/dcam_service.h:#include "dcam_service_sc8810.h"
kernel/drivers/media/video/sprd_dcam/sc8810/dcam_service_sc8810.h:* drivers/media/video/sprd_dcam/dcam_service_sc8810.h

 

 在 “dcam_service_sc8810.c” 中我们可以看到如下内容,主要是对摄像头的某些参数进行了初始化。 这里先列出部分源文件,为了使大家有一个印象。之后再详细分析流程。

typedef struct dcam_parameter
{
    DCAM_MODE_TYPE_E mode;
    DCAM_D
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值