Camx架构-Camera kernel Driver & debugging
目录
V4L2 framework
camera drivers
CRM 功能性
CRM log analysis
使能CRM log:
camera启动期间列举子设备:
userspace 连接或者取消已获得的device handles(UMD 等效于CSLLink/CSLUnlink)
userspace open request (UMD等效于CSLOpenRequest)
在SOF期间,request manager的操作:
如何将UMD sequence ID映射到kernel requestID
例如:CRM 申请ISP的request1和request2
UMD submit request
UMD submit request for realtime pipeline,并稍后在IFE/ISP中获取buf_done.
UMD submit request for offlinePreview pipeline,并稍后在ICP中获取buf_done.
SOF freeze log
V4L2 framework
camera request manager(CRM)遵循 V4L2 设备体系:
- 需要为userspace创建一个media node,以枚举所有被注册过的子设备(subdevices or entities);
- 创建一个video node 用来管理session和requests;
- 创建一个bridge entities,这个子设备是被注册在media device node;
- 将realtime modeules之间不同的request settings同步。
V4L2的 subdevices
SENSOR, IFE, ICP, LRME, JPEG, FD, CPAS, CSIPHY, ACTUATOR, CCI, FLASH,EEPROM, and OIS drivers are created after device bootup
以下这句log就表示CSL成功调用V4L2的子设备接口控制:
camxcslhwinternal.cpp:2786 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev1 (Type:CSLHwIFE, FD:12, Index:0)
设备分类:
根据hw的功能,camera相关设备可以分为realtime和nonrealtime两种。所有管理内存到内存的硬件devices被称为non realtime devices;所有进行实时streams数据驱动被成为realtime devices。
KMD driver体系
1.V4L2子设备node:如图所示camera kernel drivers用V4L2子设备接口支持UMD/CSL来建立session并与hw建立通信,这为KMD提供了single point IO control entry。
2,camera node interface:为被UMD获取的每一个设备提供node session context和state machine的pool;session node与UMD node具有一一对应的映射关心。CAMX CSL 可以从session manager
获得设备session context。
3,Camera node/context state machine
4,V4L2 bridge initialization sequence
camera drivers
CRM以前称为bridge derive,所有的V4L2子设备都被注册到bridge driver(根据camera devices)。
子设备注册具体内容:
1.V4L2子设备被注册到bridge driver的根设备上;
2.V4L2子设备的embedded media注册到bridge driver的根设备上;
3.提供SOF或者触发 到drivers 以应用新的settings;
4.与CSL/KMD通信关于即将要来的request;
5.跟踪每个devices可用的request;
6.出现error,要求设备重新使用特定的request。
CRM 功能性
CRM作用:
1,在不同pipeline不同设备之间同步reque;
2,从CSL bubble flag接收即将到达的request的相关信息,(双摄case下是同步开关)
3,用每帧SOF时间戳通知CSL;
4,对于以下情况的CRM序列示例,CRM可以针对例如局部闪光的闪光灯帧之类的情况诱发跳跃帧:
5,处理realtime devices的flush请求
session create:CAM_REQ_MGR_CREATE_SESSION
当从CSL调用create——session时,CRM将创建一个唯一的“session——handle”,这个handle被用于跨UMD和KMD来标识给定session。
作为session creation的一部分,CRM还将设置input request queue,创建workqueue用于处理任务并初始化内存管理参数(例如安全/非安全的memory context banks)
Devices linking – CAM_REQ_MGR_LINK
single session中所有real-time devices都被作为media controller graph连接的一部分,CSL通过bridge driver链接session中具有实时功能的模块。
例如,在下图中,拓扑将sensor和IFE与bridge devices相连,并形成实时图。 bridge driver可以遍历图中链接的所有realtime entities,
并通过子设备在每个链接实体上针对指定请求的子设备公开的操作顺序应用设置。
此处提到的链接仅用于桥接器,以标识链接的模块。 该链接不表示模块之间的数据流/传输。
Example topology for the connection of sensor and IFE
Example topology for front/back camera with flash
UMD call sequence the setup a link
CRM sequeue 包括如下步骤:
1,Create session
2,Set up link with connected devices (optionally, connect to another link for dual cam sync)
3,Open new request
4,Devices notify CRM of packet availability for the request
5,IFE notifies CRM of SOF trigger/error etc.
6,On trigger, if any requests are ready, CRM asks devices to apply the request
CRM可以获取已连接设备的注册操作,CRM储存和处理每一台设备的request——table和内部queue的信息,而且订阅了每个device感兴趣的事件,其中比较重要的一件就是IFE订阅了SOF事件。
以下堆栈说明了CAM_REQ_MGR_LINK的调用堆栈:
__cam_isp_ctx_link_in_acquired: 2307 next state 3
__cam_isp_ctx_link_in_acquired+0x44/0x170
cam_context_handle_crm_link+0x54/0x108
__cam_node_crm_link_setup+0x30/0x80
cam_req_mgr_link+0xd00/0xee8
cam_private_ioctl+0x234/0x958
__video_do_ioctl+0x220/0x338
video_usercopy+0x320/0x650
video_ioctl2+0x14/0x20
v4l2_compat_ioctl32+0x78/0x90
compat_SyS_ioctl+0x128/0x248
__sys_trace_return+0x0/0x4
当IFE 触发CRM workqueue时调用以下stack:
cam_req_mgr_cb_notify_trigger+0x1c/0x180
__cam_isp_ctx_notify_sof_in_activated_state+0x74/0x158
__cam_isp_ctx_handle_irq_in_activated+0x184/0x348
cam_context_handle_hw_event+0x34/0xa0
cam_tasklet_action+0xd8/0x178
tasklet_acti