kernel:高通camera架构qcom_daemon

1.Camera 软件系统  QTI = Qualcomm Technologies, Inc

高通对于camera的代码组织大体是遵循Android架构的,但对于最核心的sensor端底层设置、ISP效果参数等进行了单独的剥离,放在daemon进程中进行。【但是我在比较新的文档里面有看到把daemon拿掉了。放在了camera_server里面。这个消息待验证】

1. Camera Daemon 进程
daemon进程作为单一进程,在代码中就是mm-qcamera-daemon,其main 函数的 入口,位置如下:
/project/vendor/qcom/proprietary/mm-camera/mm-camera2/server-imaging/server.c
/project/vendor/qcom/proprietary/mm-camera/mm-camera2/server-imaging/server_process.c

1.找到服务节点的名字并打开此节点
        get_server_node_name(serv_al_node_name)//这里的serv_al_node_name为video0
        ......
        hal_fd->fd[0] = open(dev_name, O_RDWR | O_NONBLOCK); //这里dev_name为节点名“/dev/video0”
 2.初始化模块。目前有sensor、iface、isp、stats、pproc及imglib六个模块

        server_process_module_sensor_init();------》module_sensor_init()
        server_process_module_init();

其中,module_sensor_init()函数中,通过判断entity.type == MEDIA_ENT_T_V4L2_SUBDEV &&entity.group_id == MSM_CAMERA_SUBDEV_SENSOR_INIT,找到相应的/dev/v4l-subdevX节点并打开,并通过LOG_IOCTL(fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg),将sensor IC的有关信息拷贝到内核空间,调用msm_sensor_driver_probe()函数,
/* Power up and probe sensor */
rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);  rc为0,表明sensro I2C通信正常,接着通过

msm_sensor_driver_create_i2c_v4l_subdev(),生成了/dev/media1&/dev/video1(后摄像头)和/dev/media2&/dev/video2(前摄像头)节点,并通过msm_sd_register(&s_ctrl->msm_sd)注册前后摄像头的sensor

用户空间的module_sensor_find_sensor_subdev(module_ctrl)和module_sensor_find_other_subdev(module_ctrl)函数,把前后sensor,actuator,csi, isp等从设备的文件节点一一确定好,并加入到module_ctrl->sensor_bundle链表中。

 3.进入主循环来处理来自HAL及MCT的事件及消息,处理完之后的结果反馈给kernel(msm.c)

typedef enum _read_fd_type {
RD_FD_HAL, ----------------server_process_hal_event(&event)---返回真,说明消息传递给 MCT,这时
不需要发送CMD ACK给kernel,因为MCT处理结束后会发出通知;反之没有,此时需要立即发送CMD ACK到kernel,
以免HAL发送此消息的线程阻塞住;处理通过hal传递下去给kernel的任何命令;用来处理kernel的node update
    case MSM_CAMERA_NEW_SESSION:
        mct_controller_new();
    ...
    case MSM_CAMERA_DEL_SESSION:
        mct_controller_destory();
    ...
    mct_controller_proc_serv_msg();
   
RD_DS_FD_HAL, ----------server_process_hal_ds_packet()---来自 HAL 层的消息,通过domain socket 传;
用来处理mapping buffer的socket messages

RD_PIPE_FD_MCT, ----------------server_process_mct_msg()---来自 media controller 的消息,通过pipe;
用来处理mct的update buffer manager: buffer type: matedata 和frame buffers main
RD_FD_NONE
} read_fd_type;

我的理解上就是server处理来自hal的消息;发送给kernel。server也处理来自kernel的消息;发送给hal。

参考:http://blog.chinaunix.net/uid-7213935-id-5749311.html

           http://blog.chinaunix.net/uid-7213935-id-5753785.html

           https://www.cnblogs.com/potato-coffee/p/4172009.html

           https://blog.csdn.net/qq_20678703/article/details/54091926

 

media controller线程

1.概述
    MCT线程是camera新架构的引擎部分,负责对管道的监控,由此来完成一个camera设备的控制运转。它运行在daemon进程空间,由MSM_CAMERA_NEW_SESSION事件来开启,具体开启函数为server_process_hal_event--->mct_controller_new()。

2.mct_controller_new()函数


    此函数创建一个新的MCT引擎,这将对应一个事务的pipeline。我们知道上层可以创建多个事务,每个对应一个camera,也对应自己的MCT及pipeline等。因此这个函数的主要完成以下几件事情:
    1.mct_pipeline_new()
        ---->创建一个Pipeline及其bus,并完成pipeline函数的映射。

<

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值