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

指向结构体 v4l2_dbg_register 的指针。

7.6.4. 描述

注意

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

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

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

要写入寄存器,应用程序必须初始化结构体 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

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