From 781e45b20496df9183358522ccb2f7d2f4fba2ed Mon Sep 17 00:00:00 2001 From: Wootak Jung Date: Tue, 22 Jun 2021 10:10:54 +0900 Subject: [PATCH] Apply next HAL architecture Change-Id: I9641c9331f5dd6cd42fcd000385edd86135b5ae4 Signed-off-by: Wootak Jung --- AUTHORS | 2 + CMakeLists.txt | 15 +++ LICENSE.APLv2 | 204 ++++++++++++++++++++++++++++++ LICENSE.Broadcom | 204 ++++++++++++++++++++++++++++++ NOTICE | 3 + firmware/BCM4359C0.hcd | Bin 0 -> 67687 bytes firmware/CMakeLists.txt | 2 + hal-backend-bluetooth-vim3.manifest | 5 + packaging/hal-backend-bluetooth-vim3.spec | 46 +++++++ scripts/CMakeLists.txt | 3 + scripts/bt-dev-end.sh | 35 +++++ scripts/bt-dev-start.sh | 42 ++++++ src/CMakeLists.txt | 25 ++++ src/hal-backend-bluetooth.c | 75 +++++++++++ 14 files changed, 661 insertions(+) create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 LICENSE.APLv2 create mode 100644 LICENSE.Broadcom create mode 100644 NOTICE create mode 100644 firmware/BCM4359C0.hcd create mode 100644 firmware/CMakeLists.txt create mode 100644 hal-backend-bluetooth-vim3.manifest create mode 100644 packaging/hal-backend-bluetooth-vim3.spec create mode 100644 scripts/CMakeLists.txt create mode 100755 scripts/bt-dev-end.sh create mode 100755 scripts/bt-dev-start.sh create mode 100644 src/CMakeLists.txt create mode 100644 src/hal-backend-bluetooth.c diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..834173a --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Dohyun Pyun +Wootak Jung diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..1099fb4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,15 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(hal-backend-bluetooth-vim3 C) + +FOREACH(flag ${package_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION ${HAL_LICENSE_DIR}/${PROJECT_NAME}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.Broadcom DESTINATION ${HAL_LICENSE_DIR}/${PROJECT_NAME}) + +ADD_SUBDIRECTORY(firmware) +ADD_SUBDIRECTORY(scripts) +ADD_SUBDIRECTORY(src) diff --git a/LICENSE.APLv2 b/LICENSE.APLv2 new file mode 100644 index 0000000..300e292 --- /dev/null +++ b/LICENSE.APLv2 @@ -0,0 +1,204 @@ +Copyright (c) 2000 - 2021 Samsung Electronics Co., Ltd. All rights reserved. + + 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. + diff --git a/LICENSE.Broadcom b/LICENSE.Broadcom new file mode 100644 index 0000000..300e292 --- /dev/null +++ b/LICENSE.Broadcom @@ -0,0 +1,204 @@ +Copyright (c) 2000 - 2021 Samsung Electronics Co., Ltd. All rights reserved. + + 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. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..aeb6843 --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) 2021 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Apache License, Version 2. +Please, see the LICENSE file for Apache License terms and conditions. diff --git a/firmware/BCM4359C0.hcd b/firmware/BCM4359C0.hcd new file mode 100644 index 0000000000000000000000000000000000000000..95c16546fadc51e006083c84d0b2e95508b269dc GIT binary patch literal 67687 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 + + + + diff --git a/packaging/hal-backend-bluetooth-vim3.spec b/packaging/hal-backend-bluetooth-vim3.spec new file mode 100644 index 0000000..1958122 --- /dev/null +++ b/packaging/hal-backend-bluetooth-vim3.spec @@ -0,0 +1,46 @@ +Name: hal-backend-bluetooth-vim3 +Summary: firmware and tools for bluetooth +Version: 0.1.0 +Release: 1 +Group: TO_BE_FILLED +License: Apache-2.0 +Source0: hal-backend-bluetooth-vim3-%{version}.tar.gz + +BuildRequires: cmake +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(hal-api-common) +BuildRequires: pkgconfig(hal-api-bluetooth) + +%description +VIM3 firmware and tools for bluetooth + +%prep +%setup -q -n hal-backend-bluetooth-vim3-%{version} + +%build +export CFLAGS+=" -fpie -fvisibility=hidden" +export CXXFLAGS+=" -fpie -fvisibility=hidden" +export LDFLAGS+=" -Wl,--rpath=/usr/lib -Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs -pie" + +cmake ./ -DCMAKE_INSTALL_PREFIX=%{_prefix} \ + -DPLUGIN_INSTALL_PREFIX=%{_prefix} \ + -DHAL_LIB_DIR=%{_hal_libdir} \ + -DHAL_LICENSE_DIR=%{_hal_licensedir} \ + -DHAL_SYSCONF_DIR=%{_hal_sysconfdir} +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +%post +ln -s %{_hal_sysconfdir}/bluetooth/BCM4359C0.hcd /usr/etc/bluetooth/BCM4359C0.hcd + +%files +%manifest %{name}.manifest +%{_hal_licensedir}/%{name}/LICENSE.APLv2 +%{_hal_licensedir}/%{name}/LICENSE.Broadcom +%{_hal_sysconfdir}/bluetooth/BCM4359C0.hcd +%{_hal_sysconfdir}/bluetooth/bt-dev-end.sh +%{_hal_sysconfdir}/bluetooth/bt-dev-start.sh +%{_hal_libdir}/*.so* diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt new file mode 100644 index 0000000..91cef2b --- /dev/null +++ b/scripts/CMakeLists.txt @@ -0,0 +1,3 @@ +# install firmware +INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/bt-dev-end.sh DESTINATION ${HAL_SYSCONF_DIR}/bluetooth) +INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/bt-dev-start.sh DESTINATION ${HAL_SYSCONF_DIR}/bluetooth) diff --git a/scripts/bt-dev-end.sh b/scripts/bt-dev-end.sh new file mode 100755 index 0000000..4835030 --- /dev/null +++ b/scripts/bt-dev-end.sh @@ -0,0 +1,35 @@ +#!/bin/sh +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +GREP="/bin/grep" +HCI_CONFIG=/usr/bin/hciconfig + +echo "Check for Bluetooth device status" +if (${HCI_CONFIG} | ${GREP} hci); then + echo "Bluetooth device is UP" + ${HCI_CONFIG} hci0 down +else + echo "Did not attach HCI" + exit 1 +fi + +TIMEOUT=20 + +for (( i=1; i<=$TIMEOUT; i++)) +do + /bin/sleep 0.1 + + if [ $i -eq $TIMEOUT ] + then + echo "time expired happen $i" + exit 2 + fi + + if (${HCI_CONFIG} | ${GREP} DOWN); then + echo "Bluetooth device is down" + break + fi + + echo "Continue...$i" +done +exit 0 diff --git a/scripts/bt-dev-start.sh b/scripts/bt-dev-start.sh new file mode 100755 index 0000000..863c00d --- /dev/null +++ b/scripts/bt-dev-start.sh @@ -0,0 +1,42 @@ +#!/bin/sh +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +GREP="/bin/grep" +HCI_CONFIG=/usr/bin/hciconfig + +echo "Check for Bluetooth device status" +if (${HCI_CONFIG} | ${GREP} hci); then + echo "Up the bluetooth device" + ${HCI_CONFIG} hci0 up + exit 0 +fi + +/usr/sbin/rfkill unblock 0 +/usr/bin/hciattach -n -s 115200 /dev/ttyS1 bcm43xx 2000000 & +/bin/sleep 0.1 + +TIMEOUT=20 + +for (( i=1; i<=$TIMEOUT; i++)) +do + if [ $i -eq $TIMEOUT ] + then + echo "time expired happen $i" + exit 2 + fi + + echo "Check for Bluetooth device status" + if (${HCI_CONFIG} | ${GREP} hci); then + echo "Up the bluetooth device" + ${HCI_CONFIG} hci0 up + + if (${HCI_CONFIG} | ${GREP} UP); then + echo "Bluetooth device is made" + break + fi + fi + + /bin/sleep 0.1 + echo "Continue...$i" +done +exit 0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..964fe52 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,25 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(hal-backend-bluetooth C) + +INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(hal-backend-bluetooth_pkgs REQUIRED + dlog + hal-api-common + hal-api-bluetooth +) + +SET(SRCS + ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.c) + +FOREACH(flag ${hal-backend-bluetooth_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${hal-backend-bluetooth_pkgs_LDFLAGS}) +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${HAL_LIB_DIR} COMPONENT RuntimeLibraries) diff --git a/src/hal-backend-bluetooth.c b/src/hal-backend-bluetooth.c new file mode 100644 index 0000000..5f9846d --- /dev/null +++ b/src/hal-backend-bluetooth.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include + +#include + +#undef LOG_TAG +#define LOG_TAG "HALAPI_BLUETOOTH" + +#define EXPORT __attribute__ ((visibility("default"))) + +static int bluetooth_vim3_start(void) +{ + int ret; + ret = system("/hal/etc/bluetooth/bt-dev-start.sh"); + if (ret == 0x100) { + LOGE("script internal failed"); + return HAL_BACKEND_ERROR_INTERNAL; + } else if (ret == 0x200) { + LOGE("script timeout failed"); + return HAL_BACKEND_ERROR_TIMEOUT; + } + LOGD("script started successfully"); + return HAL_BACKEND_ERROR_NONE; +} + +static int bluetooth_vim3_stop(void) +{ + int ret; + ret = system("/hal/etc/bluetooth/bt-dev-end.sh"); + if (ret == 0x100) { + LOGE("script internal failed"); + return HAL_BACKEND_ERROR_INTERNAL; + } else if (ret == 0x200) { + LOGE("script timeout failed"); + return HAL_BACKEND_ERROR_TIMEOUT; + } + LOGD("script started successfully"); + return HAL_BACKEND_ERROR_NONE; +} + +static int bluetooth_vim3_init(void **data) +{ + hal_backend_bluetooth_funcs *bluetooth_funcs; + + bluetooth_funcs = calloc(1, sizeof(hal_backend_bluetooth_funcs)); + if (!bluetooth_funcs) + return -ENOMEM; + + bluetooth_funcs->start = bluetooth_vim3_start; + bluetooth_funcs->stop = bluetooth_vim3_stop; + + *data = (void *)bluetooth_funcs; + + return 0; +} + +static int bluetooth_vim3_exit(void *data) +{ + if (!data) + return -EINVAL; + free(data); + + return 0; +} + +hal_backend EXPORT hal_backend_bluetooth_data = { + .name = "bluetooth-vim3", + .vendor = "VIM3", + .abi_version = HAL_ABI_VERSION_TIZEN_6_5, + .init = bluetooth_vim3_init, + .exit = bluetooth_vim3_exit, +}; -- 2.7.4