9.1.2. cx2341x 驱动程序

9.1.2.1. cx2341x 芯片上的内存

本节介绍了 cx2341x 的内存映射,并记录了一些寄存器空间。

注意

内存长字是小端(“英特尔格式”)。

警告

此信息是通过搜索内存和寄存器得出的,此信息可能不正确,当然也不完整,并且仅通过诸如以下的命令搜索内存空间而得出的

ivtvctl -O min=0x02000000,max=0x020000ff

所以请按原样使用,我一直在寻找更多信息,这是一个很大的寄存器空间 :-)。

9.1.2.1.1. 内存映射

cx2341x 通过 PCI BAR0(基址寄存器 0)将其整个 64M 内存空间暴露给 PCI 主机。这里的地址是相对于 BAR0 中保存的地址的偏移量。

0x00000000-0x00ffffff Encoder memory space
0x00000000-0x0003ffff Encode.rom
???-???         MPEG buffer(s)
???-???         Raw video capture buffer(s)
???-???         Raw audio capture buffer(s)
???-???         Display buffers (6 or 9)

0x01000000-0x01ffffff Decoder memory space
0x01000000-0x0103ffff Decode.rom
???-???         MPEG buffers(s)
0x0114b000-0x0115afff Audio.rom (deprecated?)

0x02000000-0x0200ffff Register Space

9.1.2.1.2. 寄存器

寄存器占用从 BAR0 偏移 0x02000000 开始的 64k 空间。所有这些寄存器的宽度均为 32 位。

DMA Registers 0x000-0xff:

0x00 - Control:
        0=reset/cancel, 1=read, 2=write, 4=stop
0x04 - DMA status:
        1=read busy, 2=write busy, 4=read error, 8=write error, 16=link list error
0x08 - pci DMA pointer for read link list
0x0c - pci DMA pointer for write link list
0x10 - read/write DMA enable:
        1=read enable, 2=write enable
0x14 - always 0xffffffff, if set any lower instability occurs, 0x00 crashes
0x18 - ??
0x1c - always 0x20 or 32, smaller values slow down DMA transactions
0x20 - always value of 0x780a010a
0x24-0x3c - usually just random values???
0x40 - Interrupt status
0x44 - Write a bit here and shows up in Interrupt status 0x40
0x48 - Interrupt Mask
0x4C - always value of 0xfffdffff,
        if changed to 0xffffffff DMA write interrupts break.
0x50 - always 0xffffffff
0x54 - always 0xffffffff (0x4c, 0x50, 0x54 seem like interrupt masks, are
        3 processors on chip, Java ones, VPU, SPU, APU, maybe these are the
        interrupt masks???).
0x60-0x7C - random values
0x80 - first write linked list reg, for Encoder Memory addr
0x84 - first write linked list reg, for pci memory addr
0x88 - first write linked list reg, for length of buffer in memory addr
        (|0x80000000 or this for last link)
0x8c-0xdc - rest of write linked list reg, 8 sets of 3 total, DMA goes here
        from linked list addr in reg 0x0c, firmware must push through or
        something.
0xe0 - first (and only) read linked list reg, for pci memory addr
0xe4 - first (and only) read linked list reg, for Decoder memory addr
0xe8 - first (and only) read linked list reg, for length of buffer
0xec-0xff - Nothing seems to be in these registers, 0xec-f4 are 0x00000000.

编码器缓冲区内存位置 0x700-0x7ff

这些寄存器显示与每个用于编码的缓冲区区域相关的内存位置的偏移量,必须先将它们左移 <<1。

  • 0x07F8:编码器 SDRAM 刷新

  • 0x07FC:编码器 SDRAM 预充电

解码器缓冲区内存位置 0x800-0x8ff

这些寄存器显示与每个用于解码的缓冲区区域相关的内存位置的偏移量,必须先将它们左移 <<1。

  • 0x08F8:解码器 SDRAM 刷新

  • 0x08FC:解码器 SDRAM 预充电

其他内存位置

  • 0x2800:视频显示模块控制

  • 0x2D00:AO(音频输出?)控制

  • 0x2D24:刷新的字节数

  • 0x7000:LSB I2C 写时钟位(反转)

  • 0x7004:LSB I2C 写数据位(反转)

  • 0x7008:LSB I2C 读取时钟位

  • 0x700c:LSB I2C 读取数据位

  • 0x9008:GPIO 获取输入状态

  • 0x900c:GPIO 设置输出状态

  • 0x9020:GPIO 方向(Bit7(GPIO 0..7)- 0:输入,1:输出)

  • 0x9050:SPU 控制

  • 0x9054:重置硬件块

  • 0x9058:VPU 控制

  • 0xA018:Bit6:中断挂起?

  • 0xA064:APU 命令

9.1.2.1.3. 中断状态寄存器

中断状态寄存器 0x0040 和中断掩码 0x0048 中位的定义。如果清除掩码中的某个位,则我们希望执行 ISR。

  • bit 31 编码器开始捕获

  • bit 30 编码器 EOS

  • bit 29 编码器 VBI 捕获

  • bit 28 编码器视频输入模块复位事件

  • bit 27 编码器 DMA 完成

  • bit 24 解码器音频模式更改检测事件(通过事件通知)

  • bit 22 解码器数据请求

  • bit 20 解码器 DMA 完成

  • bit 19 解码器 VBI 重新插入

  • bit 18 解码器 DMA 错误(链表错误)

9.1.2.2. 缺少文档

  • 编码器 API 发布(?)

  • 解码器 API 发布(?)

  • 解码器 VTRACE 事件

9.1.2.3. cx2341x 固件上传

本文档介绍如何将 cx2341x 固件上传到卡。

9.1.2.3.1. 如何查找

请参阅使用此芯片的各种项目的网页,了解如何获取固件的信息。

存储在 Windows 驱动程序中的固件可以如下检测

  • 每个固件映像为 256k 字节。

  • 编码器映像的第一个 32 位字为 0x0000da7

  • 解码器映像的第一个 32 位字为 0x00003a7

  • 两个映像的第二个 32 位字均为 0xaa55bb66

9.1.2.3.2. 如何加载

  • 如果编码器正在运行,则发出 FWapi 命令以停止编码器。等待命令完成。

  • 如果解码器正在运行,则发出 FWapi 命令以停止解码器。等待命令完成。

  • 向数字化仪发出 I2C 命令以停止发出 VSYNC 事件。

  • 发出 FWapi 命令以停止编码器的固件。

  • 休眠 10 毫秒。

  • 发出 FWapi 命令以停止解码器的固件。

  • 休眠 10 毫秒。

  • 向寄存器 0x2800 写入 0x00000000 以停止视频显示模块。

  • 向寄存器 0x2D00 写入 0x00000005 以停止 AO(音频输出?)。

  • 向寄存器 0xA064 写入 0x00000000 以 ping? APU。

  • 向寄存器 0x9058 写入 0xFFFFFFFE 以停止 VPU。

  • 向寄存器 0x9054 写入 0xFFFFFFFF 以重置硬件块。

  • 向寄存器 0x9050 写入 0x00000001 以停止 SPU。

  • 休眠 10 毫秒。

  • 向寄存器 0x07FC 写入 0x0000001A 以初始化编码器 SDRAM 的预充电。

  • 向寄存器 0x07F8 写入 0x80000640 以将编码器 SDRAM 的刷新初始化为 1us。

  • 向寄存器 0x08FC 写入 0x0000001A 以初始化解码器 SDRAM 的预充电。

  • 向寄存器 0x08F8 写入 0x80000640 以将解码器 SDRAM 的刷新初始化为 1us。

  • 休眠 512 毫秒。(建议 600 毫秒)

  • 将编码器的固件映像传输到编码器内存空间中的偏移量 0。

  • 将解码器的固件映像传输到解码器内存空间中的偏移量 0。

  • 使用读取-修改-写入操作清除寄存器 0x9050 的位 0 以重新启用 SPU。

  • 休眠 1 秒。

  • 使用读取-修改-写入操作清除寄存器 0x9058 的位 3 和 0 以重新启用 VPU。

  • 休眠 1 秒。

  • 发出状态 API 命令以验证两个固件映像。

9.1.2.4. 如何调用固件 API

首选的调用约定称为固件邮箱。邮箱基本上是一个固定长度的数组,用作调用堆栈。

可以通过在编码器和解码器内存中搜索 16 字节签名来定位固件邮箱。该签名将位于 256 字节边界上。

签名

0x78, 0x56, 0x34, 0x12, 0x12, 0x78, 0x56, 0x34,
0x34, 0x12, 0x78, 0x56, 0x56, 0x34, 0x12, 0x78

固件实现 20 个包含 20 个 32 位字的邮箱。前 10 个保留用于 API 调用。后 10 个由固件用于事件通知。

索引

名称

0

标志

1

命令

2

返回值

3

超时

4-19

参数/结果

标志在下表中定义。方向是从固件的角度出发的。

方向

目的

2

O

固件已处理该命令。

1

I

驱动程序已完成参数设置。

0

I

驱动程序正在使用此邮箱。

该命令是一个 32 位枚举器。API 规范可以在本章中找到。

返回值是一个 32 位枚举器。当前仅定义了两个值

  • 0=成功

  • -1=命令未定义。

有 16 个参数/结果 32 位字段。驱动程序使用调用所需的所有参数的值填充这些字段。驱动程序使用调用返回的结果值覆盖这些字段。

超时值保护卡免受驱动程序线程挂起的影响。如果驱动程序未在指定超时时间内处理完成的调用,则固件将重置该邮箱。

要发出 API 调用,驱动程序会迭代每个邮箱,寻找第一个可用的邮箱(位 0 已被清除)。驱动程序设置该位,填写命令枚举器、超时值和任何必需的参数。然后,驱动程序设置参数就绪位(位 1)。固件扫描邮箱以查找挂起的命令,处理它们,设置结果代码,使用该调用的返回值填充结果值数组,并设置调用完成位(位 2)。一旦设置位 2,驱动程序应检索结果并清除所有标志。如果驱动程序未在超时寄存器中设置的时间内执行此任务,则固件将重置该邮箱。

