From 09192a1f31a152d0749178da24e7aa6b0d626eed Mon Sep 17 00:00:00 2001 From: lanche1024 <1033823238@qq.com> Date: Fri, 10 Sep 2021 10:43:50 +0800 Subject: [PATCH] add esp32 vender support Signed-off-by: LiteOS2021 Signed-off-by: wcc0 <917033401@qq.com> --- LICENSE | 177 +++++++++++++++++++++ README.en.md | 36 ----- README.md | 39 ----- esp32/BUILD.gn | 15 ++ esp32/config.json | 36 +++++ esp32/hals/utils/sys_param/BUILD.gn | 25 +++ esp32/hals/utils/sys_param/hal_sys_param.c | 128 +++++++++++++++ esp32/hals/utils/token/BUILD.gn | 22 +++ esp32/hals/utils/token/hal_token.c | 104 ++++++++++++ esp32/image/bootloader.bin | Bin 0 -> 26656 bytes esp32/image/partition-table.bin | Bin 0 -> 3072 bytes esp32/kernel_configs/debug.config | 3 + esp32/ohos.build | 10 ++ 13 files changed, 520 insertions(+), 75 deletions(-) create mode 100644 LICENSE delete mode 100644 README.en.md delete mode 100644 README.md create mode 100755 esp32/BUILD.gn create mode 100755 esp32/config.json create mode 100644 esp32/hals/utils/sys_param/BUILD.gn create mode 100644 esp32/hals/utils/sys_param/hal_sys_param.c create mode 100644 esp32/hals/utils/token/BUILD.gn create mode 100644 esp32/hals/utils/token/hal_token.c create mode 100755 esp32/image/bootloader.bin create mode 100755 esp32/image/partition-table.bin create mode 100644 esp32/kernel_configs/debug.config create mode 100644 esp32/ohos.build diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 470ba68..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# vendor_espressif - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index ea35758..0000000 --- a/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# vendor_espressif - -#### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/esp32/BUILD.gn b/esp32/BUILD.gn new file mode 100755 index 0000000..e44d6c0 --- /dev/null +++ b/esp32/BUILD.gn @@ -0,0 +1,15 @@ +# Copyright (c) 2021 Huawei Device 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. + +group("esp32") { +} diff --git a/esp32/config.json b/esp32/config.json new file mode 100755 index 0000000..2dd64ce --- /dev/null +++ b/esp32/config.json @@ -0,0 +1,36 @@ +{ + "product_name": "esp32", + "type": "mini", + "target_cpu": "xtensa", + "version": "3.0", + "ohos_version": "OpenHarmony 1.0", + "device_company": "esp", + "board": "esp32", + "kernel_type": "liteos_m", + "kernel_version": "3.0.0", + "subsystems": [ + { + "subsystem": "kernel", + "components": [ + { "component": "liteos_m", "features":[] + } + ] + } + ], + "vendor_adapter_dir": "//device/esp/esp32", + "third_party_dir": "//third_party", + "product_adapter_dir": "//vendor/esp/esp32/hals", + "ohos_product_type":"", + "ohos_manufacture":"", + "ohos_brand":"", + "ohos_market_name":"", + "ohos_product_series":"", + "ohos_product_model":"", + "ohos_software_model":"", + "ohos_hardware_model":"", + "ohos_hardware_profile":"", + "ohos_serial":"", + "ohos_bootloader_version":"", + "ohos_secure_patch_level":"", + "ohos_abi_list":"" +} diff --git a/esp32/hals/utils/sys_param/BUILD.gn b/esp32/hals/utils/sys_param/BUILD.gn new file mode 100644 index 0000000..49f2b69 --- /dev/null +++ b/esp32/hals/utils/sys_param/BUILD.gn @@ -0,0 +1,25 @@ +# Copyright (c) 2021 Huawei Device 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. + +static_library("hal_sysparam") { + sources = [ "hal_sys_param.c" ] + include_dirs = [ "//base/startup/syspara_lite/hals" ] + defines = [ + "INCREMENTAL_VERSION=\"${ohos_version}\"", + "BUILD_TYPE=\"${ohos_build_type}\"", + "BUILD_USER=\"${ohos_build_user}\"", + "BUILD_TIME=\"${ohos_build_time}\"", + "BUILD_HOST=\"${ohos_build_host}\"", + "BUILD_ROOTHASH=\"${ohos_build_roothash}\"", + ] +} diff --git a/esp32/hals/utils/sys_param/hal_sys_param.c b/esp32/hals/utils/sys_param/hal_sys_param.c new file mode 100644 index 0000000..e846a25 --- /dev/null +++ b/esp32/hals/utils/sys_param/hal_sys_param.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2021 Huawei Device 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. + */ + +#include "hal_sys_param.h" + +#define OHOS_DEVICE_TYPE "****" +#define OHOS_DISPLAY_VERSION "OpenHarmony 1.0.1" +#define OHOS_MANUFACTURE "****" +#define OHOS_BRAND "****" +#define OHOS_MARKET_NAME "****" +#define OHOS_PRODUCT_SERIES "****" +#define OHOS_PRODUCT_MODEL "****" +#define OHOS_SOFTWARE_MODEL "****" +#define OHOS_HARDWARE_MODEL "****" +#define OHOS_HARDWARE_PROFILE "aout:true,display:true" +#define OHOS_BOOTLOADER_VERSION "bootloader" +#define OHOS_ABI_LIST "****" +#define OHOS_SERIAL "1234567890" +#define OHOS_FIRST_API_VERSION 1 + +#define EMPTY_STR "" + +const char *HalGetDeviceType(void) +{ + return OHOS_DEVICE_TYPE; +} + +const char *HalGetManufacture(void) +{ + return OHOS_MANUFACTURE; +} + +const char *HalGetBrand(void) +{ + return OHOS_BRAND; +} + +const char *HalGetMarketName(void) +{ + return OHOS_MARKET_NAME; +} + +const char *HalGetProductSeries(void) +{ + return OHOS_PRODUCT_SERIES; +} + +const char *HalGetProductModel(void) +{ + return OHOS_PRODUCT_MODEL; +} + +const char *HalGetSoftwareModel(void) +{ + return OHOS_SOFTWARE_MODEL; +} + +const char *HalGetHardwareModel(void) +{ + return OHOS_HARDWARE_MODEL; +} + +const char *HalGetHardwareProfile(void) +{ + return OHOS_HARDWARE_PROFILE; +} + +const char *HalGetSerial(void) +{ + return OHOS_SERIAL; +} + +const char *HalGetBootloaderVersion(void) +{ + return OHOS_BOOTLOADER_VERSION; +} + +const char *HalGetAbiList(void) +{ + return OHOS_ABI_LIST; +} + +const char *HalGetDisplayVersion(void) +{ + return OHOS_DISPLAY_VERSION; +} + +const char *HalGetIncrementalVersion(void) +{ + return INCREMENTAL_VERSION; +} + +const char *HalGetBuildType(void) +{ + return BUILD_TYPE; +} + +const char *HalGetBuildUser(void) +{ + return BUILD_USER; +} + +const char *HalGetBuildHost(void) +{ + return BUILD_HOST; +} + +const char *HalGetBuildTime(void) +{ + return BUILD_TIME; +} + +int HalGetFirstApiVersion(void) +{ + return OHOS_FIRST_API_VERSION; +} diff --git a/esp32/hals/utils/token/BUILD.gn b/esp32/hals/utils/token/BUILD.gn new file mode 100644 index 0000000..f4cc930 --- /dev/null +++ b/esp32/hals/utils/token/BUILD.gn @@ -0,0 +1,22 @@ +# Copyright (c) 2021 Huawei Device 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. + +static_library("hal_token_static") { + sources = [ "hal_token.c" ] + + include_dirs = [ + "//base/startup/syspara_lite/hals", + "//utils/native/lite/include", + ] + deps = [] +} diff --git a/esp32/hals/utils/token/hal_token.c b/esp32/hals/utils/token/hal_token.c new file mode 100644 index 0000000..9bc9dca --- /dev/null +++ b/esp32/hals/utils/token/hal_token.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2021 Huawei Device 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. + */ + +#include "hal_token.h" +#include "ohos_errno.h" +#include "ohos_types.h" + +static int OEMReadToken(char *token, unsigned int len) +{ + // OEM need add here, read token from device + (void)(token); + (void)(len); + return EC_SUCCESS; +} + +static int OEMWriteToken(const char *token, unsigned int len) +{ + // OEM need add here, write token to device + (void)(token); + (void)(len); + return EC_SUCCESS; +} + +static int OEMGetAcKey(char *acKey, unsigned int len) +{ + // OEM need add here, get AcKey + (void)(acKey); + (void)(len); + return EC_SUCCESS; +} + +static int OEMGetProdId(char *productId, unsigned int len) +{ + // OEM need add here, get ProdId + (void)(productId); + (void)(len); + return EC_SUCCESS; +} + +static int OEMGetProdKey(char *productKey, unsigned int len) +{ + // OEM need add here, get ProdKey + (void)(productKey); + (void)(len); + return EC_SUCCESS; +} + + +int HalReadToken(char *token, unsigned int len) +{ + if (token == NULL) { + return EC_FAILURE; + } + + return OEMReadToken(token, len); +} + +int HalWriteToken(const char *token, unsigned int len) +{ + if (token == NULL) { + return EC_FAILURE; + } + + return OEMWriteToken(token, len); +} + +int HalGetAcKey(char *acKey, unsigned int len) +{ + if (acKey == NULL) { + return EC_FAILURE; + } + + return OEMGetAcKey(acKey, len); +} + +int HalGetProdId(char *productId, unsigned int len) +{ + if (productId == NULL) { + return EC_FAILURE; + } + + return OEMGetProdId(productId, len); +} + +int HalGetProdKey(char *productKey, unsigned int len) +{ + if (productKey == NULL) { + return EC_FAILURE; + } + + return OEMGetProdKey(productKey, len); +} diff --git a/esp32/image/bootloader.bin b/esp32/image/bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..d43cbbcf352f727ea3ada211d28357015549d5b4 GIT binary patch literal 26656 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 YaB=L(?kmbK{7PTBFYu