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驱动层次关系

0
0
 

3、TFE HW资源

0
 

4、ISP V4L2 subdev/cam_node及context关系

0
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:
 
0
Activated Substate Manchine:
0
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,
         },
 };

 

 

 

 

 
posted @ 2024-04-06 16:09  lethe1203  阅读(144)  评论(0编辑  收藏  举报