目录
谁来救救我…
【DVP接口】0v5640 的DVP接口设计分析(硬件)
【DVP接口】0v5640 的DVP接口设计分析(软件)
0. 个人简介 && 授权须知
📋 个人简介
- 💖 作者简介:大家好,我是喜欢记录零碎知识点的菜鸟打工人。😎
- 📝 个人主页:欢迎访问我的博客主页🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:嵌入式开发专栏 🍁 🍁
- 💬格言:写文档啊不是写文章,重要的还是直白!🔥
转载文章,禁止声明原创;不允许直接二次转载,转载请根据原文链接联系作者
若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。作者:积跬步、至千里
1. buf 队列管理
VIN
模块中的队列管理,参考了Linux
的V4L2
框架,通过 struct vb_queue
结构中的两个Buf
队列来管理,DVP
驱动中还需要维护一个buf_list
来配合DVP
控制器的地址更新。 整个Buf
流转的过程如下图:
2. 初始化
2.1 硬件接口初始化
2.1.1 行中断 HNUM 配置
设置
DVP
控制器接收10
行数据的后,产生中断,10
为href
下降沿的个数
硬件产生中断以后,软件上更新buf
地址在新的内存空间接收数据
2.1.2 注册中断服务函数
2.2 申请内存空间
g_mpp_dvp_buf
是内存空间的首地址
2.3 软件数据结构初始化
2.3.1 【3个】链表的初始化
vb_queue
,用于描述buf
的数据结构
// 用于描述 buf 的数据结构
struct vb_queue {
aicos_sem_t done; // 信号量
struct vb_buffer bufs[VIN_MAX_BUF_NUM]; // buf 大小
unsigned int num_buffers; // buf 个数
struct list_head queued_list; // 空闲链表
unsigned int queued_count; // 空闲节点个数
unsigned int owned_by_drv_count; // 驱动使用的个数
struct list_head done_list; // 填充了视频数据的 链表
unsigned int streaming:1; // 正在开始运行视频流
unsigned int error:1;
unsigned int waiting_in_dqbuf:1;
};
DVP 控制器设备管理信息【三个链表】的初始化
设置视频的输入和输出格式
3. 用户申请 video buf
参考 【2.2 申请内存空间】小节,最终 binfo
指向了 g_mpp_dvp_buf
内存空间的首地址。
代码中设定的参数为:
video_buf
参数的赋值为:
赋值过程为:
4. buf 入列
我们申请了
3
个buf
,每个buf
大小为640*480*2
,将三个buf
入列,最终加入到
vb_queue
这个数据结构中
入列之后,链表为,此时所有
buf
都在空闲链表中
5. 启动 stream
下面实在分析不下去了,脑子都要炸了