Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基说明:
V4L2(Video for Linux 2)
:Linux内核中关于视频设备驱动的框架,对上向应用层提供统一的接口,对下支持各类复杂硬件的灵活扩展;V4L2
框架,主要包括v4l2-core
、meida framework
、videobuf2
等模块,这也是本文将要展开的内容,仅提纲挈领;开始吧。
先从应用的角度来看如何使用v4l2
吧:
假如要进行视频数据采集,大体的步骤如上图左侧所示:
/dev/videoX
;上图右侧是v4l2-core的大体框架,右侧是对硬件的抽象,要想理解好它,可以先看一下较常见的硬件拓扑结构:
如果以上图的硬件为例,对摄像头的硬件该怎么来抽象呢?没错,就是以v4l2_device
和v4l2_subdev
来进行抽象,以v4l2_device
来代表整个输入设备,以v4l2_subdev
来代表子模块,比如CSI
、Sensor
等;
v4l2_device
:对视频设备的整体进行抽象,可以看成是一个纽带,将各个子设备联系在一起,通常它会嵌入在其他结构体中以提供v4l2
框架的功能,比如strcut isp_device
;v4l2_subdev
:对子设备进行抽象,该结构体中包含的struct v4l2_subdev_ops
是一个完备的操作函数集,用于对接各种不同的子设备,比如video、audio、sensor等,同时还有一个核心的函数集struct v4l2_subdev_core_ops
,提供更通用的功能。子设备驱动根据设备特点实现该函数集中的某些函数即可;video_device
:用于向系统注册字符设备节点,以便用户空间可以进行交互,包括各类设置以及数据buffer的获取等,在该结构体中也能看到struct v4l2_ioctl_ops
和struct vb2_queue
结构体字段,这些与上文中的应用层代码编写息息相关;struct v4l2_subdev
中内嵌的video_device
也可以不向系统注册字符设备;video_device
结构体,可以内嵌在其他结构体中,以便提供用户层交互的功能,比如struct isp_video
;v4l2-core
提供了一些实现,所以driver在实现时,非特殊情况下可以不用重复造轮子;来进一步看一下内部的注册,及调用流程吧:
struct video_device
,同时实现struct v4l2_file_operations
结构体中的函数,最终通过video_register_device
向提供注册;v4l2_register_device
函数通过cdev_add
向系统注册字符设备,并指定了file_operations
,用户空间调用open/read/write/ioctl
等接口,便可回调到驱动实现中;v4l2_register_device
函数中,通过device_register
向系统注册设备,会在/sys
文件系统下创建节点;完成注册后,用户空间便可通过文件描述符来进行访问,从应用层看,大部分都是通过ioctl
接口来完成,流程如下:
ioctl
回调到__video_do_ioctl
中,该函数会对系统提供的struct v4l2_ioctl_info v4l2_ioctls[]
表进行查询,找到对应的项后进行调用;下一个小节,让我们看看更复杂一点的情况。
为了更好的描述,本节以omap3isp
为例,先看一下它的硬件构成:
上述硬件模块,可以对应到驱动结构体struct isp_device
中的各个字段。
omap3isp的硬件模块,支持多种数据流通路,它并不是唯一的,以RGB为例,如下图:
那么,软件该如何满足这种需求呢?
没错,pipeline框架的引入可以解决这个问题。说来很巧,我曾经也实现过一个类似的框架,在阅读media framework时有一种似曾相识的感觉,核心的思想大体一致。
struct media_entity
来进行抽象,通常会将struct media_entity
嵌入到其他结构中,以支持media framework
功能;struct media_pad
,pad可以认为是端口,与其他模块进行联系的媒介,针对特定模块来说它是确定的;struct media_link
来建立连接,指定source和sink,即可将通路建立起来;因此,只需要将struct media_entity
嵌入到特定子模块中,最终便可以将子模块串联起来,构成数据流。所以,omap3isp
的驱动中,数据流就如下图所示:
video devnode
代表video device
,也就是前文中提到的导出到用户空间的节点,用于与用户进行控制及数据交互;isp_create_links
;还是看一下数据结构吧:
media_device
:与v4l2_device
类似,也是负责将各个子模块集中进行管理,同时在注册的时候,会向系统注册设备节点,方便用户层进行操作;media_entity
、media_pad
、media_link
等结构体的功能在上文中描述过,注意,这几个结构体会添加到media_device
的链表中,同时它们结构体的开始字段都需是struct media_gobj
,该结构中的mdev
将会指向它所属的media_device
。这种设计方便结构之间的查找;media_entity
中包含多个media_pad
,同时media_pad
又会指向它所属的media_entity
;media_graph
和media_pipeline
是media_entity
的集合,直观来理解,就是由一些模块构成的一条数据通路,由一个统一的数据结构来组织管理;罗列一下常见的几个接口吧,细节不表了:
/* 初始化entity的pads */
int media_entity_pads_init(struct media_entity *entity, u16 num_pads,
struct media_pad *pads);
/* 在两个entity之间创建link */
int media_create_pad_links(const struct media_device *mdev,
const u32 source_function,
struct media_entity *source,
const u16 source_pad,
const u32 sink_function,
struct media_entity *sink,
const u16 sink_pad,
u32 flags,
const bool allow_both_undefined);
/* 开始graph的遍历,从指定的entity开始 */
void media_graph_walk_start(struct media_graph *graph,
struct media_entity *entity);
/* 启动pipeline */
__must_check int media_pipeline_start(struct media_entity *entity,
struct media_pipeline *pipe);
将media framework
和v4l2_device
及v4l2_subdev
结合起来,就可以将各个子设备构建pipeline,完美!
video buffer
了。V4L2
的buffer管理是通过videobuf2
来完成的,它充当用户空间和驱动之间的中间层,并提供low-level,模块化的内存管理功能;vb2_queue
:核心的数据结构,用于描述buffer的队列,其中struct vb2_buffer *bufs[]
是存放buffer节点的数组,该数组中的成员代表了vb2 buffer
,并将在queued_list
和done_list
两个队列中进行流转;struct vb2_buf_ops
:buffer的操作函数集,由驱动来实现,并由框架通过call_bufop
宏来对特定的函数进行调用;struct vb2_mem_ops
:内存buffer分配函数接口,buffer类型分为三种:1)虚拟地址和物理地址都分散,可以通过dma-sg来完成;2)物理地址分散,虚拟地址连续,可以通过vmalloc分配;3)物理地址连续,可以通过dma-contig来完成;三种类型也vb2框架中都有实现,框架可以通过call_memop
来进行调用;struct vb2_ops
:vb2队列操作函数集,由驱动来实现对应的接口,并在框架中通过call_vb_qop
宏被调用;本节以omap3isp
为例进行简要分析,感觉直接看图就可以了:
1 . buffer申请
2 . buffer enqueue
3 . buffer dequeue
4 . stream on
行文至此,主体讲完了,相信看完本文应该有个大概的轮廓了,还有一些细节未进一步描述,就此打住。
https://lwn.net/Articles/416649/
《OMAP35x Technical Reference Manual (Rev. Y).pdf》
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/vB1ksYqbq-kg1XvLmL6U3w
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。