Camera KMD ISP学习笔记(6)-ISP驱动架构
仅用于个人学习,侵联删
一、Context驱动模型
1、基本术语及概念
- v4l2 subdevice: 暴露给UMD的/dev/v4l-subdevX节点对应底层的数据结构,ISP驱动框架只有一个v4l2 subdev实例
- cam_node: 与v4l2 subdevice一一对应
- cam_context: subdevice node上下文,与UMD的camxnode一一对应,个数不固定,比如CAM_IFE_CTX_MAX = 4;
- cam_isp_context: ISP context对象,与cam_context一一对应
- cam_ife_hw_mgr: IFE HW Manager,管理所有三个IFE,CSID,TPG等硬件资源
- cam_ife_hw_mgr_ctx: IFE HW manager Context object
2、ISP驱动层次关系
3、TFE HW资源
4、ISP V4L2 subdev/cam_node及context关系
umd一个camxnode对应kmd一个 camera context
二、ISP状态机轮转
1、ISP中断类型
- SOF: 一帧图像数据开始传输
- EOF: 一帧图像数据传输完成
- REG_UPDATE: ISP寄存器更新完成(每个reg group都有独立的这个中断)
- EPOCH: ISP某一行结尾(默认20)就会产生此中断
- BUFFER DONE: 一帧图像数据ISP完全写到DDR了
2、ISP驱动状态机
ISP Camera Context Manchine State:
Activated Substate Manchine:
ISP初始化处于SOF状态,配置之后进入Applied状态,正常reg updated中断进入Epoch状态,等待epoch中断,等全部出完了等buffer done中断,通知ISP(也是ISP寄存器配置),配置下一帧,正常状态机一直在SOF/APPLIED/EPOCH状态。applied进入Bubble表示Isp配置没有生效。进入bubble,表示这一帧就不要了,会进入bubble recovery,如果能够恢复成功会进入下面的状态机
activated substate manchine状态机分为带中断和不带中断两种,下面是不带中断的情况:
static struct cam_ctx_ops cam_isp_ctx_activated_state_machine[CAM_ISP_CTX_ACTIVATED_MAX] = { /* SOF */ { .ioctl_ops = {}, .crm_ops = { // 只会响应crm的操作 .apply_req = __cam_isp_ctx_apply_req_in_sof, .notify_frame_skip = __cam_isp_ctx_apply_default_req_settings, }, .irq_ops = NULL, }, /* APPLIED */ { .ioctl_ops = {}, .crm_ops = {}, .irq_ops = NULL, }, /* EPOCH */ { .ioctl_ops = {}, .crm_ops = { // 只会响应crm的操作 .apply_req = __cam_isp_ctx_apply_req_in_epoch, .notify_frame_skip = __cam_isp_ctx_apply_default_req_settings, }, .irq_ops = NULL, }, /* BUBBLE */ { .ioctl_ops = {}, .crm_ops = { // 只会响应crm的操作 .apply_req = __cam_isp_ctx_apply_req_in_bubble, .notify_frame_skip = __cam_isp_ctx_apply_default_req_settings, }, .irq_ops = NULL, }, /* Bubble Applied */ { .ioctl_ops = {}, .crm_ops = {}, .irq_ops = NULL, }, /* HW ERROR */ { .ioctl_ops = {}, .crm_ops = {}, .irq_ops = NULL, }, /* HALT */ { .ioctl_ops = {}, .crm_ops = {}, .irq_ops = NULL, }, };