2.23. V4L2 fwnode kAPI

struct v4l2_fwnode_endpoint

端点数据结构

定义:

struct v4l2_fwnode_endpoint {
    struct fwnode_endpoint base;
    enum v4l2_mbus_type bus_type;
    struct {
        struct v4l2_mbus_config_parallel parallel;
        struct v4l2_mbus_config_mipi_csi1 mipi_csi1;
        struct v4l2_mbus_config_mipi_csi2 mipi_csi2;
    } bus;
    u64 *link_frequencies;
    unsigned int nr_of_link_frequencies;
};

成员

base

v4l2_fwnode 的 fwnode 端点

bus_type

总线类型

bus

总线配置数据结构

bus.parallel

嵌入的 struct v4l2_mbus_config_parallel。如果总线是并行总线,则使用此项。

bus.mipi_csi1

嵌入的 struct v4l2_mbus_config_mipi_csi1。如果总线是 MIPI 联盟的相机串行接口版本 1 (MIPI CSI1) 或标准移动成像架构的紧凑型相机端口 2 (SMIA CCP2),则使用此项。

bus.mipi_csi2

嵌入的 struct v4l2_mbus_config_mipi_csi2。如果总线是 MIPI 联盟的相机串行接口版本 2 (MIPI CSI2),则使用此项。

link_frequencies

支持的链路频率数组

nr_of_link_frequencies

link_frequenccies 数组中的元素数量

V4L2_FWNODE_PROPERTY_UNSET

V4L2_FWNODE_PROPERTY_UNSET

标识未初始化的属性

描述

struct v4l2_fwnode_device_properties 中的所有属性都初始化为此值。

enum v4l2_fwnode_orientation

可能的设备方向

常量

V4L2_FWNODE_ORIENTATION_FRONT

设备安装在正面

V4L2_FWNODE_ORIENTATION_BACK

设备安装在背面

V4L2_FWNODE_ORIENTATION_EXTERNAL

设备位于外部

struct v4l2_fwnode_device_properties

fwnode 设备属性

定义:

struct v4l2_fwnode_device_properties {
    enum v4l2_fwnode_orientation orientation;
    unsigned int rotation;
};

成员

orientation

设备方向。请参阅 enum v4l2_fwnode_orientation

rotation

设备旋转

两个端点之间的链接

定义:

struct v4l2_fwnode_link {
    struct fwnode_handle *local_node;
    unsigned int local_port;
    unsigned int local_id;
    struct fwnode_handle *remote_node;
    unsigned int remote_port;
    unsigned int remote_id;
};

成员

local_node

指向此端点的 device_node 的指针

local_port

此端点所属的端口的标识符

local_id

此端点所属的 id 的标识符

remote_node

指向远程端点的 device_node 的指针

remote_port

远程端点所属的端口的标识符

remote_id

远程端点所属的 id 的标识符

enum v4l2_connector_type

连接器类型

常量

V4L2_CONN_UNKNOWN

未知连接器类型,没有 V4L2 连接器配置

V4L2_CONN_COMPOSITE

模拟复合连接器

V4L2_CONN_SVIDEO

模拟 svideo 连接器

连接器链接数据结构

定义:

struct v4l2_connector_link {
    struct list_head head;
    struct v4l2_fwnode_link fwnode_link;
};

成员

head

用于将链接添加到 struct v4l2_fwnode_connector 的结构

fwnode_link

连接器和连接器所属的设备之间的 struct v4l2_fwnode_link 链接。

struct v4l2_fwnode_connector_analog

模拟连接器数据结构

定义:

struct v4l2_fwnode_connector_analog {
    v4l2_std_id sdtv_stds;
};

成员

sdtv_stds

此连接器支持的 sdtv 标准,如果未指定限制,则设置为 V4L2_STD_ALL。

struct v4l2_fwnode_connector

连接器数据结构

定义:

struct v4l2_fwnode_connector {
    const char *name;
    const char *label;
    enum v4l2_connector_type type;
    struct list_head links;
    unsigned int nr_of_links;
    union {
        struct v4l2_fwnode_connector_analog analog;
    } connector;
};

成员

name

连接器设备名称

label

可选连接器标签

type

连接器类型

links

所有连接器 struct v4l2_connector_link 链接的列表

nr_of_links

链接总数

connector

连接器配置

connector.analog

模拟连接器配置 struct v4l2_fwnode_connector_analog

enum v4l2_fwnode_bus_type

固件属性定义的视频总线类型

常量

V4L2_FWNODE_BUS_TYPE_GUESS

如果未指定总线类型 fwnode 属性,则为默认值

V4L2_FWNODE_BUS_TYPE_CSI2_CPHY

