From 76539f1a1cb03fa2f720aa8f7b4214606204f47c Mon Sep 17 00:00:00 2001 From: Goutam Damodaran Date: Thu, 24 Aug 2023 11:56:00 +0530 Subject: [PATCH] RDKB-50692 : Platform HAL Header file on new rdkb-platform-hal Reason for change: Development of test script for platform hal Risks: Low Test Procedure: Check the ticket Signed-off-by:Goutam_Damodaran@comcast.com --- CHANGELOG.md | 5 + CONTRIBUTING.md | 11 + COPYING | 1 + LICENSE | 202 +++ Makefile.am | 27 + NOTICE | 8 + README.md | 3 +- build_ut.sh | 56 + configure.ac | 57 + docs/.gitignore | 5 + docs/generate_docs.sh | 38 + docs/pages/CHANGELOG.md | 1 + docs/pages/CONTRIBUTING.md | 1 + docs/pages/COPYING.md | 1 + docs/pages/LICENSE.md | 1 + docs/pages/NOTICE.md | 1 + docs/pages/PlatformhalSpec.md | 129 ++ docs/pages/generate_docs.sh | 37 + .../images/Platform_HAL_Architetcture.png | Bin 0 -> 99960 bytes .../images/Platform_HAL_Sequence_Diagram.png | Bin 0 -> 55725 bytes include/.vscode/settings.json | 11 + include/platform_hal.h | 1561 +++++++++++++++++ 22 files changed, 2154 insertions(+), 2 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 120000 COPYING create mode 100644 LICENSE create mode 100644 Makefile.am create mode 100644 NOTICE mode change 100644 => 120000 README.md create mode 100755 build_ut.sh create mode 100644 configure.ac create mode 100644 docs/.gitignore create mode 100755 docs/generate_docs.sh create mode 120000 docs/pages/CHANGELOG.md create mode 120000 docs/pages/CONTRIBUTING.md create mode 120000 docs/pages/COPYING.md create mode 120000 docs/pages/LICENSE.md create mode 120000 docs/pages/NOTICE.md create mode 100644 docs/pages/PlatformhalSpec.md create mode 100755 docs/pages/generate_docs.sh create mode 100644 docs/pages/images/Platform_HAL_Architetcture.png create mode 100644 docs/pages/images/Platform_HAL_Sequence_Diagram.png create mode 100644 include/.vscode/settings.json create mode 100644 include/platform_hal.h diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..bd48566 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +### Changelog + +All notable changes to this project will be documented in this file. Dates are displayed in UTC. + +Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..61ae708 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,11 @@ +Contributing +============ + +If you wish to make code contributions to this project, the master source is hosted at [code.rdkcentral.com](https://code.rdkcentral.com/r/#/admin/projects/rdkb/components/opensource/ccsp/halinterface). +You can submit your changes for review via that site. + +Please follow the [workflow](https://wiki.rdkcentral.com/display/CMF/Gerrit+Development+Workflow) when making a contribution. + +In order to contribute code, first-time users are requested to agree to the [license](https://wiki.rdkcentral.com/signup.action). + +There is a GitHub [mirror](https://github.com/rdkcmf/rdkb-halinterface) of this project. Pull requests to the mirror will be ignored. diff --git a/COPYING b/COPYING new file mode 120000 index 0000000..7a694c9 --- /dev/null +++ b/COPYING @@ -0,0 +1 @@ +LICENSE \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. \ No newline at end of file diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..d37c6c9 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,27 @@ +########################################################################## +# If not stated otherwise in this file or this component's LICENSE +# file the following copyright and licenses apply: +# +# Copyright 2023 RDK Management +# +# 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. +########################################################################## + +#@TODO - Check if this is correct + +SUBDIRS = +DIST_SUBDIRS = +EXTRA_DIST = ./include/platform_hal.h + +otherincludedir = $(includedir)/ccsp +otherinclude_HEADERS = $(EXTRA_DIST) diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..de2ca34 --- /dev/null +++ b/NOTICE @@ -0,0 +1,8 @@ +This component contains software that is Copyright (c) 2023 RDK Management. +The component is licensed to you under the Apache License, Version 2.0 (the "License"). +You may not use the component except in compliance with the License. + +The component may include material which is licensed under other licenses / copyrights as +listed below. Your use of this material within the component is also subject to the terms and +conditions of these licenses. The LICENSE file contains the text of all the licenses which apply +within this component. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index d2968c1..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# rdkb-platform-hal -RDKB Platform Hardware Abstraction Layer api headers and documentation diff --git a/README.md b/README.md new file mode 120000 index 0000000..c5144f6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +docs/pages/PlatformhalSpec.md \ No newline at end of file diff --git a/build_ut.sh b/build_ut.sh new file mode 100755 index 0000000..28b165d --- /dev/null +++ b/build_ut.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# * +# * If not stated otherwise in this file or this component's LICENSE file the +# * following copyright and licenses apply: +# * +# * Copyright 2023 RDK Management +# * +# * 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. +# * + +# Clone the Unit Testing Suit for this repo, it follows a standard convention +# HAL Name is replaced with haltest, allowing this script to be part of the template for all + +# This will look up the last tag in the git repo, depending on the project this may require modification +TEST_REPO=$(git remote -vv | head -n1 | awk -F ' ' '{print $2}' | sed 's/hal/haltest/g') + +# Set default UT_PROJECT_VERSION to master +if [ -z "${UT_PROJECT_VERSION}" ]; then + UT_PROJECT_VERSION=master +fi + +UT_DIR="./ut" + +# Simple help +if [ "${1}" == "-h" ]; then + echo "Script to build the unit testing suite" + echo " build_ut.sh - clean the testing" + echo " build_ut.sh TARGET=xxx - build the xxx version of the tests, linux/arm etc." + echo " build_ut.sh - build the linux version of tests using skeleton & stubs" + exit 0 +fi + +# Check if the common document configuration is present, if not clone it +if [ -d ${UT_DIR} ]; then + pushd ${UT_DIR} > /dev/null + ./build.sh $@ + popd > /dev/null +else + echo "Cloning unit Test Suite for this module" + git clone ${TEST_REPO} ut + pushd ${UT_DIR} > /dev/null + git checkout ${UT_PROJECT_VERSION} + popd > /dev/null + ./${0} $@ +fi diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..cbe9ba1 --- /dev/null +++ b/configure.ac @@ -0,0 +1,57 @@ +########################################################################## +# If not stated otherwise in this file or this component's LICENSE +# file the following copyright and licenses apply: +# +# Copyright 2023 RDK Management +# +# 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. +########################################################################## +# -*- Autoconf -*- +# Process this file with autoconf to produce configure script. +# + +AC_PREREQ([2.65]) +AC_INIT([hal], [1.0], [BUG-REPORT-ADDRESS]) +AM_INIT_AUTOMAKE([foreign]) +LT_INIT + +AC_PREFIX_DEFAULT(`pwd`) +AC_ENABLE_SHARED +AC_DISABLE_STATIC + +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_MACRO_DIR([m4]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL +AM_PROG_CC_C_O +AM_PROG_LIBTOOL(libtool) + +# Checks for header files. +AC_CHECK_HEADERS([stdlib.h string.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_INLINE + +# Checks for library functions. +AC_FUNC_MALLOC + +AC_CONFIG_FILES( + Makefile +) + + +AC_OUTPUT + diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..5512fa1 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,5 @@ +# Ignore the output files for doxygen +node_modules + +output +build diff --git a/docs/generate_docs.sh b/docs/generate_docs.sh new file mode 100755 index 0000000..1ec7e5f --- /dev/null +++ b/docs/generate_docs.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# * +# * If not stated otherwise in this file or this component's LICENSE file the +# * following copyright and licenses apply: +# * +# * Copyright 2023 RDK Management +# * +# * 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. +# * + +# In the future this should moved to a fixed verison +HAL_GENERATOR_VERSION=develop + +# This will look up the last tag in the git repo, depending on the project this may require modification +PROJECT_VERSION=$(git describe --tags | head -n1) + +# Check if the common document configuration is present, if not clone it +if [ -d "./build" ]; then + make -C ./build PROJECT_NAME="RDK-B Platform HAL" PROJECT_VERSION=${PROJECT_VERSION} +else + echo "Cloning Common documentation generation" + git clone git@github.com:rdkcentral/hal-doxygen.git build + cd ./build + git checkout ${HAL_GENERATOR_VERSION} + cd .. + ./${0} +fi diff --git a/docs/pages/CHANGELOG.md b/docs/pages/CHANGELOG.md new file mode 120000 index 0000000..699cc9e --- /dev/null +++ b/docs/pages/CHANGELOG.md @@ -0,0 +1 @@ +../../CHANGELOG.md \ No newline at end of file diff --git a/docs/pages/CONTRIBUTING.md b/docs/pages/CONTRIBUTING.md new file mode 120000 index 0000000..f939e75 --- /dev/null +++ b/docs/pages/CONTRIBUTING.md @@ -0,0 +1 @@ +../../CONTRIBUTING.md \ No newline at end of file diff --git a/docs/pages/COPYING.md b/docs/pages/COPYING.md new file mode 120000 index 0000000..7d29222 --- /dev/null +++ b/docs/pages/COPYING.md @@ -0,0 +1 @@ +../../COPYING \ No newline at end of file diff --git a/docs/pages/LICENSE.md b/docs/pages/LICENSE.md new file mode 120000 index 0000000..30cff74 --- /dev/null +++ b/docs/pages/LICENSE.md @@ -0,0 +1 @@ +../../LICENSE \ No newline at end of file diff --git a/docs/pages/NOTICE.md b/docs/pages/NOTICE.md new file mode 120000 index 0000000..fb376cf --- /dev/null +++ b/docs/pages/NOTICE.md @@ -0,0 +1 @@ +../../NOTICE \ No newline at end of file diff --git a/docs/pages/PlatformhalSpec.md b/docs/pages/PlatformhalSpec.md new file mode 100644 index 0000000..f65d8e5 --- /dev/null +++ b/docs/pages/PlatformhalSpec.md @@ -0,0 +1,129 @@ +@mainpage + +# PLATFORM HAL Documentation + +# Version and Version History + + +1.0.0 Initial Revision covers existing Platform HAL implementation. + +## Acronyms + +- `HAL` \- Hardware Abstraction Layer +- `RDK-B` \- Reference Design Kit for Broadband Devices +- `OEM` \- Original Equipment Manufacture + +# Description +The diagram below describes a high-level software architecture of the Platform HAL module stack. + +![Platform HAL Architecture Diag](images/Platform_HAL_Architetcture.png) + +Platform HAL is an abstraction layer, implemented to interact with vendor software's for getting the hardware specific details such as Firmware Name, Boot loader Version, etc. +This HAL layer is intended to be a common HAL,should be usable by any Ccspcomponents or Processes. + +# Component Runtime Execution Requirements + +## Initialization and Startup + +Below Initialization API's provide opportunity for the HAL code to initialize the appropriate DB's,start threads etc. + +Platform HAL client module is expected to call the corresponding API Once during bootup before invoking Dependent API's. + +> **platform\_hal\_PandMDBInit**
**platform\_hal\_DocsisParamsDBInit**
**platform\_hal\_initThermal** + +RDK Platform HAL doesn't mandates any predefined requirements for implementation of these API's. it is upto the +3rd party vendors to handle it appropriately to meet operational requirements. + +For Independent API's 3rd party implementation is expected to work without any prerequisties. + +Failure to meet these requirements will likely result in undefined and unexpected behaviour. + +## Threading Model + +Platform HAL is not thread safe, any module which is invoking the Platform HAL api should ensure calls are made in a thread safe manner. + +Different 3rd party vendors allowed to create internal threads to meet the operational requirements. In this case 3rd party implementations +should be responsible to synchronize between the calls, events and cleanup the thread. + +## Memory Model + +Platform HAL client module is responsible to allocate and deallocate memory for necessary API's as specified in API Documentation. + +Different 3rd party vendors allowed to allocate memory for internal operational requirements. In this case 3rd party implementations +should be responsible to deallocate internally. + +## Power Management Requirements + +The Platform HAL is not involved in any of the power management operation. +Any power management state transitions MUST not affect the operation of the Platform HAL. + +## Asynchronous Notification Model +None + +## Blocking calls + +Platform HAL API's are expected to work synchronously and should complete within a time period commensurate with the complexity of the operation and in accordance with any relevant specification. +Any calls that can fail due to the lack of a response should have a timeout period in accordance with any relevant documentation. + +## Internal Error Handling + +All the Platform HAL API's should return error synchronously as a return argument. HAL is responsible to handle system errors(e.g. out of memory) internally. + +## Persistence Model + +There is no requirement for HAL to persist any setting information. Application/Client is responsible to persist any settings related to their implementation. + + +# Nonfunctional requirements + +Following non functional requirement should be supported by the Platform HAL component. + +## Logging and debugging requirements + +Platform HAL component should log all the error and critical informative messages which helps to debug/triage the issues and understand the functional flow of the system. + +## Memory and performance requirements + +Make sure Platform HAL is not contributing more to memory and CPU utilization while performing normal operations and Commensurate with the operation required. + + +## Quality Control + +Platform HAL implementation should pass Coverity, Black duck scan, valgrind checks without any issue. + +There should not be any memory leaks/corruption introduced by HAL and underneath 3rd party software implementation. + + +## Licensing + +Platform HAL implementation is expected to released under the Apache License. + +## Build Requirements + +Platform HAL source code should be build under Linux Yocto environment and should be delivered as a shared library libhal_platform.so + + +## Variability Management + +Any new API introduced should be implemented by all the 3rd party module and RDK generic code should be compatible with specific version of Platform HAL software + +## Platform or Product Customization + +None + +## Interface API Documentation + +All HAL function prototypes and datatype definitions are available in platform_hal.h file. + + 1. Components/Process must include platform_hal.h to make use of platform hal capabilities. + 2. Components/Process should add linker dependency for libhal_platform. + +## Theory of operation and key concepts + +Covered as per "Description" sections in the API documentation. + +### UML Diagrams + +#### Sequence Diagram + +![Platform HAL Sequence Diagram](Platform_HAL_Sequence_Diagram.png) diff --git a/docs/pages/generate_docs.sh b/docs/pages/generate_docs.sh new file mode 100755 index 0000000..2d8bf7f --- /dev/null +++ b/docs/pages/generate_docs.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +# If not stated otherwise in this file or this component's LICENSE file the +# following copyright and licenses apply: +# +# Copyright 2016 RDK Management +# +# 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. + +# In the future this should moved to a fixed verison +HAL_GENERATOR_VERSION=develop + +# This will look up the last tag in the git repo, depending on the project this may require modification +PROJECT_VERSION=$(git describe --tags | head -n1) + +# Check if the common document configuration is present, if not clone it +if [ -d "./build" ]; then + make -C ./build PROJECT_NAME="RDK-B MTA HAL" PROJECT_VERSION=${PROJECT_VERSION} +else + echo "Cloning Common documentation generation" + git clone git@github.com:comcast-sky/rdk-components-hal-doxygen.git build + cd ./build + git flow init -d + git checkout ${HAL_GENERATOR_VERSION} + cd .. + ./${0} +fi diff --git a/docs/pages/images/Platform_HAL_Architetcture.png b/docs/pages/images/Platform_HAL_Architetcture.png new file mode 100644 index 0000000000000000000000000000000000000000..ed67376b80531029e228fc008892e7025658cf99 GIT binary patch literal 99960 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

