[RK3288][Android6.0] Camera HAL流程小结

本文详细介绍了在Android 6.0系统上,基于RK3288平台的Camera HAL 1.0架构工作流程。从开机时的相机配置、sensor初始化,到APP打开相机、设置参数、启动预览、拍照、录制视频的过程,再到预览数据的回调处理,逐一剖析了各个环节的关键操作和系统调用。

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

Platform: RK3288
OS: Android 6.0

Kernel: 3.10.92


虽然是Android6.0, 但是rockchip用的是Camera HAL 1.0的架构,没有更新到3.x.

开机:(MediaServer会调用)
camera_get_number_of_cameras ->        CameraHal_Module.cpp
    camera_board_profiles::getInstance ->
        createInstance ->
            new camera_board_profiles
            fopen    //打开/etc/cam_board.xml
            XML_ParserCreate
            fread
            XML_ParseBuffer    //解析文件
    LoadSensor ->
        OpenAndRegistALLSensor    //第一次会去尝试注册所有cam_board.xml里的sensor.
            OpenAndRegistOneSensor ->
                RegisterSensorDevice    //通过ioctl来执行sensor的初始化过程。
        ReadDevNameFromXML ->    //如果已经初始化过,那么直接读取/data/camera/media_profiles.xml里被第一次初始化添加进去的sensor.
            OpenAndRegistOneSensor //注册只在cam_board.xml中存在的sensor,uvc camera除外。
    open    //打开/dev/videox
    ioctl    //cmd VIDIOC_QUERYCAP, 获取driver name, front/back, orientation, capabilityies(capture, streming等), version.
        v4l_querycap    ->     v4l2-ioctl.c
        ops->vidioc_querycap ->
            soc_camera_querycap     ->    soc_camera.c
                ici->ops->querycap ->
                    rk29_camera_querycap ->    rk30_camera_oneframe.c
    ioctl -> CameraHal_module.cpp    //cmd: VIDIOC_TRY_FMT type:V4L2_BUF_TYPE_VIDEO_CAPTURE
        v4l_try_fmt ->    v4l2-ioctl.c
            ops->vidioc_try_fmt_vid_cap ->    //type: V4L2_BUF_TYPE_VIDEO_CAPTURE
                soc_camera_try_fmt_vid_cap ->     soc_camera.c
                    soc_camera_try_fmt ->
                        ici->ops->try_fmt ->
                            rk_camera_try_fmt ->    rk30_camera_oneframe.c
                                v4l2_subdev_call -> //args: try_mbus_fmt
                                    generic_sensor_try_fmt    //generic_sensor.c    
    new rk_cam_total_info    //所有sensor的信息都放在里面。
    new rk_DV_info     //每个分辨率都会new一个出来。
    ioctl ->     //cmd VIDIOC_ENUM_FRAMEINTERVALS    获取一个sensor各个分辨率对应的fps。
    ProduceNewXml    //重新生成 media_profiles.xml
                       
APP打开Camera:                        
camera_device_open -> CameraHal_Module.cpp    //提供上层ops,
    new android::CameraHal ->    //HAL层和上层的处理都用这个类实现了。
        commandThreadCommandQ //创建commandCmdQ的message queue.
        new IonMemManager    //申请ion内存
        new PreviewBufferProvider    //preview buffer
        new BufferProvider        //video buffer
        new BufferProvider        //Raw buffer
        new BufferProvider    //jpeg buffer
        new CameraSOCAdapter    //一般的isp camera, uvc camera是new CameraUSBAdapter
            CameraAdapter    //各种adapter的父类。
        new DisplayAdapter ->    //new一个显示相关的adapter
            displayThreadCommandQ    //创建名为displayCmdQ的message queue.
            new DisplayThread    //处理显示相关事物。
        new AppMsgNotifier ->
            encProcessThreadCommandQ //创建名字为pictureEncThreadQ的message queue.
            eventThreadCommandQ    //创建名字为eventThreadQ的message queue.
            create_vpu_memory_pool_alloca

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值