1.Abstract media device model
在系统内部的拓扑结构中,快速找到设备,并进行实时配置,是设计该模型的一个重要目的,为了实现它,把那些具有方向图表性的构件抽象为通过pads相连的entities的硬件设备模型。
三要素:
entity:实体,sensor, controller等。
pad: entity用于连接其他entity的端点。
link: pad间的点对点连接。
2.Media device
强制要赋值的属性
dev, 指向parent device
model,device model name
3.Entities
通过调用如下函数完成初始化
media_entity_init( struct media_entity *entity,
u16 num_pads,
struct media_pad *pads,
u16 extra_links)
注:
a.每个pad需要提前设定数据方向,其他成员会在此函数中完成初始化;
b.link数可动态申请;
c.其他函数
media_device_register_entity(struct media_device *mdev, struct media_entity *entity);
media_device_unregister_entity(struct media_entity *entity);
media_entity_cleanup(struct media_entity *entity);
4.Pads
a.flags
MEDIA_PAD_FL_SINK indicates that the pad supports sinking data.
MEDIA_PAD_FL_SOURCE indicates that the pad supports sourcing data.
5.Links
通过调用如下函数创建link
media_entity_create_link( struct media_entity *source,
u16 source_pad,
struct media_entity *sink,
u16 sink_pad,
u32 flags);
a.flags
MEDIA_LNK_FL_ENABLED
MEDIA_LNK_FL_IMMUTABLE, link enable state不能在运行过程中被修改
6.Graph traversal
相关的函数
media_device_for_each_entity
media_entity_graph_walk_start
media_entity_graph_walk_next
media_entity_find_link
media_entity_remote_pady
7.Link setup
当一个link开启或者关闭时,sink/source entities(media_entity)中的link_setup(强制要求,如果是非IMMUTABLE类型的)会被media framework调用,当link_notify非空时,该回调函数也会被调用。
8.Pipelines and media streams
当启动视频流时,Pipeline中所有的entities都应当被通知,可调用以下函数实现
media_entity_pipeline_start(struct media_entity *entity, struct media_pipeline *pipe);
当停止时,调用下列函数通知所有实体
media_entity_pipeline_stop(struct media_entity *entity);
9.Link Validation
该过程在media_entity_pipeline_start调用时执行,位于media_entity.link_validate回调函数,entity driver应当检查pad和link的匹配条件。
10.其他参考文章
https://www.freesion.com/article/68991131584/