事件通知从固件发送到主机。主机通过 API 调用告知固件它对哪些事件感兴趣。该调用告诉固件使用哪个通知邮箱。固件通过中断向主机发出信号。仅使用 16 个结果字段,而不使用标志、命令、返回值和超时字。

9.1.2.5. OSD 固件 API 描述

注意

此 API 是解码器固件的一部分,因此仅适用于 cx23415。

9.1.2.5.1. CX2341X_OSD_GET_FRAMEBUFFER

枚举:65/0x41

9.1.2.5.1.1. 描述

返回连续 OSD 内存的基地址和长度。

9.1.2.5.1.2. 结果[0]

OSD 基地址

9.1.2.5.1.3. 结果[1]

OSD 长度

9.1.2.5.2. CX2341X_OSD_GET_PIXEL_FORMAT

枚举:66/0x42

9.1.2.5.2.1. 描述

查询 OSD 格式

9.1.2.5.2.2. 结果[0]

0=8 位索引 1=16 位 RGB 5:6:5 2=16 位 ARGB 1:5:5:5 3=16 位 ARGB 1:4:4:4 4=32 位 ARGB 8:8:8:8

9.1.2.5.3. CX2341X_OSD_SET_PIXEL_FORMAT

枚举:67/0x43

9.1.2.5.3.1. 描述

分配像素格式

9.1.2.5.3.2. 参数[0]

  • 0=8 位索引

  • 1=16 位 RGB 5:6:5

  • 2=16 位 ARGB 1:5:5:5

  • 3=16 位 ARGB 1:4:4:4

  • 4=32 位 ARGB 8:8:8:8

9.1.2.5.4. CX2341X_OSD_GET_STATE

枚举:68/0x44

9.1.2.5.4.1. 描述

查询 OSD 状态

9.1.2.5.4.2. 结果[0]

  • 位 0 0=关闭,1=开启

  • 位 1:2 alpha 控制

  • 位 3:5 像素格式

9.1.2.5.5. CX2341X_OSD_SET_STATE

枚举:69/0x45

9.1.2.5.5.1. 描述

OSD 开关

9.1.2.5.5.2. 参数[0]

0=关闭,1=开启

9.1.2.5.6. CX2341X_OSD_GET_OSD_COORDS

枚举:70/0x46

9.1.2.5.6.1. 描述

检索与视频混合的 OSD 区域的坐标

9.1.2.5.6.2. 结果[0]

OSD 缓冲区地址

9.1.2.5.6.3. 结果[1]

以像素为单位的步幅

9.1.2.5.6.4. 结果[2]

OSD 缓冲区中的行数

9.1.2.5.6.5. 结果[3]

缓冲区中的水平偏移

9.1.2.5.6.6. 结果[4]

缓冲区中的垂直偏移

9.1.2.5.7. CX2341X_OSD_SET_OSD_COORDS

枚举:71/0x47

9.1.2.5.7.1. 描述

分配要与视频混合的 OSD 区域的坐标

9.1.2.5.7.2. 参数[0]

缓冲区地址

9.1.2.5.7.3. 参数[1]

以像素为单位的缓冲区步幅

9.1.2.5.7.4. 参数[2]

缓冲区中的行数

9.1.2.5.7.5. 参数[3]

水平偏移

9.1.2.5.7.6. 参数[4]

垂直偏移

9.1.2.5.8. CX2341X_OSD_GET_SCREEN_COORDS

枚举:72/0x48

9.1.2.5.8.1. 描述

检索 OSD 屏幕区域坐标

9.1.2.5.8.2. 结果[0]

左上角水平偏移

9.1.2.5.8.3. 结果[1]

左上角垂直偏移

9.1.2.5.8.4. 结果[2]

右下角水平偏移

9.1.2.5.8.5. 结果[3]

右下角垂直偏移

9.1.2.5.9. CX2341X_OSD_SET_SCREEN_COORDS

枚举:73/0x49

9.1.2.5.9.1. 描述

分配要与视频混合的屏幕区域的坐标

9.1.2.5.9.2. 参数[0]

左上角水平偏移

9.1.2.5.9.3. 参数[1]

左上角垂直偏移

9.1.2.5.9.4. 参数[2]

左下角水平偏移

9.1.2.5.9.5. 参数[3]

左下角垂直偏移

9.1.2.5.10. CX2341X_OSD_GET_GLOBAL_ALPHA

枚举:74/0x4A

9.1.2.5.10.1. 描述

检索 OSD 全局 alpha

9.1.2.5.10.2. 结果[0]

全局 alpha:0=关闭,1=开启

9.1.2.5.10.3. 结果[1]

位 0:7 全局 alpha

9.1.2.5.11. CX2341X_OSD_SET_GLOBAL_ALPHA

枚举:75/0x4B

9.1.2.5.11.1. 描述

更新全局 alpha

9.1.2.5.11.2. 参数[0]

全局 alpha:0=关闭,1=开启

9.1.2.5.11.3. 参数[1]

全局 alpha(8 位)

9.1.2.5.11.4. 参数[2]

局部 alpha:0=开启,1=关闭

9.1.2.5.12. CX2341X_OSD_SET_BLEND_COORDS

枚举:78/0x4C

9.1.2.5.12.1. 描述

移动显示缓冲区内混合区域的起始位置

9.1.2.5.12.2. 参数[0]

缓冲区中的水平偏移

9.1.2.5.12.3. 参数[1]

缓冲区中的垂直偏移

9.1.2.5.13. CX2341X_OSD_GET_FLICKER_STATE

枚举:79/0x4F

9.1.2.5.13.1. 描述

检索闪烁减少模块状态

9.1.2.5.13.2. 结果[0]

闪烁状态:0=关闭,1=开启

9.1.2.5.14. CX2341X_OSD_SET_FLICKER_STATE

枚举:80/0x50

9.1.2.5.14.1. 描述

设置闪烁减少模块状态

9.1.2.5.14.2. 参数[0]

状态:0=关闭,1=开启

9.1.2.5.15. CX2341X_OSD_BLT_COPY

枚举:82/0x52

9.1.2.5.15.1. 描述

BLT 复制

9.1.2.5.15.2. 参数[0]

'0000'  zero
'0001' ~destination AND ~source
'0010' ~destination AND  source
'0011' ~destination
'0100'  destination AND ~source
'0101'                  ~source
'0110'  destination XOR  source
'0111' ~destination OR  ~source
'1000' ~destination AND ~source
'1001'  destination XNOR source
'1010'                   source
'1011' ~destination OR   source
'1100'  destination
'1101'  destination OR  ~source
'1110'  destination OR   source
'1111'  one

9.1.2.5.15.3. 参数[1]

最终 alpha 混合

  • “01” source_alpha

  • “10” destination_alpha

  • “11” source_alpha*destination_alpha+1(如果源 alpha 和目标 alpha 都为零,则为零)

9.1.2.5.15.4. 参数[2]

'00' output_pixel = source_pixel

'01' if source_alpha=0:
         output_pixel = destination_pixel
     if 256 > source_alpha > 1:
         output_pixel = ((source_alpha + 1)*source_pixel +
                         (255 - source_alpha)*destination_pixel)/256

'10' if destination_alpha=0:
         output_pixel = source_pixel
      if 255 > destination_alpha > 0:
         output_pixel = ((255 - destination_alpha)*source_pixel +
                         (destination_alpha + 1)*destination_pixel)/256

'11' if source_alpha=0:
         source_temp = 0
     if source_alpha=255:
         source_temp = source_pixel*256
     if 255 > source_alpha > 0:
         source_temp = source_pixel*(source_alpha + 1)
     if destination_alpha=0:
         destination_temp = 0
     if destination_alpha=255:
         destination_temp = destination_pixel*256
     if 255 > destination_alpha > 0:
         destination_temp = destination_pixel*(destination_alpha + 1)
     output_pixel = (source_temp + destination_temp)/256

9.1.2.5.15.5. 参数[3]

宽度

9.1.2.5.15.6. 参数[4]

高度

9.1.2.5.15.7. 参数[5]

目标像素掩码

9.1.2.5.15.8. 参数[6]

目标矩形起始地址

9.1.2.5.15.9. 参数[7]

以双字为单位的目标步幅

9.1.2.5.15.10. 参数[8]

以双字为单位的源步幅

9.1.2.5.15.11. 参数[9]

源矩形起始地址

9.1.2.5.16. CX2341X_OSD_BLT_FILL

枚举: 83/0x53

9.1.2.5.16.1. 描述

BLT 填充颜色

9.1.2.5.16.2. Param[0]

与 API 0x52 的 Param[0] 相同

9.1.2.5.16.3. Param[1]

与 API 0x52 的 Param[1] 相同

9.1.2.5.16.4. Param[2]

与 API 0x52 的 Param[2] 相同

9.1.2.5.16.5. Param[3]

宽度

9.1.2.5.16.6. Param[4]

高度

9.1.2.5.16.7. Param[5]

目标像素掩码

9.1.2.5.16.8. Param[6]

目标矩形起始地址

9.1.2.5.16.9. Param[7]

以双字为单位的目标步幅

9.1.2.5.16.10. Param[8]

颜色填充值

9.1.2.5.17. CX2341X_OSD_BLT_TEXT

枚举: 84/0x54

9.1.2.5.17.1. 描述

用于 8 位 alpha 文本源的 BLT

9.1.2.5.17.2. Param[0]

与 API 0x52 的 Param[0] 相同

9.1.2.5.17.3. Param[1]

与 API 0x52 的 Param[1] 相同

9.1.2.5.17.4. Param[2]

与 API 0x52 的 Param[2] 相同

9.1.2.5.17.5. Param[3]

宽度

9.1.2.5.17.6. Param[4]

高度

