7.6. ioctl VIDIOC_DBG_G_REGISTER, VIDIOC_DBG_S_REGISTER

7.6.1. 名称

VIDIOC_DBG_G_REGISTER - VIDIOC_DBG_S_REGISTER - 读取或写入硬件寄存器

7.6.2. 概要

VIDIOC_DBG_G_REGISTER

int ioctl(int fd, VIDIOC_DBG_G_REGISTER, struct v4l2_dbg_register *argp)

VIDIOC_DBG_S_REGISTER

int ioctl(int fd, VIDIOC_DBG_S_REGISTER, const struct v4l2_dbg_register *argp)

7.6.3. 参数

fd

open() 返回的文件描述符。

argp

指向 struct v4l2_dbg_register 的指针。

7.6.4. 描述

注意

这是一个 实验性 API 元素 接口,将来可能会发生变化。

出于驱动程序调试目的,这些 ioctl 允许测试应用程序直接访问硬件寄存器。 正规应用程序不得使用它们。

由于写入甚至读取寄存器都可能危及系统安全性、稳定性和损坏硬件,因此这两个 ioctl 都需要超级用户权限。 此外,Linux 内核必须使用 CONFIG_VIDEO_ADV_DEBUG 选项编译才能启用这些 ioctl。

要写入寄存器,应用程序必须初始化 struct v4l2_dbg_register 的所有字段,除了 size,并使用指向此结构的指针调用 VIDIOC_DBG_S_REGISTERmatch.typematch.addrmatch.name 字段选择电视卡上的芯片,reg 字段指定寄存器号,val 字段指定要写入寄存器的值。

要读取寄存器,应用程序必须初始化 match.typematch.addrmatch.namereg 字段,并使用指向此结构的指针调用 VIDIOC_DBG_G_REGISTER。 成功后,驱动程序将寄存器值存储在 val 字段中,并将值的大小(以字节为单位)存储在 size 中。

match.typeV4L2_CHIP_MATCH_BRIDGE 时,match.addr 选择电视卡上的第 n 个非子设备芯片。 数字零始终选择主机芯片,例如连接到 PCI 或 USB 总线的芯片。 您可以使用 ioctl VIDIOC_DBG_G_CHIP_INFO ioctl 找出哪些芯片存在。

match.typeV4L2_CHIP_MATCH_SUBDEV 时,match.addr 选择第 n 个子设备。

这些 ioctl 是可选的,并非所有驱动程序都可能支持它们。 但是,当驱动程序支持这些 ioctl 时,它还必须支持 ioctl VIDIOC_DBG_G_CHIP_INFO。 相反,它可以支持 VIDIOC_DBG_G_CHIP_INFO,但不支持这些 ioctl。

VIDIOC_DBG_G_REGISTERVIDIOC_DBG_S_REGISTER 在 Linux 2.6.21 中引入,但它们的 API 在内核 2.6.29 中更改为此处描述的 API。

我们建议使用 v4l2-dbg 实用程序,而不是直接调用这些 ioctl。 它可以从 LinuxTV v4l-dvb 存储库获得; 有关访问说明,请参见 https://linuxtv.org/repo/

类型 v4l2_dbg_match
struct v4l2_dbg_match

__u32

type

有关可能的类型列表,请参见 芯片匹配类型

union {

(匿名)

__u32

addr

通过此数字匹配芯片,根据 type 字段进行解释。

char

name[32]

通过此名称匹配芯片,根据 type 字段进行解释。 目前未使用。

}

类型 v4l2_dbg_register
struct v4l2_dbg_register

struct v4l2_dbg_match

match

如何匹配芯片,请参见 v4l2_dbg_match

__u32

size

寄存器大小(以字节为单位)。

__u64

reg

寄存器号。

__u64

val

从寄存器读取或要写入寄存器的值。

芯片匹配类型

V4L2_CHIP_MATCH_BRIDGE

0

匹配卡上的第 n 个芯片,零表示桥芯片。 不匹配子设备。

V4L2_CHIP_MATCH_SUBDEV

4

匹配第 n 个子设备。

7.6.5. 返回值

成功时返回 0,出错时返回 -1,并且 errno 变量会相应地设置。 泛型错误代码在 泛型错误代码 章节中描述。

EPERM

权限不足。 需要 root 权限才能执行这些 ioctl。