SaKZeyvJt#B95&L$o(c@jOw1m*9?|$*dsCCH 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 z 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

@ow*7&!<=!kOEFHrTGy0+KTIIJ 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 I-m?t-AL0jQ`v3p{ literal 0 HcmV?d00001 diff --git a/docs/pages/images/Platform_HAL_Sequence_Diagram.png b/docs/pages/images/Platform_HAL_Sequence_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b1c5cdbdf2fccefbb74cfc2ff1a983b336fd7d GIT binary patch literal 55725 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 literal 0 HcmV?d00001 diff --git a/include/.vscode/settings.json b/include/.vscode/settings.json new file mode 100644 index 0000000..eda3cb7 --- /dev/null +++ b/include/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "cSpell.words": [ + "bssid", + "duples", + "MSDU", + "OFDM", + "RDKB", + "sideeffect", + "ssid" + ] +} \ No newline at end of file diff --git a/include/platform_hal.h b/include/platform_hal.h new file mode 100644 index 0000000..e7fc531 --- /dev/null +++ b/include/platform_hal.h @@ -0,0 +1,1561 @@ +/* + * If not stated otherwise in this file or this component's LICENSE file the + * following copyright and licenses apply: + * + * Copyright 2016 RDK Management + * + * 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. +*/ + +/********************************************************************** + Copyright [2014] [Cisco Systems, Inc.] + + 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. +**********************************************************************/ + +/********************************************************************** + + module: platform_hal.h + + For CCSP Component: CcspCMAgent + + --------------------------------------------------------------- + + description: + + This header file gives the function call prototypes and + structure definitions used for the RDK-Broadband + hardware abstraction layer for platform + + --------------------------------------------------------------- + + environment: + + This HAL layer is intended to support platform drivers + through an open API. + Changes may be needed to support different hardware enviornments. + + --------------------------------------------------------------- + + author: + + Cisco + +**********************************************************************/ +/** +* @file platform_hal.h +* @author Cisco +* @brief For CCSP Component: CcspPandM +* +* @description This header file gives the function call prototypes and structure definitions used for the RDK-Broadband hardware abstraction layer for platform. +*/ + + +#ifndef __PLATFORM_HAL_H__ +#define __PLATFORM_HAL_H__ + +/** +* @defgroup platform_hal Platform HAL +* +* @defgroup PLATFORM_HAL_TYPES Platform HAL Data Types +* @ingroup platform_hal +* +* @defgroup PLATFORM_HAL_APIS Platform HAL APIs +* @ingroup platform_hal +* +**/ + + +/** + * @addtogroup PLATFORM_HAL_TYPES + * @{ + */ + + +/********************************************************************** + CONSTANT DEFINITIONS +**********************************************************************/ +#ifdef __cplusplus +extern "C"{ +#endif + +#ifndef CHAR +#define CHAR char +#endif + +#ifndef UCHAR +#define UCHAR unsigned char +#endif + +#ifndef BOOLEAN +#define BOOLEAN unsigned char +#endif + +#ifndef INT +#define INT int +#endif + +#ifndef UINT +#define UINT unsigned int +#endif + +#ifndef ULONG +#define ULONG unsigned long +#endif + + + +#ifndef UINT64_t +#define UINT64_t unsigned long long +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef ENABLE +#define ENABLE 1 +#endif + +#ifndef RETURN_OK +#define RETURN_OK 0 +#endif + +#ifndef RETURN_ERR +#define RETURN_ERR -1 +#endif + +/** + * @} + */ + +//DHCPv6 Options +#define DHCPV6_OPT_82 82 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time +#define DHCPV6_OPT_23 23 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time +#define DHCPV6_OPT_95 95 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time +#define DHCPV6_OPT_24 24 // OPTION_DOMAIN_LIST +#define DHCPV6_OPT_83 83 // OPTION_INF_MAX_RT +#define DHCPV6_OPT_17 17 // OPTION_VENDOR_OPTS +#define DHCPV6_OPT_31 31 // OPTION_SNTP_SERVERS +#define DHCPV6_OPT_15 15 // User Class Option +#define DHCPV6_OPT_16 16 // Vendor Class Option +#define DHCPV6_OPT_20 20 // Reconfigure Accept Option + + +//DHCPv4 Options +#define DHCPV4_OPT_42 42 // NTP Server Addresses +#define DHCPV4_OPT_43 43 // Vendor Specific Information +#define DHCPV4_OPT_58 58 // DHCP Renewal (T1) Time +#define DHCPV4_OPT_59 59 // DHCP Rebinding (T2) Time +#define DHCPV4_OPT_60 60 // Class Identifier +#define DHCPV4_OPT_61 61 // Client Identifier +#define DHCPV4_OPT_100 100 // IEEE 1003.1 TZ String +#define DHCPV4_OPT_122 122 // CableLabs Client Configuration +#define DHCPV4_OPT_125 125 // Vendor-Identifying Vendor-Specific Information +#define DHCPV4_OPT_242 242 // Private Use +#define DHCPV4_OPT_243 243 // Private Use +#define DHCPV4_OPT_END 255 // DHCP Option End - used to check if option is valid + +#define FW_NAME_MAX_LEN 64 // Firmware Name String Length +#define FW_STATE_MAX_LEN 64 //Firmware State +/********************************************************************** + ENUMERATION DEFINITIONS +**********************************************************************/ + +typedef enum { + HOST_CPU=0, + PEER_CPU=1, + NOT_SUPPORTED_CPU=3, +} RDK_CPUS; // RDK_CPUS + +#ifndef PLAT_PROC_MEM_MAX_LEN +#define PLAT_PROC_MEM_MAX_LEN 40 +#endif + +/********************************************************************** + STRUCTURE DEFINITIONS +**********************************************************************/ +typedef struct +_PLAT_PROC_MEM_INFO +{ + CHAR dramPath[PLAT_PROC_MEM_MAX_LEN]; + CHAR emmcPath1[PLAT_PROC_MEM_MAX_LEN]; + CHAR emmcPath2[PLAT_PROC_MEM_MAX_LEN]; + CHAR emmcPath3[PLAT_PROC_MEM_MAX_LEN]; +} +PLAT_PROC_MEM_INFO, *PPLAT_PROC_MEM_INFO; + +/** + * @addtogroup PLATFORM_HAL_APIS + * @{ + */ + +/********************************************************************************** + * + * Subsystem level function prototypes + * +**********************************************************************************/ +/* platform_hal_GetDeviceConfigStatus() function */ +/** +* @description Get the device configuration status. +* +* @param[out] pValue - Device Configuration status, to be returned. +* \n Possible values are WaitForImplement, In Progress, Complete. +* \n The buffer size for pValue should be at least 128 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetDeviceConfigStatus(CHAR *pValue); + +/* platform_hal_GetTelnetEnable() function */ +/** +* @description Get telnet enable status. +* +* @param[out] pFlag - Telnet enable value, to be returned. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetTelnetEnable(BOOLEAN *pFlag); + +/* platform_hal_SetTelnetEnable() function */ +/** +* @description Enable/Disable telnet. +* +* @param[in] Flag - Telnet enable value. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetTelnetEnable(BOOLEAN Flag); + +/* platform_hal_GetSSHEnable() function */ +/** +* @description Get SSH enable status. +* +* @param[out] pFlag - SSH enable value, to be returned. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetSSHEnable(BOOLEAN *pFlag); + +/* platform_hal_SetSSHEnable() function */ +/** +* @description Enable/disable SSH. +* +* @param[in] Flag - SSH enable value. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetSSHEnable(BOOLEAN Flag); + +/* platform_hal_GetSNMPEnable() function */ +/** +* @description Get SNMP Enable value from the device. +* +* @param[out] pValue - SNMP enable value, to be returned. +* \n Possible values are rgWan, rgDualIp, and rgLanIp. +* \n The buffer size should be at least 32 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetSNMPEnable(CHAR* pValue); + +/* platform_hal_SetSNMPEnable() function */ +/** +* @description Set SNMP Enable value. +* +* @param[in] pValue - SNMP enable value. +* \n Possible values are rgWan, rgDualIp, rgLanIp. +* \n The string's size shouldn’t exceed 32 bytes . +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetSNMPEnable(CHAR* pValue); + +/* platform_hal_GetWebUITimeout() function */ +/** +* @description Get WebUI timeout value. +* +* @param[out] pValue - WebUI timeout value, to be returned. +* \n Valid range of values is from 30 to 86400. +* \n Default value is 840. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetWebUITimeout(ULONG *pValue); + +/* platform_hal_SetWebUITimeout() function */ +/** +* @description Set WebUI timeout value. +* +* @param[in] value - WebUI timeout value. +* \n Valid range of values are 30 to 86400 and can also be set to 0. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetWebUITimeout(ULONG value); + +/** Soon to be deprecated **/ +/* platform_hal_GetWebAccessLevel() function */ +/** +* @description Get Web Access Level. +* +* @param userIndex - User Index. +* @param ifIndex - Interface Index. +* @param pValue - Web Access Level, to be returned. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetWebAccessLevel(INT userIndex, INT ifIndex, ULONG *pValue); + +/** Soon to be deprecated **/ +/* platform_hal_SetWebAccessLevel() function */ +/** +* @description Set Web Access Level. +* +* @param userIndex - User Index. +* @param ifIndex - Interface Index. +* @param value - Web Access Level. +* +* +* +*
Lan Level Vs Index table
Lan Level User Index Interface Index +*
HomeUser_Lan_Level 1 1 +*
HomeUser_RfCM_Level 1 2 +*
HomeUser_Mta_Level 1 16 +*
HomeUser_WanRG_Level 1 40 +*
CusAdmin_Lan_Level 5 1 +*
CusAdmin_RfCM_Level 5 2 +*
CusAdmin_Mta_Level 5 16 +*
CusAdmin_WanRG_Level 5 40 +*
AdvUser_Lan_Level 10 1 +*
AdvUser_RfCM_Level 10 2 +*
AdvUser_Mta_Level 10 16 +*
AdvUser_WanRG_Level 10 40 +*
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetWebAccessLevel(INT userIndex, INT ifIndex, ULONG value); + +/* platform_hal_PandMDBInit() function */ +/** +* @description Initialize PandM DB (Database). +* +* @param None. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_PandMDBInit(void); + +/* platform_hal_DocsisParamsDBInit() function */ +/** +* @description Initialize Platform HAL docsis parameters DB. +* +* @param None. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_DocsisParamsDBInit(void); + +/* platform_hal_GetModelName() function */ +/** +* @description Get device model name. +* +* @param[out] pValue - Device Model Name, to be returned. +* \n It is a vendor specific value. +* \n Buffer size should be at least 256 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetModelName(CHAR* pValue); + +/* platform_hal_GetRouterRegion() function */ +/** +* @description Get router region. +* +* @param[out] pValue - Router region name, to be returned . +* \n Possible values of pValue are REGION_UK, REGION_IT, REGION_ROI and REGION_UNKNOWN. +* \n The buffer size should be at least 256 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetRouterRegion(CHAR* pValue); + +/* platform_hal_GetSerialNumber() function */ +/** +* @description Get device serial number. +* +* @param[out] pValue - Device Serial Number, to be returned. +* \n It is a vendor specific value. +* \n The buffer size should be at least 256 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetSerialNumber(CHAR* pValue); + +/* platform_hal_GetHardwareVersion() function */ +/** +* @description Get hardware version of the device. +* +* @param[out] pValue - Hardware version, to be returned. +* \n It is a vendor specific value. +* \n The buffer size should be at least 256 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetHardwareVersion(CHAR* pValue); + +/* platform_hal_GetSoftwareVersion() function */ +/** +* @description Get software version flashed in the device. +* +* @param[out] pValue - Software version, to be returned. +* \n It is vendor specific value. +* @param[in] maxSize - Size of the buffer allocated for pValue. +* \n The value of maxSize should be greater than or equal to 256 bytes. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None +*/ +INT platform_hal_GetSoftwareVersion(CHAR* pValue, ULONG maxSize); + +/* platform_hal_GetBootloaderVersion() function */ +/** +* @description Get the bootloader version flashed in the device. +* +* @param[out] pValue - Bootloader version. +* \n It is a vendor specific value. +* @param[in] maxSize - Size of the buffer allocated for pValue. +* \n The value of maxSize should be greater than or equal to 256 bytes. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR If any error is detected . +* +* @sideeffect None. +*/ +INT platform_hal_GetBootloaderVersion(CHAR* pValue, ULONG maxSize); + +/* platform_hal_GetFirmwareName() function */ +/** +* @description Get firmware image name flashed in the device. +* +* @param[out] pValue - Firmware image name, to be returned. +* \n It is a vendor specific value. +* @param[in] maxSize - Size of the buffer allocated for pValue. +* \n The value of maxSize should be greater than or equal to 256 bytes. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetFirmwareName(CHAR* pValue, ULONG maxSize); + +/* platform_hal_GetBaseMacAddress() function */ +/** +* @description Get base MAC Address of the device. +* +* @param[out] pValue - Base MAC Address, to be returned. +* \n The MAC Address should be in the format AA:BB:CC:DD:EE:FF (colon-separated). +* \n The buffer size should be at least 256 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetBaseMacAddress(CHAR *pValue); + +/*platform_hal_GetHardware() function*/ +/** +* @description Get total flash size of the hardware. +* +* @param[out] pValue - Total flash size, to be returned. +* \n The pValue output returned should be in the range [1, 4096], both inclusive. +* \n The buffer size should be at least 256 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetHardware(CHAR *pValue); + +/* platform_hal_GetHardware_MemUsed() function */ +/** +* @description Get total used memory of the flash. +* +* @param[out] pValue - Total used memory, to be returned. +* \n The pValue output will be in the range [1, n] inclusive, where n is dependent on the total amount of physical RAM available in the device. +* \n The buffer size should be at least 1024 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetHardware_MemUsed(CHAR *pValue); + +/* platform_hal_GetHardware_MemFree() function */ +/** +* @description Get total available memory of the flash. +* +* @param[out] pValue - Total available memory, to be returned. +* \n The pValue output will be in the range [1, n] inclusive, where n is dependent on total amount of physical RAM available in the device. +* \n The buffer size should be at least 1024 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetHardware_MemFree(CHAR *pValue); + +/* platform_hal_GetTotalMemorySize() function */ +/** +* @description Get total memory size of the DRAM (Dynamic Random Access Memory). +* +* @param[out] pulSize - Total memory size of DRAM, to be returned. +* \n The pulSize output will be in the range [1, n] inclusive, where "n" is dependent on the total amount of physical RAM available in the device. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetTotalMemorySize(ULONG *pulSize); + +/* platform_hal_GetUsedMemorySize() function */ +/** +* @description Get the total used memory of the DRAM (Dynamic Random Access Memory) +* +* @param[out] pulSize - Total used memory of the DRAM, to be returned. +* \n The value will be in the range [1, n] inclusive, where "n" is dependent on the total amount of physical RAM available in the device. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetUsedMemorySize(ULONG *pulSize); + +/* platform_hal_GetFreeMemorySize() function */ +/** +* @description Get the total available memory of the DRAM (Dynamic Random Access Memory). +* +* @param[out] pulSize - Total available memory of the DRAM, to be returned. +* \n The value will be in the range [1, n] inclusive, where n is dependent on the total amount of physical RAM. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetFreeMemorySize(ULONG *pulSize); + +/* platform_hal_GetFactoryResetCount() function */ +/** +* @description Get the total number of times factory reset has been done on the device. +* \n Device.DeviceInfo.FactoryResetCount. +* +* @param[out] pulSize - Factory reset count, to be returned. +* \n Possible values for pulSize is 0 to n. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetFactoryResetCount(ULONG *pulSize); + +/* platform_hal_ClearResetCount() function */ +/** +* @description Reset the factory reset count on the device. +*\n Device.DeviceInfo.ClearResetCount. +* +* @param[in] bFlag - Reset Factory reset count, if TRUE . +* \n Factory Reset count will be unchanged,if set to FALSE. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_ClearResetCount(BOOLEAN bFlag); + +/* platform_hal_getTimeOffSet() function */ +/** +* @description Get the time offset from the device. +* \n Device.DeviceInfo.TimeOffset. +* +* @param[out] timeOffSet - Time offset to be returned. +* \n The valid values for timeOffSet are as follows : +* \n '-25200': Eastern Standard Time (EST) = UTC-5. +* \n '-18000': Mountain Standard Time (MST) = UTC-7 (default). +* \n '+25200': Indonesia Western Time = UTC+7. +* \n The buffer size should be at least 256 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_getTimeOffSet(CHAR *timeOffSet); + +/* platform_hal_SetDeviceCodeImageTimeout() function */ +/** +* @description Set HW watchdog timeout value. +* +* @param[in] seconds - Hardware watchdog timeout value in seconds. +* \n The default value is 60 minutes. +* \n The possible range for seconds is 0 to 60 mins[inclusively]. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetDeviceCodeImageTimeout(INT seconds); + + +/* platform_hal_SetDeviceCodeImageValid() function */ +/** +* @description Set Valid flag for firmware image flashed in the device. +* +* @param[in] flag - Image valid flag. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetDeviceCodeImageValid(BOOLEAN flag); + +/* platform_hal_getFactoryPartnerId() function */ +/** +* @description Get FactoryPartnerID from the the device. +* +* @param[out] pValue - FactoryPartnerID. +* \n Possible values for pValue are "unknown", "eUnprogrammed", "eComcast", "eCharter", "eCox", "eRogers", "eVodafone", "eShaw", "eVideotron". +* \n The buffer size size should be at least 512 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_getFactoryPartnerId(CHAR *pValue); + + +/* platform_hal_getFactoryCmVariant() function */ +/** +* @description Get FactoryCmVariant from the the device. +* +* @param[out] pValue - FactoryCmVariant. +* \n Possible values for pValue are "unknown", "pc20", "pc20genband", "pc15sip", "pc15mgcp". +* \n The buffer size should be at least 512 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_getFactoryCmVariant(CHAR *pValue); + + +/* platform_hal_setFactoryCmVariant() function */ +/** +* @description Set FactoryCmVariant from the the device. +* +* @param[in] pValue - FactoryCmVariant. +* \n Possible values are "unknown", "pc20", "pc20genband", "pc15sip" and "pc15mgcp" . +* \n The string size shouldn't exceed 512 bytes. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_setFactoryCmVariant(CHAR *pValue); + + +/** + * @addtogroup PLATFORM_HAL_TYPES + * @{ + */ + +#define LED_BUFFER_SIZE 3 + +typedef enum { + LED_WHITE=0, + LED_YELLOW=1, //This is also classified as Amber from RDKB perspective. + LED_GREEN=2, + LED_RED=3, + LED_BLUE=4, + LED_RED_AND_GREEN=5, + LED_YELLOW_AND_GREEN= 6, + NOT_SUPPORTED=7 +} LED_COLOR; // LED_COLOR + + +typedef struct _LEDMGMT_PARAMS +{ +#ifdef FEATURE_RDKB_LED_MANAGER + char * led_name; + char * led_param; +#endif + LED_COLOR LedColor; //!< LED_COLOR. + INT State; //!< 0 for Solid, 1 for Blink. + INT Interval; //!< In case fs State is blink then interval per second. +} +LEDMGMT_PARAMS, *PLEDMGMT_PARAMS; + +/** + * @} + */ + +/** + * @addtogroup PLATFORM_HAL_APIS + * @{ + */ + +#ifdef FEATURE_RDKB_LED_MANAGER +/* platfom_hal_initLed() function */ +/** +* @description Initialises HAL layer and return file pointer to config file. +* +* @param[out] config_file_name - Vendor specific value. +* \n Buffer to hold the config file name including the full path. eg: /usr/rdk/rdkledmanager/led_config_gb.json. +* \n The buffer size should be at least 128 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +int platform_hal_initLed(char * config_file_name); +#endif + +/* platform_hal_setLed() function */ +/** +* @description Set Led behavior of the device. +* +* @param[in] pValue - The Current Led Buffer to be populated. +*
+*                _LEDMGMT_PARAMS is a structure with following members :
+*
+*                LedColor                    - LedColor is platform dependent.
+*                                              LedColor can hold  any values from enum LED_COLOR.
+*
+*                State                       - 0 for Solid, 1 for Blink.
+*
+*                Interval                    - In seconds. Range is from 0 to n.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_setLed(PLEDMGMT_PARAMS pValue); + + +/* platform_hal_getLed() function */ +/** +* @description Get Led behavior of the device at time of call. +* +* @param[out] pValue - The Current Led Buffer to be populated. +*
+*                _LEDMGMT_PARAMS is a structure with following members :
+*
+*                LedColor                    - LedColor is platform dependent.
+*                                              LedColor can hold  any values from enum LED_COLOR.
+*
+*                State                       - 0 for Solid, 1 for Blink.
+*
+*                Interval                    - In seconds. Range is from 0 to n.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None +*/ +INT platform_hal_getLed(PLEDMGMT_PARAMS pValue); + +/* platform_hal_getFanSpeed() function */ +/** +* @description Get PWM (pulse width modulation) setting of the fan. +* +* @param[in] fanIndex - fanIndex is a OEM dependent value. +* \n The range of fanIndex is from 0 to 1. +* +* @return FanSpeed in unsigned int. +* @retval Range of FanSpeed is from 0 to n and “n” is OEM dependent. +*/ +UINT platform_hal_getFanSpeed(UINT fanIndex); + +/* platform_hal_getRPM() function */ +/** +* @description Get RPM(rotations per minute) of the fan. +* +* @param[in] fanIndex - fanIndex is a OEM dependent value. +* \n The range of fanIndex is from 0 to 1. +* +* @return FanRPM in unsigned int. +* @retval Range of FanRPM is from 0 to n and “n” is OEM dependent. +*/ +UINT platform_hal_getRPM(UINT fanIndex); + +/* platform_hal_getRotorLock() function */ +/** +* @description Get the status of rotor lock. +* +* @param[in] fanIndex - fanIndex is a OEM dependent value. +* \n The range of fanIndex is from 0 to 1. +* +* @return The status of the rotor lock. +* @retval 1 if locked. +* @retval 0 if not locked. +* @retval -1 if value not applicable. +*/ +INT platform_hal_getRotorLock(UINT fanIndex); + + +/* platform_hal_getFanStatus() function */ +/** +* @description Get the fan status. +* +* @param[in] fanIndex - fanIndex is a OEM dependent value. +* \n The range of fanIndex is from 0 to 1. +* +* @return The fan status. +* @retval 1 if fan is enabled. +* @retval 0 if fan disabled. +*/ +BOOLEAN platform_hal_getFanStatus(UINT fanIndex); + +/* platform_hal_setFanMaxOverride() function */ +/** +* @description Set the fan to maximum speed. +* +* @param[in] bOverrideFlag - Boolean value to enable/disable fan to run in highspeed. +* @param[in] fanIndex - fanIndex is a OEM dependent value. +* \n The range of fanindex is from 0 to 1. +* +* @return The status of the operation. +* @retval RETURN_OK on success setting/unsetting the fan to run in high speed mode. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_setFanMaxOverride(BOOLEAN bOverrideFlag, UINT fanIndex); + +#ifdef FEATURE_RDKB_THERMAL_MANAGER +typedef enum { + FAN_SPEED_OFF=0, + FAN_SPEED_SLOW=1, + FAN_SPEED_MEDIUM=2, + FAN_SPEED_FAST=3, + FAN_SPEED_MAX=4 +} FAN_SPEED; // Fan speed + + + +typedef struct _FAN_PLATFORM_CONFIG +{ + UINT FanCount; + UINT SlowSpeedThresh; + UINT MediumSpeedThresh; + UINT FastSpeedThresh; + UINT FanMinRunTime; + UINT MonitoringDelay; + UINT PowerMonitoring; + UINT LogInterval; +} THERMAL_PLATFORM_CONFIG; + + + +/* platform_hal_initThermal() function */ +/** +* @description Initialise Thermal Hal. +* +* @param[out] pThermalPlatformConfig - Pointer to platforms thermal configuration. +*
+*                _FAN_PLATFORM_CONFIG is a structure with following members :
+*
+*                FanCount                    - Number of fans present. Possible values are 1 or 2.
+*
+*                SlowSpeedThresh             - Slow fan speed temperature threshold in degree celsius. Possible value is 30 C.
+*
+*                MediumSpeedThresh           - Medium fan speed temperature threshold in degree celsius. Possible value is 35 C.
+*
+*                FastSpeedThresh             - Fast fan speed temperature threshold in degree celsius. Possible value is 40 C.
+*
+*                FanMinRunTime               - Minimum Fan runtime in seconds. Possible value is 60 seconds.
+*
+*                MonitoringDelay             - Monitoring Delay time in seconds. Possible value is 30 seconds.
+*
+*                PowerMonitoring             - Enable or Disable power monitoring. Possible values are 0 or 1.
+*
+*                LogInterval                 - Thermal log interval in seconds. Possible value is 10 minutes.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK on successful initialisation. +* @retval RETURN_ERR if any error is detected +*/ +INT platform_hal_initThermal(THERMAL_PLATFORM_CONFIG* pThermalPlatformConfig); + +/* platform_hal_LoadThermalConfig() function */ +/** +* @description Loads default Thermal Hal thresholds. +* +* @param[out] pThermalPlatformConfig - Pointer to platforms thermal configuration. +*
+*                _FAN_PLATFORM_CONFIG is a structure with following members :
+*
+*                FanCount                    - Number of fans present. Possible values are 1 or 2.
+*
+*                SlowSpeedThresh             - Slow fan speed temperature threshold in degree celsius. Possible value is 30 C.
+*
+*                MediumSpeedThresh           - Medium fan speed temperature threshold in degree celsius. Possible value is 35 C.
+*
+*                FastSpeedThresh             - Fast fan speed temperature threshold in degree celsius. Possible value is 40 C.
+*
+*                FanMinRunTime               - Minimum Fan runtime in seconds. Possible value is 60 seconds.
+*
+*                MonitoringDelay             - Monitoring Delay time in seconds. Possible value is 30 seconds.
+*
+*                PowerMonitoring             - Enable or Disable power monitoring. Possible values are 0 or 1.
+*
+*                LogInterval                 - Thermal log interval in seconds. Possible value is 10 minutes.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK on successful initialisation. +* @retval RETURN_ERR if any error is detected +*/ +INT platform_hal_LoadThermalConfig (THERMAL_PLATFORM_CONFIG* pThermalPlatformConfig); + +typedef enum { + FAN_ERR_NONE = 0, + FAN_ERR_HW = 1, + FAN_ERR_MAX_OVERRIDE_SET = 2 +} FAN_ERR; // Fan errors + +/* platform_hal_setFanSpeed() function */ +/** +* @description Set the fan speed. +* +* @param[in] fanIndex - fanIndex is OEM dependent. +* \n The valid range of fanIndex are 0 to 1. +* @param[in] fanSpeed - Off, Slow, medium or fast. +* \n fanSpeed can hold any values from enum FAN_SPEED. +* @param[out] pErrReason - Pointer where to provide error status. +* \n pErrReason can hold any values from enum FAN_ERR. +* +* @return The status of the operation. +* @retval RETURN_OK on success setting fan speed. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_setFanSpeed(UINT fanIndex, FAN_SPEED fanSpeed, FAN_ERR* pErrReason); + +/* platform_hal_getFanTemperature() function */ +/** +* @description Get current device temperature reading. +* +* @param[out] pTemp - Pointer where to provide temperature reading and it is OEM dependent. +* \n The valid range of pTemp is from 0 to 100 degree celsius. +* +* @return The status of the operation. +* @retval RETURN_OK on success reading temperature. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_getFanTemperature(int* pTemp); + + +/* platform_hal_getInputCurrent() function */ +/** +* @description To get input current. +* +* @param[out] pValue - Input current in milli Amperes. +* \n pValue is OEM dependent. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_getInputCurrent(INT *pValue); + +/* platform_hal_getInputPower() function */ +/** +* @description To get input power. +* +* @param[out] pValue - Input power in milli Watts. +* \n pValue is OEM dependent. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_getInputPower(INT *pValue); + +/* platform_hal_getRadioTemperature() function */ +/** +* @description To get Radio Temperature. +* +* @param[in] radioIndex - Index of Wi-Fi radio channel. +* \n Possible values are 0,1 and 2, depending on the number of radios supported by the platform. +* @param[out] pValue - Radio temperature and it is OEM dependent. +* \n Range of pValue is 0 to 100 degree Celsius. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_getRadioTemperature(INT radioIndex, INT* pValue); + +#endif + +/* platform_hal_SetSNMPOnboardRebootEnable() function */ +/** +* @description Set SNMP Onboard Reboot Enable value to allow or ignore SNMP reboot. +* +* @param[in] pValue - SNMP Onboard Reboot Enable value. +* \n Possible values are "disable" and "enable". +* \n The string size shouldn't exceed 8 bytes. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_SetSNMPOnboardRebootEnable(CHAR* pValue); + + +/* platform_hal_GetMACsecEnable() function */ +/** +* @description Get MACsec enable status. +* +* @param[in] ethPort - Ethernet port(zero-based). +* \n Here ethPort means combination of all interfaces such as moca,ethernet and wifi. +* \n The valid range of ethPort is from 0 to MaxEthPort-1, where MaxEthPort is platform specific. +* @param[out] pFlag - MACsec enable value, to be returned. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_GetMACsecEnable(INT ethPort, BOOLEAN *pFlag); + + +/* platform_hal_SetMACsecEnable() function */ +/** +* @description Enable/Disable MACsec. +* +* @param[in] ethPort - Ethernet port (zero-based). +* \n Here ethPort means combination of all interfaces such as moca,ethernet and wifi. +* \n The valid range of ethPort is from 0 to MaxEthPort-1, where MaxEthPort is platform specific. +* @param[in] Flag - MACsec enable value. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_SetMACsecEnable(INT ethPort, BOOLEAN Flag); + + +/* platform_hal_GetMACsecOperationalStatus() function */ +/** +* @description Checks whether MACSEC is configured at interface / driver level. +* +* @param[in] ethPort - Ethernet port (zero-based). +* \n Here ethPort means combination of all interfaces such as moca,ethernet and wifi. +* \n The valid range of ethPort is from 0 to MaxEthPort-1, where MaxEthPort is platform specific. +* @param[out] pFlag - MACsec operation status value, to be returned. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_GetMACsecOperationalStatus(INT ethPort, BOOLEAN *pFlag); + +/* platform_hal_StartMACsec() function */ +/** +* @description Start MACsec - Call should be Blocking. +* +* @param[in] ethPort - Ethernet port (zero-based). +* \n Here ethPort means combination of all interfaces such as moca,ethernet and wifi. +* \n The valid range of ethPort is from 0 to MaxEthPort-1, where MaxEthPort is platform specific. +* @param[in] timeoutSec - MACsec Start Timeout (0 means retry forever). +* \n timeoutSec is unused and possible value is 0. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_StartMACsec(INT ethPort, INT timeoutSec); + +/* platform_hal_StopMACsec() function */ +/** +* @description Stop MACsec - Call should be Blocking. +* +* @param[in] ethPort - Ethernet port (zero-based). +* \n Here ethPort means combination of all interfaces such as moca,ethernet and wifi. +* \n The valid range of ethPort is from 0 to MaxEthPort-1, where MaxEthPort is platform specific. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_StopMACsec(INT ethPort); + + +/* platform_hal_GetMemoryPaths() function */ +/** +* @description Get the device specific processors DRAM and eMMC paths. +* +* @param[in] index - Index to which processor/CPU to request. +* \n Host is the primary RDK CPU . +* \n index can hold any values from enum RDK_CPUS. +* @param[out] ppinfo - Pointer to get the return array. +* \n List of client structure to be filled by hal. +*
+*                _PLAT_PROC_MEM_INFO is a structure with following members :
+*
+*                dramPath                    - Possible value is "/tmp".
+*                                              The buffer size should be at least 40 bytes long.
+*
+*                emmcpath1                   - Possible value is "/nvram".
+*                                              The buffer size should be at least 40 bytes long.
+*
+*                emmcPath2                   - Possible value is "/nvram2".
+*                                              The buffer size should be at least 40 bytes long.
+*
+*                emmcPath3                   - Unused variable.
+*                                              The buffer size should be at least 40 bytes long.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @execution Synchronous. +* \n @sideeffect None. +* +* @note HAL function need to allocate the array of PPLAT_PROC_MEM_INFO and return with ppinfo. +* +*/ +INT platform_hal_GetMemoryPaths(RDK_CPUS index, PPLAT_PROC_MEM_INFO *ppinfo); + +/* + * dhcpv4_req_opt_to_hal - is used to fill options to request values. + * from platform + */ + +typedef struct dhcp_opt_list { + int dhcp_opt; + char * dhcp_opt_val; + struct dhcp_opt_list * next; +} dhcp_opt_list; + +/* platform_hal_GetDhcpv4Options() function*/ +/** +* @description This function fills in 2 list, 1 for request option and 1 for send option. +* +* @param[out] req_opt_list - List to be filled for request dhcp options . +* @param[out] send_opt_list - List to be filled for send dhcp options. +* \n List of client structure to be filled by hal. +*
+*                dhcp_opt_list is a structure with following members :
+*
+*                dhcp_opt                    - DHCPv4 Options. Possible values are :
+*                                              #define DHCPV4_OPT_42 42 // NTP Server Addresses.
+*                                              #define DHCPV4_OPT_43 43 // Vendor Specific Information.
+*                                              #define DHCPV4_OPT_58 58 // DHCP Renewal (T1) Time.
+*                                              #define DHCPV4_OPT_59 59 // DHCP Rebinding (T2) Time.
+*                                              #define DHCPV4_OPT_60 60 // Class Identifier.
+*                                              #define DHCPV4_OPT_61 61 // Client Identifier.
+*                                              #define DHCPV4_OPT_100 100 // IEEE 1003.1 TZ String.
+*                                              #define DHCPV4_OPT_122 122 // CableLabs Client Configuration.
+*                                              #define DHCPV4_OPT_125 125 // Vendor-Identifying Vendor-Specific Information.
+*                                              #define DHCPV4_OPT_242 242 // Private Use.
+*                                              #define DHCPV4_OPT_243 243 // Private Use.
+*                                              #define DHCPV4_OPT_END 255 // DHCP Option End - used to check if option is valid.
+*
+*                dhcp_opt_val                - It can be any string and the parameter is optional.
+*
+*                next                        - Pointer variable of dhcp_opt_list.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +*/ +INT platform_hal_GetDhcpv4_Options(dhcp_opt_list ** req_opt_list, dhcp_opt_list ** send_opt_list); + +/* platform_hal_GetDhcpv6Options() function*/ +/** +* @description This function fills in 2 list, 1 for request option and 1 for send option. +* +* @param[out] req_opt_list - List to be filled for request dhcp options. +* @param[out] send_opt_list - List to be filled for send dhcp options. +* \n List of client structure to be filled by hal. +*
+*                dhcp_opt_list is a structure with following members :
+*
+*                dhcp_opt                    - DHCPv6 Options Possible values are :
+*                                              #define DHCPV6_OPT_82 82 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time.
+*                                              #define DHCPV6_OPT_23 23 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time.
+*                                              #define DHCPV6_OPT_95 95 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time.
+*                                              #define DHCPV6_OPT_24 24 // OPTION_DOMAIN_LIST.
+*                                              #define DHCPV6_OPT_83 83 // OPTION_INF_MAX_RT.
+*                                              #define DHCPV6_OPT_17 17 // OPTION_VENDOR_OPTS.
+*                                              #define DHCPV6_OPT_31 31 // OPTION_SNTP_SERVERS.
+*                                              #define DHCPV6_OPT_15 15 // User Class Option.
+*                                              #define DHCPV6_OPT_16 16 // Vendor Class Option.
+*                                              #define DHCPV6_OPT_20 20 // Reconfigure Accept Option.
+*
+*                dhcp_opt_val                - it can be any string and the parameter is optional.
+*                next                        - Pointer variable of dhcp_opt_list.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +*/ +INT platform_hal_GetDhcpv6_Options ( dhcp_opt_list ** req_opt_list, dhcp_opt_list ** send_opt_list); + +typedef enum { + PSM_UNKNOWN=0, + PSM_AC, + PSM_BATT, + PSM_HOT, + PSM_COOLED, + PSM_NOT_SUPPORTED, +} PSM_STATE, *PPSM_STATE; // Power Saving Mode State + +/* platform_hal_SetLowPowerModeState() function */ +/** +* @description Set Low Power Mode State value. Hysteresis currently not accounted for before call. +* +* @param[in] pState - Low Power Mode State. +* \n pState can hold any values from enum PPSM_STATE. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_SetLowPowerModeState(PPSM_STATE pState); + +/* platform_hal_getCMTSMac() function */ +/** +* @description Get CMTS MAC Address. +* +* @param[out] pValue - MAC address string in format AA:BB:CC:DD:EE:FF. +* \n The buffer size should be atleast 100 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_getCMTSMac(CHAR *pValue); + + +typedef enum { + DOCSIS=1, + EWAN=2, +} WAN_INTERFACE; + +typedef enum { + TRAFFIC_CNT_START=1, + TRAFFIC_CNT_STOP=2, +} TRAFFIC_CNT_COMMAND; + +typedef struct Traffic_client { + char mac[18]; // e.g. 00:AA:BB:CC:DD:EE + ULONG rxBytes; + ULONG txBytes; +} Traffic_client_t, *pTraffic_client_t; + +typedef struct DSCP_Element { + UINT dscp_value; + UINT numClients; + Traffic_client_t Client[256]; +} DSCP_Element_t, *pDSCP_Element_t; + +typedef struct DSCP_list { + UINT numElements; + DSCP_Element_t DSCP_Element[64]; +} DSCP_list_t, *pDSCP_list_t; + +/* platform_hal_setDscp() function */ +/** +* @description Control/Set traffic counting based on Dscp value. +* +* @param[in] interfaceType - 1 for DOCSIS , 2 for EWAN. +* \n interfaceType can hold any values from enum WAN_INTERFACE. +* @param[in] cmd - START/STOP. +* \n cmd can hold any values from enum TRAFFIC_CNT_COMMAND. +* @param[in] pDscpVals - Comma separated string of base 10 values. +* \n Range of DSCP values is [0-65,534]. +* \n The string’s size shouldn’t exceed 195 bytes. +* \n e.g. "10,0" , NULL. NULL is for all DSCP values. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_setDscp(WAN_INTERFACE interfaceType , TRAFFIC_CNT_COMMAND cmd , char* pDscpVals); + +/* platform_hal_resetDscpCounts() function */ +/** +* @description To reset Dscp Counter values. +* +* @param[in] interfaceType - 1 for DOCSIS , 2 for EWAN. +* \n interfaceType can hold any values from enum WAN_INTERFACE. +* +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_resetDscpCounts(WAN_INTERFACE interfaceType); + + +/* platform_hal_getDscpClientList() function */ +/** +* @description To get counter data. +* +* @param[in] interfaceType - 1 for DOCSIS , 2 for EWAN. +* \n interfaceType can hold any values from enum WAN_INTERFACE. +* @param[out] pDSCP_List - List of client structure to be filled by hal. +*
+*                DSCP_list is a structure with following members :
+*
+*                numElements                 - Maximum value for numElements is 64 range [ 0-63].
+*
+*                DSCP_Element is a Structure with following members :
+*
+*                dscp_value                  - Maximum dcspvalue is 65,535 range [ 0- 65,534].
+*                                              numClients - Range is 0-255.
+*
+*                Traffic_client is a Structure with following members :
+*
+*                mac                         - mac address. e.g. 00:AA:BB:CC:DD:EE.
+*
+*                rxBytes                     - Possible values from 0 to 2^64-1.
+*
+*                txBytes                     - Possible values from 0 to 2^64-1.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +*/ +INT platform_hal_getDscpClientList(WAN_INTERFACE interfaceType , pDSCP_list_t pDSCP_List); + + +/* platform_hal_GetCPUSpeed() function */ +/** +* @description Get cpu speed. +* +* @param[out] cpuSpeed - It is the processor speed in bogomips. +* \n Expected values for cpuSpeed is 1 to n, where n is device specific. +* \n The buffer size should be at least 16 bytes long. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetCPUSpeed(char *cpuSpeed); + +typedef enum { + ACTIVE_BANK, + INACTIVE_BANK, +} FW_BANK; + +typedef struct _FW_BANK_INFO +{ + CHAR fw_name[FW_NAME_MAX_LEN]; + CHAR fw_state[FW_STATE_MAX_LEN]; +} +FW_BANK_INFO, *PFW_BANK_INFO; + +/* platform_hal_GetFirmwareBankInfo() function */ +/** +* @description Get firmware image name flashed in the given Bank. +* +* @param[in] bankIndex - The parameter can hold any value from the enum FW_BANK. +* @param[out] pFW_Bankinfo - Structure variable containing Firmware image name and Firmware state. +*
+*                _FW_BANK_INFO is a structure with following parameters :
+*
+*                fw_name                     - Firmware name. Vendor specific.
+*                                              The buffer size should be at least 64 bytes long.
+*
+*                fw_state                    - Firmware state.
+*                                              Expected values are confirmed, from "TrialBoot#0" to "TrialBoot#n".
+*                                              TrialBoot value can vary from 0 to n, where "n" is vendor specific.
+*                                              The buffer size should be at least 64 bytes long.
+* 
+* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetFirmwareBankInfo(FW_BANK bankIndex,PFW_BANK_INFO pFW_Bankinfo); + +typedef struct _INTF_STATS +{ + UINT64_t rx_packet; /* Packets received */ + UINT64_t tx_packet; /* Packets sent */ + UINT64_t rx_bytes; /* Bytes received */ + UINT64_t tx_bytes; /* Bytes sent */ +} +INTF_STATS, *PINTF_STATS; +/* platform_hal_GetInterfaceStats() function */ +/** +* @description Get Interface Stats for the given interface,considering only LAN to WAN/WAN to LAN traffic. +* +* @param ifname - Interface name for which stats needs to be fetched. +* @param pIntfStats - Interface Stats structure, to be returned. +* +* @return The status of the operation. +* @retval RETURN_OK if successful. +* @retval RETURN_ERR if any error is detected. +* +* @sideeffect None. +*/ +INT platform_hal_GetInterfaceStats(const char *ifname,PINTF_STATS pIntfStats); + +#ifdef __cplusplus +} +#endif + +#endif + +/** + * @} + */ + +