9.1.2.5.17.7. Param[5]

目标像素掩码

9.1.2.5.17.8. Param[6]

目标矩形起始地址

9.1.2.5.17.9. Param[7]

以双字为单位的目标步幅

9.1.2.5.17.10. Param[8]

以双字为单位的源步幅

9.1.2.5.17.11. Param[9]

源矩形起始地址

9.1.2.5.17.12. Param[10]

颜色填充值

9.1.2.5.18. CX2341X_OSD_SET_FRAMEBUFFER_WINDOW

枚举: 86/0x56

9.1.2.5.18.1. 描述

在屏幕上定位主输出窗口。坐标必须使整个窗口都适合屏幕。

9.1.2.5.18.2. Param[0]

窗口宽度

9.1.2.5.18.3. Param[1]

窗口高度

9.1.2.5.18.4. Param[2]

左上角窗口水平偏移

9.1.2.5.18.5. Param[3]

左上角窗口垂直偏移

9.1.2.5.19. CX2341X_OSD_SET_CHROMA_KEY

枚举: 96/0x60

9.1.2.5.19.1. 描述

色度键开关和颜色

9.1.2.5.19.2. Param[0]

状态:0=关闭,1=打开

9.1.2.5.19.3. Param[1]

颜色

9.1.2.5.20. CX2341X_OSD_GET_ALPHA_CONTENT_INDEX

枚举: 97/0x61

9.1.2.5.20.1. 描述

检索 alpha 内容索引

9.1.2.5.20.2. Result[0]

alpha 内容索引,范围 0:15

9.1.2.5.21. CX2341X_OSD_SET_ALPHA_CONTENT_INDEX

枚举: 98/0x62

9.1.2.5.21.1. 描述

分配 alpha 内容索引

9.1.2.5.21.2. Param[0]

alpha 内容索引,范围 0:15

9.1.2.6. 编码器固件 API 描述

9.1.2.6.1. CX2341X_ENC_PING_FW

枚举: 128/0x80

9.1.2.6.1.1. 描述

什么也不做。可用于检查固件是否正在响应。

9.1.2.6.2. CX2341X_ENC_START_CAPTURE

枚举: 129/0x81

9.1.2.6.2.1. 描述

开始捕获视频、音频和/或 VBI 数据。所有编码参数必须在此 API 调用之前初始化。连续捕获帧,或者直到捕获了预定义数量的帧。

9.1.2.6.2.2. Param[0]

捕获流类型

  • 0=MPEG

  • 1=原始

  • 2=原始直通

  • 3=VBI

9.1.2.6.2.3. Param[1]

位掩码

  • 设置位 0 时,捕获 YUV

  • 设置位 1 时,捕获 PCM 音频

  • 设置位 2 时,捕获 VBI(与 param[0]=3 相同)

  • 设置位 3 时,捕获目的地为解码器(与 param[0]=2 相同)

  • 设置位 4 时,捕获目的地为主机

注意

此参数仅对 RAW 捕获类型有意义。

9.1.2.6.3. CX2341X_ENC_STOP_CAPTURE

枚举: 130/0x82

9.1.2.6.3.1. 描述

结束正在进行的捕获

9.1.2.6.3.2. Param[0]

  • 0=在 GOP 结尾停止(生成 IRQ)

  • 1=立即停止(无 IRQ)

9.1.2.6.3.3. Param[1]

要停止的流类型,请参阅 API 0x81 的 param[0]

9.1.2.6.3.4. Param[2]

子类型,请参阅 API 0x81 的 param[1]

9.1.2.6.4. CX2341X_ENC_SET_AUDIO_ID

枚举: 137/0x89

9.1.2.6.4.1. 描述

分配编码音频流的传输流 ID

9.1.2.6.4.2. Param[0]

音频流 ID

9.1.2.6.5. CX2341X_ENC_SET_VIDEO_ID

枚举: 139/0x8B

9.1.2.6.5.1. 描述

设置视频传输流 ID

9.1.2.6.5.2. Param[0]

视频流 ID

9.1.2.6.6. CX2341X_ENC_SET_PCR_ID

枚举: 141/0x8D

9.1.2.6.6.1. 描述

为 PCR 数据包分配传输流 ID

9.1.2.6.6.2. Param[0]

PCR 流 ID

9.1.2.6.7. CX2341X_ENC_SET_FRAME_RATE

枚举: 143/0x8F

9.1.2.6.7.1. 描述

设置每秒视频帧数。更改发生在新的 GOP 开始时。

9.1.2.6.7.2. Param[0]

  • 0=30fps

  • 1=25fps

9.1.2.6.8. CX2341X_ENC_SET_FRAME_SIZE

枚举: 145/0x91

9.1.2.6.8.1. 描述

选择视频流编码分辨率。

9.1.2.6.8.2. Param[0]

高度(以行表示)。默认值为 480

9.1.2.6.8.3. Param[1]

宽度(以像素表示)。默认值为 720

9.1.2.6.9. CX2341X_ENC_SET_BIT_RATE

枚举: 149/0x95

9.1.2.6.9.1. 描述

分配平均视频流比特率。

9.1.2.6.9.2. Param[0]

0=可变比特率,1=恒定比特率

9.1.2.6.9.3. Param[1]

比特率(以每秒比特数表示)

9.1.2.6.9.4. Param[2]

峰值比特率(以每秒比特数表示),除以 400

9.1.2.6.9.5. Param[3]

复用比特率(以每秒比特数表示),除以 400。可以为 0(默认值)。

9.1.2.6.9.6. Param[4]

速率控制 VBR 填充

9.1.2.6.9.7. Param[5]

编码器使用的 VBV 缓冲区

注意

  1. Param[3] 和 Param[4] 似乎始终为 0

  2. Param[5] 似乎未使用。

9.1.2.6.10. CX2341X_ENC_SET_GOP_PROPERTIES

枚举: 151/0x97

9.1.2.6.10.1. 描述

设置 GOP 结构

9.1.2.6.10.2. Param[0]

GOP 大小(最大值为 34)

9.1.2.6.10.3. Param[1]

I 帧和 P 帧之间的 B 帧数,加 1。例如:IBBPBBPBBPBB --> GOP 大小:12,B 帧数:2+1 = 3

注意

GOP 大小必须是 (B 帧 + 1) 的倍数。

9.1.2.6.11. CX2341X_ENC_SET_ASPECT_RATIO

枚举值: 153/0x99

9.1.2.6.11.1. 描述

设置编码的宽高比。宽高比的更改将在下一个 GOP 的开始时生效。

9.1.2.6.11.2. Param[0]

  • ‘0000’ 禁止使用

  • ‘0001’ 1:1 正方形

  • ‘0010’ 4:3

  • ‘0011’ 16:9

  • ‘0100’ 2.21:1

  • ‘0101’ 到 ‘1111’ 保留

9.1.2.6.12. CX2341X_ENC_SET_DNR_FILTER_MODE

枚举值: 155/0x9B

9.1.2.6.12.1. 描述

分配动态降噪操作模式

9.1.2.6.12.2. Param[0]

Bit0: 空间滤波器,set=自动,clear=手动 Bit1: 时间滤波器,set=自动,clear=手动

9.1.2.6.12.3. Param[1]

中值滤波器

  • 0=禁用

  • 1=水平

  • 2=垂直

  • 3=水平/垂直

  • 4=对角

9.1.2.6.13. CX2341X_ENC_SET_DNR_FILTER_PROPS

枚举值: 157/0x9D

9.1.2.6.13.1. 描述

这些动态降噪滤波器值仅在各自的滤波器设置为“手动”时才有意义(请参阅 API 0x9B)

9.1.2.6.13.2. Param[0]

空间滤波器:默认值 0,范围 0:15

9.1.2.6.13.3. Param[1]

时间滤波器:默认值 0,范围 0:31

9.1.2.6.14. CX2341X_ENC_SET_CORING_LEVELS

枚举值: 159/0x9F

9.1.2.6.14.1. 描述

分配动态降噪中值滤波器属性。

9.1.2.6.14.2. Param[0]

启用亮度中值滤波器的阈值上限。默认值:0,范围 0:255

9.1.2.6.14.3. Param[1]

启用亮度中值滤波器的阈值下限。默认值:255,范围 0:255

9.1.2.6.14.4. Param[2]

启用色度中值滤波器的阈值上限。默认值:0,范围 0:255

9.1.2.6.14.5. Param[3]

启用色度中值滤波器的阈值下限。默认值:255,范围 0:255

9.1.2.6.15. CX2341X_ENC_SET_SPATIAL_FILTER_TYPE

枚举值: 161/0xA1

9.1.2.6.15.1. 描述

分配空间预滤波器参数

9.1.2.6.15.2. Param[0]

亮度滤波器

  • 0=关闭

  • 1=1D 水平

  • 2=1D 垂直

  • 3=2D 水平/垂直可分离(默认)

  • 4=2D 对称不可分离

9.1.2.6.15.3. Param[1]

色度滤波器

  • 0=关闭

  • 1=1D 水平(默认)

9.1.2.6.16. CX2341X_ENC_SET_VBI_LINE

枚举值: 183/0xB7

9.1.2.6.16.1. 描述

选择 VBI 行号。

9.1.2.6.16.2. Param[0]

  • 位 0:4 行号

  • 位 31 0=顶场,1=底场

  • 位 0:31 全部设置指定“所有行”

9.1.2.6.16.3. Param[1]

VBI 行信息功能:0=禁用,1=启用

9.1.2.6.16.4. Param[2]

切片:0=无,1=隐藏式字幕 几乎可以肯定未实现。设置为 0。

9.1.2.6.16.5. Param[3]

此行中的亮度样本。几乎可以肯定未实现。设置为 0。

9.1.2.6.16.6. Param[4]

此行中的色度样本 几乎可以肯定未实现。设置为 0。

9.1.2.6.17. CX2341X_ENC_SET_STREAM_TYPE

