尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

嵌入式视频开发实战:VPDMA与HD_VENC_D寄存器配置与调试指南

嵌入式视频开发实战:VPDMA与HD_VENC_D寄存器配置与调试指南
📅 发布时间:2026/7/22 16:55:36

1. 项目概述与核心价值

在嵌入式多媒体开发,尤其是基于德州仪器(TI)DaVinci或类似SoC平台进行高清视频应用开发时,工程师迟早会与两个核心硬件模块正面交锋:视频处理直接内存访问(VPDMA)和高清视频编码器(HD_VENC_D)。你手头的芯片手册可能厚达数千页,而关于这两个模块的寄存器描述往往分散在多个章节,读起来就像在解谜。今天,我就结合自己多年在视频编解码器驱动和中间件开发中踩过的坑,来深入拆解这两个模块的寄存器配置逻辑。这不是一次照本宣科的翻译,而是一次从工程实践出发的逆向推导和实战指南。

简单来说,VPDMA是你的“数据搬运工”,它负责在内存、视频端口(VIP)、缩放器、去隔行器等处理单元之间高效、有序地搬运视频数据块(描述符链表)。而HD_VENC_D则是你的“最终画师”,它负责将处理好的视频数据,按照特定的时序、格式和色彩空间,转换成显示器能识别的电信号输出。它们的寄存器配置,直接决定了视频流水线是否能稳定运行、画面是否流畅、色彩是否准确。很多新手在调试时遇到的画面撕裂、卡顿、色彩失真甚至DMA挂死问题,根源往往就在这里。理解这些寄存器,你就能从“寄存器配置工”升级为“系统时序架构师”。

2. VPDMA客户端状态寄存器深度解析

VPDMA的寄存器体系庞大,但其中最值得玩味、也最容易出问题的,是一系列客户端状态寄存器(Client Status Register),例如你资料中提到的VPDMA_trans2_luma_cstat。这类寄存器名称通常遵循VPDMA_<client_name>_cstat的格式,是窥探和控制DMA引擎内部状态的窗口。

2.1 核心字段功能与工作原理

这类寄存器结构高度一致,主要包含以下几个关键字段,每一个都对应着DMA调度中的一个具体环节:

REQ_DELAY (Bits 31-24, R/W): 请求延迟这个寄存器字段用于设置两次DMA请求之间最小的时钟周期间隔。它是一个非常重要的节流阀。为什么需要它?想象一下,如果DMA引擎不受限制地从内存读取数据,可能会瞬间占满系统总线带宽,导致CPU或其他主设备(如显示控制器)出现“饥饿”现象。通过设置REQ_DELAY,你可以人为地降低VPDMA这个“大胃王”的进食速度,为系统其他部分留出喘息之机。

注意:寄存器中存储的值需要乘以32才是实际的时钟周期数。例如,你写入0x01,代表的最小延迟是1 * 32 = 32个时钟周期。这个计数器在每帧开始时复位,因此一帧内的第一个请求会尽快发出,不受此延迟限制。

REQ_RATE (Bits 23-16, R): 请求速率这是一个只读字段,反映了最近两次DMA请求之间实际间隔的时钟周期数(同样需要乘以32)。它是系统调试的“仪表盘”。在理想情况下,REQ_RATE应该稳定在某个值附近,这个值由视频流的数据量、总线带宽和REQ_DELAY共同决定。如果你发现REQ_RATE波动巨大,或者远高于预期,可能意味着内存带宽不足、总线仲裁出现瓶颈,或者SDRAM访问效率低下(例如频繁的页切换)。

BUSY (Bit 15, R): 忙状态位这是一个非常直观的状态标志位。当该位为1时,表示此VPDMA客户端已经接收到了列表管理器(List Manager)分配的描述符链表,并且正在处理中。这个“处理中”是一个宽泛的状态,包括了从解析描述符、发起DMA传输到完成传输的整个过程。只有当该通道的所有数据传输完毕,并且通道从共享内存中被清除后,此位才会被硬件清零。在软件设计中,监控此位是判断一次DMA传输是否完成的重要手段之一。

