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_REGISTER
。match.type
和 match.addr
或 match.name
字段选择电视卡上的芯片,reg
字段指定寄存器号,val
字段是要写入寄存器的值。
要读取寄存器,应用程序必须初始化 match.type
、match.addr
或 match.name
和 reg
字段,并使用指向此结构的指针调用 VIDIOC_DBG_G_REGISTER
。成功后,驱动程序会将寄存器值存储在 val
字段中,并将值的大小(以字节为单位)存储在 size
中。
当 match.type
为 V4L2_CHIP_MATCH_BRIDGE
时,match.addr
选择电视卡上第 n 个非子设备芯片。数字零始终选择主机芯片,例如连接到 PCI 或 USB 总线的芯片。您可以使用 ioctl VIDIOC_DBG_G_CHIP_INFO ioctl 找出存在哪些芯片。
当 match.type
为 V4L2_CHIP_MATCH_SUBDEV
时,match.addr
选择第 n 个子设备。
这些 ioctl 是可选的,并非所有驱动程序都支持它们。但是,当驱动程序支持这些 ioctl 时,它也必须支持 ioctl VIDIOC_DBG_G_CHIP_INFO。相反,它可能支持 VIDIOC_DBG_G_CHIP_INFO
但不支持这些 ioctl。
VIDIOC_DBG_G_REGISTER
和 VIDIOC_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¶
__u32 |
|
有关可能的类型列表,请参阅 芯片匹配类型。 |
union { |
(匿名) |
|
__u32 |
|
通过此数字匹配芯片,根据 |
char |
|
通过此名称匹配芯片,根据 |
} |
-
类型 v4l2_dbg_register¶
|
如何匹配芯片,请参阅 |
|
__u32 |
|
寄存器大小(以字节为单位)。 |
__u64 |
|
寄存器号。 |
__u64 |
|
从寄存器读取或要写入寄存器的值。 |
|
0 |
匹配卡上的第 n 个芯片,桥芯片为零。不匹配子设备。 |
|
4 |
匹配第 n 个子设备。 |
7.6.5. 返回值¶
成功时返回 0,错误时返回 -1,并适当设置 errno
变量。通用错误代码在 通用错误代码 章节中描述。
- EPERM
权限不足。执行这些 ioctl 需要 root 权限。