枚举值: 185/0xB9

9.1.2.6.17.1. 描述

分配流类型

注意

传输流在最近的固件中不起作用。在较旧的固件中,TS 中的时间戳似乎不可靠。

9.1.2.6.17.2. Param[0]

  • 0=程序流

  • 1=传输流

  • 2=MPEG1 流

  • 3=PES A/V 流

  • 5=PES 视频流

  • 7=PES 音频流

  • 10=DVD 流

  • 11=VCD 流

  • 12=SVCD 流

  • 13=DVD_S1 流

  • 14=DVD_S2 流

9.1.2.6.18. CX2341X_ENC_SET_OUTPUT_PORT

枚举值: 187/0xBB

9.1.2.6.18.1. 描述

分配流输出端口。当数据通过 PCI 总线(DMA)复制时,通常为 0,当数据流式传输到另一个芯片时(pvrusb 和 cx88-blackbird),通常为 1。

9.1.2.6.18.2. Param[0]

  • 0=内存(默认)

  • 1=流式传输

  • 2=串行

9.1.2.6.18.3. Param[1]

未知,但将其保留为 0 似乎效果最佳。有迹象表明这可能与 USB 支持有关,尽管传递任何非 0 的值只会破坏功能。

9.1.2.6.19. CX2341X_ENC_SET_AUDIO_PROPERTIES

枚举值: 189/0xBD

9.1.2.6.19.1. 描述

设置音频流属性,可以在编码进行中调用。

注意

所有位域与 ISO11172 文档一致,除了位 2:3,ISO 文档将其定义为

  • ‘11’ Layer I

  • ‘10’ Layer II

  • ‘01’ Layer III

  • ‘00’ 未定义

此差异可能表明文档中存在可能的错误。测试表明,实际上只有 Layer II 在工作,并且最小比特率应为 192 kbps。

9.1.2.6.19.2. Param[0]

位掩码

 0:1  '00' 44.1Khz
      '01' 48Khz
      '10' 32Khz
      '11' reserved

 2:3  '01'=Layer I
      '10'=Layer II

 4:7  Bitrate:
           Index | Layer I     | Layer II
           ------+-------------+------------
          '0000' | free format | free format
          '0001' |  32 kbit/s  |  32 kbit/s
          '0010' |  64 kbit/s  |  48 kbit/s
          '0011' |  96 kbit/s  |  56 kbit/s
          '0100' | 128 kbit/s  |  64 kbit/s
          '0101' | 160 kbit/s  |  80 kbit/s
          '0110' | 192 kbit/s  |  96 kbit/s
          '0111' | 224 kbit/s  | 112 kbit/s
          '1000' | 256 kbit/s  | 128 kbit/s
          '1001' | 288 kbit/s  | 160 kbit/s
          '1010' | 320 kbit/s  | 192 kbit/s
          '1011' | 352 kbit/s  | 224 kbit/s
          '1100' | 384 kbit/s  | 256 kbit/s
          '1101' | 416 kbit/s  | 320 kbit/s
          '1110' | 448 kbit/s  | 384 kbit/s

      .. note::

              For Layer II, not all combinations of total bitrate
              and mode are allowed. See ISO11172-3 3-Annex B,
              Table 3-B.2

 8:9  '00'=Stereo
      '01'=JointStereo
      '10'=Dual
      '11'=Mono

      .. note::

              The cx23415 cannot decode Joint Stereo properly.

10:11 Mode Extension used in joint_stereo mode.
      In Layer I and II they indicate which subbands are in
      intensity_stereo. All other subbands are coded in stereo.
          '00' subbands 4-31 in intensity_stereo, bound==4
          '01' subbands 8-31 in intensity_stereo, bound==8
          '10' subbands 12-31 in intensity_stereo, bound==12
          '11' subbands 16-31 in intensity_stereo, bound==16

12:13 Emphasis:
          '00' None
          '01' 50/15uS
          '10' reserved
          '11' CCITT J.17

14    CRC:
          '0' off
          '1' on

15    Copyright:
          '0' off
          '1' on

16    Generation:
          '0' copy
          '1' original

9.1.2.6.20. CX2341X_ENC_HALT_FW

枚举值: 195/0xC3

9.1.2.6.20.1. 描述

固件被停止,在重新上传固件之前,不会处理进一步的 API 调用。

9.1.2.6.21. CX2341X_ENC_GET_VERSION

枚举值: 196/0xC4

9.1.2.6.21.1. 描述

返回编码器固件的版本。

9.1.2.6.21.2. Result[0]

版本位掩码: - 位 0:15 构建 - 位 16:23 次要版本 - 位 24:31 主要版本

9.1.2.6.22. CX2341X_ENC_SET_GOP_CLOSURE

枚举值: 197/0xC5

9.1.2.6.22.1. 描述

分配 GOP 打开/关闭属性。

9.1.2.6.22.2. Param[0]

  • 0=打开

  • 1=关闭

9.1.2.6.23. CX2341X_ENC_GET_SEQ_END

枚举值: 198/0xC6

9.1.2.6.23.1. 描述

获取编码器缓冲区的序列结束代码。当开始捕获时,仍会生成一些中断,其中最后一个中断会将 Result[0] 设置为 1,Result[1] 将包含缓冲区的大小。

9.1.2.6.23.2. Result[0]

传输状态(如果是最后一个缓冲区,则为 1)

9.1.2.6.23.3. Result[1]

如果 Result[0] 为 1,则此值包含最后一个缓冲区的大小,否则未定义。

9.1.2.6.24. CX2341X_ENC_SET_PGM_INDEX_INFO

枚举值: 199/0xC7

9.1.2.6.24.1. 描述

设置程序索引信息。信息存储如下

struct info {
        u32 length;             // Length of this frame
        u32 offset_low;         // Offset in the file of the
        u32 offset_high;        // start of this frame
        u32 mask1;              // Bits 0-2 are the type mask:
                                // 1=I, 2=P, 4=B
                                // 0=End of Program Index, other fields
                                //   are invalid.
        u32 pts;                // The PTS of the frame
        u32 mask2;              // Bit 0 is bit 32 of the pts.
};
u32 table_ptr;
struct info index[400];

table_ptr 是表中将写入条目的编码器内存地址。

注意

这是一个环形缓冲区,因此 table_ptr 将环绕。

9.1.2.6.24.2. Param[0]

图片掩码: - 0=不捕获索引 - 1=I 帧 - 3=I、P 帧 - 7=I、P、B 帧

(似乎被忽略了,它总是索引 I、P 和 B 帧)

9.1.2.6.24.3. Param[1]

请求的元素(最多 400 个)

9.1.2.6.24.4. Result[0]

表中起始位置在编码器内存中的偏移量。

9.1.2.6.24.5. Result[1]

分配的元素数量,最多为 Param[1]

9.1.2.6.25. CX2341X_ENC_SET_VBI_CONFIG

枚举值: 200/0xC8

9.1.2.6.25.1. 描述

配置 VBI 设置

9.1.2.6.25.2. Param[0]

位图

0    Mode '0' Sliced, '1' Raw
1:3  Insertion:
         '000' insert in extension & user data
         '001' insert in private packets
         '010' separate stream and user data
         '111' separate stream and private data
8:15 Stream ID (normally 0xBD)

9.1.2.6.25.3. 参数[1]

每次中断的帧数(最大 8)。仅在原始模式下有效。

9.1.2.6.25.4. 参数[2]

原始 VBI 总帧数。仅在原始模式下有效。

9.1.2.6.25.5. 参数[3]

起始码

9.1.2.6.25.6. 参数[4]

停止码

9.1.2.6.25.7. 参数[5]

每帧的行数

9.1.2.6.25.8. 参数[6]

每行的字节数

9.1.2.6.25.9. 结果[0]

仅在原始模式下观察到的每次中断的帧数。范围 1 到 参数[1]

9.1.2.6.25.10. 结果[1]

在原始模式下观察到的帧数。范围 1 到 参数[2]

9.1.2.6.25.11. 结果[2]

原始 VBI 数据的起始内存偏移量

9.1.2.6.26. CX2341X_ENC_SET_DMA_BLOCK_SIZE

枚举:201/0xC9

9.1.2.6.26.1. 描述

设置 DMA 传输块大小

9.1.2.6.26.2. 参数[0]

DMA 传输块大小,以字节或帧为单位。当单位为字节时,支持的块大小为 2^7、2^8 和 2^9 字节。

9.1.2.6.26.3. 参数[1]

单位:0=字节,1=帧

9.1.2.6.27. CX2341X_ENC_GET_PREV_DMA_INFO_MB_10

枚举:202/0xCA

9.1.2.6.27.1. 描述

返回与中断掩码的第 27 位相关的上一次 DMA 传输的信息。使用邮箱 10。

9.1.2.6.27.2. 结果[0]

流类型

9.1.2.6.27.3. 结果[1]

地址偏移量

9.1.2.6.27.4. 结果[2]

最大传输大小

9.1.2.6.28. CX2341X_ENC_GET_PREV_DMA_INFO_MB_9

枚举:203/0xCB

9.1.2.6.28.1. 描述

返回与中断掩码的第 27 位或第 18 位相关的上一次 DMA 传输的信息。使用邮箱 9。

9.1.2.6.28.2. 结果[0]

状态位:- 0 读取完成 - 1 写入完成 - 2 DMA 读取错误 - 3 DMA 写入错误 - 4 散布/收集数组错误

9.1.2.6.28.3. 结果[1]

DMA 类型

9.1.2.6.28.4. 结果[2]

演示时间戳位 0..31

9.1.2.6.28.5. 结果[3]

演示时间戳位 32

9.1.2.6.29. CX2341X_ENC_SCHED_DMA_TO_HOST

枚举:204/0xCC

9.1.2.6.29.1. 描述

设置 DMA 到主机操作

9.1.2.6.29.2. 参数[0]

链接列表的内存地址

9.1.2.6.29.3. 参数[1]

