From fa0b4736a0014a706b496864f06a3250aee11874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E5=BE=88=E5=BF=99?= Date: Thu, 25 Sep 2025 19:00:26 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_zh.md | 42 +++++++++++++- ...77\347\224\250\346\214\207\345\215\227.md" | 57 +++++++++++++++---- os/OpenHarmony/README_zh.md | 26 +++++++++ platform/readme.md | 10 ++++ 4 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 os/OpenHarmony/README_zh.md create mode 100644 platform/readme.md diff --git a/README_zh.md b/README_zh.md index f344abd..ef10526 100644 --- a/README_zh.md +++ b/README_zh.md @@ -4,9 +4,11 @@ 本次发布仅提供基础功能,可参考docs目录下的文档、Sample下的示例进行试用,如遇到问题反馈到HiSpark社区解决。 + + ## 目录 -``` +```shell ├── docs ├── os │   └── OpenHarmony SS928V100和SS927V100移植适配OpenHarmony 5.1补丁,包含内核适配、XTS认证、图形和媒体增强特性 @@ -37,6 +39,44 @@ +## 代码下载 + +下载主仓 + +```shell +git clone https://gitee.com/HiSpark/pegasus.git +``` + +pegasus仓下有两个子仓,分别是ss928v100_clang和ss928v100_gcc,可以根据需要下载某一个或者全部下载。 + +例如: + +- 下载ss928v100_clang子仓 + + ```shell + cd pegasus + git submodule init + git submodule update platform/ss928v100_clang + ``` + +- 下载ss928v100_gcc子仓 + + ```shell + cd pegasus + git submodule init + git submodule update platform/ss928v100_gcc + ``` + +- 下载全部两个子仓 + + ```shell + cd pegasus + git submodule init + git submodule update platform/ss928v100_clang platform/ss928v100_gcc + ``` + + + ## 许可说明 - platform\ss928v100_xxx\smp\a55_linux\mpp\out\lib,os\OpenHarmony\middleware里面为上海海思的自研库,遵循上海海思的LICENSE,这个目录下有LICENSE文件,LICENSE文件中可以看到版权信息: diff --git "a/docs/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/docs/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227.md" index 1939f1e..abe5119 100644 --- "a/docs/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227.md" +++ "b/docs/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227/OpenHarmony Small\347\211\210\346\234\254\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -175,9 +175,6 @@ SS927V100/SS928V100 OpenHarmony版本基于5.1.0 Release版本开发。 >- 该OpenHarmony版本主要适配SS927V100/SS928V100 芯片,涉及多个OpenHarmony原生仓的修改,解决编译、功能问题。 >- 鸿蒙版本的uboot是直接使用各芯片SDK版本的uboot,所以对各芯片的各类介质Uboot可以在原SDK版本按相关文档进行编译。 >- 鸿蒙版本默认使用的是toybox,不支持vi,当客户需要使用vi时,可以切换为busybox。 ->- 在SS927V100/SS928V100板子上跑busybox有两类方法。 -> 第一种方法由SDK版本包编译出busybox二进制执行文件,拷贝到板端/bin目录下直接使用; -> 第二种方法把ohos的toybox修改为busybox,并集成到ohos文件系统内。 本文档的各芯片“busybox的使用说明”章节描述的是第二种方法的。 >- 在SS927V100/SS928V100板子上配置IP和mount指令可参考如下指令: > ``` > ifconfig eth0 150.1.xx.x netmask 255.255.248.0 @@ -440,13 +437,22 @@ ln -s /bin/bash /bin/sh 通过以下步骤配置SS928V100和SS927V100 OpenHarmony版本的编译目录。 -1. 从HiSpark社区下载SS928V100和SS927V100移植适配Openharmony5.1补丁,路径为SS928V100仓下:os/OpenHarmony得到middleware.、patch\_build.sh、patch.tar目录文件。 -2. 提前下载好OpenHarmony 5.1代码压缩包文件code-v5.1.0-Release.tar.gz文件。可按如下2种方法配置,任选其一即可得到ohos目录以及middleware目录。 +1. 下载HiSpark社区Pegasus仓代码,由于ss928v100\_clang和ss928v100\_gcc为Pegasus的子仓,而OpenHarmony使用llvm-calng工具链的SDK,估此步骤下载得到Pegasus和ss928v100\_clang代码目录。 + + ``` + git clone https://gitee.com/HiSpark/pegasus.git + cd pegasus + git submodule init + git submodule update platform/ss928v100_clang + ``` + +2. 从HiSpark社区下载SS928V100和SS927V100移植适配Openharmony5.1补丁,路径为Pegasus仓下:os/OpenHarmony得到middleware.、patch\_build.sh、patch目录文件。 +3. 提前下载好OpenHarmony 5.1代码压缩包文件code-v5.1.0-Release.tar.gz文件。可按如下2种方法配置,任选其一即可得到ohos目录以及middleware目录。 - 此方法用于指定脚本读取/path/to/code-v5.1.0-Release.tar.gz的解压路径。执行./patch\_build.sh --path=/path/to - 将code-v5.1.0-Release.tar.gz文件拷贝至./patch\_build.sh同级目录,执行./patch\_build.sh命令;执行完成后会删除当前目录下的code-v5.1.0-Release.tar.gz -3. 从HiSpark社区下载sdk包,路径为SS928V100仓下的:platform/ss928v100\_clang。 -4. 将ss928v100\_clang目录改名为sdk,将sdk放置在和ohos同级目录 +4. 从HiSpark社区下载clang的sdk包,路径为Pegasus仓下的子仓:platform/ss928v100\_clang。 +5. 将ss928v100\_clang目录改名为sdk,将sdk放置在和ohos同级目录 - 编译uboot/kernel或驱动ko会依赖部分开源软件,需要从各个开源软件的官方源提供的路径进行下载,需要根据指导从各个软件的官方链接下手动下载,具体如下: - linux:目录为sdk/open\_source/linux,需要按照sdk/open\_source/linux/readme.txt指导从https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.6.68.tar.gz 下载,将源码压缩包放置于sdk/open\_source/linux目录下。 - mbedtls:目录为sdk/open\_source/mbedtls,需要按照sdk/open\_source/mbedtls/readme.txt指导从https://github.com/ARMmbed/mbedtls/archive/refs/tags/v2.16.10.tar.gz 下载,将源码压缩包放置于sdk/open\_source/mbedtls目录下。 @@ -471,11 +477,38 @@ ln -s /bin/bash /bin/sh SDK包中提供内核驱动源码和Sample源码,可以通过源码进行编译。在编译前,需要配置编译工具链,将编译工具链路径加入到环境变量。 -1. 将clang编译工具链加入到环境变量,执行:export PATH=/path/to/toolchains:$PATH +- 将clang编译工具链加入到环境变量,执行:export PATH=/path/to/toolchains:$PATH + + 例如,clang所在的路径为/path/to/pegasus/os/OpenHarmony/ohos/prebuilts/clang/ohos/linux-x86\_64/llvm/bin + + ``` + export PATH=/path/to/pegasus/os/OpenHarmony/ohos/prebuilts/clang/ohos/linux-x86_64/llvm/bin:$PATH + ``` + + 检查clang配置环境变量是否生效。 + + ``` + which clang + ``` + +- 将SYSROOT\_PATH导入环境变量,此处配置仅用于编译SDK sample,配置方法如下。 + +1. 配置之前清先执行ohos编译,编译生成依赖的sysroot。 -例如,clang所在的路径为/path/to/llvm\_clang/bin,则执行:export PATH=/path/to/llvm\_clang/bin:$PATH + >![](public_sys-resources/icon-note.gif) **说明:** + >使用llvm-clang工具链来编译SDK sample时,会依赖ohos编译后的产物:out/hispark\_ss928v100/ipcamera\_hispark\_ss928v100\_linux/sysroot,因此需要提前进行ohos编译。 + +2. 假设工具链的sysroot路径为/path/to/pegasus/os/OpenHarmony/ohos/out/hispark\_ss928v100/ipcamera\_hispark\_ss928v100\_linux/sysroot,将工具链的sysroot设置到环境变量SYSROOT\_PATH。 -2. 将工具链的sysroot设置到环境变量SYSROOT\_PATH,假设工具链的sysroot路径为/path/to/llvm\_clang/sysroot,执行:export SYSROOT\_PATH=/path/to/llvm\_clang/sysroot + ``` + export SYSROOT_PATH=/path/to/pegasus/os/OpenHarmony/ohos/out/hispark_ss928v100/ipcamera_hispark_ss928v100_linux/sysroot + ``` + +3. 检查SYSROOT\_PATH配置是否生效。 + + ``` + echo $SYSROOT_PATH + ``` ## 版本编译 @@ -488,10 +521,10 @@ SDK包中提供内核驱动源码和Sample源码,可以通过源码进行编 1. 进入SS928V100 OpenHarmony代码根目录ohos(如果是其他解决方案目录层级,请参考解决方案编译指导)。 -1. 执行./build.sh --product-name=ipcamera\_hispark\_ss928v100\_linux --ccache --no-prebuilt-sdk编译命令,成功之后显示。 +1. 执行如下编译命令,成功之后显示=====build successful===== ``` - =====build successful===== + ./build.sh --product-name=ipcamera_hispark_ss928v100_linux --ccache --no-prebuilt-sdk ``` >![](public_sys-resources/icon-note.gif) **说明:** diff --git a/os/OpenHarmony/README_zh.md b/os/OpenHarmony/README_zh.md new file mode 100644 index 0000000..8e5b873 --- /dev/null +++ b/os/OpenHarmony/README_zh.md @@ -0,0 +1,26 @@ +## 版本描述 + +本文档基于OpenHarmony 5.1.0 Release版本适配SS928V100/SS927V100芯片补丁包: +1. 支持OpenHarmony5.1.0 Small型系统运行在SS928V100/SS927V100芯片上 +2. 支持Linux 6.6.86内核 +3. 继承OpenHarmony源生llvm-clang编译工具链 +4. 支持L1设备带屏和不带屏的XTS兼容性测试 +5. 支持继承OpenHarmony图形、媒体和增强特性开发,满足运行媒体和图形的Sample功能 +6. 支持运行SS928V100的SDK源生Sample + +## 快速入手 + +### 目录介绍 +``` +os/OpenHarmony +├─middleware 媒体中间件 +├─patch OpenHarmony移植适配的补丁目录,包括Kernel、媒体和图形等子系统 +├─README_zh.md +└─patch_build.sh 应用在OpenHarmony 5.1.0 Release版本包上的补丁源码的shell脚本 +``` +### 文档使用简介 +| **文档路径** | **用途介绍** | +|--|--| +|docs/OpenHarmony Small版本使用指南/OpenHarmony Small版本使用指南.md | SS928V100/SS927V100上运行OpenHarmony Small系统,rootfs打包文件系统,配置代码开发环境、编译、烧写;鸿蒙内核选项修改;XTS测试说明;媒体功能使用;图形功能使用 | +| docs/OpenHarmony内核适配SS928V100 SDK 内核6.6特性指导文档/OpenHarmony内核适配SS928V100 SDK 内核6.6特性指导文档.md | 指导将SS928V100 SDK的内核补丁和OpenHarmony内核源码合并适配 | +| docs/小型系统SS928V100芯片移植案例/小型系统SS928V100芯片移植案例.md | SS928V100移植SS928V100案例,主要包括芯片解决方案集成:产品配置添加,内核移植适配、编译,XTS认证,图形增强特性,媒体增强特性的适配案例总结 | diff --git a/platform/readme.md b/platform/readme.md new file mode 100644 index 0000000..d3b69b6 --- /dev/null +++ b/platform/readme.md @@ -0,0 +1,10 @@ +本目录为`SDK`软件相关文件,包括`lib`库,驱动源码,`sample`源码等。 + +- 支持`ss928v100` + +- 支持`clang`和`gcc`两种工具链,分别对应`ss928v100_clang`和`ss928v100_gcc` + + | | 编译器 | 运行时库 | + | ----------------- | ------------ | ----------------- | + | `ss928v100_clang` | `llvm 15.04` | `musl libc 1.2.5` | + | `ss928v100_gcc` | `gcc 12.3.0` | `glibc 2.38` | \ No newline at end of file -- Gitee From e7930cbc7d55c8294eb54c760935678772ce8b78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E5=BE=88=E5=BF=99?= Date: Thu, 25 Sep 2025 19:03:43 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platform/ss928v100_clang | 2 +- platform/ss928v100_gcc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/ss928v100_clang b/platform/ss928v100_clang index 0c0b969..98b4c6c 160000 --- a/platform/ss928v100_clang +++ b/platform/ss928v100_clang @@ -1 +1 @@ -Subproject commit 0c0b969a470c57bc401aa6035ce9710a2ebb4805 +Subproject commit 98b4c6c4ac88ab78a4a720a005cfecc43315b2e5 diff --git a/platform/ss928v100_gcc b/platform/ss928v100_gcc index a0cea64..c27dd7a 160000 --- a/platform/ss928v100_gcc +++ b/platform/ss928v100_gcc @@ -1 +1 @@ -Subproject commit a0cea644518178616e00fa410afb6a9982699ecf +Subproject commit c27dd7ae03dea079ef452029d08164060a430832 -- Gitee From 8b7c951ad53c15e0ea85d8fa9dac87175eb303e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E5=BE=88=E5=BF=99?= Date: Thu, 25 Sep 2025 19:21:56 +0800 Subject: [PATCH 3/3] update ot_mw_type.h --- .../middleware/common/include/h8/ot_mw_type.h | 93 ------------------ .../middleware/common/include/h9/ot_mw_type.h | 92 ------------------ .../middleware/common/include/ot_mw_type.h | 94 ++++++++++++++++++- 3 files changed, 93 insertions(+), 186 deletions(-) delete mode 100755 os/OpenHarmony/middleware/common/include/h8/ot_mw_type.h delete mode 100755 os/OpenHarmony/middleware/common/include/h9/ot_mw_type.h mode change 120000 => 100755 os/OpenHarmony/middleware/common/include/ot_mw_type.h diff --git a/os/OpenHarmony/middleware/common/include/h8/ot_mw_type.h b/os/OpenHarmony/middleware/common/include/h8/ot_mw_type.h deleted file mode 100755 index e63538b..0000000 --- a/os/OpenHarmony/middleware/common/include/h8/ot_mw_type.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2025 HiSilicon (Shanghai) Technologies Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __OT_MW_TYPE_H__ -#define __OT_MW_TYPE_H__ - -#ifdef __KERNEL__ -#include -#else - -#include -#endif - -#include "ot_type.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -typedef td_uchar TD_UCHAR; -typedef td_u8 TD_U8; -typedef td_u16 TD_U16; -typedef td_u32 TD_U32; -typedef td_ulong TD_UL; -typedef td_ulong TD_ULONG; -typedef uintptr_t TD_UINTPTR_T; - -typedef td_void TD_VOID; -typedef td_char TD_CHAR; -typedef td_s8 TD_S8; -typedef td_s16 TD_S16; -typedef td_s32 TD_S32; -typedef td_slong TD_SL; - -typedef td_float TD_FLOAT; -typedef td_double TD_DOUBLE; - -#ifndef _M_IX86 - typedef td_u64 TD_U64; - typedef td_s64 TD_S64; -#else - typedef unsigned __int64 TD_U64; - typedef __int64 TD_S64; -#endif - -typedef td_ulong TD_SIZE_T; -typedef td_ulong TD_LENGTH_T; -typedef td_phys_addr_t TD_PHYS_ADDR_T; - -typedef td_handle TD_HANDLE; -typedef td_bool TD_BOOL; - -/*----------------------------------------------* - * const defination * - *----------------------------------------------*/ -#ifndef NULL - #define NULL 0L -#endif - - -#ifndef TD_UNUSED -#define TD_UNUSED(x) ((x) = (x)) -#endif - -#define TD_MW_INVALID_HANDLE (TD_HANDLE)(-1) - -typedef td_void *TD_MW_PTR; - -#ifndef TD_NULL_PTR -#define TD_NULL_PTR 0L -#endif - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ - -#endif /* __OT_MW_TYPE_H__ */ diff --git a/os/OpenHarmony/middleware/common/include/h9/ot_mw_type.h b/os/OpenHarmony/middleware/common/include/h9/ot_mw_type.h deleted file mode 100755 index ae9feef..0000000 --- a/os/OpenHarmony/middleware/common/include/h9/ot_mw_type.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2025 HiSilicon (Shanghai) Technologies Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __OT_MW_TYPE_H__ -#define __OT_MW_TYPE_H__ - -#ifdef __KERNEL__ -#include -#else - -#include -#endif - -#include "ot_type.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -typedef td_uchar TD_UCHAR; -typedef td_u8 TD_U8; -typedef td_u16 TD_U16; -typedef td_u32 TD_U32; -typedef td_ulong TD_UL; -typedef td_ulong TD_ULONG; -typedef uintptr_t TD_UINTPTR_T; - -typedef td_void TD_VOID; -typedef td_char TD_CHAR; -typedef td_s8 TD_S8; -typedef td_s16 TD_S16; -typedef td_s32 TD_S32; -typedef td_slong TD_SL; - -typedef td_float TD_FLOAT; -typedef td_double TD_DOUBLE; - -#ifndef _M_IX86 - typedef td_u64 TD_U64; - typedef td_s64 TD_S64; -#else - typedef unsigned __int64 TD_U64; - typedef __int64 TD_S64; -#endif - -typedef td_ulong TD_SIZE_T; -typedef td_ulong TD_LENGTH_T; -typedef td_phys_addr_t TD_PHYS_ADDR_T; - -typedef td_handle TD_HANDLE; -typedef td_bool TD_BOOL; - -/*----------------------------------------------* - * const defination * - *----------------------------------------------*/ -#ifndef NULL - #define NULL 0L -#endif - -#ifndef TD_UNUSED -#define TD_UNUSED(x) ((x) = (x)) -#endif - -#define TD_MW_INVALID_HANDLE (TD_HANDLE)(-1) - -typedef td_void *TD_MW_PTR; - -#ifndef TD_NULL_PTR -#define TD_NULL_PTR 0L -#endif - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ - -#endif /* __OT_MW_TYPE_H__ */ diff --git a/os/OpenHarmony/middleware/common/include/ot_mw_type.h b/os/OpenHarmony/middleware/common/include/ot_mw_type.h deleted file mode 120000 index 3692cd0..0000000 --- a/os/OpenHarmony/middleware/common/include/ot_mw_type.h +++ /dev/null @@ -1 +0,0 @@ -./h8/ot_mw_type.h \ No newline at end of file diff --git a/os/OpenHarmony/middleware/common/include/ot_mw_type.h b/os/OpenHarmony/middleware/common/include/ot_mw_type.h new file mode 100755 index 0000000..e63538b --- /dev/null +++ b/os/OpenHarmony/middleware/common/include/ot_mw_type.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2025 HiSilicon (Shanghai) Technologies Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OT_MW_TYPE_H__ +#define __OT_MW_TYPE_H__ + +#ifdef __KERNEL__ +#include +#else + +#include +#endif + +#include "ot_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +typedef td_uchar TD_UCHAR; +typedef td_u8 TD_U8; +typedef td_u16 TD_U16; +typedef td_u32 TD_U32; +typedef td_ulong TD_UL; +typedef td_ulong TD_ULONG; +typedef uintptr_t TD_UINTPTR_T; + +typedef td_void TD_VOID; +typedef td_char TD_CHAR; +typedef td_s8 TD_S8; +typedef td_s16 TD_S16; +typedef td_s32 TD_S32; +typedef td_slong TD_SL; + +typedef td_float TD_FLOAT; +typedef td_double TD_DOUBLE; + +#ifndef _M_IX86 + typedef td_u64 TD_U64; + typedef td_s64 TD_S64; +#else + typedef unsigned __int64 TD_U64; + typedef __int64 TD_S64; +#endif + +typedef td_ulong TD_SIZE_T; +typedef td_ulong TD_LENGTH_T; +typedef td_phys_addr_t TD_PHYS_ADDR_T; + +typedef td_handle TD_HANDLE; +typedef td_bool TD_BOOL; + +/*----------------------------------------------* + * const defination * + *----------------------------------------------*/ +#ifndef NULL + #define NULL 0L +#endif + + +#ifndef TD_UNUSED +#define TD_UNUSED(x) ((x) = (x)) +#endif + +#define TD_MW_INVALID_HANDLE (TD_HANDLE)(-1) + +typedef td_void *TD_MW_PTR; + +#ifndef TD_NULL_PTR +#define TD_NULL_PTR 0L +#endif + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __OT_MW_TYPE_H__ */ -- Gitee