DMA_ACTIVE (Bit 14, R): DMA活跃位这个位比BUSY更具体。当它为1时,表示该客户端正在主动地向系统总线发起DMA读写请求。也就是说,数据正在物理线上流动。当DMA控制器在等待响应或处于空闲间隙时,此位可能为0,但BUSY位仍为1。这两个位的组合可以更精细地判断客户端的实时状态:BUSY=1, DMA_ACTIVE=1表示正在传输;BUSY=1, DMA_ACTIVE=0可能表示传输间歇或等待同步事件。

FRAME_START (Bits 13-10, R/W): 帧起始事件源这是整个VPDMA同步机制的核心,也是最容易配置错误的地方。它决定了是什么事件来触发该客户端开始处理新的一帧数据。选项通常包括:

  • 0 (hdmi_field_id) / 1 (dvo2_field_id) / 3 (sd_field_id):这些是来自不同视频端口的场ID(Field ID)变化信号。用于将DMA传输与外部视频源的帧/场同步信号锁定,这是实现无撕裂视频采集和显示的关键。例如,一个视频捕获客户端通常会设置为由vip1或hdmi的field_id变化来触发,确保每次DMA搬运的都是新的一帧/场数据。
  • 4/5/6 (List Manager Internal Field):使用列表管理器内部的软件可编程场信号。这为纯软件触发或复杂的多通道同步提供了灵活性。
  • 7 (Start whenever channel is free):只要通道空闲就立即开始。这通常用于与外部时序无关的后处理模块(如图像缩放器)的数据搬运,其节奏由上游数据生产者的速度决定。

2.2 配置实战与避坑指南

理解了字段含义,我们来看如何配置。假设我们要配置一个从视频端口1(VIP1)的辅助数据A通道(vip1_anc_a)捕获数据的客户端。

// 假设 VPDMA_VIP1_ANC_A_CSTAT 寄存器的基址偏移为 0x3E8 volatile uint32_t *pCstatReg = (uint32_t*)(VPDMA_BASE + 0x3E8); uint32_t regValue = 0; // 1. 设置 REQ_DELAY:根据总线负载情况设定。假设系统时钟133MHz,我们想限制请求间隔不低于1us。 // 1us = 133 cycles。寄存器值 = ceil(133 / 32) = ceil(4.156) = 5 (0x05) regValue |= (5 << 24); // 设置 REQ_DELAY = 0x05 // 2. 设置 FRAME_START:我们希望捕获与VIP1输入视频同步。 // 假设VIP1连接的是HDMI源,则选择 hdmi_field_id 变化作为触发源 (0)。 // 如果连接的是标清CVBS,则可能选择 sd_field_id (3)。 regValue |= (0 << 10); // 设置 FRAME_START = 0x0 // 3. 写入寄存器,启动配置(注意,通常需要先确保客户端未在运行) *pCstatReg = regValue;

避坑点1:REQ_DELAY 与性能的权衡设置过大的REQ_DELAY固然可以缓解总线压力,但可能导致DMA客户端无法及时搬走数据,造成上游缓冲区溢出(对于捕获)或下游缓冲区欠载(对于显示)。一个实用的调试方法是:先将其设为0(最快速度),观察系统是否稳定。如果出现总线错误或其他模块异常,再逐步调大此值,直到系统稳定为止。同时监控REQ_RATE,确保其值能满足视频流带宽需求(像素时钟 * 每像素字节数)。

避坑点2:FRAME_START 配置错误导致的“鬼影”或撕裂如果你配置一个显示客户端(如写入HDMI发射器),却错误地将其FRAME_START设置为一个不相关的信号源(例如另一个摄像头的场ID),那么显示帧的更新将与实际显示器的刷新不同步。这会导致屏幕上的图像出现撕裂(上半部分是新帧,下半部分是旧帧)或“鬼影”。黄金法则:显示客户端的帧起始必须与最终输出显示的时序发生器(如HDMI/DVO的场信号)同步。

