Edit online

关键流程设计

初始化流程

总体上看,DVP 驱动的初始化过程分为两大段:

  1. 阶段一:由 probe()接口完成,完成资源申请、注册 subdev、注册 buf、注册 notifier 等;
  2. 阶段二:由 open()接口完成(需要等 Sensor 执行完初始化后才能执行),完成的操作有:使能时钟、使能 DVP 控制器、初始化 Buf 链表信息等。

Buf 管理

详见 VIN 模块中的Buf 队列管理

中断处理流程

DVP 的中断处理函数中主要处理 Buf 的队列切换操作。 DVP 硬件提供的中断可以反映出多个状态(包括出错状态),其中有两个比较重要:

  1. Update done

    表示硬件已经读走了当前的 Register 值(影子寄存器),软件可以为下一帧去修改了;

  2. Frame done

    表示当前帧的数据传输完成。

可见,Update done 会先于 done 发生,驱动中用 done 判断当前 Register 是否可以修改,用 done 判断当前 buf 是否完成(done 状态),该 buf 就可以从 QBuf list 切换到 list 了。

按照 DVP 硬件设计的逻辑,Update done 和 done 会间隔着产生(不会连续两个 done): Update done -> Frame done -> Update done -> Frame done -> Update done -> Frame done ...

../../images/dvp_irq_flow1.png
1. DVP 驱动中 IRQ 处理流程

“处理 done 事件”的子流程如下:

../../images/dvp_frame_done_flow1.png
2. DVP 驱动中 done 处理流程

“处理 done 事件”的子流程如下:

../../images/dvp_update_done_flow1.png
3. DVP 驱动中 done 处理流程
  • 异常!DVP 同时使用了两个 Buf

    理论上不应该发生,可认为是 DVP 硬件异常,但因为 DVP 还在向 Buf 写数据,所以先不执行 stop,软件上报错。

  • DVP 在使用

    表示“DVP 控制器硬件正在使用”。