首先,我们根据 展讯 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 &#