避坑点3:BUSY 位不清零在尝试重新配置或重启一个VPDMA客户端通道前,务必检查其BUSY位是否已清零。如果BUSY位仍为1,说明硬件可能还在处理上一个链表,此时强行写入新的描述符地址或���改配置,极大概率会导致DMA引擎挂死或数据混乱。安全的做法是:先停止该通道(如果有停止机制),然后轮询BUSY位,待其清零后再进行后续操作。

3. HD_VENC_D 寄存器组配置全攻略

如果说VPDMA是后台的物流系统,那么HD_VENC_D就是前台的店面装潢。它决定了视频数据以何种“面貌”呈现给显示设备。其寄存器配置主要围绕输出格式、时序、色彩空间三大主题。

3.1 模式与控制寄存器 (HD_VENC_D_cfg0)

HD_VENC_D_cfg0是这个模块的“总控制台”,一揽子解决了输出格式和基础信号定义。

DVO_FMT (Bits 18-16): 输出格式选择这是最重要的配置之一,决定了数据引脚上的电信号协议。

  • 000: 单通道10-bit CCIR656 SD输出。这是用于标清电视的经典串行数字接口,数据在双倍像素时钟下传输。注意:仅用于480i或480p等标清格式。
  • 001: 双通道10-bit CCIR656流。用于YCbCr 4:2:2格式,两个通道分别传Y和复用的CbCr,数据速率等于像素时钟。这是高清和标清YUV422输出的常见模式。
  • 010: 三通道10-bit 嵌入式同步(SAV/EAV)流。用于YCbCr 4:4:4或RGB格式。同步信息嵌入在数据流中,无需单独的HS/VS引脚。
  • 011:最常用的高清显示模式。三通道10-bit,带独立的HSYNC、VSYNC、ACTVID等同步信号。每个通道对应一个颜色分量(RGB或Y/Cb/Cr),数据速率等于像素时钟。这是驱动LCD屏或HDMI发射器的典型模式。
  • 100: 双通道10-bit,带独立同步信号,用于YCbCr 4:2:2。第一通道是Y,第二通道时分复用Cb和Cr。

S_422 (Bit 26): YCbCr 4:2:2 色度采样模式当输出格式为YCbCr 4:2:2时,此位决定色度(CbCr)是如何得到的。

  • 0: 使用一个4:4:4到4:2:2的抽取滤波器。这会进行滤波和下采样,图像质量更好,能减少混叠失真。
  • 1: 直接隔点采样(Skip-one)。直接丢弃每隔一个像素的色度信息。这种方式简单、延迟低,但可能导致色彩分辨率下降和色差锯齿。对于高质量应用,通常建议使用滤波器模式(0)。

I_DVO_A/H/V/F (Bits 25, 24, 23, 22): 同步信号极性控制这些位控制DVO接口中ACTVID(数据有效)、HSYNC(行同步)、VSYNC(场同步)、FID(场标识)信号的极性。必须与显示设备(屏或芯片)的规格书严格匹配。通常,LCD屏使用低电平有效的同步信号(设置I_DVO_x = 1),而一些旧的VGA标准可能使用高电平有效(I_DVO_x = 0)。配反了会导致显示位置偏移、图像滚动甚至无显示。

BYPS_CS (Bit 5) 与 BYPS_GC (Bit 13): 色彩空间转换和伽马校正旁路

  • BYPS_CS: 如果输入数据已经是目标色彩空间(例如输入RGB,输出也是RGB),则将此位置1以旁路色彩空间转换(CSC)模块,减少延迟和功耗。
  • BYPS_GC: 伽马校正用于补偿显示设备的非线性电光特性。如果后续有专门的伽马查找表(LUT)处理,或者输出需要线性数据,可以旁路此模块。通常,为了获得正确的显示效果,需要使能伽马校正并配置正确的LUT。

I_PN (Bit 3): 扫描格式

  • 0: 逐行扫描(Progressive)。现代数字显示的标准模式。
  • 1: 隔行扫描(Interlace)。用于传统电视系统(如1080i)。选择此模式时,需要正确配置场相关信号。

3.2 色彩空间转换(CSC)系数寄存器 (HD_VENC_D_cfg1 ~ _cfg6)

