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
Ca