链接列表的长度 (wtf: 什么单位???)

9.1.2.6.29.4. 参数[2]

DMA 类型 (0=MPEG)

9.1.2.6.30. CX2341X_ENC_INITIALIZE_INPUT

枚举:205/0xCD

9.1.2.6.30.1. 描述

初始化视频输入

9.1.2.6.31. CX2341X_ENC_SET_FRAME_DROP_RATE

枚举:208/0xD0

9.1.2.6.31.1. 描述

对于捕获的每一帧,跳过指定数量的帧。

9.1.2.6.31.2. 参数[0]

要跳过的帧数

9.1.2.6.32. CX2341X_ENC_PAUSE_ENCODER

枚举:210/0xD2

9.1.2.6.32.1. 描述

在暂停状态下,所有帧都被丢弃,而不是被编码。

9.1.2.6.32.2. 参数[0]

  • 0=暂停编码

  • 1=继续编码

9.1.2.6.33. CX2341X_ENC_REFRESH_INPUT

枚举:211/0xD3

9.1.2.6.33.1. 描述

刷新视频输入

9.1.2.6.35. CX2341X_ENC_SET_EVENT_NOTIFICATION

枚举:213/0xD5

9.1.2.6.35.1. 描述

设置固件以通知主机有关特定事件。主机必须取消屏蔽中断位。

9.1.2.6.35.2. 参数[0]

事件 (0=刷新编码器输入)

9.1.2.6.35.3. 参数[1]

通知 0=禁用 1=启用

9.1.2.6.35.4. 参数[2]

中断位

9.1.2.6.35.5. 参数[3]

邮箱槽,如果不需要邮箱,则为 -1。

9.1.2.6.36. CX2341X_ENC_SET_NUM_VSYNC_LINES

枚举:214/0xD6

9.1.2.6.36.1. 描述

根据使用的模拟视频解码器,为场 1 和场 2 分配行数。

9.1.2.6.36.2. 参数[0]

场 1 行数:- SAA7114 为 0x00EF - SAA7115 为 0x00F0 - Micronas 为 0x0105

9.1.2.6.36.3. 参数[1]

场 2 行数:- SAA7114 为 0x00EF - SAA7115 为 0x00F0 - Micronas 为 0x0106

9.1.2.6.37. CX2341X_ENC_SET_PLACEHOLDER

枚举:215/0xD7

9.1.2.6.37.1. 描述

提供在 MPEG 流中插入自定义用户数据的机制。

9.1.2.6.37.2. 参数[0]

  • 0=扩展和用户数据

  • 1=带有流 ID 0xBD 的私有数据包

9.1.2.6.37.3. 参数[1]

插入数据的速率,以帧(对于私有数据包)或 GOP(对于扩展和用户数据)为单位

9.1.2.6.37.4. 参数[2]

要插入的数据 DWORD(如下)的数量

9.1.2.6.37.5. 参数[3]

自定义数据 0

9.1.2.6.37.6. 参数[4]

自定义数据 1

9.1.2.6.37.7. 参数[5]

自定义数据 2

9.1.2.6.37.8. 参数[6]

自定义数据 3

9.1.2.6.37.9. 参数[7]

自定义数据 4

9.1.2.6.37.10. 参数[8]

自定义数据 5

9.1.2.6.37.11. 参数[9]

自定义数据 6

9.1.2.6.37.12. 参数[10]

自定义数据 7

9.1.2.6.37.13. 参数[11]

自定义数据 8

9.1.2.6.38. CX2341X_ENC_MUTE_VIDEO

枚举:217/0xD9

9.1.2.6.38.1. 描述

视频静音

9.1.2.6.38.2. 参数[0]

位用法

 0      '0'=video not muted
        '1'=video muted, creates frames with the YUV color defined below
 1:7    Unused
 8:15   V chrominance information
16:23   U chrominance information
24:31   Y luminance information

9.1.2.6.39. CX2341X_ENC_MUTE_AUDIO

枚举:218/0xDA

9.1.2.6.39.1. 描述

音频静音

9.1.2.6.39.2. 参数[0]

  • 0=音频未静音

  • 1=音频已静音(产生静音的 MPEG 音频流)

9.1.2.6.40. CX2341X_ENC_SET_VERT_CROP_LINE

枚举:219/0xDB

9.1.2.6.40.1. 描述

与“垂直裁剪线”相关的内容

9.1.2.6.40.2. 参数[0]

如果使用 saa7114 并进行原始 VBI 捕获且为 60 Hz,则设置为 10001。否则为 0。

9.1.2.6.41. CX2341X_ENC_MISC

枚举:220/0xDC

9.1.2.6.41.1. 描述

杂项操作。100% 不知道它做什么。它实际上是一种 ioctl 调用。第一个参数是命令号,第二个参数是值。

9.1.2.6.41.2. 参数[0]

命令号

 1=set initial SCR value when starting encoding (works).
 2=set quality mode (apparently some test setting).
 3=setup advanced VIM protection handling.
   Always 1 for the cx23416 and 0 for cx23415.
 4=generate DVD compatible PTS timestamps
 5=USB flush mode
 6=something to do with the quantization matrix
 7=set navigation pack insertion for DVD: adds 0xbf (private stream 2)
   packets to the MPEG. The size of these packets is 2048 bytes (including
   the header of 6 bytes: 0x000001bf + length). The payload is zeroed and
   it is up to the application to fill them in. These packets are apparently
   inserted every four frames.
 8=enable scene change detection (seems to be a failure)
 9=set history parameters of the video input module
10=set input field order of VIM
11=set quantization matrix
12=reset audio interface after channel change or input switch (has no argument).
   Needed for the cx2584x, not needed for the mspx4xx, but it doesn't seem to
   do any harm calling it regardless.
13=set audio volume delay
14=set audio delay

9.1.2.6.41.3. 参数[1]

命令值。

9.1.2.7. 解码器固件 API 描述

注意

此 API 是解码器固件的一部分,因此仅适用于 cx23415。

9.1.2.7.1. CX2341X_DEC_PING_FW

枚举:0/0x00

9.1.2.7.1.1. 描述

此 API 调用不执行任何操作。它可用于检查固件是否正在响应。

9.1.2.7.2. CX2341X_DEC_START_PLAYBACK

枚举:1/0x01

9.1.2.7.2.1. 描述

开始或恢复播放。

9.1.2.7.2.2. 参数[0]

要从其开始播放的 GOP 中从 0 开始的帧号。

9.1.2.7.2.3. 参数[1]

指定在恢复正常音频之前要播放的静音音频帧数。(这在固件中未实现,保留为 0)

9.1.2.7.3. CX2341X_DEC_STOP_PLAYBACK

枚举:2/0x02

9.1.2.7.3.1. 描述

结束播放并清除所有解码器缓冲区。如果 PTS 不为零,则在指定的 PTS 处停止播放。

9.1.2.7.3.2. 参数[0]

显示 0=最后一帧,1=黑屏

注意

这会立即生效,因此如果要等待 PTS,则使用“0”,否则屏幕会立即变黑。您可以在稍后(即使没有播放)调用此值,并将值设置为 1,以将屏幕设置为黑色。

9.1.2.7.3.3. 参数[1]

PTS 低位

9.1.2.7.3.4. 参数[2]

PTS 高位

9.1.2.7.4. CX2341X_DEC_SET_PLAYBACK_SPEED

枚举:3/0x03

9.1.2.7.4.1. 描述

以非正常速度播放流。有两种操作模式

  • 平滑:主机传输整个流,固件丢弃未使用的帧。

  • 粗略:主机根据索引丢弃帧以达到所需的速度。

9.1.2.7.4.2. 参数[0]

Bitmap:
    0:7  0 normal
         1 fast only "1.5 times"
         n nX fast, 1/nX slow
    30   Framedrop:
             '0' during 1.5 times play, every other B frame is dropped
             '1' during 1.5 times play, stream is unchanged (bitrate
                 must not exceed 8mbps)
    31   Speed:
             '0' slow
             '1' fast

注意

n 限制为 2。任何更高的值都不会导致更快的播放。相反,主机应该开始丢弃帧。

9.1.2.7.4.3. 参数[1]

方向:0=向前,1=向后

注意

为了使向后播放工作,您必须按相反的顺序写入完整的 GOP。

9.1.2.7.4.4. 参数[2]

Picture mask:
    1=I frames
    3=I, P frames
    7=I, P, B frames

9.1.2.7.4.5. 参数[3]

每个 GOP 的 B 帧数(仅用于反向播放)

注意

对于反向播放,图片掩码应设置为 I 或 I、P。将 B 帧添加到掩码会导致视频损坏。必须将此字段设置为正确的值,以保持时序正确。

9.1.2.7.4.6. 参数[4]

静音音频:0=禁用,1=启用

9.1.2.7.4.7. 参数[5]

显示 0=帧,1=场

9.1.2.7.4.8. 参数[6]

指定在恢复正常音频之前要播放的静音音频帧数。(在固件中未实现,保留为 0)

9.1.2.7.5. CX2341X_DEC_STEP_VIDEO

枚举:5/0x05

9.1.2.7.5.1. 描述

每次调用此 API 都会将播放步进到当前播放方向中定义的下一个单元。

9.1.2.7.5.2. 参数[0]

0=帧,1=顶部场,2=底部场

9.1.2.7.6. CX2341X_DEC_SET_DMA_BLOCK_SIZE

枚举:8/0x08

9.1.2.7.6.1. 描述

设置 DMA 传输块大小。对应于 API 0xC9

9.1.2.7.6.2. 参数[0]

DMA 传输块大小(以字节为单位)。发出 DMA 传输命令时,可以指定不同的大小。

9.1.2.7.7. CX2341X_DEC_GET_XFER_INFO

枚举:9/0x09

9.1.2.7.7.1. 描述

此 API 调用可用于检测流结束情况。

9.1.2.7.7.2. 结果[0]

流类型