这是将视频从一种色彩空间(如YUV)转换到另一种(如RGB)的数学核心。转换通常用一个3x3矩阵乘法加上一个偏移向量来表示:

[R] [A0 A1 A2] [Y] [D0] [G] = [B0 B1 B2] * [Cb] + [D1] [B] [C0 C1 C2] [Cr] [D2]

寄存器cfg1到cfg6就存储了矩阵系数A0, A1, A2, B0...C2和偏移量D0, D1, D2。

系数的定点数格式:Q3.10资料中明确指出,A0, B0, C0, A1, B1, C1, A2, B2, C2这些系数是Q3.10格式的有符号定点数。这意味着:

  • 1个符号位。
  • 3个整数位(范围是-4到+3.999)。
  • 10个小数位(精度为 1/1024 ≈ 0.0009766)。
  • 因此,一个13位的寄存器值(Bit12-0)表示的范围是-4.0 到 +4.0(严格说是+3.999)。

如何编程?假设我们需要设置一个标准的SDTV ITU-R BT.601 YCbCr到RGB的转换系数。其中,A0(对应矩阵第一行第一列,即Y对R的系数)通常是1.164。

  1. 计算定点值:1.164 * 1024 = 1191.936,四舍五入为1192。
  2. 转换为16进制:1192 = 0x4A8。
  3. 因为它是正数,直接写入HD_VENC_D_cfg1寄存器的A0字段(Bit12-0)。

对于负数,如某个系数为-0.391:

  1. 计算:-0.391 * 1024 = -400.384,四舍五入为-400。
  2. 求-400的13位二进制补码:先取400的二进制(0001 1001 0000),取反加一得到补码(1110 0110 1111 + 1 = 1110 0111 0000)。
  3. 转换为16进制:0xE70。
  4. 写入对应寄存器字段。

偏移量 D0, D1, D2 的格式这三个偏移量是12位有符号整数,范围是-2048 到 +2047。它们通常用于在转换后对RGB值进行偏移,例如在YCbCr到RGB转换中,常见的偏移是16(对于Y)和128(对于CbCr),但具体值取决于转换公式。编程时直接写入十进制值对应的十六进制即可,负数同样需要以补码形式写入。

核心技巧:系数查找与验证不要自己推导这些系数矩阵。TI的DVSDK或Processor SDK通常会在显示驱动或编解码引擎的示例代码中提供标准的转换系数数组(例如ti/sdo/edma3/drv/sample/src/或视频前端/后端驱动中)。直接引用这些经过验证的系数是最稳妥的。在调试时,可以输入一个已知的YUV颜色(如纯白色、纯红色对应的YUV值),然后通过读取转换后的RGB输出(如果硬件支持回读)或观察最终显示颜色,来验证CSC配置是否正确。

3.3 时序与帧尺寸寄存器 (HD_VENC_D_cfg10, _cfg12)

这两个寄存器定义了输出视频的“画布”大小。

HD_VENC_D_cfg10 (Frame Size Register):

  • PIXELS (Bits 11-0):一行总的像素时钟数。这包括有效像素(Active Pixels)和水平消隐区(Horizontal Blanking)。例如,对于1920x1080p@60Hz标准,总像素每行通常是2200。
  • LINES (Bits 23-12):一帧总的行数。包括有效行(Active Lines)和垂直消隐区(Vertical Blanking)。对于1080p,总行数通常是1125。

HD_VENC_D_cfg12 (Active Pixels per Line Register):

  • ACT_PIX (Bits 23-12):一行中有效像素的数量。对于1920x1080,这就是1920。

它们的关系与计算PIXELS必须大于等于ACT_PIX。两者的差值决定了水平消隐的时间。HD_VENC_D_cfg15寄存器中的DVO_AVST_H(水平有效视频开始时间)通常通过公式计算:DVO_AVST_H = PIXELS - ACT_PIX。这个值定义了从行同步信号开始到第一个有效像素出现之间的像素时钟数,即行消隐后沿。

配置示例:设置1080p时序

