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_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
权限不足。 需要 root 权限才能执行这些 ioctl。