SPRD Camera sensor
总结调试camera sensor的代码流程。简单的基本的代码框架
Sprd_Sensor_Porting_Guide_For_SL8521E.pdf
Open 部分:
.open = SprdCamera3Factory::camera_device_open
return gSprdCamera3Factory.cameraDeviceOpen(atoi(id), hw_device)
rc = hw->openCamera(hw_device)
ret = openCamera()
int SprdCamera3OEMIf::openCamera()
mHalOem->ops->camera_set_largest_picture_size(mCameraId, mLargestPictureWidth, mLargestPictureHeight)
ZSLMode_monitor_thread_init()
startCameraIfNecessary()
mHalOem->ops->camera_init(mCameraId, camera_cb, this, 0,&mCameraHandle, (void *)Callback_Malloc,(void *)Callback_Free))
camera_cb
obj->HandleStartPreview(cb, parm4);
obj->HandleStopPreview(cb, parm4);
obj->HandleCancelPicture(cb, parm4);
obj->HandleTakePicture(cb, parm4);
obj->HandleEncode(cb, parm4);
obj->HandleFocus(cb, parm4);
obj->HandleAutoExposure(cb, parm4);
obj->HandleStartCamera(cb, parm4);
obj->HandleStopCamera(cb, parm4);
mHalOem->ops->camera_get_zsl_capability(mCameraHandle, &is_support_zsl, &max_width, &max_height);
mHalOem->ops->camera_ioctrl(mCameraHandle, CAMERA_IOCTRL_GET_GRAB_CAPABILITY, &grab_capability);
mHalOem->ops->camera_get_sensor_exif_info(mCameraHandle, &exif_info);
mHalOem->ops->camera_get_sensor_otp_info(mCameraHandle, &otp_info);
mHalOem->ops->camera_get_sensor_info_for_raw(mCameraHandle, mode_info);
vendor/sprd/modules/libcamera/oem2v1/src/SprdOEMCamera.c
mHalOem->ops->camera_init(mCameraId, camera_cb, this, 0,&mCameraHandle, (void *)Callback_Malloc,(void *)Callback_Free))
ret = camera_local_int(camera_id, callback, client_data, is_autotest, camera_handle, cb_of_malloc, cb_of_free);
cxt->camera_cb = callback;
ret = camera_init_internal((cmr_handle)cxt, is_autotest);
ret = camera_grab_init(oem_handle);
ret = camera_res_init(oem_handle);
ret = camera_isp_init(oem_handle);
ret = camera_res_init_done(oem_handle);
ret = camera_sensor_init(oem_handle, is_autotest);
ret = cmr_sensor_init(&init_param, &sensor_handle);
ret = cmr_sns_create_thread(handle);
ret = cmr_thread_create(&handle->thread_cxt.thread_handle, SENSOR_MSG_QUEUE_SIZE, cmr_sns_thread_proc, (void *)handle);
cmr_int cmr_sns_thread_proc(struct cmr_msg *message, void *p_data)
#define CMR_SENSOR_EVT_BASE (CMR_EVT_SENSOR_BASE + 0x100)
#define CMR_SENSOR_EVT_INIT (CMR_SENSOR_EVT_BASE + 0x0)
#define CMR_SENSOR_EVT_EXIT (CMR_SENSOR_EVT_BASE + 0x1)
#define CMR_SENSOR_EVT_OPEN (CMR_SENSOR_EVT_BASE + 0x2)
#define CMR_SENSOR_EVT_CLOSE (CMR_SENSOR_EVT_BASE + 0x3)
#define CMR_SENSOR_EVT_IOCTL (CMR_SENSOR_EVT_BASE + 0x4)
#define CMR_SENSOR_EVT_SETMODE (CMR_SENSOR_EVT_BASE + 0x5)
#define CMR_SENSOR_EVT_SETMODONE (CMR_SENSOR_EVT_BASE + 0x6)
#define CMR_SENSOR_EVT_AFINIT (CMR_SENSOR_EVT_BASE + 0x7)
#define CMR_SENSOR_EVT_STREAM (CMR_SENSOR_EVT_BASE + 0x8)
#define CMR_SENSOR_EVT_SETEXIF (CMR_SENSOR_EVT_BASE + 0x9)
#define CMR_SENSOR_EVT_ISPARAM_FROM_FILE (CMR_SENSOR_EVT_BASE + 0xa)
ret = cmr_sensor_open(sensor_handle, camera_id_bits);
message.msg_type = CMR_SENSOR_EVT_OPEN;
ret = cmr_thread_msg_send(handle->thread_cxt.thread_handle, &message);
ret = cmr_sns_open(handle, ops_param);
ret = sensor_open_common(&handle->sensor_cxt[cameraId], cameraId, handle->is_autotest);
ret_val = sensor_create_ctrl_thread(sensor_cxt);
ret = cmr_thread_create(&sensor_cxt->ctrl_thread_cxt.thread_handle, SENSOR_CTRL_MSG_QUEUE_SIZE, sensor_ctrl_thread_proc, (void *)sensor_cxt);
LOCAL cmr_int sensor_ctrl_thread_proc(struct cmr_msg *message, void *p_data)
#define SENSOR_CTRL_EVT_BASE (CMR_EVT_SENSOR_BASE + 0x800)
#define SENSOR_CTRL_EVT_INIT (SENSOR_CTRL_EVT_BASE + 0x0)
#define SENSOR_CTRL_EVT_EXIT (SENSOR_CTRL_EVT_BASE + 0x1)
#define SENSOR_CTRL_EVT_SETMODE (SENSOR_CTRL_EVT_BASE + 0x2)
#define SENSOR_CTRL_EVT_SETMODONE (SENSOR_CTRL_EVT_BASE + 0x3)
#define SENSOR_CTRL_EVT_CFGOTP (SENSOR_CTRL_EVT_BASE + 0x4)
#define SENSOR_CTRL_EVT_STREAM_CTRL (SENSOR_CTRL_EVT_BASE + 0x5)
fd_sensor = hw_sensor_drv_create(&input_ptr, &hw_drv_handle);
ret = _hw_sensor_dev_init(*hw_drv_handle, input_ptr->sensor_id);
hw_drv_cxt->fd_sensor = open(HW_SENSOR_DEV_NAME, O_RDWR, 0);
kernel\drivers\misc\sprd_camera\sensor\sprd_sensor_core.c
static int sprd_sensor_file_open(struct inode *node, struct file *file)
......
if (sensor_identify(sensor_cxt, SENSOR_MAIN))
ret = sensor_get_match_info(sensor_cxt, sensor_id);
module_tab = sensor_get_module_tab(0, sensor_id);
sensor_infor_tab_ptr = (SENSOR_MATCH_T *)&back_sensor_infor_tab;
{MODULE_SUNNY, "gc0310", &g_GC0310_MIPI_yuv_info, {NULL, 0}, NULL},
ret = sensor_ic_identify(sensor_cxt, sensor_id);
ret = sensor_get_module_cfg_info(sensor_cxt, sensor_id, &mod_cfg_info);
*cfg_info = &mod_cfg_tab[i].module_info;
sensor_cxt->i2c_addr = mod_cfg_info->major_i2c_addr;
ret = sensor_ic_create(sensor_cxt, sensor_id);
sns_init_para.ops_cb.set_mode = sensor_set_mode_common;
sns_init_para.ops_cb.get_mode = sensor_get_mode_common;
sns_init_para.ops_cb.set_exif_info = sensor_set_exif_common;
sns_init_para.ops_cb.get_exif_info = sensor_get_exif_common;
sns_init_para.ops_cb.set_mode_wait_done = sensor_set_mode_done_common;
ret = sns_ops->create_handle(&sns_init_para, &sensor_cxt->sns_ic_drv_handle);
static cmr_int gc0310_drv_handle_create
sensor_ic_set_match_module_info(sns_drv_cxt, ARRAY_SIZE(s_GC0310_module_info_tab), s_GC0310_module_info_tab);
sensor_ic_set_match_resolution_info(sns_drv_cxt, ARRAY_SIZE(s_gc0310_resolution_tab_yuv), s_gc0310_resolution_tab_yuv);
sensor_ic_set_match_trim_info(sns_drv_cxt, ARRAY_SIZE(s_gc0310_resolution_trim_tab), s_gc0310_resolution_trim_tab);
sensor_i2c_init(sensor_cxt, sensor_id);
if (hw_sensor_i2c_init(sensor_cxt->hw_drv_handle, sensor_id))
ret = ioctl(hw_drv_cxt->fd_sensor, SENSOR_IO_SET_ID, &sensor_id);
sensor_power_on(sensor_cxt, SCI_TRUE); /*power on*/
sns_ops->power(sensor_cxt->sns_ic_drv_handle, power_on);
static cmr_int gc0310_drv_power_on(cmr_handle handle, cmr_uint power_on)
hw_sensor_power_down(sns_drv_cxt->hw_handle, !power_down);
ret = ioctl(hw_drv_cxt->fd_sensor, SENSOR_IO_PD, &power_level);
static long sprd_sensor_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
ret = sprd_sensor_io_set_pd(p_file, arg);
ret = sprd_sensor_set_pd_level(p_file->sensor_id, power_level);
ret = gpio_direction_output(pwn_gpio_id, 0);
hw_sensor_set_iovdd_val(sns_drv_cxt->hw_handle, iovdd_val);
ret = sprd_sensor_io_set_iovdd(p_file, arg);
hw_sensor_set_avdd_val(sns_drv_cxt->hw_handle, avdd_val);
ret = sprd_sensor_io_set_avdd(p_file, arg);
hw_sensor_set_mclk(sns_drv_cxt->hw_handle, SENSOR_DEFALUT_MCLK);
ret = sprd_sensor_io_set_mclk(p_file, arg);
ret = sns_ops->identify(sensor_cxt->sns_ic_drv_handle, SENSOR_ZERO_I2C);
static cmr_int gc0310_drv_identify(cmr_handle handle, cmr_uint param)
sensor_id = hw_sensor_read_reg
ret_val = sensor_open(sensor_cxt, sensor_id);
if (SENSOR_SUCCESS != sensor_set_mode_msg(sensor_cxt, SENSOR_MODE_COMMON_INIT,is_inited))
ret = cmr_thread_msg_send(sensor_cxt->ctrl_thread_cxt.thread_handle, &message);
sensor_set_mode(sensor_cxt, mode, is_inited);
mod_cfg_info = sensor_ic_get_data(sensor_cxt, SENSOR_CMD_GET_MODULE_CFG);
sns_ops->get_data
static cmr_int gc0310_drv_get_private_data
ret = sensor_ic_get_private_data(handle,cmd, param);
*param = sns_drv_cxt->trim_tab_info;
*param = sns_drv_cxt->res_tab_info;
*param = sns_drv_cxt->module_info;
res_trim_ptr = sensor_ic_get_data(sensor_cxt, SENSOR_CMD_GET_TRIM_TAB);
res_info_ptr = sensor_ic_get_data(sensor_cxt, SENSOR_CMD_GET_RESOLUTION);
hw_Sensor_SendRegTabToSensor(sensor_cxt->hw_drv_handle, &res_info_ptr[mode]);
ret = _hw_sensor_dev_WriteRegTab(hw_handle, ®Tab);
s_gc0310_resolution_tab_yuv
sensor_af_init(sensor_cxt);
sensor_otp_module_init(sensor_cxt);
sensor_write_dualcam_otpdata(sensor_cxt, sensor_id);
sensor_otp_rw_ctrl(sensor_cxt, OTP_READ_PARSE_DATA, 0, NULL);
otp_ops->sensor_otp_ioctl(sensor_cxt->otp_drv_handle, CMD_SNS_OTP_GET_VENDOR_ID, (void *)&vendor_id);
sensor_set_raw_infor(sensor_cxt, vendor_id);
sensor_cxt->stream_on = 1;
sensor_stream_off(sensor_cxt);
SENSOR_LOGI("open success");
至此,Camera的Open基本流程已经完成
SPRD Camera sensor相关推荐
- [SPRD CAMERA] 4 HAL Camera open流程一
前言 最近在搞8581的camera问题,作为一个新手从没有做过camera部分,希望通过这一系列的文章记录自己学习过程. 大量参考大神的文章:[Camera专题]你应该熟悉的Camera驱动 ...
- 【SPRD CAMERA】1 HAL层初始化流程
一.前言 根据我的理解以前android在启动camera service 会直接去操作hal层,这样hal层和framework就耦合在一起了.现在 Android O 中,加入了Camera Pr ...
- 展锐平台的camera sensor驱动代码设计解析(2)
展锐平台的camera sensor驱动代码设计解析(1) 展锐平台的camera sensor驱动代码设计解析(2) 展锐平台的camera sensor驱动代码设计解析(3) Camera驱动的基 ...
- Camera Sensor
camera sensor分为YUV sensor和Bayer sensor. YUV Sensor YUV Sensor输出的格式是YUV,图像的处理效果使用sensor内部的ISP,BB端接收到的 ...
- Camera sensor 基本原理
1 Camera 工作原理介绍 1.1 结构 . 一般来说,camera 主要是由 lens 和 sensor IC 两部分组成,其中有的 sensor IC 集成 了 DSP,有的没有集成,但也需要 ...
- 【高通SDM660平台 Android 10.0】(10) --- Camera Sensor lib 与 Kernel Camera Probe 代码分析
[高通SDM660平台 Android 10.0]Camera Sensor lib 与 Kernel Camera Probe 代码分析 一.libmmcamera_imx258.so 代码分析 1 ...
- Camera Sensor Binning skipping 模式介绍
通常Camera Sensor 在不同的分辨率下会对应不同的帧率.想要提高帧率就要考虑是否需要缩小视野(FOV).若不希望视野缩小,又需要减少resolution, 常用的两种方式是Binning 和 ...
- 摄像头 - Camera sensor 基本知识
Camera sensor 基本知识(1) https://www.ccm99.com/thread-115494-1-1.html (出处: 摄像头模组论坛技术研发网-camera摄像头ccm论坛) ...
- Camera Sensor 的工频闪烁
Camera Sensor 的工频闪烁 目录 Camera Sensor 的工频闪烁 一.工频干扰闪烁现象 二.工频干扰闪烁的原因 ...
最新文章
- epoll监听文件_epoll详解——从功能到内核
- 训练神经网络最应该注意什么才能让显卡最大限度的发挥性能
- some of the strides of a given numpy array are negative
- Puppet exec资源介绍(二十六)
- 一组匹配中国大陆手机号的正则表达式
- 大型翻车现场?人人车官博辟谣破产传闻 却被群嘲官博怕是还蒙在鼓里
- 自动化测试——unittest生成HTML测试报告
- 全自动抠图换背景软件下载_智能抠图换背景软件-手挥自动背景更换软件
- SQL Server 2000/2005/2008 系列产品下载地址
- 网络七层协议,一张图片告诉你
- 浅谈大型互联网的企业入/侵及防护策略
- 华为云牛客网之学生华为云服务器体验之路_1云服务器的购买篇
- Alexnet网络结构详解
- 使用代码操作WLAN
- 用批处理文件实现文件夹加密
- day18-面向对象作业
- 2022-2028全球及中国触摸屏人机界面(HMI)行业研究及十四五规划分析报告
- Linux 目录与文件
- 物联网通信-末端监控点环网组网设计
- mysql rollback如何使用_MYSQL的COMMIT和ROLLBACK使用讲解