9.1.2.7.7.3. 结果[1]

地址偏移量

9.1.2.7.7.4. 结果[2]

要传输的最大字节数

9.1.2.7.7.5. 结果[3]

缓冲区满度

9.1.2.7.8. CX2341X_DEC_GET_DMA_STATUS

枚举:10/0x0A

9.1.2.7.8.1. 描述

上次 DMA 传输的状态

9.1.2.7.8.2. 结果[0]

位 1 设置表示传输完成。位 2 设置表示 DMA 错误。位 3 设置表示链接列表错误。

9.1.2.7.8.3. 结果[1]

DMA 类型:0=MPEG,1=OSD,2=YUV

9.1.2.7.9. CX2341X_DEC_SCHED_DMA_FROM_HOST

枚举:11/0x0B

9.1.2.7.9.1. 描述

设置来自主机的 DMA 操作。对应于 API 0xCC

9.1.2.7.9.2. 参数[0]

链接列表的内存地址

9.1.2.7.9.3. 参数[1]

要传输的总字节数

9.1.2.7.9.4. 参数[2]

DMA 类型(0=MPEG,1=OSD,2=YUV)

9.1.2.7.10. CX2341X_DEC_PAUSE_PLAYBACK

枚举:13/0x0D

9.1.2.7.10.1. 描述

立即冻结播放。在这种模式下,当内部缓冲区已满时,将不再接受数据,并且数据请求 IRQ 将被屏蔽。

9.1.2.7.10.2. 参数[0]

显示:0=最后一帧,1=黑屏

9.1.2.7.11. CX2341X_DEC_HALT_FW

枚举:14/0x0E

9.1.2.7.11.1. 描述

固件被停止,在重新上传固件之前,不会处理进一步的 API 调用。

9.1.2.7.12. CX2341X_DEC_SET_STANDARD

枚举:16/0x10

9.1.2.7.12.1. 描述

选择显示标准

9.1.2.7.12.2. 参数[0]

0=NTSC,1=PAL

9.1.2.7.13. CX2341X_DEC_GET_VERSION

枚举:17/0x11

9.1.2.7.13.1. 描述

返回解码器固件版本信息

9.1.2.7.13.2. 结果[0]

版本位掩码
  • 位 0:15 构建

  • 位 16:23 次要版本

  • 位 24:31 主要版本

9.1.2.7.14. CX2341X_DEC_SET_STREAM_INPUT

枚举:20/0x14

9.1.2.7.14.1. 描述

选择解码器流输入端口

9.1.2.7.14.2. 参数[0]

0=内存(默认),1=流

9.1.2.7.15. CX2341X_DEC_GET_TIMING_INFO

枚举:21/0x15

9.1.2.7.15.1. 描述

返回自播放开始以来的时序信息

9.1.2.7.15.2. 结果[0]

按解码顺序的帧计数

9.1.2.7.15.3. 结果[1]

按显示顺序的视频 PTS 位 0:31

9.1.2.7.15.4. 结果[2]

按显示顺序的视频 PTS 位 32

9.1.2.7.15.5. 结果[3]

按显示顺序的 SCR 位 0:31

9.1.2.7.15.6. 结果[4]

按显示顺序的 SCR 位 32

9.1.2.7.16. CX2341X_DEC_SET_AUDIO_MODE

枚举:22/0x16

9.1.2.7.16.1. 描述

选择音频模式

9.1.2.7.16.2. 参数[0]

双单声道模式操作

0=立体声,1=左声道,2=右声道,3=单声道,4=交换,-1=不变

9.1.2.7.16.3. 参数[1]

立体声模式操作

0=立体声,1=左声道,2=右声道,3=单声道,4=交换,-1=不变

9.1.2.7.17. CX2341X_DEC_SET_EVENT_NOTIFICATION

枚举:23/0x17

9.1.2.7.17.1. 描述

设置固件以通知主机有关特定事件。对应于 API 0xD5

9.1.2.7.17.2. 参数[0]

事件
  • 0=单声道、(联合)立体声和双声道之间的音频模式更改。

  • 3=解码器已启动

  • 4=未知:解码时每秒关闭 10-15 次。

  • 5=某些同步事件:每帧关闭一次。

9.1.2.7.17.3. 参数[1]

通知 0=禁用,1=启用

9.1.2.7.17.4. 参数[2]

中断位

9.1.2.7.17.5. 参数[3]

邮箱槽,如果不需要邮箱,则为 -1。

9.1.2.7.18. CX2341X_DEC_SET_DISPLAY_BUFFERS

枚举:24/0x18

9.1.2.7.18.1. 描述

显示缓冲区的数量。要解码反向播放中的所有帧,必须使用九个缓冲区。

9.1.2.7.18.2. 参数[0]

0=六个缓冲区,1=九个缓冲区

9.1.2.7.19. CX2341X_DEC_EXTRACT_VBI

枚举:25/0x19

9.1.2.7.19.1. 描述

提取 VBI 数据

9.1.2.7.19.2. 参数[0]

0=从扩展和用户数据中提取,1=从私有数据包中提取

9.1.2.7.19.3. 结果[0]

VBI 表格位置

9.1.2.7.19.4. 结果[1]

VBI 表格大小

9.1.2.7.20. CX2341X_DEC_SET_DECODER_SOURCE

枚举:26/0x1A

9.1.2.7.20.1. 描述

选择解码器源。确保传递给此 API 的参数与编码器设置匹配。

9.1.2.7.20.2. 参数[0]

模式:0=来自主机的MPEG,1=来自编码器的YUV,2=来自主机的YUV

9.1.2.7.20.3. 参数[1]

YUV 图像宽度

9.1.2.7.20.4. 参数[2]

YUV 图像高度

9.1.2.7.20.5. 参数[3]

位图:请参阅 API 0xBD 的参数[0]

9.1.2.7.21. CX2341X_DEC_SET_PREBUFFERING

枚举:30/0x1E

9.1.2.7.21.1. 描述

解码器预缓冲,当启用时,对于 <8mpbs 的流缓冲高达 128KB,对于 >8mbps 的流缓冲高达 640KB

9.1.2.7.21.2. 参数[0]

0=关闭,1=开启

9.1.2.8. PVR350 视频解码器寄存器 0x02002800 -> 0x02002B00

作者:Ian Armstrong <ian@iarmst.demon.co.uk>

版本:v0.4

日期:2007 年 3 月 12 日

此列表是通过反复试验得出的。可能会有错误和遗漏。某些寄存器没有明显的效果,因此很难说它们的作用,而另一些寄存器则相互作用,或需要特定的加载顺序。水平滤波器设置就是一个例子,其中六个寄存器协同工作,并且需要特定的加载顺序才能正确配置。索引颜色调色板的设置更容易,只需两个寄存器,但同样需要特定的加载顺序。

某些寄存器对其设置很挑剔。加载错误的值,解码器将失败。重新加载固件通常会恢复,但有时需要重置。对于包含大小信息的寄存器,通常将它们设置为 0 是一个坏主意。对于其他控制寄存器,即 2878,只有当它挂起时,您才会发现哪些值是错误的。

--------------------------------------------------------------------------------
2800
bit 0
        Decoder enable
        0 = disable
        1 = enable
--------------------------------------------------------------------------------
2804
bits 0:31
        Decoder horizontal Y alias register 1
---------------
2808
bits 0:31
        Decoder horizontal Y alias register 2
---------------
280C
bits 0:31
        Decoder horizontal Y alias register 3
---------------
2810
bits 0:31
        Decoder horizontal Y alias register 4
---------------
2814
bits 0:31
        Decoder horizontal Y alias register 5
---------------
2818
bits 0:31
        Decoder horizontal Y alias trigger

These six registers control the horizontal aliasing filter for the Y plane.
The first five registers must all be loaded before accessing the trigger
(2818), as this register actually clocks the data through for the first
five.

To correctly program set the filter, this whole procedure must be done 16
times. The actual register contents are copied from a lookup-table in the
firmware which contains 4 different filter settings.

--------------------------------------------------------------------------------
281C
bits 0:31
        Decoder horizontal UV alias register 1
---------------
2820
bits 0:31
        Decoder horizontal UV alias register 2
---------------
2824
bits 0:31
        Decoder horizontal UV alias register 3
---------------
2828
bits 0:31
        Decoder horizontal UV alias register 4
---------------
282C
bits 0:31
        Decoder horizontal UV alias register 5
---------------
2830
bits 0:31
        Decoder horizontal UV alias trigger

These six registers control the horizontal aliasing for the UV plane.
Operation is the same as the Y filter, with 2830 being the trigger
register.

--------------------------------------------------------------------------------
2834
bits 0:15
        Decoder Y source width in pixels

bits 16:31
        Decoder Y destination width in pixels
---------------
2838
bits 0:15
        Decoder UV source width in pixels

bits 16:31
        Decoder UV destination width in pixels

NOTE: For both registers, the resulting image must be fully visible on
screen. If the image exceeds the right edge both the source and destination
size must be adjusted to reflect the visible portion. For the source width,
you must take into account the scaling when calculating the new value.
--------------------------------------------------------------------------------

283C
bits 0:31
        Decoder Y horizontal scaling
                Normally = Reg 2854 >> 2
---------------
2840
bits 0:31
        Decoder ?? unknown - horizontal scaling
        Usually 0x00080514
---------------
2844
bits 0:31
        Decoder UV horizontal scaling
        Normally = Reg 2854 >> 2
---------------
2848
bits 0:31
        Decoder ?? unknown - horizontal scaling
        Usually 0x00100514
---------------
284C
bits 0:31
        Decoder ?? unknown - Y plane
        Usually 0x00200020
---------------
2850
bits 0:31
        Decoder ?? unknown - UV plane
        Usually 0x00200020
---------------
2854
bits 0:31
        Decoder 'master' value for horizontal scaling
---------------
2858
bits 0:31
        Decoder ?? unknown
        Usually 0