MIPI CSI-2 总线,C-PHY 物理层

V4L2_FWNODE_BUS_TYPE_CSI1

MIPI CSI-1 总线

V4L2_FWNODE_BUS_TYPE_CCP2

SMIA 紧凑型相机端口 2 总线

V4L2_FWNODE_BUS_TYPE_CSI2_DPHY

MIPI CSI-2 总线,D-PHY 物理层

V4L2_FWNODE_BUS_TYPE_PARALLEL

相机并行接口总线

V4L2_FWNODE_BUS_TYPE_BT656

BT.656 视频格式总线类型

V4L2_FWNODE_BUS_TYPE_DPI

视频并行接口总线

NR_OF_V4L2_FWNODE_BUS_TYPE

总线类型数量

int v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode, struct v4l2_fwnode_endpoint *vep)

解析所有 fwnode 节点属性

参数

struct fwnode_handle *fwnode

指向端点的 fwnode 句柄的指针

struct v4l2_fwnode_endpoint *vep

指向 V4L2 fwnode 数据结构的指针

描述

此函数从固件解析 V4L2 fwnode 端点特定的参数。有两种使用此函数的方法,要么让它获取总线类型(通过将 vep.bus_type 字段设置为 V4L2_MBUS_UNKNOWN),要么明确指定总线类型为 enum v4l2_mbus_type 类型之一。

vep.bus_type 为 V4L2_MBUS_UNKNOWN 时,如果 “bus-type” 属性可用,该函数将使用该属性来确定类型。调用者负责在调用返回后验证 vep.bus_type 字段的内容。

作为一种已弃用的功能,为了支持旧的 DT 绑定,对于支持多种类型的设备,没有 “bus-type” 属性时,如果 “bus-type” 属性不存在,该函数将尝试根据可用的端点属性来猜测类型。**在新的驱动程序或绑定中,永远不要依赖猜测总线类型。**

也可以将 vep.bus_type 设置为对应于实际的总线。在这种情况下,该函数将仅尝试解析与此总线相关的属性,并且如果 “bus-type” 属性的值对应于不同的总线,则将返回错误。

调用者需要初始化 vep 的所有字段,可以使用显式值,也可以将它们置零。

如果函数失败,它不会更改 V4L2 fwnode 端点状态。

注意

此函数不解析 “link-frequencies” 属性,因为其大小事先未知。如果需要可变大小的属性,请使用 v4l2_fwnode_endpoint_alloc_parse()

返回值

成功时返回 0,失败时返回负错误代码

内存分配失败时返回 -ENOMEM,解析失败时返回 -EINVAL,总线类型不匹配时返回 -ENXIO

void v4l2_fwnode_endpoint_free(struct v4l2_fwnode_endpoint *vep)

释放 v4l2_fwnode_endpoint_alloc_parse() 获取的 V4L2 fwnode

参数

struct v4l2_fwnode_endpoint *vep

要释放资源的 V4L2 fwnode

描述

可以使用 NULL 参数或解析失败的 V4L2 fwnode 安全地调用此函数。

int v4l2_fwnode_endpoint_alloc_parse(struct fwnode_handle *fwnode, struct v4l2_fwnode_endpoint *vep)

解析所有 fwnode 节点属性

参数

struct fwnode_handle *fwnode

指向端点的 fwnode 句柄的指针

struct v4l2_fwnode_endpoint *vep

指向 V4L2 fwnode 数据结构的指针

描述

此函数从固件解析 V4L2 fwnode 端点特定的参数。有两种使用此函数的方法,要么让它获取总线类型(通过将 vep.bus_type 字段设置为 V4L2_MBUS_UNKNOWN),要么明确指定总线类型为 enum v4l2_mbus_type 类型之一。

vep.bus_type 为 V4L2_MBUS_UNKNOWN 时,如果 “bus-type” 属性可用,该函数将使用该属性来确定类型。调用者负责在调用返回后验证 vep.bus_type 字段的内容。

作为一种已弃用的功能,为了支持旧的 DT 绑定,对于支持多种类型的设备,没有 “bus-type” 属性时,如果 “bus-type” 属性不存在,该函数将尝试根据可用的端点属性来猜测类型。**在新的驱动程序或绑定中,永远不要依赖猜测总线类型。**

也可以将 vep.bus_type 设置为对应于实际的总线。在这种情况下,该函数将仅尝试解析与此总线相关的属性,并且如果 “bus-type” 属性的值对应于不同的总线,则将返回错误。

调用者需要初始化 vep 的所有字段,可以使用显式值,也可以将它们置零。

如果函数失败,它不会更改 V4L2 fwnode 端点状态。