// 配置帧尺寸 *(volatile uint32_t*)(HD_VENC_D_BASE + 0x28) = (1125 << 12) | 2200; // cfg10: LINES=1125, PIXELS=2200 // 配置有效像素 *(volatile uint32_t*)(HD_VENC_D_BASE + 0x30) = (1920 << 12); // cfg12: ACT_PIX=1920 // 根据公式,计算并配置水平有效视频开始时间(假设在cfg15的bit11-0) uint32_t h_avst = 2200 - 1920; // = 280 *(volatile uint32_t*)(HD_VENC_D_BASE + 0x3C) &= ~(0xFFF); // 清零低12位 *(volatile uint32_t*)(HD_VENC_D_BASE + 0x3C) |= h_avst; // 设置 DVO_AVST_H

4. 系统集成与调试实战

理解了单个寄存器后,将它们串联起来形成一个可工作的视频流水线,才是真正的挑战。

4.1 配置流程与依赖关系

一个典型的从内存到显示的输出流水线配置顺序应该是:

  1. 失能相关模块:在配置前,确保HD_VENC_D和相关的VPDMA客户端处于停止或复位状态(例如,清除HD_VENC_D_cfg0.START位,确保VPDMA客户端BUSY位为0)。
  2. 配置HD_VENC_D时序和格式:
    • 设置cfg10,cfg12定义帧结构。
    • 设置cfg15,cfg16等定义具体的同步脉冲宽度和位置(DVO_HS_WD,DVO_AVD_HW等)。
    • 设置cfg0中的DVO_FMT,I_PN, 同步极性等。
    • 如果需要色彩空间转换,计算并写入cfg1到cfg6的系数;否则,设置BYPS_CS=1。
    • 配置伽马LUT(如果使用)。
  3. 配置VPDMA显示客户端:
    • 设置客户端的FRAME_START源,必须与HD_VENC_D输出的场同步信号(如dvo2_field_id)绑定。
    • 根据显示缓冲区的带宽需求,合理设置REQ_DELAY。
    • 将准备好的显示缓冲区描述符链表地址写入该客户端的描述符指针寄存器。
  4. 启动序列:
    • 先启动VPDMA客户端(通过列表管理器提交描述符链表)。
    • 等待VPDMA客户端进入BUSY状态(表示已就绪)。
    • 最后,将HD_VENC_D_cfg0.START位置1,启动编码器输出。
    • 这个顺序很重要:确保数据生产者(VPDMA)先就绪,再启动消费者(VENC),避免输出启动时没有数据导致的黑屏或闪屏。

4.2 常见问题排查手册

以下是我在项目中遇到的一些典型问题及排查思路:

问题现象可能原因排查步骤与解决方法
屏幕无显示,背光已亮1. HD_VENC_D未启动。
2. 同步信号极性错误。
3. 时序参数与显示器不匹配。
1. 检查HD_VENC_D_cfg0.START位是否为1。
2. 用示波器或逻辑分析仪测量HSYNC、VSYNC、DE(ACTVID)信号,核对极性和时序。与显示器数据手册对比,调整I_DVO_H/V/A位。
3. 核对PIXELS,LINES,ACT_PIX,DVO_HS_WD,DVO_AVST_H等所有时序参数,确保符合显示器的输入规格(通常可在显示器驱动板规格书或EDID信息中找到)。
显示图像颜色严重失真(如偏紫、偏绿)1. 色彩空间转换(CSC)系数错误或未启用。
2. 输入数据格式与输出格式不匹配。
1. 确认BYPS_CS位设置。如果需要进行转换,检查写入cfg1~cfg6的所有系数值,确保是正确的Q3.10或整数格式。与标准系数表(如BT.601, BT.709)逐位比对。
2. 确认VPDMA描述符中设置的数据类型(如YUV422、RGB565)与HD_VENC_D配置的输出格式(DVO_FMT)是否兼容。例如,用YUV数据配置了RGB输出格式而未使能CSC,必然色偏。
图像撕裂(部分旧帧,部分新帧)VPDMA显示客户端的FRAME_START信号源与HD_VENC_D输出不同步。检查显示客户端的FRAME_START配置。它必须设置为由HD_VENC_D输出的场同步信号触发(例如dvo2_field_id)。确保不是由其他不相关的信号源(如摄像头输入)或自由运行模式触发。
图像闪烁、抖动或不稳定1. DMA传输不稳定,数据时断时续。
2. 内存带宽不足或总线竞争激烈。
3. VPDMAREQ_DELAY设置不当。
1. 检查VPDMA客户端的BUSY和DMA_ACTIVE位是否稳定。如果BUSY位意外清零,可能是描述符链表错误导致DMA提前结束。
2. 监控REQ_RATE值,如果波动很大或数值异常高,说明DMA请求被阻塞。尝试增加REQ_DELAY,减轻总线压力,或者优化内存访问(使用缓存对齐、减少SDRAM换页)。
3. 检查显示缓冲区的物理地址是否对齐到Cache Line(通常32字节或128字节),避免Cache一致性问题导致的数据错误。
只有部分区域有图像,或图像位置偏移有效显示区域(Active Area)设置错误。核对HD_VENC_D_cfg12.ACT_PIX(有效像素每行)和总行数中的有效行部分,是否与你想显示的图像分辨率一致。同时检查DVO_AVST_H(水平开始)和垂直开始位置的相关寄存器,确保消隐区大小正确。

