全面指南:ZYNQ 7020驱动LCD触摸屏(FPGA驱动)
Zynq-7000系列是Xilinx推出的具有可编程逻辑的系统级芯片(SoC),其核心架构包括ARM处理器和FPGA,它们的紧密耦合为嵌入式系统设计提供了强大的处理能力和硬件可编程性。本章将深入介绍ZYNQ 7020的系统架构,为后续章节关于LCD控制器和触摸屏驱动开发打下坚实基础。
简介:ZYNQ 7020是一款融合ARM Cortex-A9处理器与FPGA功能的高性能SoC,广泛用于多种嵌入式应用。本压缩包提供了完整的LCD触摸屏驱动程序和FPGA库,旨在助力开发者构建具备显示和交互功能的系统。项目包括ZYNQ 7020架构理解、LCD控制器配置、触摸屏驱动实现、中断处理、设备树配置、用户空间接口以及FPGA驱动库的开发。开发者通过学习和实践本项目,可深入了解基于ZYNQ 7020的嵌入式系统开发,实现高效的设计。 
1. ZYNQ 7020系统架构概述
Zynq-7000系列是Xilinx推出的具有可编程逻辑的系统级芯片(SoC),其核心架构包括ARM处理器和FPGA,它们的紧密耦合为嵌入式系统设计提供了强大的处理能力和硬件可编程性。本章将深入介绍ZYNQ 7020的系统架构,为后续章节关于LCD控制器和触摸屏驱动开发打下坚实基础。
1.1 ZYNQ 7020的处理器核心
ZYNQ 7020搭载了双核ARM Cortex-A9处理器,每个核心可以独立工作,拥有自己的L1缓存和共享的L2缓存,使得多任务处理和数据处理性能强大。处理器核心负责运行操作系统和执行复杂的软件应用程序。
1.2 可编程逻辑部分
与处理器核心并行的是一块可编程逻辑区域,即FPGA部分,它包含了可配置的逻辑单元、存储器块和DSP切片,为实现各种定制化硬件加速器和接口提供了灵活性。此部分是ZYNQ 7020区别于传统微控制器的重要特性,可以根据具体需求设计硬件电路。
1.3 内部互联和外设
ZYNQ 7020的内部互联结构包括了高速互连网络,用于连接处理器核心与FPGA区域,以及其它外设控制器如内存控制器、千兆以太网、USB等。这样的设计确保了处理器与FPGA、外设之间高速且低延迟的数据交换。
ZYNQ 7020系统架构的特点是集成了处理器和可编程逻辑,这种混合架构使得开发者既可以享受到传统SoC的方便快捷,又不失FPGA的硬件定制能力。在深入了解了ZYNQ的系统架构之后,接下来的章节将详细介绍基于ZYNQ 7020的LCD控制器和触摸屏驱动程序的实现细节。
2. LCD控制器设计与实现
2.1 LCD控制器硬件架构分析
2.1.1 LCD控制器核心组件解析
LCD控制器是现代嵌入式系统中不可或缺的组成部分,负责将数据从处理器转换为图像输出到LCD显示设备上。核心组件包括视频处理单元(VPU)、时序控制器(TCON)、和屏驱动电路。视频处理单元负责将处理器传输的图形数据转换为适合LCD显示的格式,例如将RGB数据转换为YUV格式,或进行缩放、颜色校正等处理。时序控制器用于产生正确的显示时序信号,以满足LCD屏幕的刷新率和分辨率要求。屏驱动电路则负责将转换后的视频信号驱动到液晶屏的各个像素点上。
在分析LCD控制器硬件架构时,需要关注以下几个关键点:
- 视频处理单元的性能 :核心性能指标包括处理速度、支持的分辨率和颜色深度。
- 时序控制器的灵活性 :支持的分辨率范围、可编程的时序参数等。
- 屏驱动电路的兼容性 :必须能够兼容不同制造商和不同技术(如TFT、OLED等)的显示面板。
理解这些组件的工作原理和交互是深入分析和优化LCD显示性能的基础。
2.1.2 显示驱动信号接口与协议
LCD控制器与显示面板之间的信号接口和协议是确保正确显示的基础。信号接口通常包括以下几个主要部分:
- 数据接口 :负责传输图像数据,如RGB数据线。
- 控制信号 :如行同步(HSYNC)、场同步(VSYNC)、时钟信号(DOTCLK)等。
- 电源管理 :包含背光控制信号和电源电压。
协议方面,常见的有RGB接口协议、LVDS接口协议、以及MIPI接口协议等。以RGB接口协议为例,数据通过并行接口传输,每个像素的颜色值由若干位线(RGB分量)组成,传输时同步信号指示有效数据的开始和结束。
设计时,需要根据目标显示屏的技术手册和控制器的数据手册来适配这些接口和协议。正确的接口和协议实现可以确保图像显示的准确性和稳定性。
2.2 LCD显示驱动的软件架构
2.2.1 驱动程序的框架和层次
在软件层面上,LCD显示驱动程序的架构通常包含以下几个层次:
- 硬件抽象层(HAL) :这是最接近硬件的一层,用于屏蔽硬件的复杂性,提供统一的API接口给上层使用。
- 设备驱动层 :实现具体的硬件操作,如初始化、配置、数据传输等。
- 显示管理层 :处理更高层次的显示任务,如分辨率设置、颜色管理、显示策略等。
层次化设计的好处在于隔离了不同层次的实现细节,简化了驱动程序的开发和维护工作。
2.2.2 硬件抽象层(HAL)的作用
硬件抽象层是驱动程序设计中非常重要的一个概念,它提供了与硬件无关的编程接口。HAL的作用主要体现在以下几个方面:
- 隐藏硬件细节 :通过提供统一的接口,使上层应用无需了解具体的硬件实现。
- 提高可移植性 :当硬件平台发生变化时,只需修改HAL层,无需修改整体架构。
- 便于维护和扩展 :将硬件操作封装在HAL层中,使得维护和更新更加方便。
HAL层的实现通常涉及到一系列的函数,如初始化函数、读写函数等。代码示例如下:
// HAL层初始化函数
void LCDHAL_Init() {
// 初始化硬件寄存器,配置时钟等
}
// HAL层写入显示数据函数
void LCDHAL_WriteData(uint16_t data) {
// 将数据写入硬件寄存器
}
// HAL层配置寄存器函数
void LCDHAL_ConfigReg(uint8_t reg, uint16_t value) {
// 设置硬件寄存器的值
}
2.3 LCD控制器的初始化与配置
2.3.1 配置寄存器的编程方法
LCD控制器的初始化和配置主要通过对其内部寄存器的编程来实现。每个寄存器控制着不同的功能,如时序、分辨率、电源控制等。
编程方法通常分为以下几个步骤:
- 确定寄存器地址 :根据控制器的数据手册,了解各个寄存器的地址和功能。
- 配置寄存器值 :根据显示需求,设置寄存器的值。
- 寄存器编程 :通过写操作将配置值写入寄存器。
代码示例如下:
#define LCD_REG_TIMING1 0x100
#define LCD_REG_TIMING2 0x101
void LCD_Init() {
// 配置显示时序参数
uint16_t timing1 = (1 << 8) | (3 << 4) | 2; // 假设的配置值
uint16_t timing2 = (4 << 8) | (6 << 4) | 1; // 假设的配置值
// 写入寄存器
LCDHAL_WriteReg(LCD_REG_TIMING1, timing1);
LCDHAL_WriteReg(LCD_REG_TIMING2, timing2);
}
2.3.2 显示参数的设置与调整
显示参数的设置与调整是确保LCD正确显示的关键。这些参数包括分辨率、色彩深度、显示方向、亮度等。调整时,需注意以下几点:
- 分辨率 :选择合适的分辨率,通常由显示内容和LCD面板规格决定。
- 色彩深度 :色彩深度越高,显示的颜色越丰富,但同时对带宽和处理能力的要求也越高。
- 显示方向 :支持横屏和竖屏等多种显示方向,以适应不同的使用场景。
代码示例:
void LCD_SetDisplayParam(uint16_t width, uint16_t height, uint8_t depth, uint8_t orientation) {
// 根据传入的参数设置显示属性
// ...
}
通过适当配置这些参数,可以最大化显示效果,并提升用户体验。
本章节中对LCD控制器的硬件架构、软件架构、初始化与配置进行了深入分析,从核心组件到软件层次结构,再到寄存器级的编程方法,都进行了详细的探讨。下一章我们将转到触摸屏驱动程序开发,继续探索ZYNQ平台上的交互体验优化。
3. 触摸屏驱动程序开发
3.1 触摸屏控制器原理与协议
触摸屏作为人机交互的重要界面,广泛应用于各种嵌入式设备中。触摸屏控制器是实现触摸屏与主机通信的核心部件。本小节将探讨触摸屏控制器的硬件通信方式和数据格式及处理流程。
3.1.1 触摸屏控制器的硬件通信方式
触摸屏控制器支持多种通信协议,其中最常见的包括I2C、SPI和USB等。这些协议允许触摸屏控制器与处理器以不同的方式交换数据。
- I2C通信协议 :I2C是一种多主机总线通信协议,具有简化线路设计、低功耗的优势。在触摸屏控制器中,I2C通信方式通常使用SDA(数据线)和SCL(时钟线)两根线来完成数据的读写操作。
- SPI通信协议 :SPI是一种高速串行通信协议,它使用主从结构,有四条线路,分别是MISO(主设备输入从设备输出)、MOSI(主设备输出从设备输入)、SCK(时钟信号线)和CS(片选信号线)。
- USB通信协议 :一些触摸屏控制器还支持通过USB进行通信,这种通信方式适合于高速数据传输需求的场景。
3.1.2 触摸屏数据格式和处理流程
触摸屏控制器处理触摸数据的方式在不同型号和厂商之间可能会有差异,但大致流程是相似的。当用户触摸屏幕时,触摸屏控制器会检测到压力或电容变化,并将这些变化转换为数字信号。这些数字信号随后被封装成特定格式的数据包,以供主机处理。
触摸屏控制器通常输出的数据格式包含: - 触摸点坐标(X, Y) - 触摸事件类型(例如按下、移动、释放) - 触摸力度(在压力传感器支持的屏幕中) - 辅助数据(如触控ID,用于多点触控)
触摸屏控制器处理流程大体如下: 1. 初始化控制器,设置采样率和其他参数。 2. 主循环中持续检测触摸动作。 3. 当检测到触摸时,采集触摸点坐标及其它相关信息。 4. 将这些信息封装为数据包,并通过所选的通信协议发送到主处理器。 5. 解析数据包,转换为操作系统可以理解的输入事件。
3.2 触摸屏驱动程序的框架设计
3.2.1 驱动程序的架构和功能模块
触摸屏驱动程序作为操作系统与硬件之间的接口,负责实现触摸屏的初始化、数据采集、数据解析和事件报告等功能。驱动程序架构通常包括:
- 初始化模块 :负责加载驱动时的硬件初始化,包括设置通信参数,配置触摸屏控制器的工作模式等。
- 数据采集模块 :负责从控制器读取触摸数据,这通常涉及底层通信协议的实现。
- 数据解析模块 :负责将原始触摸数据转换为设备无关的坐标值等信息。
- 事件报告模块 :负责将解析后的触摸数据封装成输入事件,并提交给上层输入子系统。
3.2.2 输入事件的处理机制
触摸屏驱动程序在操作系统中通常作为输入设备驱动,遵循标准输入事件接口。其核心职责是将触摸屏的物理信号转换为输入事件,并通过输入子系统上报给应用层。
- 中断处理 :当触摸屏控制器产生中断信号时,驱动程序将触发中断服务例程来读取数据并上报事件。
- 轮询机制 :对于不支持中断的控制器,驱动可能需要轮询机制定期检查触摸状态。
- 缓冲区管理 :驱动程序需管理缓冲区,存储触摸屏数据,以便同步或异步处理。
// 示例代码:中断处理例程
static irqreturn_t touch_irq_handler(int irq, void *dev_id) {
struct touch_data *touch = (struct touch_data *)dev_id;
// 读取触摸屏控制器数据
int x, y;
int touched = read_touch_data(&x, &y);
// 将数据转换为输入事件
input_report_abs(touch->input_dev, ABS_X, x);
input_report_abs(touch->input_dev, ABS_Y, y);
input_report_key(touch->input_dev, BTN_TOUCH, touched);
input_sync(touch->input_dev);
return IRQ_HANDLED;
}
3.3 触摸屏校准与数据处理
3.3.1 校准过程的实现细节
校准是触摸屏驱动程序开发中不可或缺的一环。校准过程通常包含获取校准数据、计算校准系数、应用校准系数等步骤。
- 获取校准数据 :在屏幕上预定义的校准点进行触摸,记录实际触摸点和理想坐标。
- 计算校准系数 :根据实际测量值和理想值计算出校准系数。
- 应用校准系数 :将校准系数应用到触摸事件中,调整坐标值,使得触摸点更接近实际的物理位置。
3.3.2 触摸数据的滤波和映射算法
由于外界因素(如温度变化、电磁干扰等)的影响,触摸屏在实际使用中可能会产生噪声或不稳定的数据。因此,需要通过数据滤波和映射算法来优化数据的准确性和稳定性。
- 数据滤波 :通过算法(如滑动平均滤波、中值滤波等)对触摸数据进行平滑处理,减少数据波动和异常值的影响。
- 映射算法 :将触摸屏的物理坐标转换为更精确的逻辑坐标。映射算法可能包括线性映射、非线性映射等。
// 示例代码:简单的滤波算法
static int filtered_value = 0;
int get_filtered_value(int raw_value) {
filtered_value = (filtered_value * 7 + raw_value) / 8;
return filtered_value;
}
触摸屏驱动程序开发是嵌入式系统开发中的一个重要环节,它直接影响到用户交互体验的质量。通过合理设计驱动程序架构,采用有效的校准与数据处理技术,可以显著提高触摸屏的响应精度和用户体验。
4. 中断处理机制
中断系统是实时操作系统中不可或缺的部分,它使得处理器能够在紧急情况下迅速切换执行流程,对外部事件进行及时响应。在ZYNQ架构中,中断处理机制不仅负责连接处理器和外设,还确保了系统资源得到最优化的使用。本章将详细分析ZYNQ架构中断系统的角色、触摸屏中断处理流程,以及中断性能优化的相关策略。
4.1 中断系统在ZYNQ架构中的角色
4.1.1 中断控制器的功能和工作原理
ZYNQ架构中的中断控制器,被称为中断控制器(PLIC),它是一个硬件模块,负责管理来自多个外设的中断请求(IRQs),并将它们路由到处理器核心。中断控制器具有以下几个主要功能:
- 中断优先级处理 :PLIC支持优先级的概念,这意味着不是所有中断都同等重要。当多个中断同时发生时,中断控制器将根据设定的优先级选择一个中断发送到处理器。
- 中断屏蔽和使能 :通过编程的方式,可以屏蔽或使能某些特定中断,允许系统根据当前的运行情况动态调整中断响应。
- 中断触发方式 :PLIC支持电平触发和边沿触发两种中断触发方式,提供了灵活的中断响应机制。
- 中断源的管理 :PLIC负责管理来自多个外设的中断源,包括确认中断响应、清除中断请求等。
中断控制器的工作原理可以概述为以下步骤:
- 外设产生中断请求。
- 中断请求通过PLIC进行优先级判断。
- 如果中断请求高于当前正在处理的中断优先级,PLIC将中断传递给处理器。
- 处理器接收到中断信号,执行中断服务程序。
- 在中断服务程序中处理完相应外设的中断请求后,通过PLIC清除该中断请求。
4.1.2 中断优先级和分配策略
在ZYNQ架构中,中断优先级管理是确保系统稳定运行的关键。中断优先级的设置决定了哪些中断能够获得处理器的立即响应。以下是一些关键的优先级和分配策略:
- 静态优先级 :每个中断源被赋予一个固定的优先级。这在系统初始化时设置,通常不会改变。
- 动态优先级 :在某些情况下,系统可能需要根据实时需求动态调整中断优先级。
- 优先级分配 :根据外设的重要性和实时性要求进行优先级分配,例如触摸屏中断通常会被分配较高的优先级,因为交互性是用户体验的关键。
理解中断优先级的分配策略对于设计一个高效的系统至关重要。开发者需要根据实际应用的需求,仔细权衡不同任务的紧迫性和重要性,合理配置中断优先级。
4.2 触摸屏中断处理流程
4.2.1 触摸屏中断触发条件和响应
触摸屏中断是用户与设备交互的一个重要组成部分。触摸屏控制器在检测到触摸事件时,会向PLIC发送中断请求,请求处理器介入以处理相应的输入事件。触摸屏中断的触发条件和响应流程如下:
- 用户触摸屏幕,触摸屏控制器检测到信号变化。
- 触摸屏控制器将变化数据进行初步处理后,发送中断请求到PLIC。
- PLIC根据中断优先级,如果触摸屏中断的优先级足够高,则将中断信号发送给处理器。
- 处理器接收到中断信号后,暂停当前任务,跳转到触摸屏中断服务程序。
- 中断服务程序读取触摸屏控制器的数据,处理触摸事件(如坐标转换、手势识别等)。
- 完成触摸事件处理后,向PLIC发送中断完成信号,PLIC相应地清除中断请求。
4.2.2 中断服务程序的设计与实现
中断服务程序(ISR)是中断处理的核心部分,其设计和实现直接影响系统的性能和响应时间。设计触摸屏中断服务程序时需要考虑以下几点:
- 快速响应 :ISR应该尽可能短小精悍,快速完成最基本的任务,如记录触摸事件和清除中断标志。
- 任务分解 :复杂的处理任务应分解为后台任务或低优先级的线程,以免阻塞中断处理流程。
- 互斥访问 :如果ISR需要访问共享资源(如缓冲区),确保在访问时使用互斥机制,避免数据竞争和竞态条件。
代码示例:实现一个简单的触摸屏中断服务程序。
void touchscreen_isr() {
// 中断服务程序代码
unsigned int irq_status = read_irq_status_register();
if (irq_status & TOUCHSCREEN_IRQ) {
// 清除触摸屏中断标志位
clear_touchscreen_irq_flag();
// 读取触摸屏数据
touchscreen_data_t data = read_touchscreen_data();
// 处理触摸事件,例如坐标转换、手势识别等
process_touch_event(&data);
// 如有需要,可向PLIC发送中断完成信号
// send_interrupt_completion_signal(PLIC);
}
}
在上述代码中, read_irq_status_register 、 clear_touchscreen_irq_flag 和 read_touchscreen_data 都是假设存在的函数,用以读取中断状态、清除中断标志和读取触摸屏数据。实际的中断服务程序可能需要更复杂的逻辑处理触摸屏的数据。
4.3 中断性能优化
4.3.1 中断延迟与吞吐量分析
中断延迟是指从中断发生到中断服务程序开始执行的时间。在实际的应用中,中断延迟可能对系统性能造成显著影响。中断延迟由以下几个部分组成:
- 中断传播延迟 :中断从发生到PLIC开始处理的时间。
- 中断处理延迟 :PLIC处理中断请求和选择处理器的时间。
- 上下文切换延迟 :处理器保存当前任务状态,准备进入中断处理模式的时间。
- 中断服务程序执行延迟 :执行ISR代码的时间。
中断吞吐量指的是单位时间内系统能够处理的中断数量。为了提高系统性能,需要尽可能降低中断延迟和提高吞吐量。优化中断延迟的方法包括:
- 减少中断服务程序的复杂度 :简化ISR代码,使其尽快完成任务。
- 使用硬件辅助机制 :如DMA(直接内存访问)来减少CPU负担。
- 优先级管理 :合理分配中断优先级,避免低优先级中断占用过多资源。
4.3.2 中断共享和负载均衡策略
在多处理器系统中,中断共享是一种常见的负载均衡策略。中断可以被分配给不同的处理器核心进行处理,以此来提高处理效率。中断共享的实现通常基于以下机制:
- 全局中断控制器 :ZYNQ中的PLIC支持将中断路由到不同的处理器核心。
- 亲和性设置 :操作系统可以设置中断和处理器之间的亲和性,以便中断总是发送给同一核心处理,提高缓存效率。
- 动态负载均衡 :操作系统可以根据当前的负载情况,动态地调整中断分配策略。
对于中断共享的优化,关键在于平衡核心间的工作负载,避免某些核心过载而其他核心空闲的情况发生。实现该优化需要操作系统提供相应的支持,并结合具体应用场景进行合理配置。
通过本章节的介绍,读者应理解了中断处理机制在ZYNQ架构中的作用、触摸屏中断处理的具体流程,以及针对中断性能的优化策略。下一章将探讨设备树的配置与修改,以及其在驱动开发中的应用。
5. 设备树配置与修改
设备树作为描述硬件信息的结构化数据,已经成为嵌入式Linux系统中描述硬件配置的重要机制。它提供了硬件资源信息的抽象描述,允许操作系统在启动时了解设备布局,从而加载适当的驱动程序。
5.1 设备树的概念与结构
5.1.1 设备树的作用和数据模型
设备树是一种数据结构,用于以文档形式描述硬件设备,尤其在嵌入式系统中广泛使用。它以树状结构描述了硬件设备的层级关系和属性信息。这种结构化的数据能够让操作系统在启动时动态了解系统的硬件配置。
设备树的数据模型由节点(node)、属性(property)和值(value)组成。节点通常表示一个硬件单元,属性是节点的特征描述,而值则是属性的具体内容。设备树的每个节点都有一个名字和一个单元地址(如果适用)。
例如,一个简单的设备树节点可能看起来像这样:
/ {
node1 {
property1 = <value1>;
property2 = <value2>;
};
};
5.1.2 设备树的编译与解析过程
设备树首先需要被编译成二进制格式(.dtb),这一过程由设备树编译器(dtc)完成。编译后的二进制文件在系统启动时被加载并解析,然后内核根据设备树的内容进行设备初始化。
编译设备树通常涉及到以下步骤: 1. 使用dtc工具对设备树源文件(.dts)进行编译。 2. 将编译后的二进制文件(.dtb)存放到启动介质中,如NAND闪存或SD卡。 3. 在系统启动时,引导加载程序(如U-Boot)会将设备树二进制文件加载到内存中。 4. 内核解析设备树并据此初始化对应的硬件设备。
解析过程中,内核会创建一个与设备树对应的内核内部数据结构,然后根据这些信息进行设备注册和驱动程序的加载。
5.2 设备树在LCD和触摸屏驱动中的应用
5.2.1 配置LCD显示参数
为了在设备树中配置LCD显示参数,通常需要定义一个包含特定属性的节点。这些属性描述了屏幕的分辨率、颜色深度、时序等关键信息。例如:
&lcd控制器节点 {
screened,panel-timing = <...>;
screened,pixel-clock = <...>;
screened,display-width = <...>;
screened,display-height = <...>;
// 其他相关属性
};
5.2.2 配置触摸屏控制器参数
触摸屏控制器的配置通常包括中断号、IO端口、控制器类型等信息。在设备树中,这些可以通过特定的属性来设置:
&触摸屏控制器节点 {
touchscreen,interrupts = <...>;
touchscreen,IQ = <...>;
touchscreen-controller = <...>;
// 其他相关属性
};
5.3 设备树的高级功能和扩展
5.3.1 动态设备树(DT)的使用和管理
动态设备树(Dynamic DT)允许设备信息在运行时被修改或添加。这对于热插拔设备或需要动态配置的硬件特别有用。系统开发者可以利用设备树的某些特性,如设备树覆盖(overlays)和属性的动态修改来实现运行时的设备树更新。
5.3.2 设备树覆盖和修改的实践技巧
设备树覆盖是向现有设备树添加或修改节点的一种方法。在Linux中,可以使用 dtc 工具来编译和应用设备树覆盖文件(.dtbo):
dtc -O dtb -o /boot/overlays/partition.dtbo -b 0 -@ partition.dts
之后,通过特定的内核命令(如sysfs接口)来合并这个覆盖文件到当前正在运行的设备树实例中。这为系统提供了更大的灵活性,尤其是在需要支持可变硬件配置时。
通过这些步骤,开发者可以更精确地控制硬件行为,优化系统性能,或解决特定的硬件兼容性问题。
简介:ZYNQ 7020是一款融合ARM Cortex-A9处理器与FPGA功能的高性能SoC,广泛用于多种嵌入式应用。本压缩包提供了完整的LCD触摸屏驱动程序和FPGA库,旨在助力开发者构建具备显示和交互功能的系统。项目包括ZYNQ 7020架构理解、LCD控制器配置、触摸屏驱动实现、中断处理、设备树配置、用户空间接口以及FPGA驱动库的开发。开发者通过学习和实践本项目,可深入了解基于ZYNQ 7020的嵌入式系统开发,实现高效的设计。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)