v4l2_fwnode_endpoint_alloc_parse()v4l2_fwnode_endpoint_parse() 有两个重要区别

  1. 它还解析可变大小的数据。

  2. 当不再需要时,必须使用 v4l2_fwnode_endpoint_free() 释放它分配的用于存储可变大小数据的内存。

返回值

成功时返回 0,失败时返回负错误代码

内存分配失败时返回 -ENOMEM,解析失败时返回 -EINVAL,总线类型不匹配时返回 -ENXIO

解析两个端点之间的链接

参数

struct fwnode_handle *fwnode

指向链接本地端的端点的 fwnode 的指针

struct v4l2_fwnode_link *link

指向 V4L2 fwnode 链接数据结构的指针

描述

使用本地和远程节点以及端口号填充链接结构。local_node 和 remote_node 字段设置为分别指向本地和远程端口的父节点(如果端口的父节点不是 “ports” 节点,则端口的父节点是端口节点的父节点,否则是端口节点的祖父节点)。

本地和远程节点都进行了引用,当链接使用完毕时,调用者必须使用 v4l2_fwnode_put_link() 删除引用。

返回值

成功时返回 0,如果找不到远程端点 fwnode,则返回 -ENOLINK。

删除链接中节点的引用

参数

struct v4l2_fwnode_link *link

指向 V4L2 fwnode 链接数据结构的指针

描述

删除链接中本地和远程节点的引用。必须在每个使用 v4l2_fwnode_parse_link() 解析的链接上调用此函数。

void v4l2_fwnode_connector_free(struct v4l2_fwnode_connector *connector)

释放 V4L2 连接器已获取的内存

参数

struct v4l2_fwnode_connector *connector

要释放资源的 V4L2 连接器

描述

释放 v4l2_fwnode_connector_parse()v4l2_fwnode_connector_add_link() 获取的所有已分配内存并删除所有已获取的链接。

可以使用 NULL 参数或解析失败的 V4L2 连接器安全地调用此函数。

int v4l2_fwnode_connector_parse(struct fwnode_handle *fwnode, struct v4l2_fwnode_connector *connector)

初始化 ‘struct v4l2_fwnode_connector

参数

struct fwnode_handle *fwnode

指向连接器所连接到的子设备端点的 fwnode 句柄或连接器端点 fwnode 句柄的指针。

struct v4l2_fwnode_connector *connector

指向 V4L2 fwnode 连接器数据结构的指针

描述

使用连接器类型、标签和所有 enum v4l2_connector_type 特定连接器数据填充 struct v4l2_fwnode_connector。标签是可选的,如果未找到标签,则设置为 NULL。该函数将链接初始化为零。通过调用 v4l2_fwnode_connector_add_link() 向连接器添加链接。

不再需要标签分配的内存时必须释放它。通过 v4l2_fwnode_connector_free() 完成内存的释放。

返回值

  • 成功时返回 0,失败时返回负错误代码

  • 如果 fwnode 无效,则返回 -EINVAL

  • 如果连接器类型未知或找不到连接器设备,则返回 -ENOTCONN

在连接器节点和 v4l2-subdev 节点之间添加链接。

参数

struct fwnode_handle *fwnode

指向子设备端点 fwnode 句柄的指针,连接器连接到该句柄

struct v4l2_fwnode_connector *connector

指向 V4L2 fwnode 连接器数据结构的指针

描述

struct v4l2_fwnode_connector 连接器链接列表添加一个新的 struct v4l2_connector_link 链接。链接 local_node 指向连接器节点,remote_node 指向主机 v4l2(子)设备。

当不再需要时,必须释放对 remote_node 和 local_node 的引用,并且必须释放分配的内存。这两项操作都通过调用 v4l2_fwnode_connector_free() 完成。

返回值

  • 成功时返回 0,失败时返回负错误代码

  • 如果 fwnodeconnector 无效,或者 connector 类型未知,则返回 -EINVAL

  • 如果链接内存分配失败,则返回 -ENOMEM

  • 如果找不到远程连接器设备,则返回 -ENOTCONN

  • 如果 v4l2(子)设备和连接器之间的链接解析失败,则返回 -ENOLINK

int v4l2_fwnode_device_parse(struct device *dev, struct v4l2_fwnode_device_properties *props)

解析 fwnode 设备属性

参数

struct device *dev

指向 struct device 的指针

struct v4l2_fwnode_device_properties *props

指向 struct v4l2_fwnode_device_properties 的指针,解析后的属性值将存储在该结构中

描述

此函数从固件接口解析并验证 V4L2 fwnode 设备属性,并填充调用者提供的 struct v4l2_fwnode_device_properties。

返回值

成功时返回 %0,如果解析的属性值无效,则返回 -EINVAL