4.3 高级技巧:利用寄存器进行性能分析与优化

这些状态寄存器不仅是配置项,也是强大的调试工具。

  • 带宽评估:通过读取稳定的REQ_RATE值(实际周期数 =REQ_RATE* 32),你可以反推出DMA客户端的实际数据吞吐率。结合总线时钟频率,可以评估带宽利用率。
  • 瓶颈定位:如果多个VPDMA客户端同时工作,可以分别监控它们的REQ_RATE和BUSY时间。如果一个客户端的BUSY时间异常长,而REQ_RATE很低,可能意味着它正在等待数据(上游慢)或等待总线授权。这有助于定位流水线中的性能瓶颈。
  • 同步验证:在复杂系统中,你可以通过软件读取不同客户端的FRAME_START事件计数器(如果支持)或关联的场ID状态,来验证软件触发的帧同步是否精确地传递到了所有硬件模块。

配置这些寄存器,尤其是VPDMA和VENC的协同,就像在调试一个精密的机械钟表。每一个齿轮(寄存器)都必须咬合在正确的位置和时序上。最初几次尝试可能会失败,屏幕可能是黑的、花的或者抖动的。但只要你掌握了上述的核心逻辑和排查方法,耐心地用示波器、调试器以及这些寄存器提供的状态信息去观察和验证,最终一定能让稳定的图像完美地呈现出来。这份对底层硬件的掌控力,正是嵌入式视频开发工程师的核心价值所在。

相关新闻

  • 当开源成为特洛伊木马:从微软工具被篡改事件看 AI 开发者的安全困局
  • 3种验证方式对比:HTTP、DNS与DuckDNS如何为SWAG容器配置免费SSL证书
  • I2C控制器高级功能实战:中断、DMA与唤醒机制详解

最新新闻

  • 亲身到店探访广州宝玑官方售后服务中心|最新电话及维修地址(2026年7月最新) - 亨得利官方服务中心
  • 柔性制氢 + 氢冶金:打造稳定的深度脱碳管道 - 蓝色星球
  • 专科论文AI写作工具怎么选?2026年实测4款,按专科深度定制才不会翻车
  • 如何使用cppclean快速定位C++项目中的未使用代码与冗余依赖
  • 真力时2026年7月广州售后服务中心官方地址及客户服务电话通告 - 亨得利钟表维修中心
  • Fody生态系统全景:50+精选Weavers插件功能与应用场景

日新闻

  • AI云原生实战05-金融AI上云最难的不是技术,是“不出事“——TCE银行风控架构拆解
  • 2026年GEOSEO优化公司选型深度测评:五大硬核标准严选,这六家重塑搜索增长新格局 - 品牌前沿专家
  • **核验!2026年7月卡地亚香港**售后网点地址及服务电话公告 - 卡地亚服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号