---------------
285C
bits 0:31
        Decoder ?? unknown
        Normally = Reg 2854 >> 1
---------------
2860
bits 0:31
        Decoder ?? unknown
        Usually 0
---------------
2864
bits 0:31
        Decoder ?? unknown
        Normally = Reg 2854 >> 1
---------------
2868
bits 0:31
        Decoder ?? unknown
        Usually 0

Most of these registers either control horizontal scaling, or appear linked
to it in some way. Register 2854 contains the 'master' value & the other
registers can be calculated from that one. You must also remember to
correctly set the divider in Reg 2874.

To enlarge:
        Reg 2854 = (source_width * 0x00200000) / destination_width
        Reg 2874 = No divide

To reduce from full size down to half size:
        Reg 2854 = (source_width/2 * 0x00200000) / destination width
        Reg 2874 = Divide by 2

To reduce from half size down to quarter size:
        Reg 2854 = (source_width/4 * 0x00200000) / destination width
        Reg 2874 = Divide by 4

The result is always rounded up.

--------------------------------------------------------------------------------
286C
bits 0:15
        Decoder horizontal Y buffer offset

bits 15:31
        Decoder horizontal UV buffer offset

Offset into the video image buffer. If the offset is gradually incremented,
the on screen image will move left & wrap around higher up on the right.

--------------------------------------------------------------------------------
2870
bits 0:15
        Decoder horizontal Y output offset

bits 16:31
        Decoder horizontal UV output offset

Offsets the actual video output. Controls output alignment of the Y & UV
planes. The higher the value, the greater the shift to the left. Use
reg 2890 to move the image right.

--------------------------------------------------------------------------------
2874
bits 0:1
        Decoder horizontal Y output size divider
        00 = No divide
        01 = Divide by 2
        10 = Divide by 3

bits 4:5
        Decoder horizontal UV output size divider
        00 = No divide
        01 = Divide by 2
        10 = Divide by 3

bit 8
        Decoder ?? unknown
        0 = Normal
        1 = Affects video output levels

bit 16
        Decoder ?? unknown
        0 = Normal
        1 = Disable horizontal filter

--------------------------------------------------------------------------------
2878
bit 0
        ?? unknown

bit 1
        osd on/off
        0 = osd off
        1 = osd on

bit 2
        Decoder + osd video timing
        0 = NTSC
        1 = PAL

bits 3:4
        ?? unknown

bit 5
        Decoder + osd
        Swaps upper & lower fields

--------------------------------------------------------------------------------
287C
bits 0:10
        Decoder & osd ?? unknown
        Moves entire screen horizontally. Starts at 0x005 with the screen
        shifted heavily to the right. Incrementing in steps of 0x004 will
        gradually shift the screen to the left.

bits 11:31
        ?? unknown

Normally contents are 0x00101111 (NTSC) or 0x1010111d (PAL)

--------------------------------------------------------------------------------
2880  --------    ?? unknown
2884  --------    ?? unknown
--------------------------------------------------------------------------------
2888
bit 0
        Decoder + osd ?? unknown
        0 = Normal
        1 = Misaligned fields (Correctable through 289C & 28A4)

bit 4
        ?? unknown

bit 8
        ?? unknown

Warning: Bad values will require a firmware reload to recover.
                Known to be bad are 0x000,0x011,0x100,0x111
--------------------------------------------------------------------------------
288C
bits 0:15
        osd ?? unknown
        Appears to affect the osd position stability. The higher the value the
        more unstable it becomes. Decoder output remains stable.

bits 16:31
        osd ?? unknown
        Same as bits 0:15

--------------------------------------------------------------------------------
2890
bits 0:11
        Decoder output horizontal offset.

Horizontal offset moves the video image right. A small left shift is
possible, but it's better to use reg 2870 for that due to its greater
range.

NOTE: Video corruption will occur if video window is shifted off the right
edge. To avoid this read the notes for 2834 & 2838.
--------------------------------------------------------------------------------
2894
bits 0:23
        Decoder output video surround colour.

Contains the colour (in yuv) used to fill the screen when the video is
running in a window.
--------------------------------------------------------------------------------
2898
bits 0:23
        Decoder video window colour
        Contains the colour (in yuv) used to fill the video window when the
        video is turned off.

bit 24
        Decoder video output
        0 = Video on
        1 = Video off

bit 28
        Decoder plane order
        0 = Y,UV
        1 = UV,Y

bit 29
        Decoder second plane byte order
        0 = Normal (UV)
        1 = Swapped (VU)

In normal usage, the first plane is Y & the second plane is UV. Though the
order of the planes can be swapped, only the byte order of the second plane
can be swapped. This isn't much use for the Y plane, but can be useful for
the UV plane.

--------------------------------------------------------------------------------
289C
bits 0:15
        Decoder vertical field offset 1

bits 16:31
        Decoder vertical field offset 2

Controls field output vertical alignment. The higher the number, the lower
the image on screen. Known starting values are 0x011E0017 (NTSC) &
0x01500017 (PAL)
--------------------------------------------------------------------------------
28A0
bits 0:15
        Decoder & osd width in pixels

bits 16:31
        Decoder & osd height in pixels

All output from the decoder & osd are disabled beyond this area. Decoder
output will simply go black outside of this region. If the osd tries to
exceed this area it will become corrupt.
--------------------------------------------------------------------------------
28A4
bits 0:11
        osd left shift.

Has a range of 0x770->0x7FF. With the exception of 0, any value outside of
this range corrupts the osd.
--------------------------------------------------------------------------------
28A8
bits 0:15
        osd vertical field offset 1

bits 16:31
        osd vertical field offset 2

Controls field output vertical alignment. The higher the number, the lower
the image on screen. Known starting values are 0x011E0017 (NTSC) &
0x01500017 (PAL)
--------------------------------------------------------------------------------
28AC  --------    ?? unknown
|
V
28BC  --------    ?? unknown
--------------------------------------------------------------------------------
28C0
bit 0
        Current output field
        0 = first field
        1 = second field

bits 16:31
        Current scanline
        The scanline counts from the top line of the first field
        through to the last line of the second field.
--------------------------------------------------------------------------------
28C4  --------    ?? unknown
|
V
28F8  --------    ?? unknown
--------------------------------------------------------------------------------
28FC
bit 0
        ?? unknown
        0 = Normal
        1 = Breaks decoder & osd output
--------------------------------------------------------------------------------
2900
bits 0:31
        Decoder vertical Y alias register 1
---------------
2904
bits 0:31
        Decoder vertical Y alias register 2
---------------
2908
bits 0:31
        Decoder vertical Y alias trigger

These three registers control the vertical aliasing filter for the Y plane.
Operation is similar to the horizontal Y filter (2804). The only real
difference is that there are only two registers to set before accessing
the trigger register (2908). As for the horizontal filter, the values are
taken from a lookup table in the firmware, and the procedure must be
repeated 16 times to fully program the filter.
--------------------------------------------------------------------------------
290C
bits 0:31
        Decoder vertical UV alias register 1
---------------
2910
bits 0:31
        Decoder vertical UV alias register 2
---------------
2914
bits 0:31
        Decoder vertical UV alias trigger

These three registers control the vertical aliasing filter for the UV
plane. Operation is the same as the Y filter, with 2914 being the trigger.
--------------------------------------------------------------------------------
2918
bits 0:15
        Decoder Y source height in pixels

bits 16:31
        Decoder Y destination height in pixels
---------------
291C
bits 0:15
        Decoder UV source height in pixels divided by 2

bits 16:31
        Decoder UV destination height in pixels

NOTE: For both registers, the resulting image must be fully visible on
screen. If the image exceeds the bottom edge both the source and
destination size must be adjusted to reflect the visible portion. For the
source height, you must take into account the scaling when calculating the
new value.
--------------------------------------------------------------------------------
2920
bits 0:31
        Decoder Y vertical scaling
        Normally = Reg 2930 >> 2
---------------
2924
bits 0:31
        Decoder Y vertical scaling
        Normally = Reg 2920 + 0x514
---------------
2928
bits 0:31
        Decoder UV vertical scaling
        When enlarging = Reg 2930 >> 2
        When reducing = Reg 2930 >> 3
---------------
292C
bits 0:31
        Decoder UV vertical scaling
        Normally = Reg 2928 + 0x514
---------------
2930
bits 0:31
        Decoder 'master' value for vertical scaling
---------------
2934
bits 0:31
        Decoder ?? unknown - Y vertical scaling
---------------
2938
bits 0:31
        Decoder Y vertical scaling
        Normally = Reg 2930
---------------
293C
bits 0:31
        Decoder ?? unknown - Y vertical scaling
---------------
2940
bits 0:31
        Decoder UV vertical scaling
        When enlarging = Reg 2930 >> 1
        When reducing = Reg 2930
---------------
2944
bits 0:31
        Decoder ?? unknown - UV vertical scaling
---------------
2948
bits 0:31
        Decoder UV vertical scaling
        Normally = Reg 2940
---------------
294C
bits 0:31
        Decoder ?? unknown - UV vertical scaling

Most of these registers either control vertical scaling, or appear linked
to it in some way. Register 2930 contains the 'master' value & all other
registers can be calculated from that one. You must also remember to
correctly set the divider in Reg 296C

To enlarge:
        Reg 2930 = (source_height * 0x00200000) / destination_height
        Reg 296C = No divide

To reduce from full size down to half size:
        Reg 2930 = (source_height/2 * 0x00200000) / destination height
        Reg 296C = Divide by 2

To reduce from half down to quarter.
        Reg 2930 = (source_height/4 * 0x00200000) / destination height
        Reg 296C = Divide by 4

--------------------------------------------------------------------------------
2950
bits 0:15
        Decoder Y line index into display buffer, first field

bits 16:31
        Decoder Y vertical line skip, first field
--------------------------------------------------------------------------------
2954
bits 0:15
        Decoder Y line index into display buffer, second field

bits 16:31
        Decoder Y vertical line skip, second field
