From 5ea8af832edc2c38ae4d0216a6c6c405372ea879 Mon Sep 17 00:00:00 2001 From: zhangxiaowei16 Date: Mon, 31 Mar 2025 15:49:06 +0800 Subject: [PATCH] Supplement the openvela documentation --- zh-cn/demo/Music_Player_Example_zh-cn.md | 4 +- zh-cn/demo/Smart_Band_Example_zh-cn.md | 4 +- zh-cn/demo/X_Track_zh-cn.md | 4 +- .../bluetooth/Bluetooth_Overview.md | 2 +- .../AdapterBTCommands/set.md | 4 +- .../graphics/Framebuffer_Driver.md | 16 ++-- zh-cn/device_dev_guide/graphics/LCD_Driver.md | 47 ++++++------ zh-cn/device_dev_guide/graphics/VSync.md | 6 +- .../device_dev_guide/media/media_framework.md | 73 ------------------- .../media/server/media_server.md | 2 +- 10 files changed, 45 insertions(+), 117 deletions(-) delete mode 100644 zh-cn/device_dev_guide/media/media_framework.md diff --git a/zh-cn/demo/Music_Player_Example_zh-cn.md b/zh-cn/demo/Music_Player_Example_zh-cn.md index 260f40d1..5a25e34e 100644 --- a/zh-cn/demo/Music_Player_Example_zh-cn.md +++ b/zh-cn/demo/Music_Player_Example_zh-cn.md @@ -8,9 +8,9 @@ ## 前提条件 -1. 搭建开发环境,请参见 [环境搭建](../quickstart/Set_up_the_development_environment_zh-cn.md)。 +1. 搭建开发环境,请参见[环境搭建](../quickstart/Set_up_the_development_environment_zh-cn.md)。 -2. 下载源码,请参见 [下载 openvela 源码](../quickstart/Download_Vela_sources_zh-cn.md)。 +2. 下载源码,请参见[下载 openvela 源码](../quickstart/Download_Vela_sources_zh-cn.md)。 ## 步骤一 配置项目 diff --git a/zh-cn/demo/Smart_Band_Example_zh-cn.md b/zh-cn/demo/Smart_Band_Example_zh-cn.md index d2f1fe23..a03d8711 100644 --- a/zh-cn/demo/Smart_Band_Example_zh-cn.md +++ b/zh-cn/demo/Smart_Band_Example_zh-cn.md @@ -9,9 +9,9 @@ Bandx 是一款智能手环演示,包括手表表盘、启动器、音乐、 ## 前提条件 -1. 搭建开发环境,请参见 [环境搭建](../quickstart/Set_up_the_development_environment_zh-cn.md)。 +1. 搭建开发环境,请参见[环境搭建](../quickstart/Set_up_the_development_environment_zh-cn.md)。 -2. 下载源码,请参见 [下载 openvela 源码](../quickstart/Download_Vela_sources_zh-cn.md)。 +2. 下载源码,请参见[下载 openvela 源码](../quickstart/Download_Vela_sources_zh-cn.md)。 ## 步骤一 配置项目 diff --git a/zh-cn/demo/X_Track_zh-cn.md b/zh-cn/demo/X_Track_zh-cn.md index 9a0afbf8..94e8b2fd 100644 --- a/zh-cn/demo/X_Track_zh-cn.md +++ b/zh-cn/demo/X_Track_zh-cn.md @@ -14,9 +14,9 @@ ## 前提条件 -1. 搭建开发环境,请参见 [环境搭建](../quickstart/Set_up_the_development_environment_zh-cn.md)。 +1. 搭建开发环境,请参见[环境搭建](../quickstart/Set_up_the_development_environment_zh-cn.md)。 -2. 下载源码,请参见 [下载 openvela 源码](../quickstart/Download_Vela_sources_zh-cn.md)。 +2. 下载源码,请参见[下载 openvela 源码](../quickstart/Download_Vela_sources_zh-cn.md)。 ## 步骤一 配置项目 diff --git a/zh-cn/device_dev_guide/connection/bluetooth/Bluetooth_Overview.md b/zh-cn/device_dev_guide/connection/bluetooth/Bluetooth_Overview.md index 5c3e00a1..11f81b14 100644 --- a/zh-cn/device_dev_guide/connection/bluetooth/Bluetooth_Overview.md +++ b/zh-cn/device_dev_guide/connection/bluetooth/Bluetooth_Overview.md @@ -81,7 +81,7 @@ openvela 蓝牙目前还能够支持多种开源、闭源协议栈,如Zephyr ### 1、蓝牙应用开发 -对于第三方应用开发者,可以使用 openvela 快应用 QuickApp Feature ,它是基于 QuickJS 引擎使用 C++ 实现的一系列 API 接口,为三方应用提供系统访问能力,更多详情请参见 [蓝牙接口](https://doc.quickapp.cn/features/system/bluetooth.html)。 +对于第三方应用开发者,可以使用 openvela 快应用 QuickApp Feature ,它是基于 QuickJS 引擎使用 C++ 实现的一系列 API 接口,为三方应用提供系统访问能力,更多详情请参见[蓝牙接口](https://doc.quickapp.cn/features/system/bluetooth.html)。 另外,蓝牙 Framework 还提供了 NDK 接口来使用蓝牙系统的所有能力。可以参阅目录 framework/include 中的头文件获取更多信息。 diff --git a/zh-cn/device_dev_guide/connection/bluetooth/functionality_test/AdapterBTCommands/set.md b/zh-cn/device_dev_guide/connection/bluetooth/functionality_test/AdapterBTCommands/set.md index 76ba0bd4..f94590f1 100644 --- a/zh-cn/device_dev_guide/connection/bluetooth/functionality_test/AdapterBTCommands/set.md +++ b/zh-cn/device_dev_guide/connection/bluetooth/functionality_test/AdapterBTCommands/set.md @@ -118,7 +118,7 @@ bttool> set iocap 0 | **参数名** | **说明** | **参数类型** | **参数值范围** | **默认值** | | :----------- | :------------------- | :----------- | :------------------- | :--------- | -| local name | 本地蓝牙适配器名称。 | 字符串 | 最多输入 63 个字符。 | N/A | +| local name | 本地蓝牙适配器名称。 | 字符串 | 最多输入 64 个字符。 | N/A | #### 示例 @@ -160,7 +160,7 @@ bttool> [bttool] Adapter update device name: Xiaomiii | **参数名** | **说明** | **参数类型** | **默认值** | | :--------- | :----------------------------------------------------------- | :----------- | :--------- | -| class | 本地蓝牙shipeiqi 类型,由 4 个部分组成。
bit 23~13 :主服务类型。
bit 12~8:主设备类型。
bit 7~2:次要设备类型。
bit 1~0:固定值 0。 | 十六进制整数 | 0x00280704 | +| class | 本地蓝牙适配器类型,由 4 个部分组成。
bit 23~13 :主服务类型。
bit 12~8:主设备类型。
bit 7~2:次要设备类型。
bit 1~0:固定值 0。 | 十六进制整数 | 0x00280704 | #### 注意事项 diff --git a/zh-cn/device_dev_guide/graphics/Framebuffer_Driver.md b/zh-cn/device_dev_guide/graphics/Framebuffer_Driver.md index 34f17640..3357f442 100644 --- a/zh-cn/device_dev_guide/graphics/Framebuffer_Driver.md +++ b/zh-cn/device_dev_guide/graphics/Framebuffer_Driver.md @@ -9,11 +9,14 @@ Framebuffer(帧缓存/显存)是一个用于存储一帧 LCD 图像数据的 以 480x320 的屏幕为例,在不同像素模式下,Framebuffer 的大小如下: 1. ARGB888 (32bpp): - 1. 计算公式:`480 x 320 x 4 (bytes)` - 2. 大小:614,400 字节 + + - 计算公式:`480 x 320 x 4 (bytes)` + - 大小:614,400 字节 + 2. RGB565 (16bpp): - 1. 计算公式:`480 x 320 x 2 (bytes)` - 2. 大小:307,200 字节 + + - 计算公式:`480 x 320 x 2 (bytes)` + - 大小:307,200 字节 ## 二、Framebuffer的显示原理 @@ -106,7 +109,7 @@ errout_with_fb: 3. `void up_fbuninitialize(int display)` - 执行与 `up_fbinitialize` 相反的操作,用于释放资源。通常可以实现为空,不执行任何操作。 -### `3、struct fb_vtable_s` 结构 +### 3、`struct fb_vtable_s` 结构 `fb_vtable_s` 是 Framebuffer 的核心结构,定义了与视频硬件交互的接口。以下是其主要功能模块: @@ -147,7 +150,7 @@ errout_with_fb: - `getpower`:获取面板的电源状态。 - `setpower`:启用或禁用面板电源。 -#### 3.1 示例代码 +#### 示例代码 以下是 `struct fb_vtable_s` 的部分定义示例: @@ -257,7 +260,6 @@ struct fb_vtable_s int (*blend)(FAR struct fb_vtable_s *vtable, FAR const struct fb_overlayblend_s *blend); -# endif #endif /* Pan display for multiple buffers. */ diff --git a/zh-cn/device_dev_guide/graphics/LCD_Driver.md b/zh-cn/device_dev_guide/graphics/LCD_Driver.md index 97b9281e..418b7a46 100644 --- a/zh-cn/device_dev_guide/graphics/LCD_Driver.md +++ b/zh-cn/device_dev_guide/graphics/LCD_Driver.md @@ -104,22 +104,21 @@ struct lcd_dev_s ```C #ifdef CONFIG_LCD - - ret = board_lcd_initialize(); - if (ret < 0) - { - syslog(LOG_ERR, "ERROR: board_lcd_initialize() failed: %d\n", ret); - } - -# ifdef CONFIG_LCD_DEV - - ret = lcddev_register(0); - if (ret < 0) - { - syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret); - } - -# endif + // Initialize the LCD board + ret = board_lcd_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: board_lcd_initialize() failed: %d\n", ret); + } +#ifdef CONFIG_LCD_DEV + // Register the LCD device + ret = lcddev_register(0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret); + } +#endif /* CONFIG_LCD_DEV */ +#endif /* CONFIG_LCD */ ``` #### 代码说明 @@ -140,25 +139,25 @@ struct lcd_dev_s ```C struct lcd_planeinfo_s { - /* LCD Data Transfer ******************************************************/ - //对某一行写入npixels个数据 + /* LCD Data Transfer */ + /* 对某一行写入npixels个数据 */ int (*putrun)(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffer, size_t npixels); - //更新矩形区域 + /* 更新矩形区域 */ int (*putarea)(fb_coord_t row_start, fb_coord_t row_end, fb_coord_t col_start, fb_coord_t col_end, FAR const uint8_t *buffer); - //读取某一行npixels个数据 + /* 读取某一行npixels个数据 */ int (*getrun)(fb_coord_t row, fb_coord_t col, FAR uint8_t *buffer, size_t npixels); - //读取一个矩形区域的数据 + /* 读取一个矩形区域的数据 */ int (*getarea)(fb_coord_t row_start, fb_coord_t row_end, fb_coord_t col_start, fb_coord_t col_end, FAR uint8_t *buffer); - /* Plane color characteristics ******************************************** - //工作区,每个lcd 设备一个,多个layer共享一个buffer。至少存储一行的数据(bpp * xres/8),要和像素格式对齐 + /* Plane color characteristics */ + /* 工作区,每个lcd 设备一个,多个layer共享一个buffer。至少存储一行的数据(bpp * xres/8),要和像素格式对齐 */ uint8_t *buffer; - //一个像素占用的位数 + /* 一个像素占用的位数 */ uint8_t bpp; }; ``` diff --git a/zh-cn/device_dev_guide/graphics/VSync.md b/zh-cn/device_dev_guide/graphics/VSync.md index 292c0509..9d2f3230 100644 --- a/zh-cn/device_dev_guide/graphics/VSync.md +++ b/zh-cn/device_dev_guide/graphics/VSync.md @@ -67,12 +67,12 @@ > > 中断相关内容介绍请参见 [Interrupt](https://en.wikipedia.org/wiki/Interrupt)。 -MCU 和屏幕的简化版硬件连接如下图: +微控制单元(Microcontroller Unit,MCU)和屏幕的简化版硬件连接如下图: ![img](./figures/006.svg) -- TE (Tearing Effect):用于接收屏幕发送过来的同步信号,屏幕硬件会在每次即将显示新的帧之前,改变这个引脚的电平,MCU 通过 GPIO 中断接收和处理 TE 事件。 -- MIPI:用于传输命令和数据的接口,LCD 控制器和 LCD 之间沟通的桥梁,CPU 通过操作 LCD 控制器来控制屏幕显示的内容,LCD 控制器也会在每次传输完毕后,通过中断来通知 CPU buffer 已经发送完成。 +- TE(Tearing Effect):用于接收屏幕发送过来的同步信号,屏幕硬件会在每次即将显示新的帧之前,改变这个引脚的电平,MCU 通过 GPIO 中断接收和处理 TE 事件。 +- MIPI(Mobile Industry Processor Interface):用于传输命令和数据的接口,LCD 控制器和 LCD 之间沟通的桥梁,CPU 通过操作 LCD 控制器来控制屏幕显示的内容,LCD 控制器也会在每次传输完毕后,通过中断来通知 CPU buffer 已经发送完成。 LCD 驱动程序需要提供两个中断服务函数,用于接收和处理 LCD 发送过来的事件。 diff --git a/zh-cn/device_dev_guide/media/media_framework.md b/zh-cn/device_dev_guide/media/media_framework.md deleted file mode 100644 index 58354067..00000000 --- a/zh-cn/device_dev_guide/media/media_framework.md +++ /dev/null @@ -1,73 +0,0 @@ - -# **Media Framework** - -## 一、**概述** - -Media Framework 是一个用于处理音视频的库,提供了丰富的 API 供应用程序调用。Media Framework 采用 **CS 架构**,Client 接口会把命令打包通过 RPC 发送到 Server 上,由 Server 的 loop 做实际的工作。Media Framework 支持多种音频和视频格式的播放和录制,并且具有分布式架构,可以在多个 CPU 上运行。 - -![Media Framework架构图](./images/MediaFramework_zh-cn.jpg) - -## 二、**功能特性** - -Media Framework 主要功能模块包括 **Media Player**、**Media Recorder**、**Media Focus**、**Media Policy** 和 **Media Session**,其中 **Media Player** 和 **Media Recorder**由 **Media Graph** 模块封装。 - -### 1、**Media Player** - -- **播放服务**:能够创建一个播放实例,然后控制播放。 - -- **格式支持**:支持多种音频和视频格式,确保广泛的兼容性。 - -- **播放控制**:提供丰富的播放控制功能,如播放、暂停、停止、快进等,满足用户对音视频播放的各种需求。 - -### 2、**Media Recorder** - -- **录制服务**:能够创建一个录制实例,然后控制录制。 - -- **格式支持**:支持多种音频和视频格式,确保广泛的兼容性。 - -- **录制控制**:提供丰富的录制控制功能,如开启录制、暂停录制、停止录制等,满足用户对音视频录制的各种需求。 - -### 3、**Media Focus** - -通过设计焦点管理机制,有效地处理多个应用对媒体焦点的竞争。确保在特定时间只有一个应用获得媒体焦点并播放媒体。用户可以订阅焦点,参与到焦点的**焦点抢占**逻辑中,获得焦点提供的行为建议,从而获取流畅的用户体验。 - -### 4、**Media Policy** - -Media Policy 通过 **PFW** 来构造路由策略、音频策略等各种状态,可以通过插件进行扩展,支持处理 FFmpeg 命令和设置设备参数等功能。此外,通过编写 Policy 配置文件,往 Policy 设置参数,可以按照配置文件中既定的策略来改变 Graph 的一些全局状态,比如输入输出设备的链路切换和音量控制等,为用户提供高度可定制的媒体处理环境。 - -### 5、**Media Session** - -采用控制者和被控制者的架构,实现对媒体播放的精细控制和状态通知。提供注册控制者和被控制者、发送控制命令、处理事件通知和更新媒体元数据等功能,便于对多个媒体客户端进行统一管理和控制。 - -### 6、**Media RPC** - -双 socket 通信模型:不论是否跨核,我们都使用两个独立的 socket 来实现通信。 - -- Trans socket -负责传输 Client 到 Server 的控制命令,同时回传 RPC 执行结果。 - -- Notify socket -负责传输 Server 到 Client 的消息通知,通过回调传递给用户。 - -![Media RPC架构图](./images/MediaRPC.jpg) - -通用性:对于 Player、Recorder、Session、Policy、Focus 用户,RPC 机制都是通用的,允许应用程序在不同 CPU 之间进行通信。 - -模式支持 :Media Framework 支持同步与异步模式的 RPC 。 - - - 同步模式:客户端发送请求并等待服务器响应,适用于需要立即反馈的场景。 - - 异步模式:客户端发送请求后立即返回,服务器在处理完请求后通过回调通知客户端,提供高效的通信机制,确保数据传输的可靠性和实时性。 - -## 三、**Media Framework 架构** - -![Media 分布式 Server 架构图](./images/Distributed_Server_Architecture_zh-cn.jpg) - -[Client 模块](./client/media_client.md) - -[Server 模块](./server/media_server.md) - -## 四、**测试 Media Framework** - - 采用 Mediatool 测试程序,用于测试 Media Framework API,可模拟实际使用场景。 - -[使用 Mediatool工具测试 Media Framework API](./mediatool_zh-cn.md) diff --git a/zh-cn/device_dev_guide/media/server/media_server.md b/zh-cn/device_dev_guide/media/server/media_server.md index af4ba1b8..c0b245c6 100644 --- a/zh-cn/device_dev_guide/media/server/media_server.md +++ b/zh-cn/device_dev_guide/media/server/media_server.md @@ -27,7 +27,7 @@ ### 1、**Media Daemon** -Media Daemon 是 Media Server的核心,负责创建和管理Media的各个模块,如 Media Focus、Media Graph、Media Session、Media Policy等。Medid Daemon 的核心原理是使用**poll** 函数, 监听RPC socket fd,和音视频设备驱动注册的 message queue fd,处理 RPC 命令并触发 FFmpeg 工作。 +Media Daemon 是 Media Server的核心,负责创建和管理Media的各个模块,如 Media Focus、Media Graph、Media Session、Media Policy等。Medid Daemon 的核心原理是使用 **poll** 函数, 监听RPC socket fd,和音视频设备驱动注册的 message queue fd,处理 RPC 命令并触发 FFmpeg 工作。 ![Media Daemon架构图](../images/server/Media_Daemon_zh-cn.jpg)