--------------------------------------------------------------------------------
2958
bits 0:15
        Decoder UV line index into display buffer, first field

bits 16:31
        Decoder UV vertical line skip, first field
--------------------------------------------------------------------------------
295C
bits 0:15
        Decoder UV line index into display buffer, second field

bits 16:31
        Decoder UV vertical line skip, second field
--------------------------------------------------------------------------------
2960
bits 0:15
        Decoder destination height minus 1

bits 16:31
        Decoder destination height divided by 2
--------------------------------------------------------------------------------
2964
bits 0:15
        Decoder Y vertical offset, second field

bits 16:31
        Decoder Y vertical offset, first field

These two registers shift the Y plane up. The higher the number, the
greater the shift.
--------------------------------------------------------------------------------
2968
bits 0:15
        Decoder UV vertical offset, second field

bits 16:31
        Decoder UV vertical offset, first field

These two registers shift the UV plane up. The higher the number, the
greater the shift.
--------------------------------------------------------------------------------
296C
bits 0:1
        Decoder vertical Y output size divider
        00 = No divide
        01 = Divide by 2
        10 = Divide by 4

bits 8:9
        Decoder vertical UV output size divider
        00 = No divide
        01 = Divide by 2
        10 = Divide by 4
--------------------------------------------------------------------------------
2970
bit 0
        Decoder ?? unknown
        0 = Normal
        1 = Affect video output levels

bit 16
        Decoder ?? unknown
        0 = Normal
        1 = Disable vertical filter

--------------------------------------------------------------------------------
2974  --------   ?? unknown
|
V
29EF  --------   ?? unknown
--------------------------------------------------------------------------------
2A00
bits 0:2
        osd colour mode
        000 = 8 bit indexed
        001 = 16 bit (565)
        010 = 15 bit (555)
        011 = 12 bit (444)
        100 = 32 bit (8888)

bits 4:5
        osd display bpp
        01 = 8 bit
        10 = 16 bit
        11 = 32 bit

bit 8
        osd global alpha
        0 = Off
        1 = On

bit 9
        osd local alpha
        0 = Off
        1 = On

bit 10
        osd colour key
        0 = Off
        1 = On

bit 11
        osd ?? unknown
        Must be 1

bit 13
        osd colour space
        0 = ARGB
        1 = AYVU

bits 16:31
        osd ?? unknown
        Must be 0x001B (some kind of buffer pointer ?)

When the bits-per-pixel is set to 8, the colour mode is ignored and
assumed to be 8 bit indexed. For 16 & 32 bits-per-pixel the colour depth
is honoured, and when using a colour depth that requires fewer bytes than
allocated the extra bytes are used as padding. So for a 32 bpp with 8 bit
index colour, there are 3 padding bytes per pixel. It's also possible to
select 16bpp with a 32 bit colour mode. This results in the pixel width
being doubled, but the color key will not work as expected in this mode.

Colour key is as it suggests. You designate a colour which will become
completely transparent. When using 565, 555 or 444 colour modes, the
colour key is always 16 bits wide. The colour to key on is set in Reg 2A18.

Local alpha works differently depending on the colour mode. For 32bpp & 8
bit indexed, local alpha is a per-pixel 256 step transparency, with 0 being
transparent and 255 being solid. For the 16bpp modes 555 & 444, the unused
bit(s) act as a simple transparency switch, with 0 being solid & 1 being
fully transparent. There is no local alpha support for 16bit 565.

Global alpha is a 256 step transparency that applies to the entire osd,
with 0 being transparent & 255 being solid.

It's possible to combine colour key, local alpha & global alpha.
--------------------------------------------------------------------------------
2A04
bits 0:15
        osd x coord for left edge

bits 16:31
        osd y coord for top edge
---------------
2A08
bits 0:15
        osd x coord for right edge

bits 16:31
        osd y coord for bottom edge

For both registers, (0,0) = top left corner of the display area. These
registers do not control the osd size, only where it's positioned & how
much is visible. The visible osd area cannot exceed the right edge of the
display, otherwise the osd will become corrupt. See reg 2A10 for
setting osd width.
--------------------------------------------------------------------------------
2A0C
bits 0:31
        osd buffer index

An index into the osd buffer. Slowly incrementing this moves the osd left,
wrapping around onto the right edge
--------------------------------------------------------------------------------
2A10
bits 0:11
        osd buffer 32 bit word width

Contains the width of the osd measured in 32 bit words. This means that all
colour modes are restricted to a byte width which is divisible by 4.
--------------------------------------------------------------------------------
2A14
bits 0:15
        osd height in pixels

bits 16:32
        osd line index into buffer
        osd will start displaying from this line.
--------------------------------------------------------------------------------
2A18
bits 0:31
        osd colour key

Contains the colour value which will be transparent.
--------------------------------------------------------------------------------
2A1C
bits 0:7
        osd global alpha

Contains the global alpha value (equiv ivtvfbctl --alpha XX)
--------------------------------------------------------------------------------
2A20  --------    ?? unknown
|
V
2A2C  --------    ?? unknown
--------------------------------------------------------------------------------
2A30
bits 0:7
        osd colour to change in indexed palette
---------------
2A34
bits 0:31
        osd colour for indexed palette

To set the new palette, first load the index of the colour to change into
2A30, then load the new colour into 2A34. The full palette is 256 colours,
so the index range is 0x00-0xFF
--------------------------------------------------------------------------------
2A38  --------    ?? unknown
2A3C  --------    ?? unknown
--------------------------------------------------------------------------------
2A40
bits 0:31
        osd ?? unknown

Affects overall brightness, wrapping around to black
--------------------------------------------------------------------------------
2A44
bits 0:31
        osd ?? unknown

Green tint
--------------------------------------------------------------------------------
2A48
bits 0:31
        osd ?? unknown

Red tint
--------------------------------------------------------------------------------
2A4C
bits 0:31
        osd ?? unknown

Affects overall brightness, wrapping around to black
--------------------------------------------------------------------------------
2A50
bits 0:31
        osd ?? unknown

Colour shift
--------------------------------------------------------------------------------
2A54
bits 0:31
        osd ?? unknown

Colour shift
--------------------------------------------------------------------------------
2A58  --------    ?? unknown
|
V
2AFC  --------    ?? unknown
--------------------------------------------------------------------------------
2B00
bit 0
        osd filter control
        0 = filter off
        1 = filter on

bits 1:4
        osd ?? unknown

--------------------------------------------------------------------------------

9.1.2.9. cx231xx DMA 引擎

此页面描述了 cx2341x DMA 引擎使用的结构和过程。

9.1.2.9.1. 简介

cx2341x PCI 接口具有总线主控能力。这意味着它具有 DMA 引擎,可以有效地在卡和主存储器之间传输大量数据,而无需 CPU 的帮助。像大多数硬件一样,它必须在连续的物理内存上运行。这在虚拟内存机器上很难获得大量的内存。

因此,它还支持一种称为“分散-聚集”的技术。该卡可以在一次操作中传输多个缓冲区。驱动程序可以分配多个较小的缓冲区,而不是分配一个大的连续缓冲区。

在实践中,我看到平均传输量约为 80K,但高于 128K 的传输并不少见,尤其是在启动时。128K 这个数字很重要,因为这是内核通常可以分配的最大块。即使如此,128K 块也很难获得,因此敦促驱动程序编写者选择较小的块大小并学习分散-聚集技术。

邮箱 #10 保留用于 DMA 传输信息。

注意:硬件期望小端数据(“英特尔格式”)。

9.1.2.9.2. 流程

本节总体上描述了处理 DMA 传输时事件的顺序。详细信息在本节之后。

  • 该卡会引发编码器中断。

  • 驱动程序从邮箱 #10 读取传输类型、偏移量和大小。

  • 驱动程序从足够多的空闲 dma 缓冲区构建分散-聚集数组,以覆盖大小。

  • 驱动程序通过 ScheduleDMAtoHost API 调用安排 DMA 传输。

  • 该卡会引发 DMA 完成中断。

  • 驱动程序检查 DMA 状态寄存器是否有任何错误。

  • 驱动程序后处理新传输的缓冲区。

注意!编码器和 DMA 完成中断可能会同时发生。(上一次结束,下一次开始等)

9.1.2.9.3. 邮箱 #10

标志、命令、返回值和超时字段将被忽略。

  • 名称:邮箱 #10

  • 结果[0]:类型:0:MPEG。

  • 结果[1]:偏移量:相对于卡内存空间的位置。

  • 结果[2]:大小:要传输的准确字节数。

我的猜测是,由于 StartCapture API 具有可用的“RAW”捕获类型,因此类型字段将具有其他与 YUV 和 PCM 数据相对应的值。

9.1.2.9.4. 分散-聚集数组

分散-聚集数组是连续分配的内存块,它告诉卡每个要传输的数据块的源和目标。卡“地址”来自邮箱 #10 提供的偏移量。主机地址是目标 DMA 缓冲区的物理内存位置。

每个 S-G 数组元素都是一个包含三个 32 位字的结构。第一个字是源地址,第二个字是目标地址。两者都占用整个 32 位。第三个字的最低 18 位是传输字节计数。第三个字的高位是“last”标志。“last”标志告诉卡引发 DMA_DONE 中断。从痛苦的个人经验来看,如果您忘记设置此位,该卡仍然会“工作”,但流很可能会损坏。

传输计数必须是 256 的倍数。因此,驱动程序将需要跟踪目标缓冲区中有多少数据有效,并相应地处理它。

数组元素

  • 32 位源地址

  • 32 位目标地址

  • 14 位保留(高位是 last 标志)

  • 18 位字节计数

9.1.2.9.5. DMA 传输状态

寄存器 0x0004 保存 DMA 传输状态

  • 位 0:读取完成

  • 位 1:写入完成

  • 位 2:DMA 读取错误

  • 位 3:DMA 写入错误

  • 位 4:分散-聚集数组错误