From 3fc4ae7218d6b9fa05eca86471e97a37b5a2424b Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 7 Nov 2019 16:52:06 +0100 Subject: [PATCH] cryptoauthlib: update to 30/7/2019 pkcs11 release This version is based on the 20190517 master release, with the addition of pkcs11 provisioning support. The source code now has cmake files, so we don't need as many code customizations as we used to. Revamp the recipe and its patches. https://jira.digi.com/browse/DEL-6826 https://jira.digi.com/browse/DEL-6835 Signed-off-by: Gabriel Valcazar --- ...m-the-cryptoauth-engine-repo-to-the-.patch | 404 - ...rs-to-be-able-to-modify-default-I2C-.patch | 63 + ...02-Remove-unused-HAL-implementations.patch | 13459 ---------------- ...y-version-number-to-CMake-VERSION-pr.patch | 30 + ...-cmd-processor-application-along-wit.patch | 50 - ...mplate-configuration-file-to-its-int.patch | 84 + ...ry-code-from-cryptochip-cmd-processo.patch | 454 - ...all-pkg-config-file-and-header-files.patch | 82 + .../cryptoauthlib/cryptoauthlib_git.bb | 28 +- 9 files changed, 272 insertions(+), 14382 deletions(-) delete mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-Port-changes-from-the-cryptoauth-engine-repo-to-the-.patch create mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-lib-add-parameters-to-be-able-to-modify-default-I2C-.patch delete mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-Remove-unused-HAL-implementations.patch create mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-lib-apply-library-version-number-to-CMake-VERSION-pr.patch delete mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-Build-cryptochip-cmd-processor-application-along-wit.patch create mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-pkcs11-rename-template-configuration-file-to-its-int.patch delete mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-Remove-unnecessary-code-from-cryptochip-cmd-processo.patch create mode 100644 meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-lib-install-pkg-config-file-and-header-files.patch diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-Port-changes-from-the-cryptoauth-engine-repo-to-the-.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-Port-changes-from-the-cryptoauth-engine-repo-to-the-.patch deleted file mode 100644 index 8c6261b34..000000000 --- a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-Port-changes-from-the-cryptoauth-engine-repo-to-the-.patch +++ /dev/null @@ -1,404 +0,0 @@ -From: Gabriel Valcazar -Date: Wed, 14 Feb 2018 17:30:49 +0100 -Subject: [PATCH 1/2] Port changes from the cryptoauth engine repo to the - library repo - -Incorporate makefiles to be able to build cryptoauthlib as well as the changes -Digi has done in the atmel-cryptoauth-openssl-engine repo (except for -our modifications in the HAL section, which are not needed anymore). Update -package configuration version to 1.3, remove OpenSSL engine dependencies and -fix an infinite recursion that happened when cleaning the project. - -https://jira.digi.com/browse/DEL-5591 - -Signed-off-by: Gabriel Valcazar -Signed-off-by: Isaac Hermida ---- - Makefile | 32 +++++++++++++++++ - Makefile.generic | 22 ++++++++++++ - ecc-test-main.c | 71 +++++++++++++++++++++++++++++++++++++ - lib/Makefile | 46 ++++++++++++++++++++++++ - lib/atca_cfgs.c | 16 +++++++-- - lib/atcacert/Makefile | 1 + - lib/basic/Makefile | 1 + - lib/crypto/Makefile | 1 + - lib/crypto/hashes/Makefile | 1 + - lib/cryptoauthlib.pc | 11 ++++++ - lib/hal/Makefile | 1 + - lib/host/Makefile | 1 + - lib/jwt/Makefile | 1 + - lib/tls/Makefile | 1 + - test/Makefile | 15 ++++++++ - test/atcacert/Makefile | 1 + - test/jwt/Makefile | 1 + - test/sha-byte-test-vectors/Makefile | 1 + - test/tls/Makefile | 1 + - 19 files changed, 222 insertions(+), 3 deletions(-) - create mode 100644 Makefile - create mode 100644 Makefile.generic - create mode 100644 ecc-test-main.c - create mode 100644 lib/Makefile - create mode 100644 lib/atcacert/Makefile - create mode 100644 lib/basic/Makefile - create mode 100644 lib/crypto/Makefile - create mode 100644 lib/crypto/hashes/Makefile - create mode 100644 lib/cryptoauthlib.pc - create mode 100644 lib/hal/Makefile - create mode 100644 lib/host/Makefile - create mode 100644 lib/jwt/Makefile - create mode 100644 lib/tls/Makefile - create mode 100644 test/Makefile - create mode 100644 test/atcacert/Makefile - create mode 100644 test/jwt/Makefile - create mode 100644 test/sha-byte-test-vectors/Makefile - create mode 100644 test/tls/Makefile - -diff --git a/Makefile b/Makefile -new file mode 100644 -index 000000000000..a471428ad12c ---- /dev/null -+++ b/Makefile -@@ -0,0 +1,32 @@ -+CWD:= $(shell pwd) -+CFLAGS+= -I. -I../.. -fPIC -g -O0 -+SRC:= $(wildcard *.c) -+export CFLAGS -+ -+SUBDIRS= lib test -+ -+.PHONY: tgt_lib tgt_test clean -+ -+all: tgt_lib tgt_test ecc-test -+ -+%.o: %.c -+ $(CC) $(CFLAGS) -o $@ -c $< -+ -+tgt_lib: -+ make -w -C lib -+ -+tgt_test: -+ make -w -C test -+ -+ecc-test: tgt_lib tgt_test -+ $(CC) -c ecc-test-main.c $(CFLAGS) $(LDFLAGS) -I ./lib/ -I ./test/ -+ $(CC) -o ecc-test-main ecc-test-main.o $(LDFLAGS) test/tls/atcatls_tests.o -L lib -L test -lm -lc -lrt -lcryptoauth -lunity -+ -+install: -+ for a in $(SUBDIRS); do $(MAKE) -C $$a $@; done -+ install -d $(DESTDIR)/usr/bin -+ install -m 0755 ecc-test-main $(DESTDIR)/usr/bin/ -+ -+clean: -+ rm -f *.o *.a ecc-test-main -+ $(foreach subdir,$(basename $(SUBDIRS)),$(MAKE) -w -C $(subdir) clean;) -diff --git a/Makefile.generic b/Makefile.generic -new file mode 100644 -index 000000000000..f6a0d67c708c ---- /dev/null -+++ b/Makefile.generic -@@ -0,0 +1,22 @@ -+CWD:= $(shell pwd) -+CFLAGS+= -I. -I.. -I../.. -I../../.. -I../../../.. -I../../lib -I../lib -fPIC -g -O0 -DATCA_HAL_I2C -DATCAPRINTF -+SRC:= $(wildcard *.c) -+export CFLAGS -+ -+DIRECTORIES= $(shell find . -maxdepth 1 ! -path . -type d) -+SUBDIRS= $(DIRECTORIES) -+ -+.PHONY: clean tgt_local -+ -+MODULES= $(patsubst %.c,%.o,$(SRC)) -+ -+all: $(MODULES) tgt_local -+ $(foreach subdir,$(basename $(SUBDIRS)),$(MAKE) -w -C $(subdir);) -+ -+%.o: %.c -+ $(CC) $(CFLAGS) -o $@ -c $< -+ -+clean: -+ rm -f *.o *.a -+ $(foreach subdir,$(basename $(SUBDIRS)),$(MAKE) -w -C $(subdir) clean;) -+ -diff --git a/ecc-test-main.c b/ecc-test-main.c -new file mode 100644 -index 000000000000..032bc4bc2b5a ---- /dev/null -+++ b/ecc-test-main.c -@@ -0,0 +1,71 @@ -+/** \file ecc-test-main.c -+ * \brief Used to launch CryptoAuthLib tests for TLS -+ * -+ * Copyright (c) 2015 Atmel Corporation. All rights reserved. -+ * -+ * \atmel_crypto_device_library_license_start -+ * -+ * \page License -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions are met: -+ * -+ * 1. Redistributions of source code must retain the above copyright notice, -+ * this list of conditions and the following disclaimer. -+ * -+ * 2. Redistributions in binary form must reproduce the above copyright notice, -+ * this list of conditions and the following disclaimer in the documentation -+ * and/or other materials provided with the distribution. -+ * -+ * 3. Neither the name of Atmel nor the names of its contributors may be used to endorse -+ * or promote products derived from this software without specific prior written permission. -+ * -+ * 4. This software may only be redistributed and used in connection with an -+ * Atmel integrated circuit. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+*/ -+ -+//#include "ssl.h" -+#include -+#include -+#include -+#include -+#include -+ -+#define ATCA_HAL_I2C -+ -+// Get a pointer to the default configuration based on the compiler switch -+#ifdef ATCA_HAL_KIT_CDC -+ATCAIfaceCfg* pCfg = &cfg_ecc508_kitcdc_default; -+#elif defined(ATCA_HAL_KIT_HID) -+ATCAIfaceCfg* pCfg = &cfg_ecc508_kithid_default; -+#elif defined(ATCA_HAL_I2C) -+ATCAIfaceCfg* pCfg = &cfg_ateccx08a_i2c_default; -+#endif -+ -+ -+/** \brief Main function for running ATECC508 tests. -+ * Use this test program to ensure that the Engine can communicate to your ATECC508 -+ * -+ * \return For success return 0 -+ */ -+int main() -+{ -+ uint8_t runTests = true; -+ -+ if (runTests) -+ { -+ atcatls_test_runner(pCfg); -+ } -+ return 0; -+} -diff --git a/lib/Makefile b/lib/Makefile -new file mode 100644 -index 000000000000..e8c89380a43c ---- /dev/null -+++ b/lib/Makefile -@@ -0,0 +1,46 @@ -+CWD:=$(shell pwd) -+SRC:=$(wildcard *.c) -+ -+DIRECTORIES=$(shell find . -maxdepth 1 ! -path . -type d) -+SUBDIRS=$(DIRECTORIES) -+ -+.PHONY: clean -+ -+MODULES=$(patsubst %.c,%.o,$(SRC)) -+#O_FILES=$(shell find . -name \*.o) -+O_FILES=$(wildcard **/**/*.o) -+O_FILES+=$(wildcard **/*.o) -+LIBNAME=libcryptoauth -+ -+INCLUDE_PATH = "$(DESTDIR)/usr/include/cryptoauthlib" -+ -+all: $(MODULES) -+ - $(foreach subdir,$(basename $(SUBDIRS)),$(shell make -w -C $(subdir))) -+ @echo "OFILES: $(O_FILES)" -+ $(AR) -r $(LIBNAME).a $(MODULES) $(O_FILES) -+ $(RANLIB) $(LIBNAME).a -+ -+.PHONY: install -+install: $(LIBNAME).a -+ install -d $(DESTDIR)/usr/lib/pkgconfig -+ install -m 0644 $(LIBNAME).a $(DESTDIR)/usr/lib/ -+ install -m 0644 cryptoauthlib.pc $(DESTDIR)/usr/lib/pkgconfig/ -+ -+ install -d $(INCLUDE_PATH)/atcacert $(INCLUDE_PATH)/basic $(INCLUDE_PATH)/hal $(INCLUDE_PATH)/tls -+ install -m 0644 atcacert/*.h $(INCLUDE_PATH)/atcacert -+ install -m 0644 basic/*.h $(INCLUDE_PATH)/basic -+ install -m 0644 hal/*.h $(INCLUDE_PATH)/hal -+ install -m 0644 tls/*.h $(INCLUDE_PATH)/tls -+ install -m 0644 *.h $(INCLUDE_PATH) -+ -+ install -d $(INCLUDE_PATH)/crypto/hashes -+ install -m 0644 crypto/*.h $(INCLUDE_PATH)/crypto -+ install -m 0644 crypto/hashes/*.h $(INCLUDE_PATH)/crypto/hashes -+ -+%.o: %.c -+ $(CC) $(CFLAGS) -o $@ -c $< -+ -+clean: -+ rm -f *.o *.a -+ $(foreach subdir,$(basename $(SUBDIRS)),$(MAKE) -w -C $(subdir) clean;) -+ -diff --git a/lib/atca_cfgs.c b/lib/atca_cfgs.c -index b8de8e8ede7f..4cbd305724d4 100644 ---- a/lib/atca_cfgs.c -+++ b/lib/atca_cfgs.c -@@ -40,14 +40,24 @@ - - /* if the number of these configurations grows large, we can #ifdef them based on required device support */ - -+/* Default I2C configuration */ -+#ifndef ATCA_HAL_I2C_BUS -+#define ATCA_HAL_I2C_BUS 0 -+#warning "Using default value for ATCA_HAL_I2C_BUS: 0" -+#endif -+ -+#ifndef ATCA_HAL_I2C_SPEED -+#define ATCA_HAL_I2C_SPEED 400000 -+#warning "Using default value for ATCA_HAL_I2C_SPEED: 400000" -+#endif -+ - /** \brief default configuration for an ECCx08A device */ - ATCAIfaceCfg cfg_ateccx08a_i2c_default = { - .iface_type = ATCA_I2C_IFACE, - .devtype = ATECC508A, - .atcai2c.slave_address = 0xC0, -- .atcai2c.bus = 2, -- .atcai2c.baud = 400000, -- //.atcai2c.baud = 100000, -+ .atcai2c.bus = ATCA_HAL_I2C_BUS, -+ .atcai2c.baud = ATCA_HAL_I2C_SPEED, - .wake_delay = 1500, - .rx_retries = 20 - }; -diff --git a/lib/atcacert/Makefile b/lib/atcacert/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/lib/atcacert/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/lib/basic/Makefile b/lib/basic/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/lib/basic/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/lib/crypto/Makefile b/lib/crypto/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/lib/crypto/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/lib/crypto/hashes/Makefile b/lib/crypto/hashes/Makefile -new file mode 100644 -index 000000000000..0356cb8c0cd5 ---- /dev/null -+++ b/lib/crypto/hashes/Makefile -@@ -0,0 +1 @@ -+include ../../../Makefile.generic -diff --git a/lib/cryptoauthlib.pc b/lib/cryptoauthlib.pc -new file mode 100644 -index 000000000000..001a02c1c341 ---- /dev/null -+++ b/lib/cryptoauthlib.pc -@@ -0,0 +1,11 @@ -+prefix=/usr -+exec_prefix=${prefix} -+libdir=${exec_prefix}/lib -+includedir=${prefix}/include -+ -+Name: cryptoauthlib -+Description: Atmel Cryptochip library for ATECC508A -+Version:1.3 -+ -+Libs: -L${libdir} -lcryptoauth -+Cflags: -I${includedir} -I${includedir}/cryptoauthlib -I${includedir}/cryptoauthlib/tls -diff --git a/lib/hal/Makefile b/lib/hal/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/lib/hal/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/lib/host/Makefile b/lib/host/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/lib/host/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/lib/jwt/Makefile b/lib/jwt/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/lib/jwt/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/lib/tls/Makefile b/lib/tls/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/lib/tls/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/test/Makefile b/test/Makefile -new file mode 100644 -index 000000000000..5de9ef42a46b ---- /dev/null -+++ b/test/Makefile -@@ -0,0 +1,15 @@ -+LIBNAME= libunity -+LIB= $(LIBNAME).a -+AR+= r -+ -+include ../Makefile.generic -+ -+tgt_local: -+ $(CC) -o unity.o -c unity.c -+ $(AR) $(LIB) unity.o -+ -+ecc-test: tgt_local -+ $(CC) -c ecc-test-main.c $(CFLAGS) -I. -I.. -+ $(CC) -o ecc-test-main ecc-test-main.o ../test/tls/atcatls_tests.o -Lcryptoauthlib/lib -lcryptoauth -Lcryptoauthlib/test -lunity -lm -lc -lrt -+ -+install: ; -diff --git a/test/atcacert/Makefile b/test/atcacert/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/test/atcacert/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/test/jwt/Makefile b/test/jwt/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/test/jwt/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic -diff --git a/test/sha-byte-test-vectors/Makefile b/test/sha-byte-test-vectors/Makefile -new file mode 100644 -index 000000000000..78d24559879f ---- /dev/null -+++ b/test/sha-byte-test-vectors/Makefile -@@ -0,0 +1 @@ -+empty_target: ; -diff --git a/test/tls/Makefile b/test/tls/Makefile -new file mode 100644 -index 000000000000..aa3e01644e15 ---- /dev/null -+++ b/test/tls/Makefile -@@ -0,0 +1 @@ -+include ../../Makefile.generic diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-lib-add-parameters-to-be-able-to-modify-default-I2C-.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-lib-add-parameters-to-be-able-to-modify-default-I2C-.patch new file mode 100644 index 000000000..da95dff95 --- /dev/null +++ b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0001-lib-add-parameters-to-be-able-to-modify-default-I2C-.patch @@ -0,0 +1,63 @@ +From: Gabriel Valcazar +Date: Thu, 31 Oct 2019 11:49:06 +0100 +Subject: [PATCH 1/6] lib: add parameters to be able to modify default I2C bus + index and speed + +https://jira.digi.com/browse/DEL-6826 + +Signed-off-by: Gabriel Valcazar +--- + lib/CMakeLists.txt | 8 ++++++++ + lib/atca_cfgs.c | 15 +++++++++++++-- + 2 files changed, 21 insertions(+), 2 deletions(-) + +diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt +index 9816ed1..b198d1f 100644 +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -66,6 +66,14 @@ add_definitions(-DATCA_HAL_I2C) + set(CRYPTOAUTH_SRC ${CRYPTOAUTH_SRC} ${TWI_SRC}) + endif(LINUX AND ATCA_HAL_I2C) + ++if(ATCA_HAL_I2C_BUS) ++add_definitions(-DATCA_HAL_I2C_BUS=${ATCA_HAL_I2C_BUS}) ++endif(ATCA_HAL_I2C_BUS) ++ ++if(ATCA_HAL_I2C_SPEED) ++add_definitions(-DATCA_HAL_I2C_SPEED=${ATCA_HAL_I2C_SPEED}) ++endif(ATCA_HAL_I2C_SPEED) ++ + if(ATCA_HAL_CUSTOM) + add_definitions(-DATCA_HAL_CUSTOM) + endif() +diff --git a/lib/atca_cfgs.c b/lib/atca_cfgs.c +index a79e02b..60727f7 100644 +--- a/lib/atca_cfgs.c ++++ b/lib/atca_cfgs.c +@@ -37,13 +37,24 @@ + + /* if the number of these configurations grows large, we can #ifdef them based on required device support */ + ++/* Default I2C configuration */ ++#ifndef ATCA_HAL_I2C_BUS ++#define ATCA_HAL_I2C_BUS 0 ++#warning "Using default value for ATCA_HAL_I2C_BUS: 0" ++#endif ++ ++#ifndef ATCA_HAL_I2C_SPEED ++#define ATCA_HAL_I2C_SPEED 400000 ++#warning "Using default value for ATCA_HAL_I2C_SPEED: 400000" ++#endif ++ + /** \brief default configuration for an ECCx08A device */ + ATCAIfaceCfg cfg_ateccx08a_i2c_default = { + .iface_type = ATCA_I2C_IFACE, + .devtype = ATECC608A, + .atcai2c.slave_address = 0xC0, +- .atcai2c.bus = 1, +- .atcai2c.baud = 400000, ++ .atcai2c.bus = ATCA_HAL_I2C_BUS, ++ .atcai2c.baud = ATCA_HAL_I2C_SPEED, + //.atcai2c.baud = 100000, + .wake_delay = 1500, + .rx_retries = 20 diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-Remove-unused-HAL-implementations.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-Remove-unused-HAL-implementations.patch deleted file mode 100644 index b9a56fdda..000000000 --- a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-Remove-unused-HAL-implementations.patch +++ /dev/null @@ -1,13459 +0,0 @@ -From: Gabriel Valcazar -Date: Mon, 19 Feb 2018 10:48:50 +0100 -Subject: [PATCH 2/2] Remove unused HAL implementations - -When building the library, all HAL implementations get compiled, leading to -failures due to missing Windows header files. The official README states that -only the necessary HAL implementations should be included in a project, so keep -the Linux userpace I2C HAL and remove everything else. - -https://jira.digi.com/browse/DEL-5591 - -Signed-off-by: Gabriel Valcazar ---- - lib/hal/hal_at90usb1287_i2c_asf.c | 520 ---------------------------- - lib/hal/hal_at90usb1287_i2c_asf.h | 64 ---- - lib/hal/hal_at90usb1287_timer_asf.c | 79 ----- - lib/hal/hal_i2c_bitbang.c | 518 ---------------------------- - lib/hal/hal_i2c_bitbang.h | 78 ----- - lib/hal/hal_linux_kit_cdc.c | 428 ----------------------- - lib/hal/hal_linux_kit_cdc.h | 67 ---- - lib/hal/hal_linux_kit_hid.c | 429 ----------------------- - lib/hal/hal_linux_kit_hid.h | 62 ---- - lib/hal/hal_pic32mx695f512h_i2c.c | 510 --------------------------- - lib/hal/hal_pic32mx695f512h_i2c.h | 74 ---- - lib/hal/hal_pic32mx695f512h_timer.c | 106 ------ - lib/hal/hal_sam4s_i2c_asf.c | 667 ------------------------------------ - lib/hal/hal_sam4s_i2c_asf.h | 67 ---- - lib/hal/hal_sam4s_timer_asf.c | 86 ----- - lib/hal/hal_samb11_i2c_asf.c | 485 -------------------------- - lib/hal/hal_samb11_i2c_asf.h | 60 ---- - lib/hal/hal_samb11_timer_asf.c | 78 ----- - lib/hal/hal_samd21_i2c_asf.c | 572 ------------------------------- - lib/hal/hal_samd21_i2c_asf.h | 63 ---- - lib/hal/hal_samd21_i2c_start.c | 545 ----------------------------- - lib/hal/hal_samd21_i2c_start.h | 64 ---- - lib/hal/hal_samd21_timer_asf.c | 79 ----- - lib/hal/hal_samd21_timer_start.c | 80 ----- - lib/hal/hal_samg55_i2c_asf.c | 661 ----------------------------------- - lib/hal/hal_samg55_i2c_asf.h | 67 ---- - lib/hal/hal_samg55_timer_asf.c | 86 ----- - lib/hal/hal_samv71_i2c_asf.c | 583 ------------------------------- - lib/hal/hal_samv71_i2c_asf.h | 63 ---- - lib/hal/hal_samv71_timer_asf.c | 79 ----- - lib/hal/hal_swi_bitbang.c | 347 ------------------- - lib/hal/hal_swi_bitbang.h | 76 ---- - lib/hal/hal_swi_uart.c | 527 ---------------------------- - lib/hal/hal_swi_uart.h | 62 ---- - lib/hal/hal_win_kit_cdc.c | 556 ------------------------------ - lib/hal/hal_win_kit_cdc.h | 58 ---- - lib/hal/hal_win_kit_hid.c | 469 ------------------------- - lib/hal/hal_win_kit_hid.h | 64 ---- - lib/hal/hal_win_timer.c | 86 ----- - lib/hal/hal_xmega_a3bu_i2c_asf.c | 520 ---------------------------- - lib/hal/hal_xmega_a3bu_i2c_asf.h | 64 ---- - lib/hal/hal_xmega_a3bu_timer_asf.c | 78 ----- - lib/hal/i2c_bitbang_samd21.c | 262 -------------- - lib/hal/i2c_bitbang_samd21.h | 195 ----------- - lib/hal/kit_phy.h | 62 ---- - lib/hal/kit_protocol.c | 430 ----------------------- - lib/hal/kit_protocol.h | 77 ----- - lib/hal/swi_bitbang_samd21.c | 272 --------------- - lib/hal/swi_bitbang_samd21.h | 148 -------- - lib/hal/swi_uart_at90usb1287_asf.c | 260 -------------- - lib/hal/swi_uart_at90usb1287_asf.h | 83 ----- - lib/hal/swi_uart_samd21_asf.c | 238 ------------- - lib/hal/swi_uart_samd21_asf.h | 84 ----- - lib/hal/swi_uart_samd21_start.c | 208 ----------- - lib/hal/swi_uart_samd21_start.h | 80 ----- - lib/hal/swi_uart_xmega_a3bu_asf.c | 258 -------------- - lib/hal/swi_uart_xmega_a3bu_asf.h | 83 ----- - 57 files changed, 12967 deletions(-) - delete mode 100644 lib/hal/hal_at90usb1287_i2c_asf.c - delete mode 100644 lib/hal/hal_at90usb1287_i2c_asf.h - delete mode 100644 lib/hal/hal_at90usb1287_timer_asf.c - delete mode 100644 lib/hal/hal_i2c_bitbang.c - delete mode 100644 lib/hal/hal_i2c_bitbang.h - delete mode 100644 lib/hal/hal_linux_kit_cdc.c - delete mode 100644 lib/hal/hal_linux_kit_cdc.h - delete mode 100644 lib/hal/hal_linux_kit_hid.c - delete mode 100644 lib/hal/hal_linux_kit_hid.h - delete mode 100644 lib/hal/hal_pic32mx695f512h_i2c.c - delete mode 100644 lib/hal/hal_pic32mx695f512h_i2c.h - delete mode 100644 lib/hal/hal_pic32mx695f512h_timer.c - delete mode 100644 lib/hal/hal_sam4s_i2c_asf.c - delete mode 100644 lib/hal/hal_sam4s_i2c_asf.h - delete mode 100644 lib/hal/hal_sam4s_timer_asf.c - delete mode 100644 lib/hal/hal_samb11_i2c_asf.c - delete mode 100644 lib/hal/hal_samb11_i2c_asf.h - delete mode 100644 lib/hal/hal_samb11_timer_asf.c - delete mode 100644 lib/hal/hal_samd21_i2c_asf.c - delete mode 100644 lib/hal/hal_samd21_i2c_asf.h - delete mode 100644 lib/hal/hal_samd21_i2c_start.c - delete mode 100644 lib/hal/hal_samd21_i2c_start.h - delete mode 100644 lib/hal/hal_samd21_timer_asf.c - delete mode 100644 lib/hal/hal_samd21_timer_start.c - delete mode 100644 lib/hal/hal_samg55_i2c_asf.c - delete mode 100644 lib/hal/hal_samg55_i2c_asf.h - delete mode 100644 lib/hal/hal_samg55_timer_asf.c - delete mode 100644 lib/hal/hal_samv71_i2c_asf.c - delete mode 100644 lib/hal/hal_samv71_i2c_asf.h - delete mode 100644 lib/hal/hal_samv71_timer_asf.c - delete mode 100644 lib/hal/hal_swi_bitbang.c - delete mode 100644 lib/hal/hal_swi_bitbang.h - delete mode 100644 lib/hal/hal_swi_uart.c - delete mode 100644 lib/hal/hal_swi_uart.h - delete mode 100644 lib/hal/hal_win_kit_cdc.c - delete mode 100644 lib/hal/hal_win_kit_cdc.h - delete mode 100644 lib/hal/hal_win_kit_hid.c - delete mode 100644 lib/hal/hal_win_kit_hid.h - delete mode 100644 lib/hal/hal_win_timer.c - delete mode 100644 lib/hal/hal_xmega_a3bu_i2c_asf.c - delete mode 100644 lib/hal/hal_xmega_a3bu_i2c_asf.h - delete mode 100644 lib/hal/hal_xmega_a3bu_timer_asf.c - delete mode 100644 lib/hal/i2c_bitbang_samd21.c - delete mode 100644 lib/hal/i2c_bitbang_samd21.h - delete mode 100644 lib/hal/kit_phy.h - delete mode 100644 lib/hal/kit_protocol.c - delete mode 100644 lib/hal/kit_protocol.h - delete mode 100644 lib/hal/swi_bitbang_samd21.c - delete mode 100644 lib/hal/swi_bitbang_samd21.h - delete mode 100644 lib/hal/swi_uart_at90usb1287_asf.c - delete mode 100644 lib/hal/swi_uart_at90usb1287_asf.h - delete mode 100644 lib/hal/swi_uart_samd21_asf.c - delete mode 100644 lib/hal/swi_uart_samd21_asf.h - delete mode 100644 lib/hal/swi_uart_samd21_start.c - delete mode 100644 lib/hal/swi_uart_samd21_start.h - delete mode 100644 lib/hal/swi_uart_xmega_a3bu_asf.c - delete mode 100644 lib/hal/swi_uart_xmega_a3bu_asf.h - -diff --git a/lib/hal/hal_at90usb1287_i2c_asf.c b/lib/hal/hal_at90usb1287_i2c_asf.c -deleted file mode 100644 -index 878d82e48470..000000000000 ---- a/lib/hal/hal_at90usb1287_i2c_asf.c -+++ /dev/null -@@ -1,520 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for AT90USB1287 I2C over ASF drivers. -- * -- * Prerequisite: Add I2C Master Polled/Interrupt support to application in Atmel Studio -- * this HAL implementation assumes you've included the ASF I2C libraries in your project, otherwise, -- * the HAL layer will not compile because the ASF I2C drivers are a dependency -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include --#include "atca_hal.h" --#include "hal_at90usb1287_i2c_asf.h" --#include "atca_device.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --/** \brief logical to physical bus mapping structure */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses --static twi_master_options_t config_i2c_master; -- -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the prior knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- -- // if every PORT was a likely candidate bus, then would need to initialize the entire array to all PORT n numbers. -- // As an optimization and making discovery safer, make assumptions about bus-num / PORT map based on AT90USB1287 -- // If you were using a raw XMEGA on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- // -- -- i2c_buses[0] = 0; /* AT90USB1287 has only one I2C Port */ -- -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- // build an info command -- packet.param1 = INFO_MODE_REVISION; -- packet.param2 = 0; -- -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slaveAddress = 0x08; slaveAddress <= 0x77; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(packet.data, 0x00, sizeof(packet.data)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- printf("command response error\r\n"); -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- deleteATCADevice(&device); -- -- return ATCA_SUCCESS; --} -- -- -- -- --/** \brief hal_i2c_init manages requests to initialize a physical interface. it manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** \brief initialize an I2C interface using given config -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - pointer to interface configuration -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t) ); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- -- config_i2c_master.speed = cfg->atcai2c.baud; -- config_i2c_master.chip = 0x50; -- config_i2c_master.baud_reg = TWI_CLOCK_RATE(sysclk_get_cpu_hz(), cfg->atcai2c.baud); -- -- i2c_hal_data[bus]->i2c_master_instance = (int*)&TWBR; -- -- sysclk_enable_peripheral_clock((i2c_hal_data[bus]->i2c_master_instance)); -- twi_master_init((i2c_hal_data[bus]->i2c_master_instance), &config_i2c_master); -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of I2C post init -- * \param[in] iface instance -- * \return ATCA_STATUS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C send over ASF -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address, // TWI slave bus address -- .buffer = txdata, // transfer data source buffer -- .length = txlength, // transfer data size (bytes) -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- // txdata[0] is using _reserved byte of the ATCAPacket -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- packet.length = txlength; -- -- if (twi_master_write(i2c_hal_data[bus]->i2c_master_instance, &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C receive function for ASF I2C -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- int status = !STATUS_OK; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address, // TWI slave bus address -- .buffer = rxdata, // transfer data source buffer -- .length = *rxlength, // transfer data size (bytes) -- }; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = twi_master_read(i2c_hal_data[bus]->i2c_master_instance, &packet); -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief method to change the bus speed of I2C -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- */ -- --void change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- config_i2c_master.speed = speed; -- config_i2c_master.baud_reg = TWI_CLOCK_RATE(sysclk_get_cpu_hz(), speed); -- -- /*twi_reset();*/ -- -- twi_master_init((i2c_hal_data[bus]->i2c_master_instance), &config_i2c_master); --} -- --/** \brief wake up CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t bdrt = cfg->atcai2c.baud; -- int status = !STATUS_OK; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- if (bdrt != 100000) // if not already at 100KHz, change it -- { -- change_i2c_speed(iface, 100000); -- } -- -- // Send the wake by writing to an address of 0x00 -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = 0x00, // TWI slave bus address -- .buffer = &data[0], // transfer data source buffer -- .length = 0 // transfer data size (bytes) -- }; -- -- -- // Send the 00 address as the wake pulse -- twi_master_write(i2c_hal_data[bus]->i2c_master_instance, &packet); // part will NACK, so don't check for status -- -- atca_delay_us(cfg->wake_delay); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- packet.chip = cfg->atcai2c.slave_address; -- packet.length = 4; -- packet.buffer = data; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = twi_master_read(i2c_hal_data[bus]->i2c_master_instance, &packet); -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, bdrt); -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief idle CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address, // TWI slave bus address -- .buffer = &data[0], // transfer data source buffer -- .length = 1 // transfer data size (bytes) -- }; -- -- data[0] = 0x02; // idle word address value -- if (twi_master_write((i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; -- --} -- --/** \brief sleep CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address, // TWI slave bus address -- .buffer = &data[0], // transfer data source buffer -- .length = 1 // transfer data size (bytes) -- }; -- -- data[0] = 0x01; // sleep word address value -- if (twi_master_write((i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief manages reference count on given bus and releases resource if no more refences exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- -- if (i2c_bus_ref_ct > 0) -- { -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- } -- else -- { -- return ATCA_EXECUTION_ERROR; -- } -- -- if (hal->ref_ct <= 0) -- { -- return ATCA_EXECUTION_ERROR; -- } -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- twi_reset(); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_at90usb1287_i2c_asf.h b/lib/hal/hal_at90usb1287_i2c_asf.h -deleted file mode 100644 -index 82ef65e314e7..000000000000 ---- a/lib/hal/hal_at90usb1287_i2c_asf.h -+++ /dev/null -@@ -1,64 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for AT90USB1287 I2C over ASF drivers. -- * -- * Prerequisite: add I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_AT90USB1287_I2C_ASF_H_ --#define HAL_AT90USB1287_I2C_ASF_H_ -- --#include --#include "twi_megarf.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- -- --#define MAX_I2C_BUSES 1 // AT90USB1287 has only 1 PORT that can be configured as I2C -- --/** \brief this is the hal_data for ATCA HAL created using ASF -- */ --typedef struct atcaI2Cmaster --{ -- /*twi_master_t*/ int* i2c_master_instance; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --void change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ --#endif /* HAL_AT90USB1287_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_at90usb1287_timer_asf.c b/lib/hal/hal_at90usb1287_timer_asf.c -deleted file mode 100644 -index bd6260f5b11a..000000000000 ---- a/lib/hal/hal_at90usb1287_timer_asf.c -+++ /dev/null -@@ -1,79 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for AT90USB1287 timer/delay over ASF drivers. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of microseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay); --} -- --/** \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay * 10); -- --} -- --/** \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * \param[in] delay number of milliseconds to delay -- */ -- --/* ASF already has delay_ms - see delay.h */ --void atca_delay_ms(uint32_t delay) --{ -- // use ASF supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_i2c_bitbang.c b/lib/hal/hal_i2c_bitbang.c -deleted file mode 100644 -index d25cc9887e03..000000000000 ---- a/lib/hal/hal_i2c_bitbang.c -+++ /dev/null -@@ -1,518 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for I2C bit banging. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include --#include "atca_hal.h" --#include "atca_device.h" --#include "hal_i2c_bitbang.h" -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief These methods define the hardware abstraction layer for -- * communicating with a CryptoAuth device using I2C bit banging. -- @{ */ -- --/** -- * \brief Logical to physical bus mapping structure. -- */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; //!< map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; //!< total in-use count across buses -- -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the prior knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- -- i2c_discover_buses(i2c_buses, max_buses); -- -- return ATCA_SUCCESS; -- --} -- -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- //.atcai2c.baud = 100000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- ATCAHAL_t hal; -- -- hal_i2c_init(&hal, &discoverCfg); -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slaveAddress = 0x07; slaveAddress <= 0x78; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(packet.data, 0x00, sizeof(packet.data)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- printf("command response error\r\n"); -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < (int)sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- hal_i2c_release(&hal); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief This function creates a Start condition and sends the I2C -- * address. -- * -- * \param[in] RorW I2C_READ for reading, I2C_WRITE for writing. -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --static ATCA_STATUS hal_i2c_send_slave_address(ATCAIface iface, uint8_t RorW) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_TX_TIMEOUT; -- -- uint8_t sla = cfg->atcai2c.slave_address | RorW; -- -- i2c_send_start(); -- -- status = i2c_send_byte(sla); -- if (status != ATCA_SUCCESS) -- { -- i2c_send_stop(); -- } -- -- return status; --} -- --/** -- * \brief hal_i2c_init manages requests to initialize a physical -- * interface. It manages use counts so when an interface has -- * released the physical layer, it will disable the interface for -- * some other use. You can have multiple ATCAIFace instances using -- * the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and -- * ATCAIFace is abstracted from the physical details. -- */ -- --/** -- * \brief Initialize an I2C interface using given config. -- * -- * \param[in] hal opaque pointer to HAL data -- * \param[in] cfg interface configuration -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- int bus = cfg->atcai2c.bus; //!< 0-based logical bus number -- -- if (i2c_bus_ref_ct == 0) //!< power up state, no i2c buses will have been used -- -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; //!< total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- //! if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t)); -- i2c_hal_data[bus]->ref_ct = 1; //!< buses are shared, this is the first instance -- -- //! assign GPIO pins -- i2c_hal_data[bus]->pin_sda = i2c_buses_default.pin_sda[bus]; -- i2c_hal_data[bus]->pin_scl = i2c_buses_default.pin_scl[bus]; -- -- i2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl); -- i2c_enable(); -- -- //! store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- } -- else -- { -- //! otherwise, another interface already initialized the bus, so this interface will share it and any different -- //! cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- -- -- --/** \brief HAL implementation of I2C post init -- * \param[in] iface instance -- * \return ATCA_STATUS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** -- * \brief HAL implementation of Send byte(s) via I2C. -- * -- * \param[in] iface interface of the logical device to send data to -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_TX_TIMEOUT; -- -- int bus = cfg->atcai2c.bus; -- -- txdata[0] = 0x03; //!< Word Address Value = Command -- txlength++; //!< count Word Address byte towards txlength -- -- //! Set I2C pins -- i2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl); -- -- do -- { -- //! Address the device and indicate that bytes are to be written -- status = hal_i2c_send_slave_address(iface, I2C_WRITE); -- if (status != ATCA_SUCCESS) -- { -- break; -- } -- -- //! Send the remaining bytes -- status = i2c_send_bytes(txlength, txdata); -- } -- while (0); -- -- //! Send STOP regardless of i2c_status -- i2c_send_stop(); -- -- return status; --} -- --/** -- * \brief HAL implementation of Receive byte(s) via I2C. -- * -- * \param[in] iface interface of the logical device to receive data -- * from -- * \param[in] rxdata pointer to where bytes will be received -- * \param[in] rxlength pointer to expected number of receive bytes to -- * request -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_RX_TIMEOUT; -- -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint8_t count; -- -- //! Set I2C pins -- i2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl); -- -- while (retries-- > 0 && status != ATCA_SUCCESS) -- { -- //! Address the device and indicate that bytes are to be read -- status = hal_i2c_send_slave_address(iface, I2C_READ); -- if (status == ATCA_SUCCESS) -- { -- //! Receive count byte -- i2c_receive_byte(rxdata); -- count = rxdata[0]; -- if ((count < ATCA_RSP_SIZE_MIN) || (count > *rxlength)) -- { -- i2c_send_stop(); -- status = ATCA_INVALID_SIZE; -- break; -- } -- -- //! Receive the remaining bytes -- i2c_receive_bytes(count - 1, &rxdata[1]); -- } -- } -- if (status == ATCA_TX_TIMEOUT) -- { -- status = ATCA_RX_NO_RESPONSE; -- } -- -- return status; --} -- -- --/** \brief wake up CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_WAKE_FAILED; -- -- int bus = cfg->atcai2c.bus; -- uint8_t response[4] = { 0x00, 0x00, 0x00, 0x00 }; -- uint8_t expected_response[4] = { 0x04, 0x11, 0x33, 0x43 }; -- uint16_t response_size = sizeof(response); -- -- //! Set I2C pins -- i2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl); -- -- //! Generate Wake Token -- i2c_send_wake_token(); -- -- //! Wait tWHI + tWLO -- atca_delay_us(cfg->wake_delay); -- -- //! Receive Wake Response -- status = hal_i2c_receive(iface, response, &response_size); -- if (status == ATCA_SUCCESS) -- { -- //! Compare response with expected_response -- if (memcmp(response, expected_response, 4) != 0) -- { -- status = ATCA_WAKE_FAILED; -- } -- } -- -- return status; --} -- --/** \brief idle CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_TX_TIMEOUT; -- -- int bus = cfg->atcai2c.bus; -- -- //! Set I2C pins -- i2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl); -- -- //! Address the device and indicate that bytes are to be written -- status = hal_i2c_send_slave_address(iface, I2C_WRITE); -- if (status == ATCA_SUCCESS) -- { -- status = i2c_send_byte(0x02); //!< Word Address Value = Idle -- i2c_send_stop(); -- } -- -- return status; --} -- --/** \brief sleep CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_TX_TIMEOUT; -- -- int bus = cfg->atcai2c.bus; -- -- //! Set I2C pins -- i2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl); -- -- //! Address the device and indicate that bytes are to be written -- status = hal_i2c_send_slave_address(iface, I2C_WRITE); -- if (status == ATCA_SUCCESS) -- { -- status = i2c_send_byte(0x01); //!< Word Address Value = Sleep -- i2c_send_stop(); -- } -- -- return status; --} -- --/** \brief manages reference count on given bus and releases resource if no more refences exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- i2c_set_pin(i2c_hal_data[hal->bus_index]->pin_sda, i2c_hal_data[hal->bus_index]->pin_scl); -- i2c_disable(); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -\ No newline at end of file -diff --git a/lib/hal/hal_i2c_bitbang.h b/lib/hal/hal_i2c_bitbang.h -deleted file mode 100644 -index 02b33f83babf..000000000000 ---- a/lib/hal/hal_i2c_bitbang.h -+++ /dev/null -@@ -1,78 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for I2C bit banging. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_I2C_BITBANG_H_ --#define HAL_I2C_BITBANG_H_ -- -- -- -- -- --#if BOARD == AT88CK9000 --# include "i2c_bitbang_at88ck9000.h" --#endif -- --#if (SAMD21 == 1) --#include "i2c_bitbang_samd21.h" --#endif -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief These methods define the hardware abstraction layer for -- * communicating with a CryptoAuth device using I2C bit banging. -- @{ */ -- --/** -- * \brief This enumeration lists flags for I2C read or write addressing. -- */ --enum i2c_read_write_flag --{ -- I2C_WRITE = (uint8_t)0x00, //!< write command flag -- I2C_READ = (uint8_t)0x01 //!< read command flag --}; -- --/** -- * \brief This is the hal_data for ATCA HAL. -- */ --typedef struct atcaI2Cmaster --{ -- uint32_t pin_sda; -- uint32_t pin_scl; -- int ref_ct; -- //! for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --/** @} */ -- --#endif /* HAL_AT88CK900X_I2C_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_linux_kit_cdc.c b/lib/hal/hal_linux_kit_cdc.c -deleted file mode 100644 -index 232cefc93b97..000000000000 ---- a/lib/hal/hal_linux_kit_cdc.c -+++ /dev/null -@@ -1,428 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Linux using kit protocol over a USB CDC device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include "atca_hal.h" --#include "kit_phy.h" --#include "hal_linux_kit_cdc.h" --#include "kit_protocol.h" -- --#include --#include --#include --#include --#include --#include --#include -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// File scope macros --#ifndef __cplusplus --#define max(a, b) (((a) > (b)) ? (a) : (b)) --#define min(a, b) (((a) < (b)) ? (a) : (b)) --#endif -- --// File scope globals --atcacdc_t _gCdc; -- -- -- --char *dev = "/dev/ttyACM0"; // default device, Atmel CryptoAuth %n --//char *dev = "/dev/ttyATCA0"; // default device, Atmel CryptoAuth %n --int speed = B115200; -- --/** \brief discover cdc buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge.This function is currently not implemented. -- * \param[in] cdc_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- -- */ -- --ATCA_STATUS hal_cdc_discover_buses(int cdc_buses[], int max_buses) --{ -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ -- --ATCA_STATUS hal_cdc_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- return ATCA_UNIMPLEMENTED; --} -- -- -- --/** \brief HAL implementation of Kit USB CDC init -- * -- * this discovery assumes a udev rule is active which renames the ATCK101 CDC device as a ttyATCA%n -- * the udev rule is: -- * -- * SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2122", MODE:="0777", SYMLINK+="ttyATCA%n" -- * -- * \param[in] hal pointer to HAL specific data that is maintained by this HAL -- * \param[in] cfg pointer to HAL specific configuration data that is used to initialize this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_init(void* hal, ATCAIfaceCfg* cfg) --{ -- ATCAHAL_t *phal = NULL; -- struct termios serialTermios; -- uint32_t i = 0; -- uint32_t index = 0; -- int fd; -- -- // Check the input variables -- if ((hal == NULL) || (cfg == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Cast the hal to the ATCAHAL_t structure -- phal = (ATCAHAL_t*)hal; -- -- // Initialize the _gCdc structure -- memset(&_gCdc, 0, sizeof(_gCdc)); -- for (i = 0; i < CDC_DEVICES_MAX; i++) -- { -- _gCdc.kits[i].read_handle = INVALID_HANDLE_VALUE; -- _gCdc.kits[i].write_handle = INVALID_HANDLE_VALUE; -- } -- _gCdc.num_kits_found = 0; -- -- // Get the read & write handles -- // todo: perform an actual discovery here... -- if ( (fd = open(dev, O_RDWR | O_NOCTTY)) < 0) -- { -- printf("Failed to open %s ret:%02X\n", dev, fd); -- return ATCA_COMM_FAIL; -- } -- index++; -- // Save the results of this discovery of CDC -- if (index > 0) -- { -- _gCdc.num_kits_found = 1; -- phal->hal_data = &_gCdc; -- } -- -- tcgetattr(fd, &serialTermios); -- cfsetispeed(&serialTermios, speed); -- cfsetospeed(&serialTermios, speed); -- cfmakeraw(&serialTermios); -- -- serialTermios.c_cflag |= CS8 | CLOCAL | CREAD; -- serialTermios.c_iflag = 0; -- serialTermios.c_oflag = 0; -- serialTermios.c_lflag = 0; -- // serialTermios.c_cc[VMIN] = 1; -- // serialTermios.c_cc[VTIME] = 0; -- -- tcsetattr(fd, TCSANOW, &serialTermios); -- -- _gCdc.kits[0].read_handle = fd; -- _gCdc.kits[0].write_handle = fd; -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of Kit USB CDC post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_post_init(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- atcacdc_t* phaldat = atgetifacehaldat(iface); -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- //int cdcid = cfg->atcauart.port; -- int i = 0; -- -- // Init all kit USB devices -- for (i = 0; i < phaldat->num_kits_found; i++) -- { -- // Set the port -- cfg->atcauart.port = i; -- // Perform the kit protocol init -- status = kit_init(iface); -- if (status != ATCA_SUCCESS) -- { -- return status; -- } -- } -- -- return status; --} -- --/** \brief HAL implementation of kit protocol send .It is called by the top layer. -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_send(ATCAIface iface, const char* txdata, int txlength) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int cdcid = cfg->atcauart.port; -- atcacdc_t* pCdc = (atcacdc_t*)atgetifacehaldat(iface); -- size_t bytesWritten = 0; -- --#ifdef KIT_DEBUG -- printf("--> %s", txdata); --#endif -- // Verify the input parameters -- if ((txdata == NULL) || (pCdc == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Verify the write handle -- if (pCdc->kits[cdcid].write_handle == INVALID_HANDLE_VALUE) -- { -- return ATCA_COMM_FAIL; -- } -- -- // Write the bytes to the specified com port -- bytesWritten = write(pCdc->kits[cdcid].write_handle, txdata, txlength); -- -- return status; --} -- --/** \brief HAL implementation of kit protocol receive data.It is called by the top layer. -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_receive(ATCAIface iface, char* rxdata, int* rxsize) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int cdcid = cfg->atcauart.port; -- atcacdc_t* pCdc = (atcacdc_t*)atgetifacehaldat(iface); -- uint8_t buffer[CDC_BUFFER_MAX] = { 0 }; -- bool continue_read = true; -- int bytes_read = 0; -- uint16_t total_bytes = 0; -- char* location = NULL; -- int bytes_remain = 0; -- int bytes_to_cpy = 0; -- -- do -- { -- // Verify the input variables -- if ((rxdata == NULL) || (rxsize == NULL) || (pCdc == NULL)) -- { -- status = ATCA_BAD_PARAM; -- break; -- } -- // Verify the write handle -- if (pCdc->kits[cdcid].read_handle == INVALID_HANDLE_VALUE) -- { -- status = ATCA_COMM_FAIL; -- break; -- } -- // Read all of the bytes -- while (continue_read == true) -- { -- bytes_read = read(pCdc->kits[cdcid].read_handle, buffer, CDC_BUFFER_MAX); -- -- // Find the location of the '\n' character in read buffer -- // todo: generalize this read... it only applies if there is an ascii protocol with an of \n and if the exists -- location = strchr((char*)&buffer[0], '\n'); -- if (location == NULL) -- { -- // Copy all of the bytes -- bytes_to_cpy = bytes_read; -- } -- else -- { -- // Copy only the bytes remaining in the read buffer to the -- bytes_to_cpy = (uint8_t)(location - (char*)buffer) + 1; -- // The response has been received, stop receiving more data -- continue_read = false; -- } -- // Protect rxdata from overwriting, this will have the result of truncating the returned bytes -- // Remaining space in rxdata -- bytes_remain = (*rxsize - total_bytes); -- // Use the minimum between number of bytes read and remaining space -- bytes_to_cpy = min(bytes_remain, bytes_to_cpy); -- -- // Copy the received data -- memcpy(&rxdata[total_bytes], &buffer[0], bytes_to_cpy); -- total_bytes += bytes_to_cpy; -- } -- -- } -- while (0); -- -- *rxsize = total_bytes; --#ifdef KIT_DEBUG -- printf("<-- %s", rxdata); --#endif -- return status; --} -- --/** \brief Number of USB CDC devices found -- * \param[out] num_found -- * \return ATCA_STATUS -- */ --ATCA_STATUS hal_kit_phy_num_found(int8_t* num_found) --{ -- *num_found = _gCdc.num_kits_found; -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of kit protocol send over USB CDC -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_send(ATCAIface iface, uint8_t* txdata, int txlength) --{ -- // Call the hal_kit_send() function that will call hal_phy_send() implemented below -- return kit_send(iface, txdata, txlength); --} -- --/** \brief HAL implementation of kit protocol receive over USB CDC -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_receive(ATCAIface iface, uint8_t* rxdata, uint16_t* rxsize) --{ -- // Call the hal_kit_receive() function that will call hal_phy_receive() implemented below -- return kit_receive(iface, rxdata, rxsize); --} -- --/** \brief Call the wake for kit protocol over USB CDC -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_wake(ATCAIface iface) --{ -- // Call the hal_kit_wake() function that will call hal_phy_send() and hal_phy_receive() -- return kit_wake(iface); --} -- --/** \brief Call the idle for kit protocol over USB CDC -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code.S -- */ --ATCA_STATUS hal_kit_cdc_idle(ATCAIface iface) --{ -- // Call the hal_kit_idle() function that will call hal_phy_send() and hal_phy_receive() -- return kit_idle(iface); --} -- --/** \brief Call the sleep for kit protocol over USB CDC -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_sleep(ATCAIface iface) --{ -- // Call the hal_kit_sleep() function that will call hal_phy_send() and hal_phy_receive() -- return kit_sleep(iface); --} -- --/** \brief Close the physical port for CDC over USB CDC -- * \param[in] hal_data The hardware abstraction data specific to this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_release(void* hal_data) --{ -- int i = 0; -- atcacdc_t* phaldat = (atcacdc_t*)hal_data; -- -- if ((hal_data == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Close all kit USB devices -- for (i = 0; i < phaldat->num_kits_found; i++) -- { -- if (phaldat->kits[i].read_handle != INVALID_HANDLE_VALUE) -- { -- close(phaldat->kits[i].read_handle); -- phaldat->kits[i].read_handle = INVALID_HANDLE_VALUE; -- } -- -- if (phaldat->kits[i].write_handle != INVALID_HANDLE_VALUE) -- { -- close(phaldat->kits[i].write_handle); -- phaldat->kits[i].write_handle = INVALID_HANDLE_VALUE; -- } -- } -- return ATCA_SUCCESS; --} -- --/** \brief discover cdc buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge.This function is currently not implemented. -- * \param[in] cdc_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- -- */ --ATCA_STATUS hal_kit_cdc_discover_buses(int cdc_buses[], int max_buses) --{ -- // TODO: Implement -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ -- --ATCA_STATUS hal_kit_cdc_discover_devices(int busNum, ATCAIfaceCfg *cfg, int *found) --{ -- // TODO: Implement -- *found = 0; -- return ATCA_UNIMPLEMENTED; --} --/** @} */ -diff --git a/lib/hal/hal_linux_kit_cdc.h b/lib/hal/hal_linux_kit_cdc.h -deleted file mode 100644 -index c0dcf4ab9801..000000000000 ---- a/lib/hal/hal_linux_kit_cdc.h -+++ /dev/null -@@ -1,67 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Linux using kit protocol over a USB CDC device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_LINUX_KIT_CDC_H_ --#define HAL_LINUX_KIT_CDC_H_ -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// Kit USB defines --#define CDC_DEVICES_MAX 10 //! Maximum number of supported Kit USB devices --#define CDC_BUFFER_MAX 1024 //! Maximum number of bytes read per port read -- -- --// Each device that is found will have a read handle and a write handle --typedef int HANDLE; --#define INVALID_HANDLE_VALUE ((int)(-1)) --typedef struct cdc_device --{ -- HANDLE read_handle; //! The kit USB read file handle -- HANDLE write_handle; //! The kit USB write file handle --} cdc_device_t; -- -- --// A structure to hold CDC information --typedef struct atcacdc --{ -- cdc_device_t kits[CDC_DEVICES_MAX]; -- int8_t num_kits_found; --} atcacdc_t; -- --/** @} */ -- --#endif /* HAL_LINUX_KIT_CDC_H_ */ -- -diff --git a/lib/hal/hal_linux_kit_hid.c b/lib/hal/hal_linux_kit_hid.c -deleted file mode 100644 -index 960d18c7ddea..000000000000 ---- a/lib/hal/hal_linux_kit_hid.c -+++ /dev/null -@@ -1,429 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Linux using kit protocol over a USB HID device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include --#include -- --#include "atca_hal.h" --#include "hal_linux_kit_hid.h" --#include "hal/kit_protocol.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// File scope globals --atcahid_t _gHid; -- --/** \brief discover hid buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge.This function is currently not implemented. -- * \param[in] cdc_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- */ -- --ATCA_STATUS hal_kit_hid_discover_buses(int hid_buses[], int max_buses) --{ -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number.This function is currently not implemented. -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_kit_hid_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief HAL implementation of Kit USB HID init -- * \param[in] hal pointer to HAL specific data that is maintained by this HAL -- * \param[in] cfg pointer to HAL specific configuration data that is used to initialize this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_init(void* hal, ATCAIfaceCfg* cfg) --{ -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- int status = 0; -- struct udev *udev = NULL; -- struct udev_enumerate *enumerate = NULL; -- struct udev_list_entry *list = NULL; -- struct udev_list_entry *list_entry = NULL; -- struct udev_device *syspath_device = NULL; -- struct udev_device *device = NULL; -- int i = 0; -- char hid_filter[20]; -- char device_hid[20]; -- FILE *file_descriptor = NULL; -- int index = 0; -- -- // Check the input variables -- if ((cfg == NULL) || (phal == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Initialize the _gHid structure -- memset(&_gHid, 0, sizeof(_gHid)); -- for (i = 0; i < HID_DEVICES_MAX; i++) -- { -- _gHid.kits[i].read_handle = NULL; -- _gHid.kits[i].write_handle = NULL; -- } -- -- _gHid.num_kits_found = 0; -- -- // Create the udev object -- udev = udev_new(); -- if (udev == NULL) -- { -- return ATCA_COMM_FAIL; -- } -- -- // Create the enumerate object -- enumerate = udev_enumerate_new(udev); -- if (enumerate == NULL) -- { -- // Free the udev object -- udev_unref(udev); -- -- return ATCA_COMM_FAIL; -- } -- -- // Create the list of available USB devices -- status = udev_enumerate_add_match_subsystem(enumerate, "hidraw"); -- if (status >= 0) -- { -- status = udev_enumerate_scan_devices(enumerate); -- if (status >= 0) -- { -- list = udev_enumerate_get_list_entry(enumerate); -- } -- } -- -- // Create the HID filter string -- memset(hid_filter, 0, sizeof(hid_filter)); -- sprintf(hid_filter, "vid_%04x&pid_%04x", cfg->atcahid.vid, cfg->atcahid.pid); -- -- // Find the available kit USB devices -- udev_list_entry_foreach(list_entry, list) -- { -- // Get the udev device -- syspath_device = udev_device_new_from_syspath(udev, udev_list_entry_get_name(list_entry)); -- device = udev_device_get_parent_with_subsystem_devtype(syspath_device, "usb", "usb_device"); -- -- // Create the device HID string -- memset(device_hid, 0, sizeof(device_hid)); -- sprintf(device_hid, "vid_%s&pid_%s", -- udev_device_get_sysattr_value(device, "idVendor"), -- udev_device_get_sysattr_value(device, "idProduct")); -- -- // Determine if this is the correct kit USB device -- if (strcasecmp(device_hid, hid_filter) == 0) -- { -- // Open the kit USB device for reading and writing -- if (_gHid.kits[index].read_handle != NULL) -- { -- fclose(_gHid.kits[index].read_handle); -- } -- if (_gHid.kits[index].write_handle != NULL) -- { -- fclose(_gHid.kits[index].write_handle); -- } -- -- file_descriptor = fopen(udev_device_get_devnode(syspath_device), "rb+"); -- if (file_descriptor != NULL) -- { -- _gHid.kits[index].read_handle = file_descriptor; -- _gHid.kits[index].write_handle = file_descriptor; -- -- // Increment the opened kit USB device index -- index++; -- --#ifdef KIT_DEBUG -- printf("Kit USB Device Node: %s\n", udev_device_get_devnode(syspath_device)); -- printf(" Manufacturer %s (%s)\n", -- udev_device_get_sysattr_value(device, "manufacturer"), -- udev_device_get_sysattr_value(device, "product")); -- printf(" VID/PID: %s %s\n", -- udev_device_get_sysattr_value(device, "idVendor"), -- udev_device_get_sysattr_value(device, "idProduct")); --#endif // KIT_DEBUG -- } -- else -- { --#ifdef KIT_DEBUG -- printf("fopen(\"%s\") failed with errno=%d\n", -- udev_device_get_devnode(syspath_device), -- errno); --#endif // KIT_DEBUG -- } -- } -- -- // Free the udev device object -- udev_device_unref(syspath_device); -- } -- -- // Save the results of this discovery of HID -- if (index > 0) -- { -- _gHid.num_kits_found = index; -- phal->hal_data = &_gHid; -- } -- -- // Free the enumerator object -- udev_enumerate_unref(enumerate); -- -- // Free the udev object -- udev_unref(udev); -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of Kit HID post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_post_init(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- atcahid_t* pHid = atgetifacehaldat(iface); -- ATCAIfaceCfg *pCfg = atgetifacecfg(iface); -- int i = 0; -- -- if ((pHid == NULL) || (pCfg == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Perform the kit protocol init -- for (i = 0; i < pHid->num_kits_found; i++) -- { -- status = kit_init(iface); -- if (status != ATCA_SUCCESS) -- { -- BREAK(status, "kit_init() Failed"); -- } -- } -- -- return status; --} -- --/** \brief HAL implementation of send over Kit protocol.This function is called by the top layer. -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_send(ATCAIface iface, uint8_t* txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- atcahid_t* pHid = (atcahid_t*)atgetifacehaldat(iface); -- size_t bytes_written = 0; -- -- if ((txdata == NULL) || (cfg == NULL) || (pHid == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- if (pHid->kits[cfg->atcahid.idx].write_handle == NULL) -- { -- return ATCA_COMM_FAIL; -- } -- -- // Send the data to the kit USB device -- if (txlength > 0) -- { -- bytes_written = fwrite(txdata, sizeof(uint8_t), txlength, -- pHid->kits[cfg->atcahid.idx].write_handle); -- if (bytes_written != txlength) -- { -- clearerr(pHid->kits[cfg->atcahid.idx].write_handle); -- return ATCA_TX_FAIL; -- } -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of kit protocol receive.This function is called by the top layer. -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_receive(ATCAIface iface, uint8_t* rxdata, int* rxsize) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- atcahid_t* pHid = (atcahid_t*)atgetifacehaldat(iface); -- bool continue_read = true; -- size_t bytes_read = 0; -- size_t total_bytes_read = 0; -- -- if ((rxdata == NULL) || (rxsize == NULL) || (cfg == NULL) || (pHid == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- if (pHid->kits[cfg->atcahid.idx].read_handle == NULL) -- { -- return ATCA_COMM_FAIL; -- } -- -- // Receive the data from the kit USB device -- do -- { -- bytes_read = fread(&rxdata[total_bytes_read], sizeof(uint8_t), 1, -- pHid->kits[cfg->atcahid.idx].read_handle); -- if (ferror(pHid->kits[cfg->atcahid.idx].read_handle) != 0) -- { -- clearerr(pHid->kits[cfg->atcahid.idx].read_handle); -- return ATCA_RX_FAIL; -- } -- -- total_bytes_read += bytes_read; -- -- // Check if the kit protocol message has been received -- if (strstr((char*)rxdata, "\n") != NULL) -- { -- continue_read = false; -- } -- } -- while (continue_read == true); -- -- // Save the total bytes read -- *rxsize = total_bytes_read; -- -- return ATCA_SUCCESS; --} -- --/** \brief Number of USB HID devices found -- * \param[out] num_found -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_num_found(int8_t* num_found) --{ -- *num_found = _gHid.num_kits_found; -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of kit protocol send over USB HID -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_send(ATCAIface iface, uint8_t* txdata, int txlength) --{ -- // Call the kit_send() function that will call phy_send() implemented below -- return kit_send(iface, txdata, txlength); --} -- --/** \brief HAL implementation of send over USB HID -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_receive(ATCAIface iface, uint8_t* rxdata, uint16_t* rxsize) --{ -- // Call the kit_receive() function that will call phy_receive() implemented below -- return kit_receive(iface, rxdata, rxsize); --} -- --/** \brief Call the wake for kit protocol over USB HID -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_wake(ATCAIface iface) --{ -- // Call the kit_wake() function that will call phy_send() and phy_receive() -- return kit_wake(iface); --} -- --/** \brief Call the idle for kit protocol over USB HID -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_idle(ATCAIface iface) --{ -- // Call the kit_idle() function that will call phy_send() and phy_receive() -- return kit_idle(iface); --} -- --/** \brief Call the sleep for kit protocol over USB HID -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_sleep(ATCAIface iface) --{ -- // Call the kit_sleep() function that will call phy_send() and phy_receive() -- return kit_sleep(iface); --} -- --/** \brief Close the physical port for HID -- * \param[in] hal_data The hardware abstraction data specific to this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_release(void* hal_data) --{ -- atcahid_t* phaldat = (atcahid_t*)hal_data; -- int i = 0; -- -- if (phaldat == NULL) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Close all kit USB devices -- for (i = 0; i < phaldat->num_kits_found; i++) -- { -- if (_gHid.kits[i].read_handle != NULL) -- { -- fclose(_gHid.kits[i].read_handle); -- _gHid.kits[i].read_handle = NULL; -- _gHid.kits[i].write_handle = NULL; -- } -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_linux_kit_hid.h b/lib/hal/hal_linux_kit_hid.h -deleted file mode 100644 -index 649aab556668..000000000000 ---- a/lib/hal/hal_linux_kit_hid.h -+++ /dev/null -@@ -1,62 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Linux using kit protocol over a USB HID device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_LINUX_KIT_HID_H_ --#define HAL_LINUX_KIT_HID_H_ -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// Kit USB defines --#define HID_DEVICES_MAX 10 //! Maximum number of supported Kit USB devices --#define HID_PACKET_MAX 512 //! Maximum number of bytes for a HID send/receive packet (typically 64) -- --// Each device that is found will have a read handle and a write handle --typedef struct hid_device --{ -- FILE *read_handle; //! The kit USB read file handle -- FILE *write_handle; //! The kit USB write file handle --} hid_device_t; -- -- --// A structure to hold HID information --typedef struct atcahid --{ -- hid_device_t kits[HID_DEVICES_MAX]; -- int8_t num_kits_found; --} atcahid_t; -- --/** @} */ --#endif /* HAL_LINUX_KIT_HID_H_ */ -diff --git a/lib/hal/hal_pic32mx695f512h_i2c.c b/lib/hal/hal_pic32mx695f512h_i2c.c -deleted file mode 100644 -index 730d782d7e51..000000000000 ---- a/lib/hal/hal_pic32mx695f512h_i2c.c -+++ /dev/null -@@ -1,510 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for PIC32MX695F512H I2C over plib drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the xxx I2C primitives to set up the interface. -- * -- * Prerequisite: -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include -- --#include "hal/atca_hal.h" --#include "hal/hal_pic32mx695f512h_i2c.h" -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** -- * \brief -- * Logical to physical bus mapping structure -- */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses --//twi_options_t opt_twi_master; -- -- --/****** I2C Driver implementation *******/ --static bool StartTransfer(I2C_MODULE i2c_id, bool restart) --{ -- I2C_STATUS status; -- -- // Send the Start (or Restart) signal -- if (restart) -- { -- I2CRepeatStart(i2c_id); -- } -- else -- { -- // Wait for the bus to be idle, then start the transfer -- while (!I2CBusIsIdle(i2c_id)) -- { -- ; -- } -- -- if (I2CStart(i2c_id) != I2C_SUCCESS) -- { -- //DBPRINTF("Error: Bus collision during transfer Start\n"); -- return FALSE; -- } -- } -- -- // Wait for the signal to complete -- do -- { -- status = I2CGetStatus(i2c_id); -- } -- -- while (!(status & I2C_START)); -- -- return TRUE; --} -- --static bool TransmitOneByte(I2C_MODULE i2c_id, uint8_t data) --{ -- // Wait for the transmitter to be ready -- while (!I2CTransmitterIsReady(i2c_id)) -- { -- ; -- } -- -- // Transmit the byte -- if (I2CSendByte(i2c_id, data) == I2C_MASTER_BUS_COLLISION) -- { -- //DBPRINTF("Error: I2C Master Bus Collision\n"); -- return FALSE; -- } -- -- // Wait for the transmission to finish -- while (!I2CTransmissionHasCompleted(i2c_id)) -- { -- ; -- } -- -- return TRUE; --} -- --static uint8_t ReceiveOneByte(I2C_MODULE i2c_id, bool ack) --{ -- uint8_t data; -- -- // Enable I2C receive -- I2CReceiverEnable(i2c_id, TRUE); -- -- // Wait until 1-byte is fully received -- while (!I2CReceivedDataIsAvailable(i2c_id)) -- { -- ; -- } -- -- // Save the byte received -- data = I2CGetByte(i2c_id); -- -- // Perform acknowledgement sequence -- I2CAcknowledgeByte(i2c_id, ack); -- -- // Wait until acknowledgement is successfully sent -- while (!I2CAcknowledgeHasCompleted(i2c_id)) -- { -- ; -- } -- -- return data; --} -- --static void StopTransfer(I2C_MODULE i2c_id) --{ -- I2C_STATUS status; -- -- // Send the Stop signal -- I2CStop(i2c_id); -- -- // Wait for the signal to complete -- do -- { -- status = I2CGetStatus(i2c_id); -- } -- -- while (!(status & I2C_STOP)); --} -- --void i2c_write(I2C_MODULE i2c_id, uint8_t address, uint8_t *data, int len) --{ -- uint8_t i2cBuffer[len + 1]; -- int i; -- -- i2cBuffer[0] = address | 0x00; -- memcpy(&i2cBuffer[1], data, len); -- -- if (!StartTransfer(i2c_id, FALSE)) -- { -- return; -- } -- for (i = 0; i < len + 1; i++) -- { -- if (!TransmitOneByte(i2c_id, i2cBuffer[i])) -- { -- break; -- } -- } -- -- StopTransfer(i2c_id); --} -- --void i2c_read(I2C_MODULE i2c_id, uint8_t address, uint8_t *data, uint16_t len) --{ -- uint16_t i; -- -- if (!StartTransfer(i2c_id, FALSE)) -- { -- return; -- } -- -- if (!TransmitOneByte(i2c_id, (address | 0x01))) -- { -- return; -- } -- -- for (i = 0; i < len; i++) -- { -- if (i < len - 1) // send ACK -- { -- data[i] = ReceiveOneByte(i2c_id, TRUE); -- } -- else // send NACK -- { -- data[i] = ReceiveOneByte(i2c_id, FALSE); -- } -- } -- -- StopTransfer(i2c_id); --} --/****************************************/ -- -- --/** -- * \brief -- * This HAL implementation assumes you've included the Plib libraries in your project, otherwise, -- * the HAL layer will not compile because the Plib drivers are a dependency -- */ -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge.This function is currently not implemented. -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number.This function is currently not implemented. -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- return ATCA_UNIMPLEMENTED; --} -- --/** -- * \brief -- * hal_i2c_init manages requests to initialize a physical interface. It manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** -- * \brief initialize an I2C interface using given config -- * -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- int i; -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- -- { -- for (i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- //// if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t)); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- -- switch (bus) -- { --// case 0: --// i2c_hal_data[bus]->id = I2C0; --// break; -- case 1: -- i2c_hal_data[bus]->id = I2C1; -- break; --// case 2: --// i2c_hal_data[bus]->id = I2C2; --// break; -- case 3: -- i2c_hal_data[bus]->id = I2C3; -- break; -- } -- -- // Set the I2C baudrate -- I2CSetFrequency(i2c_hal_data[bus]->id, GetPeripheralClock(), cfg->atcai2c.baud); -- -- // Enable the I2C bus -- I2CEnable(i2c_hal_data[bus]->id, TRUE); -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** -- * \brief HAL implementation of I2C post init -- * -- * \param[in] iface instance -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** -- * \brief HAL implementation of I2C send over ASF -- * -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- -- i2c_write(i2c_hal_data[bus]->id, cfg->atcai2c.slave_address, txdata, txlength); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief HAL implementation of I2C receive function for ASF I2C -- * -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- i2c_read(i2c_hal_data[bus]->id, cfg->atcai2c.slave_address, rxdata, *rxlength); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief method to change the bus speed of I2C -- * -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- */ --void change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- // Disable the I2C bus -- I2CEnable(i2c_hal_data[bus]->id, FALSE); -- -- // Set the I2C baudrate -- I2CSetFrequency(i2c_hal_data[bus]->id, GetPeripheralClock(), speed); -- -- // Enable the I2C bus -- I2CEnable(i2c_hal_data[bus]->id, TRUE); --} -- --/** -- * \brief wake up CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to wakeup -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint32_t bdrt = cfg->atcai2c.baud; -- -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- if (bdrt != 100000) // if not already at 100KHz, change it -- { -- change_i2c_speed(iface, 100000); -- } -- -- // Send 0x00 as wake pulse -- i2c_write(i2c_hal_data[bus]->id, 0x00, NULL, NULL); -- -- atca_delay_ms(3); // wait tWHI + tWLO which is configured based on device type and configuration structure -- //atca_delay_us(cfg->wake_delay); -- -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, cfg->atcai2c.baud); -- } -- -- i2c_read(i2c_hal_data[bus]->id, cfg->atcai2c.slave_address, data, 4); -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** -- * \brief idle CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to idle -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- data[0] = 0x02; // idle word address value -- -- i2c_write(i2c_hal_data[bus]->id, cfg->atcai2c.slave_address, data, 1); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief sleep CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to sleep -- * -- * \return ATCA_SUCESS -- */ --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- data[0] = 0x01; // idle word address value -- -- i2c_write(i2c_hal_data[bus]->id, cfg->atcai2c.slave_address, data, 1); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief manages reference count on given bus and releases resource if no more refences exist -- * -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * -- * \return ATCA_SUCESS -- */ --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- I2CEnable(hal->id, FALSE); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -\ No newline at end of file -diff --git a/lib/hal/hal_pic32mx695f512h_i2c.h b/lib/hal/hal_pic32mx695f512h_i2c.h -deleted file mode 100644 -index 1b242168b43d..000000000000 ---- a/lib/hal/hal_pic32mx695f512h_i2c.h -+++ /dev/null -@@ -1,74 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for PIC32MX695F512H I2C over xxx drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the xxx I2C primitives to set up the interface. -- * -- * Prerequisite: -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_PIC32MX695F512H_I2C_ASF_H_ --#define HAL_PIC32MX695F512H_I2C_ASF_H_ -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// Clock Constants --#define GetSystemClock() (80000000ul) --#define GetPeripheralClock() (GetSystemClock() / (1 << OSCCONbits.PBDIV)) --#define GetInstructionClock() (GetSystemClock()) -- --#define MAX_I2C_BUSES 4 // PIC32MX695F512H has 4 TWI -- --/** -- * \brief this is the hal_data for ATCA HAL -- */ --typedef struct atcaI2Cmaster --{ -- I2C_MODULE id; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --void i2c_write(I2C_MODULE i2c_id, uint8_t address, uint8_t *data, int len); --void i2c_read(I2C_MODULE i2c_id, uint8_t address, uint8_t *data, uint16_t len); -- --void change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ -- --#endif /* HAL_PIC32MX695F512H_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_pic32mx695f512h_timer.c b/lib/hal/hal_pic32mx695f512h_timer.c -deleted file mode 100644 -index b4963d2d31a8..000000000000 ---- a/lib/hal/hal_pic32mx695f512h_timer.c -+++ /dev/null -@@ -1,106 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for PIC32MX695F512H timer/delay routine -- * -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include -- --#include "hal/atca_hal.h" -- -- --/* ASF already have delay_us and delay_ms - see delay.h */ -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- -- --#define CPU_CLOCK (80000000UL) --#define us_SCALE ((CPU_CLOCK / 2) / 1000000) -- -- --void delay_us(UINT32 delay) --{ -- UINT32 startCnt = ReadCoreTimer(); -- UINT32 waitCnt = delay * us_SCALE; -- -- while ((ReadCoreTimer() - startCnt) < waitCnt) -- { -- ; -- } -- --} -- -- -- -- --/****************************************/ -- --/** -- * \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of 0.001 milliseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- delay_us(delay); --} -- --/** -- * \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- atca_delay_us(delay * 10); --} -- --/** -- * \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * -- * \param[in] delay number of milliseconds to delay -- */ --void atca_delay_ms(uint32_t delay) --{ -- -- atca_delay_us(delay * 1000); -- --} -- --/** @} */ -\ No newline at end of file -diff --git a/lib/hal/hal_sam4s_i2c_asf.c b/lib/hal/hal_sam4s_i2c_asf.c -deleted file mode 100644 -index 619de4d1b6a4..000000000000 ---- a/lib/hal/hal_sam4s_i2c_asf.c -+++ /dev/null -@@ -1,667 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAM4S I2C over ASF drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the ASF I2C primitives to set up the interface. -- * -- * Prerequisite: add "TWI - Two-Wire Interface (Common API) (service)" module to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include --#include "atca_hal.h" --#include "hal_sam4s_i2c_asf.h" --#include "atca_device.h" -- -- -- --//!< Uncomment when debugging --/*#define DEBUG_HAL*/ -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --/** -- * \brief -- * Logical to physical bus mapping structure -- */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses --twi_master_options_t opt_twi_master; -- -- --#ifdef DEBUG_HAL --static void print_array(uint8_t *data, uint32_t data_size) --{ -- uint32_t n; -- -- for (n = 0; n < data_size; n++) -- { -- printf("%.2x ", data[n]); -- if (((n + 1) % 16) == 0) -- { -- printf("\r\n"); -- if ((n + 1) != data_size) -- { -- printf(" "); -- } -- } -- } -- if (data_size % 16 != 0) -- { -- printf("\r\n"); -- } --} --#endif -- --/** -- * \brief -- * This HAL implementation assumes you've included the ASF TWI libraries in your project, otherwise, -- * the HAL layer will not compile because the ASF TWI drivers are a dependency -- */ -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- /* logical bus numbers 0-2 map to the SAM4S i2c buses: -- ID_TWI0 -- ID_TWI1 -- -- TWS0 bus will respond on the SAM4S Xplained Pro board -- -- */ -- int i; -- -- i2c_buses[0] = 0; --#if MAX_I2C_BUSES == 2 -- i2c_buses[1] = -1; --#endif -- return ATCA_SUCCESS; -- --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- ATCAHAL_t hal; -- -- if (busNum < 0) -- { -- return ATCA_COMM_FAIL; -- } -- -- hal_i2c_init(&hal, &discoverCfg); -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slaveAddress = 0x07; slaveAddress <= 0x78; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(packet.data, 0x00, sizeof(packet.data)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < (int)sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- //hal_i2c_release(&hal); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief -- * hal_i2c_init manages requests to initialize a physical interface. It manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** -- * \brief initialize an I2C interface using given config -- * -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t)); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- -- switch (bus) -- { -- case 0: -- i2c_hal_data[bus]->twi_id = ID_TWI0; -- i2c_hal_data[bus]->twi_master_instance = TWI0; -- break; -- case 1: -- i2c_hal_data[bus]->twi_id = ID_TWI1; -- i2c_hal_data[bus]->twi_master_instance = TWI1; -- // configure TWI1 pins -- gpio_configure_pin(PIO_PB4_IDX, (PIO_PERIPH_A | PIO_PULLUP)); -- gpio_configure_pin(PIO_PB5_IDX, (PIO_PERIPH_A | PIO_PULLUP)); -- // disable JTAG -- MATRIX->CCFG_SYSIO |= (1 << 4) | (1 << 5); -- break; -- } -- -- pmc_enable_periph_clk(i2c_hal_data[bus]->twi_id); -- -- opt_twi_master.master_clk = sysclk_get_cpu_hz(); -- opt_twi_master.speed = cfg->atcai2c.baud; -- opt_twi_master.smbus = 0; -- -- twi_master_init(i2c_hal_data[bus]->twi_master_instance, &opt_twi_master); -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** -- * \brief HAL implementation of I2C post init -- * -- * \param[in] iface instance -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** -- * \brief HAL implementation of I2C send over ASF -- * -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ --#ifdef DEBUG_HAL -- printf("hal_i2c_send()\r\n"); -- -- printf("\r\nCommand Packet (size:0x%.8x)\r\n", (uint32_t)txlength); -- printf("Count : %.2x\r\n", txdata[1]); -- printf("Opcode : %.2x\r\n", txdata[2]); -- printf("Param1 : %.2x\r\n", txdata[3]); -- printf("Param2 : "); print_array(&txdata[4], 2); -- if (txdata[1] > 7) -- { -- printf("Data : "); print_array(&txdata[6], txdata[1] - 7); -- } -- printf("CRC : "); print_array(&txdata[txdata[1] - 1], 2); -- printf("\r\n"); --#endif -- -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- -- twi_package_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = (void*)txdata, -- .length = (uint32_t)txlength //(uint32_t)txdata[1] -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- -- if (twi_master_write(i2c_hal_data[bus]->twi_master_instance, &packet) != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief HAL implementation of I2C receive function for ASF I2C -- * -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ --#ifdef DEBUG_HAL -- printf("hal_i2c_receive()\r\n"); --#endif -- -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t status = !TWI_SUCCESS; -- -- twi_package_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = (void*)rxdata, -- .length = (uint32_t)*rxlength -- }; -- -- while (retries-- > 0 && status != TWI_SUCCESS) -- { -- status = twi_master_read(i2c_hal_data[bus]->twi_master_instance, &packet); -- } -- if (status != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- --#ifdef DEBUG_HAL -- printf("\r\nResponse Packet (size:0x%.4x)\r\n", rxlength); -- printf("Count : %.2x\r\n", rxdata[0]); -- if (rxdata[0] > 3) -- { -- printf("Data : "); print_array(&rxdata[1], rxdata[0] - 3); -- printf("CRC : "); print_array(&rxdata[rxdata[0] - 2], 2); -- } -- printf("\r\n"); --#endif -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief method to change the bus speed of I2C -- * -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- */ --void change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- -- pmc_enable_periph_clk(i2c_hal_data[bus]->twi_id); -- -- opt_twi_master.master_clk = sysclk_get_cpu_hz(); -- opt_twi_master.speed = speed; -- opt_twi_master.smbus = 0; -- -- twi_master_init(i2c_hal_data[bus]->twi_master_instance, &opt_twi_master); --} -- --/** -- * \brief wake up CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to wakeup -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t bdrt = cfg->atcai2c.baud; -- int status = !TWI_SUCCESS; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- // if not already at 100kHz, change it -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, 100000); -- } -- -- // Send 0x00 as wake pulse -- twi_write_byte(i2c_hal_data[bus]->twi_master_instance, 0x00); -- -- // rounded up to the nearest ms -- atca_delay_ms(((uint32_t)cfg->wake_delay + (1000 - 1)) / 1000); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- twi_package_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = (void*)data, -- .length = 4 -- }; -- -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, bdrt); -- } -- -- while (retries-- > 0 && status != TWI_SUCCESS) -- { -- status = twi_master_read(i2c_hal_data[bus]->twi_master_instance, &packet); -- } -- if (status != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** -- * \brief idle CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to idle -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- data[0] = 0x02; // idle word address value -- -- twi_package_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = (void*)data, -- .length = 1 -- }; -- -- if (twi_master_write(i2c_hal_data[bus]->twi_master_instance, &packet) != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief sleep CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to sleep -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- data[0] = 0x01; // sleep word address value -- -- twi_package_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = (void*)data, -- .length = 1 -- }; -- -- if (twi_master_write(i2c_hal_data[bus]->twi_master_instance, &packet) != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief manages reference count on given bus and releases resource if no more refences exist -- * -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- // set to default i2c bus -- if (hal->bus_index > MAX_I2C_BUSES - 1) -- { -- hal->bus_index = 0; -- } -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- twi_reset(hal->twi_master_instance); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_sam4s_i2c_asf.h b/lib/hal/hal_sam4s_i2c_asf.h -deleted file mode 100644 -index dea016a08be9..000000000000 ---- a/lib/hal/hal_sam4s_i2c_asf.h -+++ /dev/null -@@ -1,67 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAM4S I2C over ASF drivers. -- * -- * Prerequisite: add "TWI - Two-Wire Interface (Common API) (service)" module to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SAM4S_I2C_ASF_H_ --#define HAL_SAM4S_I2C_ASF_H_ -- --#include -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --#define MAX_I2C_BUSES 2 // SAM4S has 2 TWI -- --/** -- * \brief this is the hal_data for ATCA HAL -- */ --typedef struct atcaI2Cmaster --{ -- uint32_t twi_id; -- Twi * twi_master_instance; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --void change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ -- --#endif /* HAL_SAM4S_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_sam4s_timer_asf.c b/lib/hal/hal_sam4s_timer_asf.c -deleted file mode 100644 -index c3c937c25252..000000000000 ---- a/lib/hal/hal_sam4s_timer_asf.c -+++ /dev/null -@@ -1,86 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAM4S I2C over ASF drivers. -- * -- * Prerequisite: add "Delay routines (service)" module to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- -- --/* ASF already have delay_us and delay_ms - see delay.h */ -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** -- * \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of 0.001 milliseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay); --} -- --/** -- * \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay * 10); -- --} -- --/** -- * \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * -- * \param[in] delay number of milliseconds to delay -- */ --void atca_delay_ms(uint32_t delay) --{ -- // use ASF supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_samb11_i2c_asf.c b/lib/hal/hal_samb11_i2c_asf.c -deleted file mode 100644 -index aa12364e62c7..000000000000 ---- a/lib/hal/hal_samb11_i2c_asf.c -+++ /dev/null -@@ -1,485 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMB11 I2C over ASF drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the ASF I2C primitives to set up the interface. -- * -- * Prerequisite: add I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include -- --#include "atca_hal.h" --#include "hal_samb11_i2c_asf.h" --#include "atca_device.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --/** \brief logical to physical bus mapping structure */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses --static struct i2c_master_config config_i2c_master; -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- i2c_buses[0] = 0; // b11 bus for xplained pro dev board over EXT1 -- i2c_buses[1] = 1; // b11 bus for MR510CA -- -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] found number of devices found on this bus -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- //.atcai2c.baud = 100000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- ATCAHAL_t hal; -- -- hal_i2c_init(&hal, &discoverCfg); -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- for (slaveAddress = 0x07; slaveAddress <= 0x78; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(packet.data, 0x00, sizeof(packet.data)); -- -- // build an info command -- packet.param1 = INFO_MODE_REVISION; -- packet.param2 = 0; -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- printf("command response error\r\n"); -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < (int)sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- hal_i2c_release(&hal); -- -- return ATCA_SUCCESS; --} -- --/** \brief -- - this HAL implementation assumes you've included the ASF I2C libraries in your project, otherwise, -- the HAL layer will not compile because the ASF I2C drivers are a dependency * -- */ -- --/** \brief hal_i2c_init manages requests to initialize a physical interface. it manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** \brief initialize an I2C interface using given config -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t) ); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- i2c_master_get_config_defaults(&config_i2c_master); -- -- switch (bus) -- { -- case 0: -- config_i2c_master.pin_number_pad0 = PIN_LP_GPIO_8; -- config_i2c_master.pin_number_pad1 = PIN_LP_GPIO_9; -- config_i2c_master.pinmux_sel_pad0 = PINMUX_LP_GPIO_8_MUX2_I2C0_SDA; -- config_i2c_master.pinmux_sel_pad1 = PINMUX_LP_GPIO_9_MUX2_I2C0_SCL; -- i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), I2C0, &config_i2c_master); -- break; -- case 1: -- config_i2c_master.pin_number_pad0 = PIN_LP_GPIO_14; -- config_i2c_master.pin_number_pad1 = PIN_LP_GPIO_15; -- config_i2c_master.pinmux_sel_pad0 = PINMUX_LP_GPIO_14_MUX4_I2C1_SDA; -- config_i2c_master.pinmux_sel_pad1 = PINMUX_LP_GPIO_15_MUX4_I2C1_SCL; -- i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), I2C1, &config_i2c_master); -- break; -- } -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- -- i2c_enable((i2c_hal_data[bus]->i2c_master_instance).hw); -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of I2C post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C send over ASF -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = txlength, -- .data = txdata, -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- // txdata[0] is using _reserved byte of the ATCAPacket -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- packet.data_length = txlength; -- -- if (i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C receive function for ASF I2C -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- int status = !STATUS_OK; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = *rxlength, -- .data = rxdata, -- }; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = i2c_master_read_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet); -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief wake up CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- int status = !STATUS_OK; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- // Send the wake by writing to an address of 0x00 -- struct i2c_master_packet packet = { -- .address = 0x00, -- .data_length = 0, -- .data = &data[0], -- }; -- -- // Send the 00 address as the wake pulse -- i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet); // part will NACK, so don't check for status -- -- atca_delay_us(cfg->wake_delay); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- packet.address = cfg->atcai2c.slave_address >> 1; -- packet.data_length = 4; -- packet.data = data; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = i2c_master_read_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet); -- } -- -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief idle CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = 1, -- .data = &data[0], -- }; -- -- data[0] = 0x02; // idle word address value -- if (i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; -- --} -- --/** \brief sleep CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = 1, -- .data = data, -- }; -- -- data[0] = 0x01; // sleep word address value -- if (i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief manages reference count on given bus and releases resource if no more references exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- i2c_master_reset(&(hal->i2c_master_instance)); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_samb11_i2c_asf.h b/lib/hal/hal_samb11_i2c_asf.h -deleted file mode 100644 -index 0c2243a3c703..000000000000 ---- a/lib/hal/hal_samb11_i2c_asf.h -+++ /dev/null -@@ -1,60 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMB11 I2C over ASF drivers. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SAMB11_I2C_ASF_H_ --#define HAL_SAMB11_I2C_ASF_H_ -- --#include -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --#define MAX_I2C_BUSES 2 // SAMB11 has up to 2 I2C address that can be configured as I2C -- --/** \brief this is the hal_data for ATCA HAL for ASF -- */ --typedef struct atcaI2Cmaster --{ -- struct i2c_master_module i2c_master_instance; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --/** @} */ --#endif /* HAL_SAMB11_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_samb11_timer_asf.c b/lib/hal/hal_samb11_timer_asf.c -deleted file mode 100644 -index dd0a21fea7ee..000000000000 ---- a/lib/hal/hal_samb11_timer_asf.c -+++ /dev/null -@@ -1,78 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMB11 timer/delay over ASF drivers. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of 0.001 milliseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay); --} -- --/** \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay * 10); -- --} -- --/** \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * \param[in] delay number of milliseconds to delay -- */ -- --/* ASF already has delay_ms - see delay.h */ --void atca_delay_ms(uint32_t delay) --{ -- // use ASF supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_samd21_i2c_asf.c b/lib/hal/hal_samd21_i2c_asf.c -deleted file mode 100644 -index 841a1fb9125e..000000000000 ---- a/lib/hal/hal_samd21_i2c_asf.c -+++ /dev/null -@@ -1,572 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 I2C over ASF drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the ASF I2C primitives to set up the interface. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include -- --#include "atca_hal.h" --#include "hal_samd21_i2c_asf.h" --#include "atca_device.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --/** \brief logical to physical bus mapping structure */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses --static struct i2c_master_config config_i2c_master; -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- -- /* if every SERCOM was a likely candidate bus, then would need to initialize the entire array to all SERCOM n numbers. -- * As an optimization and making discovery safer, make assumptions about bus-num / SERCOM map based on D21 Xplained Pro board -- * If you were using a raw D21 on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- */ --#ifdef __SAMR21G18A__ -- i2c_buses[0] = 1; // default r21 for xplained pro dev board --#else -- i2c_buses[0] = 2; // default d21 for xplained pro dev board --#endif -- -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] found number of devices found on this bus -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs608[1][4] = { { 0x00, 0x00, 0x60, 0x01 } }; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- //.atcai2c.baud = 100000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- ATCAHAL_t hal; -- -- hal_i2c_init(&hal, &discoverCfg); -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slaveAddress = 0x07; slaveAddress <= 0x78; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(&packet, 0x00, sizeof(packet)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- -- if ( (status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- printf("command response error\r\n"); -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < (int)sizeof(revs608) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs608[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC608A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- hal_i2c_release(&hal); -- -- return ATCA_SUCCESS; --} -- --/** \brief -- - this HAL implementation assumes you've included the ASF SERCOM I2C libraries in your project, otherwise, -- the HAL layer will not compile because the ASF I2C drivers are a dependency * -- */ -- --/** \brief hal_i2c_init manages requests to initialize a physical interface. it manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** \brief initialize an I2C interface using given config -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t) ); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- i2c_master_get_config_defaults(&config_i2c_master); --#ifdef __SAMR21G18A__ -- if (bus == 1) -- { -- config_i2c_master.pinmux_pad0 = PINMUX_PA16C_SERCOM1_PAD0; -- config_i2c_master.pinmux_pad1 = PINMUX_PA17C_SERCOM1_PAD1; -- } --#endif --#ifdef __SAMD21G18A__ -- if (bus == 0) -- { -- // This is to support SAMW25 configs, where the WINC1500 is on SERCOM2 -- config_i2c_master.pinmux_pad0 = PINMUX_PA08C_SERCOM0_PAD0; -- config_i2c_master.pinmux_pad1 = PINMUX_PA09C_SERCOM0_PAD1; -- } --#endif -- -- // config_i2c_master.buffer_timeout = 10000; -- config_i2c_master.baud_rate = cfg->atcai2c.baud / 1000; -- -- switch (bus) -- { -- case 0: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM0, &config_i2c_master); break; -- case 1: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM1, &config_i2c_master); break; -- case 2: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM2, &config_i2c_master); break; -- case 3: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM3, &config_i2c_master); break; -- case 4: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM4, &config_i2c_master); break; -- case 5: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM5, &config_i2c_master); break; -- } -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- i2c_master_enable(&(i2c_hal_data[bus]->i2c_master_instance)); -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of I2C post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C send over ASF -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = txlength, -- .data = txdata, -- .ten_bit_address = false, -- .high_speed = false, -- .hs_master_code = 0x0, -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- // txdata[0] is using _reserved byte of the ATCAPacket -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- packet.data_length = txlength; -- -- // statusCode = i2c_master_write_packet_wait(&i2c_master_instance, &packet); -- //if ( i2c_master_write_packet_wait_no_stop( &(i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- if (i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C receive function for ASF I2C -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- int status = !STATUS_OK; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = *rxlength, -- .data = rxdata, -- .ten_bit_address = false, -- .high_speed = false, -- .hs_master_code = 0x0, -- }; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = i2c_master_read_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet); -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- if (atCheckCrc(packet.data) != ATCA_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief method to change the bus speec of I2C -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- */ -- --void change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- config_i2c_master.buffer_timeout = 10000; -- config_i2c_master.baud_rate = speed / 1000; -- -- i2c_master_disable(&(i2c_hal_data[bus]->i2c_master_instance)); -- -- switch (bus) -- { -- case 0: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM0, &config_i2c_master); break; -- case 1: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM1, &config_i2c_master); break; -- case 2: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM2, &config_i2c_master); break; -- case 3: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM3, &config_i2c_master); break; -- case 4: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM4, &config_i2c_master); break; -- case 5: i2c_master_init(&(i2c_hal_data[bus]->i2c_master_instance), SERCOM5, &config_i2c_master); break; -- } -- -- i2c_master_enable(&(i2c_hal_data[bus]->i2c_master_instance)); --} -- --/** \brief wake up CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t bdrt = cfg->atcai2c.baud; -- int status = !STATUS_OK; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- if (bdrt != 100000) // if not already at 100KHz, change it -- { -- change_i2c_speed(iface, 100000); -- } -- -- // Send the wake by writing to an address of 0x00 -- struct i2c_master_packet packet = { -- .address = 0x00, -- .data_length = 0, -- .data = &data[0], -- .ten_bit_address = false, -- .high_speed = false, -- .hs_master_code = 0x0, -- }; -- -- // Send the 00 address as the wake pulse -- i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet); // part will NACK, so don't check for status -- -- atca_delay_us(cfg->wake_delay); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- packet.address = cfg->atcai2c.slave_address >> 1; -- packet.data_length = 4; -- packet.data = data; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = i2c_master_read_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet); -- } -- -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, bdrt); -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief idle CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = 1, -- .data = &data[0], -- .ten_bit_address = false, -- .high_speed = false, -- .hs_master_code = 0x0, -- }; -- -- data[0] = 0x02; // idle word address value -- if (i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; -- --} -- --/** \brief sleep CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- struct i2c_master_packet packet = { -- .address = cfg->atcai2c.slave_address >> 1, -- .data_length = 1, -- .data = &data[0], -- .ten_bit_address = false, -- .high_speed = false, -- .hs_master_code = 0x0, -- }; -- -- data[0] = 0x01; // sleep word address value -- if (i2c_master_write_packet_wait(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief manages reference count on given bus and releases resource if no more refences exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- i2c_master_reset(&(hal->i2c_master_instance)); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_samd21_i2c_asf.h b/lib/hal/hal_samd21_i2c_asf.h -deleted file mode 100644 -index b8ff14d0123d..000000000000 ---- a/lib/hal/hal_samd21_i2c_asf.h -+++ /dev/null -@@ -1,63 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 I2C over ASF drivers. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SAMD21_I2C_ASF_H_ --#define HAL_SAMD21_I2C_ASF_H_ -- --#include -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- -- --#define MAX_I2C_BUSES 6 // SAMD21 has up to 6 SERCOMS that can be configured as I2C -- --/** \brief this is the hal_data for ATCA HAL for ASF SERCOM -- */ --typedef struct atcaI2Cmaster --{ -- struct i2c_master_module i2c_master_instance; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --void change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ --#endif /* HAL_SAMD21_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_samd21_i2c_start.c b/lib/hal/hal_samd21_i2c_start.c -deleted file mode 100644 -index 5bade0768ef0..000000000000 ---- a/lib/hal/hal_samd21_i2c_start.c -+++ /dev/null -@@ -1,545 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 I2C over START drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the START I2C primitives to set up the interface. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- #include --#include --#include --#include --#include --#include "atca_hal.h" --#include "atca_device.h" --#include "hal_samd21_i2c_start.h" --#include "peripheral_gclk_config.h" -- --#include "atca_start_config.h" --#include "atca_start_iface.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses -- --/* Notes: -- - this HAL implementation assumes you've included the Atmel START SERCOM I2C libraries in your project, otherwise, -- the HAL layer will not compile because the START I2C drivers are a dependency * -- */ -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- -- /* if every SERCOM was a likely candidate bus, then would need to initialize the entire array to all SERCOM n numbers. -- * As an optimization and making discovery safer, make assumptions about bus-num / SERCOM map based on D21 Xplained Pro board -- * If you were using a raw D21 on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- */ --#ifdef __SAMR21G18A__ -- i2c_buses[0] = 1; // default r21 for xplained pro dev board --#else -- i2c_buses[0] = 2; // default d21 for xplained pro dev board --#endif -- -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] found number of devices found on this bus -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs608[1][4] = { { 0x00, 0x00, 0x60, 0x01 } }; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- //.atcai2c.baud = 100000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- ATCAHAL_t hal; -- -- hal_i2c_init(&hal, &discoverCfg); -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slaveAddress = 0x07; slaveAddress <= 0x78; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(&packet, 0x00, sizeof(packet)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- printf("command response error\r\n"); -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- -- for (i = 0; i < (int)sizeof(revs608) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs608[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC608A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- hal_i2c_release(&hal); -- -- return ATCA_SUCCESS; --} -- -- -- --/** \brief -- - this HAL implementation assumes you've included the START Twi libraries in your project, otherwise, -- the HAL layer will not compile because the START TWI drivers are a dependency * -- */ -- --/** \brief hal_i2c_init manages requests to initialize a physical interface. it manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** \brief initialize an I2C interface using given config -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- uint32_t freq_constant; // I2C frequency configuration constant in kHz -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t) ); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- -- // store I2C baudrate in kHz -- freq_constant = cfg->atcai2c.baud / 1000; -- -- switch (bus) -- { -- case 0: break; -- case 1: break; -- case 2: memcpy(&(i2c_hal_data[bus]->i2c_master_instance), &I2C_0, sizeof(struct i2c_m_sync_desc)); break; -- case 3: break; -- case 4: break; -- case 5: break; -- } -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- -- // set I2C baudrate and enable I2C module -- i2c_m_sync_set_baudrate(&(i2c_hal_data[bus]->i2c_master_instance), CONF_GCLK_SERCOM2_CORE_FREQUENCY / 1000, freq_constant); -- i2c_m_sync_enable(&(i2c_hal_data[bus]->i2c_master_instance)); -- -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of I2C post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C send over START -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- struct _i2c_m_msg packet = { -- .addr = cfg->atcai2c.slave_address >> 1, -- .buffer = txdata, -- .flags = I2C_M_SEVEN | I2C_M_STOP, -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- // txdata[0] is using _reserved byte of the ATCAPacket -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- packet.len = txlength; -- -- if (i2c_m_sync_transfer(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != I2C_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C receive function for START I2C -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- int status = !I2C_OK; -- -- struct _i2c_m_msg packet = { -- .addr = cfg->atcai2c.slave_address >> 1, -- .len = *rxlength, -- .buffer = rxdata, -- .flags = I2C_M_SEVEN | I2C_M_RD | I2C_M_STOP, -- }; -- -- while (retries-- > 0 && status != I2C_OK) -- { -- status = i2c_m_sync_transfer(&(i2c_hal_data[bus]->i2c_master_instance), &packet); -- } -- -- if (status != I2C_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief method to change the bus speec of I2C -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- */ -- --void change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint32_t freq_constant; // I2C frequency configuration constant -- -- // disable I2C module -- i2c_m_sync_disable(&(i2c_hal_data[bus]->i2c_master_instance)); -- -- // store I2C baudrate in kHz -- freq_constant = speed / 1000; -- -- // set I2C baudrate and enable I2C module -- i2c_m_sync_set_baudrate(&(i2c_hal_data[bus]->i2c_master_instance), CONF_GCLK_SERCOM2_CORE_FREQUENCY / 1000, freq_constant); -- i2c_m_sync_enable(&(i2c_hal_data[bus]->i2c_master_instance)); --} -- --/** \brief wake up CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t bdrt = cfg->atcai2c.baud; -- int status = !I2C_OK; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- if (bdrt != 100000) // if not already at 100KHz, change it -- { -- change_i2c_speed(iface, 100000); -- } -- -- // send the wake by writing to an address of 0x00 -- struct _i2c_m_msg packet = { -- .addr = 0x00, -- .len = 0, -- .buffer = NULL, -- .flags = I2C_M_SEVEN | I2C_M_STOP, -- }; -- -- // Send the 00 address as the wake pulse -- status = i2c_m_sync_transfer(&(i2c_hal_data[bus]->i2c_master_instance), &packet); // part will NACK, so don't check for status -- -- delay_us(cfg->wake_delay); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- // receive the wake up response -- packet.addr = cfg->atcai2c.slave_address >> 1; -- packet.len = 4; -- packet.buffer = data; -- packet.flags = I2C_M_SEVEN | I2C_M_RD | I2C_M_STOP; -- -- while (retries-- > 0 && status != I2C_OK) -- { -- status = i2c_m_sync_transfer(&(i2c_hal_data[bus]->i2c_master_instance), &packet); -- } -- -- if (status == I2C_OK) -- { -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, bdrt); -- } -- // compare received data with expected value -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief idle CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- struct _i2c_m_msg packet = { -- .addr = cfg->atcai2c.slave_address >> 1, -- .len = 1, -- .buffer = &data[0], -- .flags = I2C_M_SEVEN | I2C_M_STOP, -- }; -- -- data[0] = 0x02; // idle word address value -- -- if (i2c_m_sync_transfer(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != I2C_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief sleep CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- struct _i2c_m_msg packet = { -- .addr = cfg->atcai2c.slave_address >> 1, -- .len = 1, -- .buffer = &data[0], -- .flags = I2C_M_SEVEN | I2C_M_STOP, -- }; -- -- data[0] = 0x01; // sleep word address value -- -- if (i2c_m_sync_transfer(&(i2c_hal_data[bus]->i2c_master_instance), &packet) != I2C_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief manages reference count on given bus and releases resource if no more refences exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- //if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- i2c_m_sync_disable(&(hal->i2c_master_instance)); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_samd21_i2c_start.h b/lib/hal/hal_samd21_i2c_start.h -deleted file mode 100644 -index 08a50093dd9a..000000000000 ---- a/lib/hal/hal_samd21_i2c_start.h -+++ /dev/null -@@ -1,64 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 I2C over START drivers. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SAMD21_I2C_START_H_ --#define HAL_SAMD21_I2C_START_H_ -- --#include "atmel_start.h" --#include -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --#define MAX_I2C_BUSES 6 // SAMD21 has up to 6 SERCOMS that can be configured as I2C -- --/** \brief this is the hal_data for ATCA HAL for Atmel START SERCOM -- */ --typedef struct atcaI2Cmaster --{ -- struct i2c_m_sync_desc i2c_master_instance; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --void change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ -- --#endif /* HAL_SAMD21_I2C_START_H_ */ -diff --git a/lib/hal/hal_samd21_timer_asf.c b/lib/hal/hal_samd21_timer_asf.c -deleted file mode 100644 -index ba191e400f3c..000000000000 ---- a/lib/hal/hal_samd21_timer_asf.c -+++ /dev/null -@@ -1,79 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 timer/delay over ASF drivers. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of 0.001 milliseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay); --} -- --/** \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay * 10); -- --} -- --/** \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * \param[in] delay number of milliseconds to delay -- */ -- --/* ASF already has delay_ms - see delay.h */ --void atca_delay_ms(uint32_t delay) --{ -- // use ASF supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_samd21_timer_start.c b/lib/hal/hal_samd21_timer_start.c -deleted file mode 100644 -index 1204331466ab..000000000000 ---- a/lib/hal/hal_samd21_timer_start.c -+++ /dev/null -@@ -1,80 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 I2C over START drivers. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include "atca_hal.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of microseconds to delay -- */ -- --void atca_delay_us(uint32_t delay) --{ -- // use START supplied delay -- delay_us(delay); --} -- --/** \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ -- --void atca_delay_10us(uint32_t delay) --{ -- // use START supplied delay -- delay_us(delay * 10); --} -- --/** \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * \param[in] delay number of milliseconds to delay -- */ -- --void atca_delay_ms(uint32_t delay) --{ -- // use START supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_samg55_i2c_asf.c b/lib/hal/hal_samg55_i2c_asf.c -deleted file mode 100644 -index 37a7ddd9348d..000000000000 ---- a/lib/hal/hal_samg55_i2c_asf.c -+++ /dev/null -@@ -1,661 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMG55 I2C over ASF drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the ASF I2C primitives to set up the interface. -- * -- * Prerequisite: add "TWI - Two-Wire Interface (Common API) (service)" module to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include --#include "atca_hal.h" --#include "atca_device.h" --#include "hal_samg55_i2c_asf.h" -- -- --//!< Uncomment when debugging --/*#define DEBUG_HAL*/ -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --/** -- * \brief -- * Logical to physical bus mapping structure -- */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses --twi_options_t opt_twi_master; -- -- --#ifdef DEBUG_HAL --static void print_array(uint8_t *data, uint32_t data_size) --{ -- uint32_t n; -- -- for (n = 0; n < data_size; n++) -- { -- printf("%.2x ", data[n]); -- if (((n + 1) % 16) == 0) -- { -- printf("\r\n"); -- if ((n + 1) != data_size) -- { -- printf(" "); -- } -- } -- } -- if (data_size % 16 != 0) -- { -- printf("\r\n"); -- } --} --#endif -- --/** -- * \brief -- * This HAL implementation assumes you've included the ASF TWI libraries in your project, otherwise, -- * the HAL layer will not compile because the ASF TWI drivers are a dependency -- */ -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- /* logical bus numbers 0-2 map to the samG55 i2c buses: -- */ -- i2c_buses[0] = 0; -- -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- ATCAHAL_t hal; -- -- if (busNum < 0) -- { -- return ATCA_COMM_FAIL; -- } -- -- hal_i2c_init(&hal, &discoverCfg); -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slaveAddress = 0x07; slaveAddress <= 0x78; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(packet.data, 0x00, sizeof(packet.data)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < (int)sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- hal_i2c_release(&hal); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief -- * hal_i2c_init manages requests to initialize a physical interface. It manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** -- * \brief initialize an I2C interface using given config -- * -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- //// if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t)); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- -- switch (bus) -- { -- case 0: -- i2c_hal_data[bus]->twi_id = ID_FLEXCOM4; -- i2c_hal_data[bus]->twi_master_instance = TWI4; -- break; -- case 1: -- i2c_hal_data[bus]->twi_id = FLEXCOM6; -- i2c_hal_data[bus]->twi_master_instance = TWI6; -- break; -- } -- -- flexcom_enable((Flexcom*)i2c_hal_data[bus]->twi_id); -- flexcom_set_opmode((Flexcom*)i2c_hal_data[bus]->twi_id, FLEXCOM_TWI); -- -- opt_twi_master.master_clk = sysclk_get_cpu_hz(); -- opt_twi_master.speed = cfg->atcai2c.baud; -- opt_twi_master.smbus = 0; -- -- twi_master_init(i2c_hal_data[bus]->twi_master_instance, &opt_twi_master); -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** -- * \brief HAL implementation of I2C post init -- * -- * \param[in] iface instance -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** -- * \brief HAL implementation of I2C send over ASF -- * -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ --#ifdef DEBUG_HAL -- printf("hal_i2c_send()\r\n"); -- -- printf("\r\nCommand Packet (size:0x%.8x)\r\n", (uint32_t)txlength); -- printf("Count : %.2x\r\n", txdata[1]); -- printf("Opcode : %.2x\r\n", txdata[2]); -- printf("Param1 : %.2x\r\n", txdata[3]); -- printf("Param2 : "); print_array(&txdata[4], 2); -- if (txdata[1] > 7) -- { -- printf("Data : "); print_array(&txdata[6], txdata[1] - 7); -- } -- printf("CRC : "); print_array(&txdata[txdata[1] - 1], 2); -- printf("\r\n"); --#endif -- -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- -- twi_packet_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = txdata, -- .length = (uint32_t)txlength //(uint32_t)txdata[1] -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- -- if (twi_master_write(i2c_hal_data[bus]->twi_master_instance, &packet) != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief HAL implementation of I2C receive function for ASF I2C -- * -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ --#ifdef DEBUG_HAL -- printf("hal_i2c_receive()\r\n"); --#endif -- -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t status = !TWI_SUCCESS; -- -- twi_packet_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = rxdata, -- .length = (uint32_t)*rxlength -- }; -- -- while (retries-- > 0 && status != TWI_SUCCESS) -- { -- status = twi_master_read(i2c_hal_data[bus]->twi_master_instance, &packet); -- } -- if (status != TWI_SUCCESS) -- { -- if (retries <= 0) -- { -- return ATCA_TOO_MANY_COMM_RETRIES; -- } -- -- return ATCA_COMM_FAIL; -- } -- --#ifdef DEBUG_HAL -- printf("\r\nResponse Packet (size:0x%.4x)\r\n", rxlength); -- printf("Count : %.2x\r\n", rxdata[0]); -- if (rxdata[0] > 3) -- { -- printf("Data : "); print_array(&rxdata[1], rxdata[0] - 3); -- printf("CRC : "); print_array(&rxdata[rxdata[0] - 2], 2); -- } -- printf("\r\n"); --#endif -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief method to change the bus speed of I2C -- * -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- */ --void change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- -- pmc_enable_periph_clk(i2c_hal_data[bus]->twi_id); -- -- opt_twi_master.master_clk = sysclk_get_cpu_hz(); -- opt_twi_master.speed = speed; -- opt_twi_master.smbus = 0; -- -- twi_master_init(i2c_hal_data[bus]->twi_master_instance, &opt_twi_master); --} -- --/** -- * \brief wake up CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to wakeup -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- //set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t bdrt = cfg->atcai2c.baud; -- int status = !TWI_SUCCESS; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- // if not already at 100kHz, change it -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, 100000); -- } -- -- // Send 0x00 as wake pulse -- twi_write_byte(i2c_hal_data[bus]->twi_master_instance, 0x00); -- -- // rounded up to the nearest ms -- atca_delay_ms(((uint32_t)cfg->wake_delay + (1000 - 1)) / 1000); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- twi_packet_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = data, -- .length = 4 -- }; -- -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, bdrt); -- } -- -- while (retries-- > 0 && status != TWI_SUCCESS) -- { -- status = twi_master_read(i2c_hal_data[bus]->twi_master_instance, &packet); -- } -- if (status != TWI_SUCCESS) -- { -- if (retries <= 0) -- { -- return ATCA_TOO_MANY_COMM_RETRIES; -- } -- -- return ATCA_COMM_FAIL; -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** -- * \brief idle CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to idle -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- // set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- data[0] = 0x02; // idle word address value -- -- twi_packet_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = data, -- .length = 1 -- }; -- -- if (twi_master_write(i2c_hal_data[bus]->twi_master_instance, &packet) != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief sleep CryptoAuth device using I2C bus -- * -- * \param[in] iface interface to logical device to sleep -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- //// set to default i2c bus -- if (cfg->atcai2c.bus > MAX_I2C_BUSES - 1) -- { -- cfg->atcai2c.bus = 0; -- } -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- data[0] = 0x01; // sleep word address value -- -- twi_packet_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, -- .addr = { 0 }, -- .addr_length = 0, -- .buffer = data, -- .length = 1 -- }; -- -- if (twi_master_write(i2c_hal_data[bus]->twi_master_instance, &packet) != TWI_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief manages reference count on given bus and releases resource if no more refences exist -- * -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- // set to default i2c bus -- if (hal->bus_index > MAX_I2C_BUSES - 1) -- { -- hal->bus_index = 0; -- } -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- twi_reset(hal->twi_master_instance); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_samg55_i2c_asf.h b/lib/hal/hal_samg55_i2c_asf.h -deleted file mode 100644 -index a3c545c72d43..000000000000 ---- a/lib/hal/hal_samg55_i2c_asf.h -+++ /dev/null -@@ -1,67 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMG55 I2C over ASF drivers. -- * -- * Prerequisite: add "TWI - Two-Wire Interface (Common API) (service)" module to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SAMG55_I2C_ASF_H_ --#define HAL_SAMG55_I2C_ASF_H_ -- --#include -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --#define MAX_I2C_BUSES 2 // SAMG55 has 2 TWI -- --/** -- * \brief this is the hal_data for ATCA HAL -- */ --typedef struct atcaI2Cmaster --{ -- uint32_t twi_id; -- Twi * twi_master_instance; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --void change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ -- --#endif /* HAL_SAMG55_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_samg55_timer_asf.c b/lib/hal/hal_samg55_timer_asf.c -deleted file mode 100644 -index 6b5a27ce1dbf..000000000000 ---- a/lib/hal/hal_samg55_timer_asf.c -+++ /dev/null -@@ -1,86 +0,0 @@ --/** -- * \file -- * \brief -- * -- * Prerequisite: add "Delay routines (service)" module to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- -- --/* ASF already have delay_us and delay_ms - see delay.h */ -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** -- * \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of 0.001 milliseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay); --} -- --/** -- * \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay * 10); -- --} -- --/** -- * \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * -- * \param[in] delay number of milliseconds to delay -- */ --void atca_delay_ms(uint32_t delay) --{ -- // use ASF supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_samv71_i2c_asf.c b/lib/hal/hal_samv71_i2c_asf.c -deleted file mode 100644 -index 7da38807d998..000000000000 ---- a/lib/hal/hal_samv71_i2c_asf.c -+++ /dev/null -@@ -1,583 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMV71 I2C over ASF drivers. -- * -- * This code is structured in two parts. Part 1 is the connection of the ATCA HAL API to the physical I2C -- * implementation. Part 2 is the ASF I2C primitives to set up the interface. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include -- --#include "atca_hal.h" --#include "hal_samv71_i2c_asf.h" --#include "atca_device.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --/** \brief logical to physical bus mapping structure */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- /* logical bus numbers 0-2 map to the V71 i2c buses: -- ID_TWIHS0 -- ID_TWIHS1 -- ID_TWIHS2 -- -- until ASF driver supports timeouts, only the TWIHS0 bus will respond on the SAMV71 Xplained Pro board -- otherwise, driver hangs on waiting for txready. -- for( i = 0; i < MAX_I2C_BUSES && i < max_buses; i++ ) -- i2c_buses[i] = i; -- */ -- i2c_buses[0] = 0; --#if MAX_I2C_BUSES == 3 -- i2c_buses[1] = -1; -- i2c_buses[2] = -1; --#endif -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] bus_num Logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg Pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] found Number of devices found on this bus -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_discover_devices(int bus_num, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slave_address = 0x01; -- ATCADevice device; -- ATCAIface discover_iface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs608[1][4] = { { 0x00, 0x00, 0x60, 0x01 } }; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = bus_num, -- .atcai2c.baud = 400000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- ATCAHAL_t hal; -- -- if (bus_num < 0) -- { -- return ATCA_COMM_FAIL; -- } -- -- hal_i2c_init(&hal, &discoverCfg); -- device = newATCADevice(&discoverCfg); -- discover_iface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slave_address = 0x07; slave_address <= 0x78; slave_address++) -- { -- discoverCfg.atcai2c.slave_address = slave_address << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discover_iface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(&packet, 0x00, sizeof(packet)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discover_iface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discover_iface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < (int)sizeof(revs608) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs608[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC608A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < (int)sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discover_iface); -- } -- -- // hal_i2c_release(&hal); -- -- return ATCA_SUCCESS; --} -- --/** \brief -- - this HAL implementation assumes you've included the ASF Twi libraries in your project, otherwise, -- the HAL layer will not compile because the ASF TWI drivers are a dependency * -- */ -- --/** \brief hal_i2c_init manages requests to initialize a physical interface. it manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** \brief initialize an I2C interface using given config -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- twihs_options_t twi_options; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t) ); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- -- /* Configure the options of TWI driver */ -- twi_options.master_clk = sysclk_get_cpu_hz() / CONFIG_SYSCLK_DIV; -- twi_options.speed = cfg->atcai2c.baud; -- -- switch (bus) -- { -- case 0: /* Enable the peripheral clock for TWI */ -- pmc_enable_periph_clk(ID_TWIHS0); -- if (twihs_master_init(TWIHS0, &twi_options) != TWIHS_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- i2c_hal_data[bus]->twi_module = (uint32_t)TWIHS0; -- break; -- -- case 1: /* Enable the peripheral clock for TWI */ -- pmc_enable_periph_clk(ID_TWIHS1); -- if (twihs_master_init(TWIHS1, &twi_options) != TWIHS_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- i2c_hal_data[bus]->twi_module = (uint32_t)TWIHS1; -- break; -- -- case 2: /* Enable the peripheral clock for TWI */ -- pmc_enable_periph_clk(ID_TWIHS2); -- if (twihs_master_init(TWIHS2, &twi_options) != TWIHS_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- i2c_hal_data[bus]->twi_module = (uint32_t)TWIHS2; -- break; -- } -- -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of I2C post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- -- --/** \brief HAL implementation of I2C send over ASF -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- Twihs *twihs_device = (Twihs*)(i2c_hal_data[bus]->twi_module); -- -- twihs_packet_t packet = { -- .addr[0] = 0, -- .addr[1] = 0, -- .addr_length = 0, //very important, since cryptoauthdevices do not require addressing; -- .chip = cfg->atcai2c.slave_address >> 1, -- .buffer = txdata, -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- // txdata[0] is using _reserved byte of the ATCAPacket -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- packet.length = txlength; -- -- if (twihs_master_write(twihs_device, &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C receive function for ASF I2C -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- int status = !STATUS_OK; -- Twihs *twihs_device = (Twihs*)(i2c_hal_data[bus]->twi_module); -- -- twihs_packet_t packet = { -- .chip = cfg->atcai2c.slave_address >> 1, // use 7-bit address -- .buffer = rxdata, -- .length = *rxlength -- }; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- if (twihs_master_read(twihs_device, &packet) != TWIHS_SUCCESS) -- { -- status = ATCA_COMM_FAIL; -- } -- else -- { -- status = ATCA_SUCCESS; -- } -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief method to change the bus speed of I2C -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- Twihs *twihs_device = (Twihs*)(i2c_hal_data[bus]->twi_module); -- -- // if necessary, revert baud rate to what came in. -- if (twihs_set_speed(twihs_device, speed, sysclk_get_cpu_hz() / CONFIG_SYSCLK_DIV) == FAIL) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief wake up CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- -- */ -- --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint16_t rxlength; -- uint32_t bdrt = cfg->atcai2c.baud; -- int status = !STATUS_OK; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- Twihs *twihs_device = (Twihs*)(i2c_hal_data[bus]->twi_module); -- -- if (bdrt != 100000) // if not already at 100KHz, change it -- -- { -- if (twihs_set_speed(twihs_device, 100000, sysclk_get_cpu_hz() / CONFIG_SYSCLK_DIV) == FAIL) -- { -- return ATCA_COMM_FAIL; -- } -- } -- -- twihs_packet_t packet = { -- .addr[0] = 0, -- .addr[1] = 0, -- .addr_length = 0, //very important, since cryptoauthdevices do not require addressing; -- .chip = cfg->atcai2c.slave_address >> 1, -- .buffer = &data[0], -- .length = 1 -- }; -- -- twihs_master_write(twihs_device, &packet); -- -- atca_delay_us(cfg->wake_delay); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- // look for wake response -- rxlength = 4; -- memset(data, 0x00, rxlength); -- status = hal_i2c_receive(iface, data, &rxlength); -- -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- if (twihs_set_speed(twihs_device, bdrt, sysclk_get_cpu_hz() / CONFIG_SYSCLK_DIV) == FAIL) -- { -- return ATCA_COMM_FAIL; -- } -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- -- --/** \brief idle CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- Twihs *twihs_device = (Twihs*)(i2c_hal_data[bus]->twi_module); -- -- data[0] = 0x02; // idle word address value -- -- twihs_packet_t packet = { -- .addr[0] = 0, -- .addr[1] = 0, -- .addr_length = 0, //very important, since cryptoauthdevices do not require addressing; -- .chip = cfg->atcai2c.slave_address >> 1, -- .buffer = data, -- }; -- -- packet.length = 1; -- -- if (twihs_master_write(twihs_device, &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief sleep CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- Twihs *twihs_device = (Twihs*)(i2c_hal_data[bus]->twi_module); -- -- data[0] = 0x01; // sleep word address value -- -- twihs_packet_t packet = { -- .addr[0] = 0, -- .addr[1] = 0, -- .addr_length = 0, //very important, since cryptoauthdevices do not require addressing; -- .chip = cfg->atcai2c.slave_address >> 1, -- .buffer = data, -- }; -- -- packet.length = 1; -- -- if (twihs_master_write(twihs_device, &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief manages reference count on given bus and releases resource if no more refences exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- int bus = hal->bus_index; -- Twihs *twihs_device = (Twihs*)(i2c_hal_data[bus]->twi_module); -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[bus] != NULL) -- { -- twihs_disable_master_mode(twihs_device); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_samv71_i2c_asf.h b/lib/hal/hal_samv71_i2c_asf.h -deleted file mode 100644 -index 7efcb52b8b17..000000000000 ---- a/lib/hal/hal_samv71_i2c_asf.h -+++ /dev/null -@@ -1,63 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMV71 I2C over ASF drivers. -- * -- * Prerequisite: add SERCOM I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SAMV71_I2C_ASF_H_ --#define HAL_SAMV71_I2C_ASF_H_ -- --#include -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- -- --#define MAX_I2C_BUSES 3 -- --/** \brief this is the hal_data for ATCA HAL for ASF SERCOM -- */ --typedef struct atcaI2Cmaster --{ -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; -- uint32_t twi_module; --} ATCAI2CMaster_t; -- --ATCA_STATUS change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ --#endif /* HAL_SAMD21_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_samv71_timer_asf.c b/lib/hal/hal_samv71_timer_asf.c -deleted file mode 100644 -index 1090a2d26f70..000000000000 ---- a/lib/hal/hal_samv71_timer_asf.c -+++ /dev/null -@@ -1,79 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 timer/delay over ASF drivers. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of 0.001 milliseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay); --} -- --/** \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay * 10); -- --} -- --/** \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * \param[in] delay number of milliseconds to delay -- */ -- --/* ASF already has delay_ms - see delay.h */ --void atca_delay_ms(uint32_t delay) --{ -- // use ASF supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_swi_bitbang.c b/lib/hal/hal_swi_bitbang.c -deleted file mode 100644 -index 412b393d9bd0..000000000000 ---- a/lib/hal/hal_swi_bitbang.c -+++ /dev/null -@@ -1,347 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SWI bit banging. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include --#include "atca_hal.h" --#include "hal_swi_bitbang.h" --#include "atca_device.h" -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief These methods define the hardware abstraction layer for -- * communicating with a CryptoAuth device using SWI bit banging. -- @{ */ -- --/** -- * \brief Logical to physical bus mapping structure. -- */ --ATCASWIMaster_t *swi_hal_data[MAX_SWI_BUSES]; //!< map logical, 0-based bus number to index --int swi_bus_ref_ct = 0; //!< total in-use count across buses -- --/** \brief discover swi buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application.This function is currently not supported. -- * of the a-priori knowledge -- * \param[in] swi_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_swi_discover_buses(int swi_buses[], int max_buses) --{ -- -- return ATCA_UNIMPLEMENTED; -- --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number.This function is curently not supported. -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ -- --ATCA_STATUS hal_swi_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- return ATCA_UNIMPLEMENTED; -- --} -- -- -- --/** -- * \brief hal_swi_init manages requests to initialize a physical -- * interface. It manages use counts so when an interface has -- * released the physical layer, it will disable the interface for -- * some other use. You can have multiple ATCAIFace instances using -- * the same bus, and you can have multiple ATCAIFace instances on -- * multiple swi buses, so hal_swi_init manages these things and -- * ATCAIFace is abstracted from the physical details. -- */ -- --/** -- * \brief Initialize an SWI interface using given config. -- * -- * \param[in] hal opaque pointer to HAL data -- * \param[in] cfg interface configuration -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_swi_init(void *hal, ATCAIfaceCfg *cfg) --{ -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- int bus = cfg->atcaswi.bus; //!< 0-based logical bus number -- -- if (swi_bus_ref_ct == 0) //!< power up state, no swi buses will have been used -- -- { -- for (int i = 0; i < MAX_SWI_BUSES; i++) -- { -- swi_hal_data[i] = NULL; -- } -- } -- swi_bus_ref_ct++; //!< total across buses -- -- if (bus >= 0 && bus < MAX_SWI_BUSES) -- { -- //! if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (swi_hal_data[bus] == NULL) -- { -- swi_hal_data[bus] = malloc(sizeof(ATCASWIMaster_t)); -- -- //! assign GPIO pin -- swi_hal_data[bus]->pin_sda = swi_buses_default.pin_sda[bus]; -- -- swi_set_pin(swi_hal_data[bus]->pin_sda); -- swi_enable(); -- -- //! store this for use during the release phase -- swi_hal_data[bus]->bus_index = bus; -- } -- else -- { -- //! otherwise, another interface already initialized the bus, any different -- //! cfg parameters will be ignored...first one to initialize this sets the configuration -- } -- -- phal->hal_data = swi_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** -- * \brief HAL implementation of SWI post init. -- * -- * \param[in] iface ATCAIface instance -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_swi_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** -- * \brief Send byte(s) via SWI. -- * -- * \param[in] iface interface of the logical device to send data to -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_swi_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- int bus = cfg->atcaswi.bus; -- -- //! Skip the Word Address data as SWI doesn't use it -- txdata++; -- -- //! Set SWI pin -- swi_set_pin(swi_hal_data[bus]->pin_sda); -- -- //! Send Command Flag -- swi_send_byte(SWI_FLAG_CMD); -- -- //! Send the remaining bytes -- swi_send_bytes(txlength, txdata); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief Receive byte(s) via SWI. -- * -- * \param[in] iface interface of the logical device to receive data -- * from -- * \param[out] rxdata pointer to where bytes will be received -- * \param[in] rxlength pointer to expected number of receive bytes to -- * request -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_swi_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_RX_TIMEOUT; -- -- int bus = cfg->atcaswi.bus; -- int retries = cfg->rx_retries; -- uint16_t count; -- -- //! Set SWI pin -- swi_set_pin(swi_hal_data[bus]->pin_sda); -- -- while (retries-- > 0 && status != ATCA_SUCCESS) -- { -- swi_send_byte(SWI_FLAG_TX); -- -- status = swi_receive_bytes(*rxlength, rxdata); -- if (status == ATCA_RX_FAIL) -- { -- count = rxdata[0]; -- if ((count < ATCA_RSP_SIZE_MIN) || (count > *rxlength)) -- { -- status = ATCA_INVALID_SIZE; -- break; -- } -- else -- { -- status = ATCA_SUCCESS; -- } -- } -- else if (status == ATCA_RX_TIMEOUT) -- { -- status = ATCA_RX_NO_RESPONSE; -- } -- } -- -- return status; --} -- --/** -- * \brief Send Wake flag via SWI. -- * -- * \param[in] iface interface of the logical device to wake up -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_swi_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- ATCA_STATUS status = ATCA_WAKE_FAILED; -- -- int bus = cfg->atcaswi.bus; -- uint8_t response[4] = { 0x00, 0x00, 0x00, 0x00 }; -- uint8_t expected_response[4] = { 0x04, 0x11, 0x33, 0x43 }; -- uint16_t rxlength = sizeof(response); -- -- //! Set SWI pin -- swi_set_pin(swi_hal_data[bus]->pin_sda); -- -- //! Generate Wake Token -- swi_send_wake_token(); -- -- //! Wait tWHI + tWLO -- atca_delay_us(cfg->wake_delay); -- -- status = hal_swi_receive(iface, response, &rxlength); -- if (status == ATCA_SUCCESS) -- { -- //! Compare response with expected_response -- if (memcmp(response, expected_response, 4) != 0) -- { -- status = ATCA_WAKE_FAILED; -- } -- } -- -- return status; --} -- --/** -- * \brief Send Idle flag via SWI. -- * -- * \param[in] iface interface of the logical device to idle -- * -- * \return ATCA_SUCCES -- */ --ATCA_STATUS hal_swi_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- int bus = cfg->atcaswi.bus; -- -- //! Set SWI pin -- swi_set_pin(swi_hal_data[bus]->pin_sda); -- -- swi_send_byte(SWI_FLAG_IDLE); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief Send Sleep flag via SWI. -- * -- * \param[in] iface interface of the logical device to sleep -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_swi_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- -- int bus = cfg->atcaswi.bus; -- -- //! Set SWI pin -- swi_set_pin(swi_hal_data[bus]->pin_sda); -- -- swi_send_byte(SWI_FLAG_SLEEP); -- -- return ATCA_SUCCESS; --} -- --/** -- * \brief Manages reference count on given bus and releases resource if -- * no more reference(s) exist. -- * -- * \param[in] hal_data opaque pointer to hal data structure - known only -- * to the HAL implementation -- * -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_swi_release(void *hal_data) --{ -- ATCASWIMaster_t *hal = (ATCASWIMaster_t*)hal_data; -- -- swi_bus_ref_ct--; //!< track total SWI instances -- -- //! if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && swi_hal_data[hal->bus_index] != NULL) -- { -- swi_set_pin(swi_hal_data[hal->bus_index]->pin_sda); -- swi_disable(); -- free(swi_hal_data[hal->bus_index]); -- swi_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -\ No newline at end of file -diff --git a/lib/hal/hal_swi_bitbang.h b/lib/hal/hal_swi_bitbang.h -deleted file mode 100644 -index b981a6fc99ff..000000000000 ---- a/lib/hal/hal_swi_bitbang.h -+++ /dev/null -@@ -1,76 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SWI bit banging. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SWI_BITBANG_H_ --#define HAL_SWI_BITBANG_H_ -- -- --#if BOARD == AT88CK9000 --#include "swi_bitbang_at88ck9000.h" --#endif -- --#if (SAMD21 == 1) --#include "swi_bitbang_samd21.h" --#endif -- -- -- --/** -- * \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief These methods define the hardware abstraction layer for -- * communicating with a CryptoAuth device using SWI bit banging. -- @{ */ -- --/** -- * \brief This enumeration lists flags for SWI. -- */ --enum swi_flag --{ -- SWI_FLAG_CMD = (uint8_t)0x77, //!< flag preceding a command -- SWI_FLAG_TX = (uint8_t)0x88, //!< flag requesting a response -- SWI_FLAG_IDLE = (uint8_t)0xBB, //!< flag requesting to go into Idle mode -- SWI_FLAG_SLEEP = (uint8_t)0xCC //!< flag requesting to go into Sleep mode --}; -- --/** -- * \brief This is the hal_data for ATCA HAL. -- */ --typedef struct atcaSWImaster --{ -- uint8_t pin_sda; -- //! for conveniences during interface release phase -- int bus_index; --} ATCASWIMaster_t; -- --/** @} */ -- --#endif /* HAL_SWI_BITBANG_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_swi_uart.c b/lib/hal/hal_swi_uart.c -deleted file mode 100644 -index f379d9abcd5e..000000000000 ---- a/lib/hal/hal_swi_uart.c -+++ /dev/null -@@ -1,527 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SWI over UART drivers. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" --#include "hal_swi_uart.h" --#include "atca_device.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using SWI Interface. -- * -- @{ */ -- --/** \brief logical to physical bus mapping structure */ --ATCASWIMaster_t *swi_hal_data[MAX_SWI_BUSES]; // map logical, 0-based bus number to index --int swi_bus_ref_ct = 0; // total in-use count across buses -- --#ifdef DEBUG_HAL --static void print_array(uint8_t *data, uint32_t data_size) --{ -- // printf("%.4x\r\n", data_size); -- -- uint32_t n; -- -- for (n = 0; n < data_size; n++) -- { -- printf("%.2x ", data[n]); -- if (((n + 1) % 16) == 0) -- { -- printf("\r\n"); -- if ((n + 1) != data_size) -- { -- printf(" "); -- } -- } -- } -- if (data_size % 16 != 0) -- { -- printf("\r\n"); -- } --} --#endif -- -- --/** \brief discover swi buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] swi_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_swi_discover_buses(int swi_buses[], int max_buses) --{ -- swi_uart_discover_buses(swi_buses, max_buses); -- -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_swi_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- unsigned int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_SWI_IFACE, -- .devtype = ATECC508A, -- .atcaswi.bus = busNum, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- // build an info command -- packet.param1 = INFO_MODE_REVISION; -- packet.param2 = 0; -- -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_swi_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(packet.data, 0x00, sizeof(packet.data)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- return status; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- printf("command response error\r\n"); -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- -- hal_swi_idle(discoverIface); -- } -- -- deleteATCADevice(&device); -- -- return ATCA_SUCCESS; --} -- --/** \brief hal_swi_init manages requests to initialize a physical interface. it manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple swi buses, so hal_swi_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** \brief initialize an SWI interface using given config -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcaswi.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (swi_bus_ref_ct == 0) // power up state, no swi buses will have been used -- { -- for (int i = 0; i < MAX_SWI_BUSES; i++) -- { -- swi_hal_data[i] = NULL; -- } -- swi_bus_ref_ct++; // total across buses become 1 -- } -- -- if (bus >= 0 && bus < MAX_SWI_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (swi_hal_data[bus] == NULL) -- { -- swi_hal_data[bus] = malloc(sizeof(ATCASWIMaster_t) ); -- // store this for use during the release phase -- swi_hal_data[bus]->bus_index = bus; -- // initialize UART module for SWI interface -- swi_uart_init(swi_hal_data[bus]); -- } -- else -- { -- // otherwise, another interface already initialized the bus, any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- } -- phal->hal_data = swi_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of SWI post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_swi_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of SWI send one byte over UART -- * \param[in] iface instance -- * \param[in] data bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_send_flag(ATCAIface iface, uint8_t data) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcaswi.bus; -- uint8_t bit_mask, bit_data; -- -- for (bit_mask = 1; bit_mask > 0; bit_mask <<= 1) -- { -- // Send one byte that represent one bit, 0x7F for one or 0x7D for zero -- // The LSB (least significant bit) is sent first. -- bit_data = (bit_mask & data) ? 0x7F : 0x7D; -- status |= swi_uart_send_byte(swi_hal_data[bus], bit_data); -- -- } -- if (status != ATCA_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- else -- { -- return ATCA_SUCCESS; -- } --} -- --/** \brief HAL implementation of SWI send command over UART -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- --#ifdef DEBUG_HAL -- printf("hal_swi_send()\r\n"); -- -- printf("\r\nCommand Packet (size:0x%.4x)\r\n", txlength); -- printf("Count : %.2x\r\n", txdata[1]); -- printf("Opcode : %.2x\r\n", txdata[2]); -- printf("Param1 : %.2x\r\n", txdata[3]); -- printf("Param2 : "); print_array(&txdata[4], 2); -- if (txdata[1] > 7) -- { -- printf("Data : "); print_array(&txdata[6], txdata[1] - 7); -- } -- printf("CRC : "); print_array(&txdata[txdata[1] - 1], 2); -- printf("\r\n"); --#endif -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcaswi.bus; -- uint8_t i, bit_mask, bit_data; -- -- //Skip the Word Address data as SWI doesn't use it -- txdata++; -- -- status = hal_swi_send_flag(iface, SWI_FLAG_CMD); -- if (status == ATCA_SUCCESS) -- { -- for (i = 0; i < txlength; i++) -- { -- for (bit_mask = 1; bit_mask > 0; bit_mask <<= 1) -- { -- // Send one byte that represent one bit, 0x7F for one or 0x7D for zero -- // The LSB (least significant bit) is sent first. -- bit_data = (bit_mask & *txdata) ? 0x7F : 0x7D; -- status = swi_uart_send_byte(swi_hal_data[bus], bit_data); -- if (status != ATCA_SUCCESS) -- { -- return ATCA_COMM_FAIL; -- } -- } -- txdata++; -- } -- return ATCA_SUCCESS; -- } -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of SWI receive function over UART -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ --#ifdef DEBUG_HAL -- printf("hal_swi_receive()\r\n"); --#endif -- ATCA_STATUS status = ATCA_COMM_FAIL; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcaswi.bus; -- int retries = cfg->rx_retries; -- uint8_t bit_mask, *head_buff, bit_data; -- uint16_t i = 0; -- -- while ((status != ATCA_SUCCESS) && (retries >= 0x00)) -- { -- retries--; -- head_buff = rxdata; -- -- status = hal_swi_send_flag(iface, SWI_FLAG_TX); -- -- // Set SWI to receive mode. -- swi_uart_mode(swi_hal_data[bus], RECEIVE_MODE); --#ifdef SAMD21_ASF -- RX_DELAY --#else -- atca_delay_us(RX_DELAY); // Must be configured to sync with response from device --#endif -- if (status == ATCA_SUCCESS) -- { -- for (i = 0; i < *rxlength; i++) -- { -- *head_buff = 0x00; -- for (bit_mask = 1; bit_mask > 0; bit_mask <<= 1) -- { -- bit_data = 0; -- status = swi_uart_receive_byte(swi_hal_data[bus], &bit_data); -- if ((i == 0) && (bit_mask == 1) && (status != ATCA_SUCCESS)) -- { -- break; -- } -- // Sometimes bit data from device is stretched -- // When the device sends a "one" bit, it is read as 0x7E or 0x7F. -- // When the device sends a "zero" bit, it is read as 0x7A, 0x7B, or 7D. -- if ((bit_data ^ 0x7F) < 2) -- { -- // Received "one" bit. -- *head_buff |= bit_mask; -- } -- } -- if ((i == 0) && (bit_mask == 1) && (status != ATCA_SUCCESS)) -- { -- break; -- } -- head_buff++; -- } -- // Set SWI to transmit mode. -- swi_uart_mode(swi_hal_data[bus], TRANSMIT_MODE); -- atca_delay_us(TX_DELAY); // Must be configured to sync with response from device -- } -- // The Response shorter than expected -- if ((i >= 4) && (status == ATCA_TIMEOUT)) -- { -- status = ATCA_SUCCESS; -- } -- } --#ifdef DEBUG_HAL -- printf("\r\nResponse Packet (size:0x%.4x)\r\n", *rxlength); -- printf("Count : %.2x\r\n", rxdata[0]); -- if (rxdata[0] > 3) -- { -- printf("Data : "); print_array(&rxdata[1], rxdata[0] - 3); -- printf("CRC : "); print_array(&rxdata[rxdata[0] - 2], 2); -- } -- printf("\r\n"); --#endif -- return status; --} -- -- --/** \brief wake up CryptoAuth device using SWI interface -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_wake(ATCAIface iface) --{ --#ifdef DEBUG_HAL -- printf("hal_swi_wake()\r\n"); --#endif -- ATCA_STATUS status = ATCA_COMM_FAIL; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcaswi.bus; -- int retries = cfg->rx_retries; -- uint16_t datalength = 4; -- uint8_t data[4] = { 0x00, 0x00, 0x00, 0x00 }, expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- while ((status != ATCA_SUCCESS) && (retries >= 0x00)) -- { -- retries--; -- // Change baudrate to 115200 to get low signal more than 60us -- swi_uart_setbaud(swi_hal_data[bus], 115200); -- // Send byte 0x00 -- status = swi_uart_send_byte(swi_hal_data[bus], SWI_WAKE_TOKEN); -- // Change baudrate back to 230400 -- swi_uart_setbaud(swi_hal_data[bus], 230400); -- } -- -- if (!status) -- { -- atca_delay_us(cfg->wake_delay); // wait tWHI + tWLO which is configured based on device type and configuration structure -- status = hal_swi_receive(iface, data, &datalength); -- } -- -- if ((retries == 0x00) && (status != ATCA_SUCCESS) ) -- { -- return ATCA_TIMEOUT; -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief idle CryptoAuth device using SWI interface -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_idle(ATCAIface iface) --{ -- return hal_swi_send_flag(iface, SWI_FLAG_IDLE); --} -- --/** \brief sleep CryptoAuth device using SWI interface -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_sleep(ATCAIface iface) --{ -- return hal_swi_send_flag(iface, SWI_FLAG_SLEEP); --} -- --/** \brief manages reference count on given bus and releases resource if no more refences exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_swi_release(void *hal_data) --{ -- ATCASWIMaster_t *hal = (ATCASWIMaster_t*)hal_data; -- -- swi_bus_ref_ct--; // track total SWI instances -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && swi_hal_data[hal->bus_index] != NULL) -- { -- swi_uart_deinit(swi_hal_data[hal->bus_index]); -- free(swi_hal_data[hal->bus_index]); -- swi_hal_data[hal->bus_index] = NULL; -- } -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_swi_uart.h b/lib/hal/hal_swi_uart.h -deleted file mode 100644 -index 75274a7d4f2e..000000000000 ---- a/lib/hal/hal_swi_uart.h -+++ /dev/null -@@ -1,62 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SWI over UART drivers. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_SWI_UART_H_ --#define HAL_SWI_UART_H_ -- --#ifdef SAMD21_START -- #include "swi_uart_samd21_start.h" --#elif defined (SAMD21_ASF) -- #include "swi_uart_samd21_asf.h" --#elif defined (XMEGA_ASF) -- #include "swi_uart_xmega_a3bu_asf.h" --#elif defined (AT90USB_ASF) -- #include "swi_uart_at90usb1287_asf.h" --#endif -- -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using SWI interface. -- * -- @{ */ --#define SWI_WAKE_TOKEN ((uint8_t)0x00) //!< flag preceding a command --#define SWI_FLAG_CMD ((uint8_t)0x77) //!< flag preceding a command --#define SWI_FLAG_TX ((uint8_t)0x88) //!< flag requesting a response --#define SWI_FLAG_IDLE ((uint8_t)0xBB) //!< flag requesting to go into Idle mode --#define SWI_FLAG_SLEEP ((uint8_t)0xCC) //!< flag requesting to go into Sleep mode -- --ATCA_STATUS hal_swi_send_flag(ATCAIface iface, uint8_t flag); -- --/** @} */ --#endif /* HAL_SWI_UART_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_win_kit_cdc.c b/lib/hal/hal_win_kit_cdc.c -deleted file mode 100644 -index be3664f3df3b..000000000000 ---- a/lib/hal/hal_win_kit_cdc.c -+++ /dev/null -@@ -1,556 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Windows using kit protocol over a USB CDC device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --//#include "atca_basic.h" --#include "atca_hal.h" --#include "kit_phy.h" --#include "hal_win_kit_cdc.h" --#include "kit_protocol.h" -- --#include --#include --#include --#include -- -- --// File scope globals --atcacdc_t _gCdc; -- -- -- --/** \brief HAL implementation of Kit USB CDC init -- * \param[in] hal pointer to HAL specific data that is maintained by this HAL -- * \param[in] cfg pointer to HAL specific configuration data that is used to initialize this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_init(void* hal, ATCAIfaceCfg* cfg) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAHAL_t *phal = NULL; -- GUID *pcdc_guid = NULL; -- HDEVINFO dev_info; -- SP_DEVINFO_DATA dev_data; -- DWORD device_index = 0; -- DWORD required_size = 0; -- HKEY reg_key; -- DWORD reg_type = 0; -- TCHAR reg_data[256]; -- TCHAR cdc_data[256]; -- BOOL result = FALSE; -- LONG reg_result = 0; -- DCB dcb_settings; -- COMMTIMEOUTS comm_timeouts; -- int i = 0; -- int index = 0; -- -- // Check the input variables -- if ((hal == NULL) || (cfg == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Cast the hal to the ATCAHAL_t strucure -- phal = (ATCAHAL_t*)hal; -- -- // Initialize the _gCdc structure -- memset(&_gCdc, 0, sizeof(_gCdc)); -- for (i = 0; i < CDC_DEVICES_MAX; i++) -- { -- _gCdc.kits[i].read_handle = INVALID_HANDLE_VALUE; -- _gCdc.kits[i].write_handle = INVALID_HANDLE_VALUE; -- } -- -- _gCdc.num_kits_found = 0; -- -- // Get the number of available GUIDs -- result = SetupDiClassGuidsFromName(_T("Ports"), NULL, 0, &required_size); -- if (required_size == 0) -- { -- return ATCA_COMM_FAIL; -- } -- -- // Allocated the memory the GUID list -- pcdc_guid = malloc(required_size * sizeof(GUID)); -- -- // Get the number of available GUIDs -- result = SetupDiClassGuidsFromName(_T("Ports"), pcdc_guid, required_size, &required_size); -- if (result == TRUE) -- { -- //Query the devices -- dev_info = SetupDiGetClassDevs(pcdc_guid, NULL, NULL, DIGCF_PRESENT); -- if (dev_info != INVALID_HANDLE_VALUE) -- { -- // Initialize the dev_data object -- memset(&dev_data, 0, sizeof(SP_DEVINFO_DATA)); -- dev_data.cbSize = sizeof(SP_DEVINFO_DATA); -- -- while (SetupDiEnumDeviceInfo(dev_info, device_index, &dev_data)) -- { -- // Get the USB CDC friendly name -- required_size = sizeof(reg_data); -- result = SetupDiGetDeviceRegistryProperty(dev_info, &dev_data, SPDRP_FRIENDLYNAME, ®_type, -- (PBYTE)reg_data, required_size, &required_size); -- if (result == TRUE) -- { -- // Determine if this is the correct kit USB CDC device -- if ((_tcsstr(reg_data, _T("AT90USB"))) || -- (_tcsstr(reg_data, _T("XPLAINED"))) || -- (_tcsstr(reg_data, _T("Class ASF")))) -- { -- // Get the registry key for the kit USB CDC device -- reg_key = SetupDiOpenDevRegKey(dev_info, &dev_data, DICS_FLAG_GLOBAL, -- 0, DIREG_DEV, KEY_QUERY_VALUE); -- if (reg_key != INVALID_HANDLE_VALUE) -- { -- // Get the port used with this kit USB CDC device -- required_size = sizeof(reg_data); -- reg_result = RegQueryValueEx(reg_key, _T("PortName"), NULL, NULL, -- (LPBYTE)reg_data, &required_size); -- if (reg_result == ERROR_SUCCESS) -- { -- _sntprintf_s(cdc_data, sizeof(cdc_data) / sizeof(cdc_data[0]), _TRUNCATE, _T("\\\\.\\%s"), reg_data); -- -- // Open the kit USB device for reading and writing -- if (_gCdc.kits[index].read_handle != INVALID_HANDLE_VALUE) -- { -- CloseHandle(_gCdc.kits[index].read_handle); -- } -- _gCdc.kits[index].read_handle = INVALID_HANDLE_VALUE; -- _gCdc.kits[index].write_handle = INVALID_HANDLE_VALUE; -- -- _gCdc.kits[index].read_handle = CreateFile(cdc_data, -- GENERIC_READ | GENERIC_WRITE, -- 0, -- NULL, -- OPEN_EXISTING, -- FILE_ATTRIBUTE_NORMAL, -- NULL); -- _gCdc.kits[index].write_handle = _gCdc.kits[index].read_handle; -- -- if (_gCdc.kits[index].read_handle != INVALID_HANDLE_VALUE) -- { -- // Get the comm settings -- dcb_settings.DCBlength = sizeof(DCB); -- result = GetCommState(_gCdc.kits[index].read_handle, &dcb_settings); -- if (result == FALSE) -- { -- continue; -- } -- -- // Set the comm settings -- dcb_settings.BaudRate = cfg->atcauart.baud; -- dcb_settings.ByteSize = cfg->atcauart.wordsize; -- dcb_settings.StopBits = cfg->atcauart.stopbits; -- -- switch (cfg->atcauart.parity) -- { -- case 0: dcb_settings.Parity = EVENPARITY; -- case 1: dcb_settings.Parity = ODDPARITY; -- case 2: dcb_settings.Parity = NOPARITY; -- default: dcb_settings.Parity = NOPARITY; -- } -- -- result = SetCommState(_gCdc.kits[index].read_handle, &dcb_settings); -- if (result == FALSE) -- { -- continue; -- } -- -- // Set the comm timeout settings -- comm_timeouts.ReadIntervalTimeout = 3; -- comm_timeouts.ReadTotalTimeoutMultiplier = 3; -- comm_timeouts.ReadTotalTimeoutConstant = 2; -- comm_timeouts.WriteTotalTimeoutMultiplier = 3; -- comm_timeouts.WriteTotalTimeoutConstant = 2; -- -- SetCommTimeouts(_gCdc.kits[index].read_handle, &comm_timeouts); -- } -- -- // Increment the opened kit USB device index -- index++; -- } -- -- // Close the registry key -- RegCloseKey(reg_key); -- } -- } -- } -- -- // Break the while loop, if the maximum number of supported -- // kit USB devices have been found -- if (index == CDC_DEVICES_MAX) -- { -- break; -- } -- -- // Increment the device member index -- device_index++; -- } -- } -- -- // Delete device info now that we're done -- SetupDiDestroyDeviceInfoList(dev_info); -- } -- -- // Free allocated memory -- free(pcdc_guid); -- -- // Save the results of this discovery of HID -- if (index > 0) -- { -- _gCdc.num_kits_found = index; -- phal->hal_data = &_gCdc; -- return status; -- } -- return ATCA_NO_DEVICES; --} -- --/** \brief discover all CDC kits available.This function is currently not implemented. -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- */ -- --ATCA_STATUS hal_cdc_discover_buses(int i2c_buses[], int max_buses) --{ -- // TODO: This should be set to the com port index(s) -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number.This function is currently not implemented. -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_cdc_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- // TODO: Add kitg protocol calls to discover all devices -- return ATCA_UNIMPLEMENTED; --} -- -- --/** \brief HAL implementation of Kit USB CDC post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_post_init(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- atcacdc_t* pHalDat = atgetifacehaldat(iface); -- ATCAIfaceCfg *pCfg = atgetifacecfg(iface); -- int i = 0; -- -- do -- { -- // Check the pointers -- if (pHalDat == NULL || pCfg == NULL) -- { -- status = ATCA_BAD_PARAM; -- BREAK(status, "NULL pointers in hal_kit_cdc_post_init"); -- } -- // Init all kit USB devices -- for (i = 0; i < pHalDat->num_kits_found; i++) -- { -- // Set the port -- pCfg->atcauart.port = i; -- // Perform the kit protocol init -- status = kit_init(iface); -- if (status != ATCA_SUCCESS) -- { -- BREAK(status, "kit_init() Failed"); -- } -- } -- } -- while (0); -- return status; --} -- --/** \brief HAL implementation of kit protocol send .It is called by the top layer. -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_send(ATCAIface iface, const char* txdata, int txlength) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int cdcid = cfg->atcauart.port; -- atcacdc_t* pCdc = (atcacdc_t*)atgetifacehaldat(iface); -- uint8_t buffer[CDC_BUFFER_MAX]; -- DWORD bytes_to_send = 0; -- DWORD bytes_left = 0; -- DWORD bytes_sent = 0; -- BOOL result = FALSE; -- -- if ((txdata == NULL) || (pCdc == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- if (pCdc->kits[cdcid].write_handle == INVALID_HANDLE_VALUE) -- { -- return ATCA_COMM_FAIL; -- } -- -- bytes_left = txlength; -- -- while (bytes_left > 0) -- { -- memset(buffer, 0, CDC_BUFFER_MAX); -- -- if (bytes_left >= CDC_BUFFER_MAX) -- { -- bytes_to_send = CDC_BUFFER_MAX; -- } -- else -- { -- bytes_to_send = bytes_left; -- } -- -- memcpy(&buffer[0], &txdata[(txlength - bytes_left)], bytes_to_send); -- -- result = WriteFile(pCdc->kits[cdcid].write_handle, buffer, bytes_to_send, &bytes_sent, NULL); -- if (result == FALSE) -- { -- return ATCA_TX_FAIL; -- } -- -- bytes_left -= bytes_sent; -- } -- return status; --} -- -- --/** \brief HAL implementation of kit protocol receive data.It is called by the top layer. -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_receive(ATCAIface iface, char* rxdata, int* rxsize) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int cdcid = cfg->atcauart.port; -- atcacdc_t* pCdc = (atcacdc_t*)atgetifacehaldat(iface); -- uint8_t buffer[CDC_BUFFER_MAX] = { 0 }; -- BOOL continue_read = TRUE; -- DWORD bytes_read = 0; -- DWORD total_bytes = 0; -- BOOL result = true; -- uint8_t* location = NULL; -- int bytes_remain = 0; -- int bytes_to_copy = 0; -- int size_adjust = 0; -- -- // Verify the input variables -- if ((rxdata == NULL) || (rxsize == NULL) || (pCdc == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- if (pCdc->kits[cdcid].read_handle == INVALID_HANDLE_VALUE) -- { -- return ATCA_COMM_FAIL; -- } -- -- DWORD start_time_ms = GetTickCount(); -- while (continue_read == true) -- { -- // If the CDC port disappears while trying to read, ReadFile will continue to report -- // success and return 0 bytes. Same as when we're waiting for a reply. This lets the -- // operation timeout. -- if (GetTickCount() - start_time_ms > 3000) -- { -- // Close handles to force a quicker failure. -- CloseHandle(pCdc->kits[cdcid].read_handle); -- pCdc->kits[cdcid].read_handle = INVALID_HANDLE_VALUE; -- pCdc->kits[cdcid].write_handle = INVALID_HANDLE_VALUE; -- return ATCA_COMM_FAIL; -- } -- -- result = ReadFile(pCdc->kits[cdcid].read_handle, buffer, CDC_BUFFER_MAX, &bytes_read, NULL); -- if (result == FALSE) -- { -- return ATCA_RX_FAIL; -- } -- -- // Find the location of the '\n' character in read buffer -- // todo: generalize this read... it only applies if there is an ascii protocol with an of \n and if the exists -- location = strchr((char*)&buffer[0], '\n'); -- if (location == NULL) -- { -- // Copy all of the bytes -- bytes_to_copy = bytes_read; -- } -- else -- { -- // Copy only the bytes remaining in the read buffer to the -- bytes_to_copy = (int)(location - (char*)buffer); -- -- // The response has been received, stop receiving more data -- continue_read = false; -- } -- // Protect rxdata from overwriting, this will have the result of truncating the returned bytes -- // Remaining space in rxdata -- bytes_remain = (*rxsize - total_bytes); -- // Use the minimum between number of bytes read and remaining space -- bytes_to_copy = min(bytes_remain, bytes_to_copy); -- -- // Copy the received data -- memcpy(&rxdata[total_bytes], &buffer[0], bytes_to_copy); -- total_bytes += bytes_to_copy - size_adjust; -- } -- *rxsize = total_bytes; -- return ATCA_SUCCESS; --} -- --/** \brief Number of USB CDC devices found -- * \param[out] num_found Number of USB CDC devices found returned here -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_kit_phy_num_found(int8_t* num_found) --{ -- *num_found = _gCdc.num_kits_found; -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of kit protocol send over USB CDC -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_send(ATCAIface iface, uint8_t* txdata, int txlength) --{ -- // Call the hal_kit_send() function that will call hal_phy_send() implemented below -- return kit_send(iface, txdata, txlength); --} -- --/** \brief HAL implementation of kit protocol receive over USB CDC -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_receive(ATCAIface iface, uint8_t* rxdata, uint16_t* rxsize) --{ -- // Call the hal_kit_receive() function that will call hal_phy_receive() implemented below -- return kit_receive(iface, rxdata, rxsize); --} -- --/** \brief Call the wake for kit protocol over USB CDC -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_wake(ATCAIface iface) --{ -- // Call the hal_kit_wake() function that will call hal_phy_send() and hal_phy_receive() -- return kit_wake(iface); --} -- --/** \brief Call the idle for kit protocol over USB CDC -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_idle(ATCAIface iface) --{ -- // Call the hal_kit_idle() function that will call hal_phy_send() and hal_phy_receive() -- return kit_idle(iface); --} -- --/** \brief Call the sleep for kit protocol over USB CDC -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_sleep(ATCAIface iface) --{ -- // Call the hal_kit_sleep() function that will call hal_phy_send() and hal_phy_receive() -- return kit_sleep(iface); --} -- --/** \brief Close the physical port for CDC -- * \param[in] hal_data The hardware abstraction data specific to this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_cdc_release(void* hal_data) --{ -- int i = 0; -- atcacdc_t* phaldat = (atcacdc_t*)hal_data; -- -- if ((hal_data == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Close all kit USB devices -- for (i = 0; i < phaldat->num_kits_found; i++) -- { -- if (phaldat->kits[i].read_handle != INVALID_HANDLE_VALUE) -- { -- CloseHandle(phaldat->kits[i].read_handle); -- phaldat->kits[i].read_handle = INVALID_HANDLE_VALUE; -- phaldat->kits[i].write_handle = INVALID_HANDLE_VALUE; -- } -- } -- return ATCA_SUCCESS; --} -- --/** \brief discover cdc buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge.This function is currently not implemented. -- * \param[in] cdc_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- */ -- --ATCA_STATUS hal_kit_cdc_discover_buses(int cdc_buses[], int max_buses) --{ -- // TODO: Implement -- return ATCA_UNIMPLEMENTED; --} -- -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_kit_cdc_discover_devices(int busNum, ATCAIfaceCfg *cfg, int *found) --{ -- // TODO: Implement -- *found = 0; -- return ATCA_UNIMPLEMENTED; --} -\ No newline at end of file -diff --git a/lib/hal/hal_win_kit_cdc.h b/lib/hal/hal_win_kit_cdc.h -deleted file mode 100644 -index 8970d54965e2..000000000000 ---- a/lib/hal/hal_win_kit_cdc.h -+++ /dev/null -@@ -1,58 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Windows using kit protocol over a USB CDC device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_WIN_KIT_CDC_H_ --#define HAL_WIN_KIT_CDC_H_ -- --#include -- --// Kit USB defines --#define CDC_DEVICES_MAX 10 //! Maximum number of supported Kit USB devices --#define CDC_BUFFER_MAX 1024 //! Maximum number of bytes read per port read -- -- --// Each device that is found will have a read handle and a write handle --typedef struct cdc_device --{ -- HANDLE read_handle; //! The kit USB read file handle -- HANDLE write_handle; //! The kit USB write file handle --} cdc_device_t; -- -- --// A structure to hold CDC information --typedef struct atcacdc --{ -- cdc_device_t kits[CDC_DEVICES_MAX]; -- int8_t num_kits_found; --} atcacdc_t; -- --#endif /* HAL_WIN_KIT_CDC_H_ */ -- -diff --git a/lib/hal/hal_win_kit_hid.c b/lib/hal/hal_win_kit_hid.c -deleted file mode 100644 -index 44b52120bbee..000000000000 ---- a/lib/hal/hal_win_kit_hid.c -+++ /dev/null -@@ -1,469 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Windows using kit protocol over a USB HID device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include "atca_hal.h" --#include "hal_win_kit_hid.h" --#include "kit_protocol.h" --#include "kit_phy.h" --#include --#include --#include --#include -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// File scope globals --atcahid_t _gHid; -- --// The HID GUID filter --#define HID_GUID { 0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } -- -- -- --/** \brief HAL implementation of Kit USB HID init -- * \param[in] hal pointer to HAL specific data that is maintained by this HAL -- * \param[in] cfg pointer to HAL specific configuration data that is used to initialize this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_init(void* hal, ATCAIfaceCfg* cfg) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAHAL_t *phal = NULL; -- GUID hid_guid = HID_GUID; -- HDEVINFO dev_info; -- SP_DEVICE_INTERFACE_DATA dev_data; -- PSP_DEVICE_INTERFACE_DETAIL_DATA dev_detail_data; -- DWORD required_size = 0; -- BOOL result = FALSE; -- DWORD device_index = 0; -- int i = 0; -- int index = 0; -- TCHAR hid_filter[32]; -- -- // Check the input variables -- if ((hal == NULL) || (cfg == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Cast the hal to the ATCAHAL_t strucure -- phal = (ATCAHAL_t*)hal; -- -- // Initialize the _gHid structure -- memset(&_gHid, 0, sizeof(_gHid)); -- for (i = 0; i < HID_DEVICES_MAX; i++) -- { -- _gHid.kits[i].read_handle = INVALID_HANDLE_VALUE; -- _gHid.kits[i].write_handle = INVALID_HANDLE_VALUE; -- } -- -- _gHid.num_kits_found = 0; -- -- // Initialize the GUID --// UuidFromString(cfg->atcahid.guid, &hid_guid); -- -- // Query the devices -- dev_info = SetupDiGetClassDevs(&hid_guid, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); -- if (dev_info == INVALID_HANDLE_VALUE) -- { -- return ATCA_COMM_FAIL; -- } -- -- // Initialize the dev_data object -- memset(&dev_data, 0, sizeof(SP_DEVICE_INTERFACE_DATA)); -- dev_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); -- -- // Construct the filter string -- memset(hid_filter, 0, sizeof(hid_filter)); -- _stprintf(hid_filter, _T("vid_%04x&pid_%04x"), cfg->atcahid.vid, cfg->atcahid.pid); -- -- // Find the Atmel kit USB devices -- while (SetupDiEnumDeviceInterfaces(dev_info, NULL, &hid_guid, device_index, &dev_data)) -- { -- // Get the required buffer size of the detailed data -- SetupDiGetDeviceInterfaceDetail(dev_info, &dev_data, NULL, 0, &required_size, NULL); -- -- // Allocate the required space for the detailed interface data -- dev_detail_data = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(required_size); -- -- // Retrieve the detailed interface data -- dev_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); -- result = SetupDiGetDeviceInterfaceDetail(dev_info, &dev_data, dev_detail_data, -- required_size, &required_size, NULL); -- -- // Determine if this is the correct kit USB device -- -- if (_tcsstr(dev_detail_data->DevicePath, hid_filter) != NULL) -- { -- // Open the kit USB device for reading and writing -- if (_gHid.kits[index].read_handle != INVALID_HANDLE_VALUE) -- { -- CloseHandle(_gHid.kits[index].read_handle); -- } -- if (_gHid.kits[index].write_handle != INVALID_HANDLE_VALUE) -- { -- CloseHandle(_gHid.kits[index].write_handle); -- } -- -- _gHid.kits[index].read_handle = CreateFile(dev_detail_data->DevicePath, -- GENERIC_READ, -- (FILE_SHARE_READ | FILE_SHARE_WRITE), -- NULL, -- OPEN_EXISTING, -- 0, -- NULL); -- _gHid.kits[index].write_handle = CreateFile(dev_detail_data->DevicePath, -- GENERIC_WRITE, -- (FILE_SHARE_READ | FILE_SHARE_WRITE), -- NULL, -- OPEN_EXISTING, -- 0, -- NULL); -- -- // Increment the opened kit USB device index -- index++; -- } -- // Deallocate the required space for the detailed interface data -- free(dev_detail_data); -- -- // Break the while loop, if the maximum number of supported -- // kit USB devices have been found -- if (index == HID_DEVICES_MAX) -- { -- break; -- } -- -- // Increment the device member index -- device_index++; -- } -- -- // Delete device info now that we're done -- SetupDiDestroyDeviceInfoList(dev_info); -- -- // Save the results of this discovery of HID -- if (index > 0) -- { -- _gHid.num_kits_found = index; -- phal->hal_data = &_gHid; -- } -- return status; --} -- -- --/** \brief discover all HID kits available.This function is currently not implemented. -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] cdc_buses an array of logical bus numbers -- * \param[in] max_buses maximum number of buses the app wants to attempt to discover -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_kit_hid_discover_buses(int cdc_buses[], int max_buses) --{ -- // TODO: This should be set to the com port index(s) -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number.This function is currently not implemented. -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_UNIMPLEMENTED -- */ --ATCA_STATUS hal_kit_hid_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- // TODO: Add kitg protocol calls to discover all devices -- return ATCA_UNIMPLEMENTED; --} -- --/** \brief HAL implementation of Kit HID post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_post_init(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- atcahid_t* pHid = atgetifacehaldat(iface); -- ATCAIfaceCfg *pCfg = atgetifacecfg(iface); -- int i = 0; -- -- do -- { -- // Check the pointers -- if (pHid == NULL || pCfg == NULL) -- { -- status = ATCA_BAD_PARAM; -- BREAK(status, "NULL pointers in hal_kit_hid_post_init"); -- } -- // Init all kit USB HID devices -- for (i = 0; i < pHid->num_kits_found; i++) -- { -- // Perform the kit protocol init -- status = kit_init(iface); -- if (status != ATCA_SUCCESS) -- { -- BREAK(status, "kit_init() Failed"); -- } -- } -- -- } -- while (0); -- return status; --} -- --/** \brief HAL implementation of kit protocol send .It is called by the top layer. -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_send(ATCAIface iface, const char* txdata, int txlength) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int hidid = cfg->atcahid.idx; -- atcahid_t* pHid = (atcahid_t*)atgetifacehaldat(iface); -- uint8_t buffer[HID_PACKET_MAX]; -- DWORD bytes_to_send = 0; -- DWORD bytes_left = 0; -- DWORD bytes_sent = 0; -- BOOL result = FALSE; -- -- if ((txdata == NULL) || (pHid == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- if (pHid->kits[hidid].write_handle == INVALID_HANDLE_VALUE) -- { -- return ATCA_COMM_FAIL; -- } -- -- bytes_left = txlength; -- -- while (bytes_left > 0) -- { -- memset(buffer, 0, (HID_PACKET_MAX)); -- -- if (bytes_left >= cfg->atcahid.packetsize) -- { -- bytes_to_send = cfg->atcahid.packetsize; -- } -- else -- { -- bytes_to_send = bytes_left; -- } -- -- memcpy(&buffer[1], &txdata[(txlength - bytes_left)], bytes_to_send); -- -- result = WriteFile(pHid->kits[hidid].write_handle, buffer, (cfg->atcahid.packetsize + 1), &bytes_sent, NULL); -- if (result == FALSE) -- { -- return ATCA_TX_FAIL; -- } -- -- bytes_left -= bytes_to_send; -- } -- return status; --} -- --/** \brief HAL implementation of kit protocol receive data.It is called by the top layer. -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_phy_receive(ATCAIface iface, char* rxdata, int* rxsize) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int hidid = cfg->atcahid.idx; -- atcahid_t* pHid = (atcahid_t*)atgetifacehaldat(iface); -- uint8_t buffer[HID_PACKET_MAX] = { 0 }; -- BOOL continue_read = TRUE; -- DWORD bytes_read = 0; -- DWORD total_bytes = 0; -- BOOL result = true; -- char* location = NULL; -- int bytes_remain = 0; -- int bytes_to_cpy = 0; -- int size_adjust = 0; -- -- // Verify the input variables -- if ((rxdata == NULL) || (rxsize == NULL) || (pHid == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- if (pHid->kits[hidid].read_handle == INVALID_HANDLE_VALUE) -- { -- return ATCA_COMM_FAIL; -- } -- -- while (continue_read == true) -- { -- result = ReadFile(pHid->kits[hidid].read_handle, buffer, (cfg->atcahid.packetsize + 1), &bytes_read, NULL); -- if (result == false) -- { -- return ATCA_RX_FAIL; -- } -- // Find the location of the '\n' character in read buffer -- // todo: generalize this read... it only applies if there is an ascii protocol with an of \n and if the exists -- location = strchr((char*)&buffer[1], '\n'); -- if (location == NULL) -- { -- // Copy all of the bytes -- bytes_to_cpy = bytes_read; -- // An extra byte is prepended to HID communication -- size_adjust = 1; -- } -- else -- { -- // Copy only the bytes remaining in the read buffer to the -- bytes_to_cpy = (uint8_t)(location - (char*)buffer); -- size_adjust = 0; -- // The response has been received, stop receiving more data -- continue_read = false; -- } -- // Protect rxdata from overwriting, this will have the result of truncating the returned bytes -- // Remaining space in rxdata -- bytes_remain = (*rxsize - total_bytes); -- // Use the minimum between number of bytes read and remaining space -- bytes_to_cpy = min(bytes_remain, bytes_to_cpy); -- -- // Copy the received data -- memcpy(&rxdata[total_bytes], &buffer[1], bytes_to_cpy); -- total_bytes += bytes_to_cpy - size_adjust; -- } -- *rxsize = total_bytes; -- return ATCA_SUCCESS; --} -- --/** \brief Number of USB HID devices found -- * \param[out] num_found -- * \return SUCCESS -- */ --ATCA_STATUS kit_phy_num_found(int8_t* num_found) --{ -- *num_found = _gHid.num_kits_found; -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of kit protocol send over USB HID -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_send(ATCAIface iface, uint8_t* txdata, int txlength) --{ -- // Call the kit_send() function that will call phy_send() implemented below -- return kit_send(iface, txdata, txlength); --} -- --/** \brief HAL implementation of send over USB HID -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_receive(ATCAIface iface, uint8_t* rxdata, uint16_t* rxsize) --{ -- // Call the kit_receive() function that will call phy_receive() implemented below -- return kit_receive(iface, rxdata, rxsize); --} -- --/** \brief Call the wake for kit protocol over USB HID -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_wake(ATCAIface iface) --{ -- // Call the kit_wake() function that will call phy_send() and phy_receive() -- return kit_wake(iface); --} -- --/** \brief Call the idle for kit protocol over USB HID -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_idle(ATCAIface iface) --{ -- // Call the kit_idle() function that will call phy_send() and phy_receive() -- return kit_idle(iface); --} -- --/** \brief Call the sleep for kit protocol over USB HID -- * \param[in] iface ATCAIface instance that is the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_sleep(ATCAIface iface) --{ -- // Call the kit_sleep() function that will call phy_send() and phy_receive() -- return kit_sleep(iface); --} -- --/** \brief Close the physical port for HID -- * \param[in] hal_data The hardware abstraction data specific to this HAL -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_kit_hid_release(void* hal_data) --{ -- int i = 0; -- atcahid_t* phaldat = (atcahid_t*)hal_data; -- -- if ((hal_data == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Close all kit USB devices -- for (i = 0; i < phaldat->num_kits_found; i++) -- { -- if (phaldat->kits[i].read_handle != INVALID_HANDLE_VALUE) -- { -- CloseHandle(phaldat->kits[i].read_handle); -- phaldat->kits[i].read_handle = INVALID_HANDLE_VALUE; -- } -- -- if (phaldat->kits[i].write_handle != INVALID_HANDLE_VALUE) -- { -- CloseHandle(phaldat->kits[i].write_handle); -- phaldat->kits[i].write_handle = INVALID_HANDLE_VALUE; -- } -- } -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_win_kit_hid.h b/lib/hal/hal_win_kit_hid.h -deleted file mode 100644 -index e3523272d33a..000000000000 ---- a/lib/hal/hal_win_kit_hid.h -+++ /dev/null -@@ -1,64 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for Windows using kit protocol over a USB HID device. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_WIN_KIT_HID_H_ --#define HAL_WIN_KIT_HID_H_ -- --#include -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// Kit USB defines --#define HID_DEVICES_MAX 10 //! Maximum number of supported Kit USB devices --#define HID_PACKET_MAX 512 //! Maximum number of bytes for a HID send/receive packet (typically 64) -- --// Each device that is found will have a read handle and a write handle --typedef struct hid_device --{ -- HANDLE read_handle; //! The kit USB read file handle -- HANDLE write_handle; //! The kit USB write file handle --} hid_device_t; -- -- --// A structure to hold HID information --typedef struct atcahid --{ -- hid_device_t kits[HID_DEVICES_MAX]; -- int8_t num_kits_found; --} atcahid_t; -- --/** @} */ --#endif /* HAL_WIN_KIT_HID_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_win_timer.c b/lib/hal/hal_win_timer.c -deleted file mode 100644 -index 71c431b4354b..000000000000 ---- a/lib/hal/hal_win_timer.c -+++ /dev/null -@@ -1,86 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for windows timer functions. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of microseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // divide by 1000 to convert us to ms -- // todo: use a timer with us accuracy -- long ms = (long)(delay / 1.0e3 + 0.5); // Miliseconds -- -- // use Windows supplied delay -- Sleep(delay); --} -- --/** \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // divide by 100 to convert 10's of us to ms -- // todo: use a timer with us accuracy -- long ms = (long)(delay / 1.0e2 + 0.5); // Miliseconds -- -- // use Windows supplied delay -- Sleep(delay); --} -- --/** \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * \param[in] delay number of milliseconds to delay -- */ -- --/* ASF already has delay_ms - see delay.h */ --void atca_delay_ms(uint32_t delay) --{ -- // use Windows supplied delay -- Sleep(delay); --} -- --/** @} */ -diff --git a/lib/hal/hal_xmega_a3bu_i2c_asf.c b/lib/hal/hal_xmega_a3bu_i2c_asf.c -deleted file mode 100644 -index 2d8fa71c9b21..000000000000 ---- a/lib/hal/hal_xmega_a3bu_i2c_asf.c -+++ /dev/null -@@ -1,520 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for XMEGA-A3BU I2C over ASF drivers. -- * -- * Prerequisite: add I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include --#include "atca_hal.h" --#include "hal_xmega_a3bu_i2c_asf.h" --#include "atca_device.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- --/** \brief logical to physical bus mapping structure */ --ATCAI2CMaster_t *i2c_hal_data[MAX_I2C_BUSES]; // map logical, 0-based bus number to index --int i2c_bus_ref_ct = 0; // total in-use count across buses --static twi_master_options_t config_i2c_master; -- -- --/** \brief discover i2c buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] i2c_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_buses(int i2c_buses[], int max_buses) --{ -- -- /* if every PORT was a likely candidate bus, then would need to initialize the entire array to all PORT n numbers. -- * As an optimization and making discovery safer, make assumptions about bus-num / PORT map based on XMEGA-A3BU Xplained Pro board -- * If you were using a raw XMEGA on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- */ -- i2c_buses[0] = 2; // default xmega-a3bu for xplained dev board -- -- return ATCA_SUCCESS; --} -- --/** \brief discover any CryptoAuth devices on a given logical bus number -- * \param[in] busNum - logical bus number on which to look for CryptoAuth devices -- * \param[out] cfg[] - pointer to head of an array of interface config structures which get filled in by this method -- * \param[out] *found - number of devices found on this bus -- * \return ATCA_SUCCESS -- */ -- --ATCA_STATUS hal_i2c_discover_devices(int busNum, ATCAIfaceCfg cfg[], int *found) --{ -- ATCAIfaceCfg *head = cfg; -- uint8_t slaveAddress = 0x01; -- ATCADevice device; -- ATCAIface discoverIface; -- ATCACommand command; -- ATCAPacket packet; -- ATCA_STATUS status; -- uint8_t revs508[1][4] = { { 0x00, 0x00, 0x50, 0x00 } }; -- uint8_t revs108[1][4] = { { 0x80, 0x00, 0x10, 0x01 } }; -- uint8_t revs204[3][4] = { { 0x00, 0x02, 0x00, 0x08 }, -- { 0x00, 0x02, 0x00, 0x09 }, -- { 0x00, 0x04, 0x05, 0x00 } }; -- int i; -- -- /** \brief default configuration, to be reused during discovery process */ -- ATCAIfaceCfg discoverCfg = { -- .iface_type = ATCA_I2C_IFACE, -- .devtype = ATECC508A, -- .atcai2c.slave_address = 0x07, -- .atcai2c.bus = busNum, -- .atcai2c.baud = 400000, -- //.atcai2c.baud = 100000, -- .wake_delay = 800, -- .rx_retries = 3 -- }; -- -- // build an info command -- packet.param1 = INFO_MODE_REVISION; -- packet.param2 = 0; -- -- device = newATCADevice(&discoverCfg); -- discoverIface = atGetIFace(device); -- command = atGetCommands(device); -- -- // iterate through all addresses on given i2c bus -- // all valid 7-bit addresses go from 0x07 to 0x78 -- for (slaveAddress = 0x07; slaveAddress <= 0x78; slaveAddress++) -- { -- discoverCfg.atcai2c.slave_address = slaveAddress << 1; // turn it into an 8-bit address which is what the rest of the i2c HAL is expecting when a packet is sent -- -- // wake up device -- // If it wakes, send it a dev rev command. Based on that response, determine the device type -- // BTW - this will wake every cryptoauth device living on the same bus (ecc508a, sha204a) -- -- if (hal_i2c_wake(discoverIface) == ATCA_SUCCESS) -- { -- (*found)++; -- memcpy( (uint8_t*)head, (uint8_t*)&discoverCfg, sizeof(ATCAIfaceCfg)); -- -- memset(packet.data, 0x00, sizeof(packet.data)); -- -- // get devrev info and set device type accordingly -- atInfo(command, &packet); -- if ((status = atGetExecTime(packet.opcode, command)) != ATCA_SUCCESS) -- { -- continue; -- } -- -- // send the command -- if ( (status = atsend(discoverIface, (uint8_t*)&packet, packet.txsize)) != ATCA_SUCCESS) -- { -- printf("packet send error\r\n"); -- continue; -- } -- -- // delay the appropriate amount of time for command to execute -- atca_delay_ms((command->execution_time_msec) + 1); -- -- // receive the response -- if ( (status = atreceive(discoverIface, &(packet.data[0]), &(packet.rxsize) )) != ATCA_SUCCESS) -- { -- continue; -- } -- -- if ( (status = isATCAError(packet.data)) != ATCA_SUCCESS) -- { -- printf("command response error\r\n"); -- continue; -- } -- -- // determine device type from common info and dev rev response byte strings -- for (i = 0; i < sizeof(revs508) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs508[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC508A; -- break; -- } -- } -- -- for (i = 0; i < sizeof(revs204) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs204[i], 4) == 0) -- { -- discoverCfg.devtype = ATSHA204A; -- break; -- } -- } -- -- for (i = 0; i < sizeof(revs108) / 4; i++) -- { -- if (memcmp(&packet.data[1], &revs108[i], 4) == 0) -- { -- discoverCfg.devtype = ATECC108A; -- break; -- } -- } -- -- atca_delay_ms(15); -- // now the device type is known, so update the caller's cfg array element with it -- head->devtype = discoverCfg.devtype; -- head++; -- } -- -- hal_i2c_idle(discoverIface); -- } -- -- deleteATCADevice(&device); -- -- return ATCA_SUCCESS; --} -- -- --/** \brief -- - this HAL implementation assumes you've included the ASF I2C libraries in your project, otherwise, -- the HAL layer will not compile because the ASF I2C drivers are a dependency * -- */ -- --/** \brief hal_i2c_init manages requests to initialize a physical interface. it manages use counts so when an interface -- * has released the physical layer, it will disable the interface for some other use. -- * You can have multiple ATCAIFace instances using the same bus, and you can have multiple ATCAIFace instances on -- * multiple i2c buses, so hal_i2c_init manages these things and ATCAIFace is abstracted from the physical details. -- */ -- --/** \brief initialize an I2C interface using given config -- * \param[in] hal - opaque ptr to HAL data -- * \param[in] cfg - interface configuration -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg) --{ -- int bus = cfg->atcai2c.bus; // 0-based logical bus number -- ATCAHAL_t *phal = (ATCAHAL_t*)hal; -- -- if (i2c_bus_ref_ct == 0) // power up state, no i2c buses will have been used -- { -- for (int i = 0; i < MAX_I2C_BUSES; i++) -- { -- i2c_hal_data[i] = NULL; -- } -- } -- -- i2c_bus_ref_ct++; // total across buses -- -- if (bus >= 0 && bus < MAX_I2C_BUSES) -- { -- // if this is the first time this bus and interface has been created, do the physical work of enabling it -- if (i2c_hal_data[bus] == NULL) -- { -- i2c_hal_data[bus] = malloc(sizeof(ATCAI2CMaster_t) ); -- i2c_hal_data[bus]->ref_ct = 1; // buses are shared, this is the first instance -- -- config_i2c_master.speed = cfg->atcai2c.baud; -- config_i2c_master.chip = 0x50; -- config_i2c_master.speed_reg = TWI_BAUD(sysclk_get_cpu_hz(), cfg->atcai2c.baud); -- switch (bus) -- { -- case 0: i2c_hal_data[bus]->i2c_master_instance = &TWIC; break; -- //case 1: i2c_hal_data[bus]->i2c_master_instance = &TWID; break; // for XMEGA-A1 -- case 2: i2c_hal_data[bus]->i2c_master_instance = &TWIE; break; -- //case 3: i2c_hal_data[bus]->i2c_master_instance = &TWIF; break; // for XMEGA-A1 -- } -- -- twi_master_setup((i2c_hal_data[bus]->i2c_master_instance), &config_i2c_master); -- // store this for use during the release phase -- i2c_hal_data[bus]->bus_index = bus; -- twi_master_enable(i2c_hal_data[bus]->i2c_master_instance); -- } -- else -- { -- // otherwise, another interface already initialized the bus, so this interface will share it and any different -- // cfg parameters will be ignored...first one to initialize this sets the configuration -- i2c_hal_data[bus]->ref_ct++; -- } -- -- phal->hal_data = i2c_hal_data[bus]; -- -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief HAL implementation of I2C post init -- * \param[in] iface instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS hal_i2c_post_init(ATCAIface iface) --{ -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C send over ASF -- * \param[in] iface instance -- * \param[in] txdata pointer to space to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address >> 1, // TWI slave bus address -- .buffer = txdata, // transfer data source buffer -- .length = txlength, // transfer data size (bytes) -- }; -- -- // for this implementation of I2C with CryptoAuth chips, txdata is assumed to have ATCAPacket format -- -- // other device types that don't require i/o tokens on the front end of a command need a different hal_i2c_send and wire it up instead of this one -- // this covers devices such as ATSHA204A and ATECCx08A that require a word address value pre-pended to the packet -- // txdata[0] is using _reserved byte of the ATCAPacket -- txdata[0] = 0x03; // insert the Word Address Value, Command token -- txlength++; // account for word address value byte. -- packet.length = txlength; -- -- if (twi_master_write(i2c_hal_data[bus]->i2c_master_instance, &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief HAL implementation of I2C receive function for ASF I2C -- * \param[in] iface instance -- * \param[out] rxdata pointer to space to receive the data -- * \param[in] rxlength ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- int status = !STATUS_OK; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address >> 1, // TWI slave bus address -- .buffer = rxdata, // transfer data source buffer -- .length = *rxlength, // transfer data size (bytes) -- }; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = twi_master_read(i2c_hal_data[bus]->i2c_master_instance, &packet); -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief method to change the bus speec of I2C -- * \param[in] iface interface on which to change bus speed -- * \param[in] speed baud rate (typically 100000 or 400000) -- */ -- --void change_i2c_speed(ATCAIface iface, uint32_t speed) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- -- config_i2c_master.speed = speed; -- config_i2c_master.speed_reg = TWI_BAUD(sysclk_get_cpu_hz(), speed); -- -- twi_master_disable(i2c_hal_data[bus]->i2c_master_instance); -- -- switch (bus) -- { -- case 0: i2c_hal_data[bus]->i2c_master_instance = &TWIC; break; -- case 2: i2c_hal_data[bus]->i2c_master_instance = &TWIE; break; -- } -- -- twi_master_setup((i2c_hal_data[bus]->i2c_master_instance), &config_i2c_master); -- -- twi_master_enable(i2c_hal_data[bus]->i2c_master_instance); --} -- --/** \brief wake up CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to wakeup -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_wake(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- int retries = cfg->rx_retries; -- uint32_t bdrt = cfg->atcai2c.baud; -- int status = !STATUS_OK; -- uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 }; -- -- if (bdrt != 100000) // if not already at 100KHz, change it -- { -- change_i2c_speed(iface, 100000); -- } -- -- // Send the wake by writing to an address of 0x00 -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = 0x00, // TWI slave bus address -- .buffer = &data[0], // transfer data source buffer -- .length = 0 // transfer data size (bytes) -- }; -- -- -- // Send the 00 address as the wake pulse -- twi_master_write(i2c_hal_data[bus]->i2c_master_instance, &packet); // part will NACK, so don't check for status -- -- atca_delay_us(cfg->wake_delay); // wait tWHI + tWLO which is configured based on device type and configuration structure -- -- packet.chip = cfg->atcai2c.slave_address >> 1; -- packet.length = 4; -- packet.buffer = data; -- -- while (retries-- > 0 && status != STATUS_OK) -- { -- status = twi_master_read(i2c_hal_data[bus]->i2c_master_instance, &packet); -- } -- -- if (status != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- // if necessary, revert baud rate to what came in. -- if (bdrt != 100000) -- { -- change_i2c_speed(iface, bdrt); -- } -- -- if (memcmp(data, expected, 4) == 0) -- { -- return ATCA_SUCCESS; -- } -- -- return ATCA_COMM_FAIL; --} -- --/** \brief idle CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to idle -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_idle(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address >> 1, // TWI slave bus address -- .buffer = &data[0], // transfer data source buffer -- .length = 1 // transfer data size (bytes) -- }; -- -- data[0] = 0x02; // idle word address value -- if (twi_master_write((i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; -- --} -- --/** \brief sleep CryptoAuth device using I2C bus -- * \param[in] iface interface to logical device to sleep -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_sleep(ATCAIface iface) --{ -- ATCAIfaceCfg *cfg = atgetifacecfg(iface); -- int bus = cfg->atcai2c.bus; -- uint8_t data[4]; -- -- twi_package_t packet = { -- .addr_length = 0, // TWI slave memory address data size -- .chip = cfg->atcai2c.slave_address >> 1, // TWI slave bus address -- .buffer = &data[0], // transfer data source buffer -- .length = 1 // transfer data size (bytes) -- }; -- -- data[0] = 0x01; // sleep word address value -- if (twi_master_write((i2c_hal_data[bus]->i2c_master_instance), &packet) != STATUS_OK) -- { -- return ATCA_COMM_FAIL; -- } -- -- return ATCA_SUCCESS; --} -- --/** \brief manages reference count on given bus and releases resource if no more refences exist -- * \param[in] hal_data - opaque pointer to hal data structure - known only to the HAL implementation -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ -- --ATCA_STATUS hal_i2c_release(void *hal_data) --{ -- ATCAI2CMaster_t *hal = (ATCAI2CMaster_t*)hal_data; -- -- i2c_bus_ref_ct--; // track total i2c bus interface instances for consistency checking and debugging -- -- // if the use count for this bus has gone to 0 references, disable it. protect against an unbracketed release -- if (hal && --(hal->ref_ct) <= 0 && i2c_hal_data[hal->bus_index] != NULL) -- { -- twi_master_disable(hal->i2c_master_instance); -- free(i2c_hal_data[hal->bus_index]); -- i2c_hal_data[hal->bus_index] = NULL; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/hal_xmega_a3bu_i2c_asf.h b/lib/hal/hal_xmega_a3bu_i2c_asf.h -deleted file mode 100644 -index 4617c739245d..000000000000 ---- a/lib/hal/hal_xmega_a3bu_i2c_asf.h -+++ /dev/null -@@ -1,64 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for XMEGA-A3BU I2C over ASF drivers. -- * -- * Prerequisite: add I2C Master Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef HAL_XMEGA_A3BU_I2C_ASF_H_ --#define HAL_XMEGA_A3BU_I2C_ASF_H_ -- --#include --#include "twi_master.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * using I2C driver of ASF. -- * -- @{ */ -- -- --#define MAX_I2C_BUSES 4 // XMEGA A3BU has up to 4 PORT that can be configured as I2C -- --/** \brief this is the hal_data for ATCA HAL created using ASF -- */ --typedef struct atcaI2Cmaster --{ -- twi_master_t i2c_master_instance; -- int ref_ct; -- // for conveniences during interface release phase -- int bus_index; --} ATCAI2CMaster_t; -- --void change_i2c_speed(ATCAIface iface, uint32_t speed); -- --/** @} */ --#endif /* HAL_XMEGA_A3BU_I2C_ASF_H_ */ -\ No newline at end of file -diff --git a/lib/hal/hal_xmega_a3bu_timer_asf.c b/lib/hal/hal_xmega_a3bu_timer_asf.c -deleted file mode 100644 -index e2f4a4337e03..000000000000 ---- a/lib/hal/hal_xmega_a3bu_timer_asf.c -+++ /dev/null -@@ -1,78 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer for SAMD21 timer/delay over ASF drivers. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "atca_hal.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** \brief This function delays for a number of microseconds. -- * -- * \param[in] delay number of 0.001 milliseconds to delay -- */ --void atca_delay_us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay); --} -- --/** \brief This function delays for a number of tens of microseconds. -- * -- * \param[in] delay number of 0.01 milliseconds to delay -- */ --void atca_delay_10us(uint32_t delay) --{ -- // use ASF supplied delay -- delay_us(delay * 10); -- --} -- --/** \brief This function delays for a number of milliseconds. -- * -- * You can override this function if you like to do -- * something else in your system while delaying. -- * \param[in] delay number of milliseconds to delay -- */ -- --/* ASF already has delay_ms - see delay.h */ --void atca_delay_ms(uint32_t delay) --{ -- // use ASF supplied delay -- delay_ms(delay); --} -- --/** @} */ -diff --git a/lib/hal/i2c_bitbang_samd21.c b/lib/hal/i2c_bitbang_samd21.c -deleted file mode 100644 -index 0cdac42912b9..000000000000 ---- a/lib/hal/i2c_bitbang_samd21.c -+++ /dev/null -@@ -1,262 +0,0 @@ --/** -- * \file -- * \brief Hardware Interface Functions - I2C bit-bang for SAMd21 -- * \author Atmel Crypto Group -- * \date November 18, 2015 -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "i2c_bitbang_samd21.h" --#define DEFAULT_I2C_BUS 2 -- -- --I2CBuses i2c_buses_default = { -- { EXT3_PIN_3, EXT3_PIN_9, EXT3_PIN_I2C_SDA, EXT3_PIN_13, EXT2_PIN_3, EXT2_PIN_5, EXT2_PIN_7, EXT2_PIN_9, EXT2_PIN_13, EXT2_PIN_15, EXT2_PIN_17, EXT1_PIN_3, EXT1_PIN_5, EXT1_PIN_7, EXT1_PIN_9, EXT1_PIN_13, EXT1_PIN_15, EXT1_PIN_17 }, -- { EXT3_PIN_7, EXT3_PIN_10, EXT3_PIN_I2C_SCL, EXT3_PIN_14, EXT2_PIN_4, EXT2_PIN_6, EXT2_PIN_8, EXT2_PIN_10, EXT2_PIN_14, EXT2_PIN_16, EXT2_PIN_18, EXT1_PIN_4, EXT1_PIN_6, EXT1_PIN_8, EXT1_PIN_10, EXT1_PIN_14, EXT1_PIN_16, EXT1_PIN_18 } --}; -- --uint8_t pin_sda, pin_scl; -- --void i2c_discover_buses(int i2c_bitbang_buses[], int max_buses) --{ -- -- i2c_bitbang_buses[0] = DEFAULT_I2C_BUS; -- --} -- --void i2c_set_pin(uint8_t sda, uint8_t scl) --{ -- pin_sda = sda; -- pin_scl = scl; --} -- --void i2c_enable(void) --{ -- I2C_ENABLE(); -- I2C_DATA_HIGH(); -- I2C_CLOCK_HIGH(); --} -- --void i2c_disable(void) --{ -- I2C_DISABLE(); --} -- -- --void i2c_send_start(void) --{ -- //! Set clock high in case we re-start. -- I2C_CLOCK_HIGH(); -- I2C_SET_OUTPUT_HIGH(); -- I2C_DATA_LOW(); -- I2C_HOLD_DELAY(); -- I2C_CLOCK_LOW(); --} -- --void i2c_send_ack(uint8_t ack) --{ -- if (ack) -- { -- I2C_SET_OUTPUT_LOW(); //!< Low data line indicates an ACK. -- while (I2C_DATA_IN()) -- { -- ; -- } -- } -- else -- { -- I2C_SET_OUTPUT_HIGH(); //!< High data line indicates a NACK. -- while (!I2C_DATA_IN()) -- { -- ; -- } -- } -- -- //! Clock out acknowledgment. -- I2C_CLOCK_HIGH(); -- I2C_CLOCK_DELAY_SEND_ACK(); -- I2C_CLOCK_LOW(); --} -- --void i2c_send_stop(void) --{ -- I2C_SET_OUTPUT_LOW(); -- I2C_CLOCK_DELAY_WRITE_LOW(); -- I2C_CLOCK_HIGH(); -- I2C_HOLD_DELAY(); -- I2C_DATA_HIGH(); --} -- -- --void i2c_send_wake_token(void) --{ -- I2C_DATA_LOW(); -- delay_us(80); -- I2C_DATA_HIGH(); --} -- --ATCA_STATUS i2c_send_byte(uint8_t i2c_byte) --{ -- ATCA_STATUS status = ATCA_TX_TIMEOUT; -- -- uint8_t i; -- -- DISABLE_INTERRUPT(); -- -- //! This avoids spikes but adds an if condition. -- //! We could parametrize the call to I2C_SET_OUTPUT -- //! and translate the msb to OUTSET or OUTCLR, -- //! but then the code would become target specific. -- if (i2c_byte & 0x80) -- { -- I2C_SET_OUTPUT_HIGH(); -- } -- else -- { -- I2C_SET_OUTPUT_LOW(); -- } -- -- //! Send 8 bits of data. -- for (i = 0; i < 8; i++) -- { -- I2C_CLOCK_LOW(); -- if (i2c_byte & 0x80) -- { -- I2C_DATA_HIGH(); -- } -- else -- { -- I2C_DATA_LOW(); -- } -- I2C_CLOCK_DELAY_WRITE_LOW(); -- -- //! Clock out the data bit. -- I2C_CLOCK_HIGH(); -- -- //! Shifting while clock is high compensates for the time it -- //! takes to evaluate the bit while clock is low. -- //! That way, the low and high time of the clock pin is -- //! almost equal. -- i2c_byte <<= 1; -- I2C_CLOCK_DELAY_WRITE_HIGH(); -- } -- //! Clock in last data bit. -- I2C_CLOCK_LOW(); -- -- //! Set data line to be an input. -- I2C_SET_INPUT(); -- -- I2C_CLOCK_DELAY_READ_LOW(); -- //! Wait for the ack. -- I2C_CLOCK_HIGH(); -- for (i = 0; i < I2C_ACK_TIMEOUT; i++) -- { -- if (!I2C_DATA_IN()) -- { -- status = ATCA_SUCCESS; -- I2C_CLOCK_DELAY_READ_HIGH(); -- break; -- } -- } -- I2C_CLOCK_LOW(); -- -- ENABLE_INTERRUPT(); -- -- return status; --} -- --ATCA_STATUS i2c_send_bytes(uint8_t count, uint8_t *data) --{ -- ATCA_STATUS status = ATCA_TX_TIMEOUT; -- -- uint8_t i; -- -- for (i = 0; i < count; i++) -- { -- status = i2c_send_byte(data[i]); -- if (status != ATCA_SUCCESS) -- { -- if (i > 0) -- { -- status = ATCA_TX_FAIL; -- } -- break; -- } -- } -- -- return status; --} -- --uint8_t i2c_receive_one_byte(uint8_t ack) --{ -- uint8_t i2c_byte; -- uint8_t i; -- -- DISABLE_INTERRUPT(); -- -- I2C_SET_INPUT(); -- for (i = 0x80, i2c_byte = 0; i; i >>= 1) -- { -- I2C_CLOCK_HIGH(); -- I2C_CLOCK_DELAY_READ_HIGH(); -- if (I2C_DATA_IN()) -- { -- i2c_byte |= i; -- } -- I2C_CLOCK_LOW(); -- if (i > 1) -- { -- //! We don't need to delay after the last bit because -- //! it takes time to switch the pin to output for acknowledging. -- I2C_CLOCK_DELAY_READ_LOW(); -- } -- } -- i2c_send_ack(ack); -- -- ENABLE_INTERRUPT(); -- -- return i2c_byte; --} -- --void i2c_receive_byte(uint8_t *data) --{ -- *data = i2c_receive_one_byte(1); --} -- --void i2c_receive_bytes(uint8_t count, uint8_t *data) --{ -- while (--count) -- { -- *data++ = i2c_receive_one_byte(1); -- } -- *data = i2c_receive_one_byte(0); -- -- i2c_send_stop(); --} -\ No newline at end of file -diff --git a/lib/hal/i2c_bitbang_samd21.h b/lib/hal/i2c_bitbang_samd21.h -deleted file mode 100644 -index 00fc7977e305..000000000000 ---- a/lib/hal/i2c_bitbang_samd21.h -+++ /dev/null -@@ -1,195 +0,0 @@ --/** -- * \file -- * \brief definitions for bit-banged I2C -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef I2C_BITBANG_SAMD21_H_ --#define I2C_BITBANG_SAMD21_H_ -- --#include "atca_status.h" --#include -- -- --#define MAX_I2C_BUSES 18 //The MAX_I2C_BUSES is the number of free pins in samd21 xplained pro -- -- --typedef struct --{ -- uint8_t pin_sda[MAX_I2C_BUSES]; -- uint8_t pin_scl[MAX_I2C_BUSES]; --} I2CBuses; -- --extern I2CBuses i2c_buses_default; -- --extern uint8_t pin_sda; --extern uint8_t pin_scl; -- --# define I2C_ENABLE() { struct port_config pin_conf; \ -- port_get_config_defaults(&pin_conf); \ -- pin_conf.direction = PORT_PIN_DIR_OUTPUT_WTH_READBACK; \ -- port_pin_set_config(pin_sda, &pin_conf); \ -- pin_conf.direction = PORT_PIN_DIR_OUTPUT; \ -- port_pin_set_config(pin_scl, &pin_conf); } --# define I2C_DISABLE() { struct port_config pin_conf; \ -- port_get_config_defaults(&pin_conf); \ -- pin_conf.direction = PORT_PIN_DIR_INPUT; \ -- pin_conf.input_pull = PORT_PIN_PULL_UP; \ -- port_pin_set_config(pin_sda, &pin_conf); \ -- port_pin_set_config(pin_scl, &pin_conf); } --# define I2C_CLOCK_LOW() port_pin_set_output_level(pin_scl, false) --# define I2C_CLOCK_HIGH() port_pin_set_output_level(pin_scl, true) --# define I2C_DATA_LOW() port_pin_set_output_level(pin_sda, false) --# define I2C_DATA_HIGH() port_pin_set_output_level(pin_sda, true) --# define I2C_DATA_IN() port_pin_get_input_level(pin_sda) --# define I2C_SET_OUTPUT() { struct port_config pin_conf; \ -- port_get_config_defaults(&pin_conf); \ -- pin_conf.direction = PORT_PIN_DIR_OUTPUT_WTH_READBACK; \ -- port_pin_set_config(pin_sda, &pin_conf); } --# define I2C_SET_OUTPUT_HIGH() { I2C_SET_OUTPUT(); I2C_DATA_HIGH(); } --# define I2C_SET_OUTPUT_LOW() { I2C_SET_OUTPUT(); I2C_DATA_LOW(); } --# define I2C_SET_INPUT() { struct port_config pin_conf; \ -- port_get_config_defaults(&pin_conf); \ -- pin_conf.direction = PORT_PIN_DIR_INPUT; \ -- port_pin_set_config(pin_sda, &pin_conf); } --# define DISABLE_INTERRUPT() cpu_irq_disable() --# define ENABLE_INTERRUPT() cpu_irq_enable() -- -- --#define I2C_CLOCK_DELAY_WRITE_LOW() delay_us(1) --#define I2C_CLOCK_DELAY_WRITE_HIGH() delay_us(1) --#define I2C_CLOCK_DELAY_READ_LOW() delay_us(1) --#define I2C_CLOCK_DELAY_READ_HIGH() delay_us(1) --#define I2C_CLOCK_DELAY_SEND_ACK() delay_us(1) --//! This delay is inserted to make the Start and Stop hold time at least 250 ns. --#define I2C_HOLD_DELAY() delay_us(1) -- -- -- -- --//! loop count when waiting for an acknowledgment --#define I2C_ACK_TIMEOUT (4) -- -- --/** -- * \brief Set I2C data and clock pin. -- * Other functions will use these pins. -- * -- * \param[in] sda definition of GPIO pin to be used as data pin -- * \param[in] scl definition of GPIO pin to be used as clock pin -- */ --void i2c_set_pin(uint8_t sda, uint8_t scl); -- -- --/** -- * \brief Assigns the logical bus number for discovering the devices -- * -- * -- * \param[in] i2c_bitbang_buses The logical bus numbers are assigned to the variables. -- * \param[in] max_buses Maximum number of bus used for discovering. -- */ -- --void i2c_discover_buses(int i2c_bitbang_buses[], int max_buses); -- --/** -- * \brief Configure GPIO pins for I2C clock and data as output. -- */ --void i2c_enable(void); -- --/** -- * \brief Configure GPIO pins for I2C clock and data as input. -- */ --void i2c_disable(void); -- -- --/** -- * \brief Send a START condition. -- */ --void i2c_send_start(void); -- --/** -- * \brief Send an ACK or NACK (after receive). -- * -- * \param[in] ack 0: NACK, else: ACK -- */ --void i2c_send_ack(uint8_t ack); -- --/** -- * \brief Send a STOP condition. -- */ --void i2c_send_stop(void); -- --/** -- * \brief Send a Wake Token. -- */ --void i2c_send_wake_token(void); -- --/** -- * \brief Send one byte. -- * -- * \param[in] i2c_byte byte to write -- * -- * \return ATCA_STATUS -- */ --ATCA_STATUS i2c_send_byte(uint8_t i2c_byte); -- --/** -- * \brief Send a number of bytes. -- * -- * \param[in] count number of bytes to send -- * \param[in] data pointer to buffer containing bytes to send -- * -- * \return ATCA_STATUS -- */ --ATCA_STATUS i2c_send_bytes(uint8_t count, uint8_t *data); -- --/** -- * \brief Receive one byte (MSB first). -- * -- * \param[in] ack 0:NACK, else:ACK -- * -- * \return Number of bytes received -- */ --uint8_t i2c_receive_one_byte(uint8_t ack); -- --/** -- * \brief Receive one byte and send ACK. -- * -- * \param[out] data pointer to received byte -- */ --void i2c_receive_byte(uint8_t *data); -- --/** -- * \brief Receive a number of bytes. -- * -- * \param[out] data pointer to receive buffer -- * \param[in] count number of bytes to receive -- */ --void i2c_receive_bytes(uint8_t count, uint8_t *data); -- --#endif /* I2C_BITBANG_SAMD21_H_ */ -\ No newline at end of file -diff --git a/lib/hal/kit_phy.h b/lib/hal/kit_phy.h -deleted file mode 100644 -index f0b6ecd35f90..000000000000 ---- a/lib/hal/kit_phy.h -+++ /dev/null -@@ -1,62 +0,0 @@ --/** -- * \file -- * \brief ATCA Hardware abstraction layer physical send & receive function definitions. -- * -- * This is included for kit protocol implementations. -- * It is included in the kit protocol callback to actually send and recieve bytes. -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef KIT_PHY_H_ --#define KIT_PHY_H_ -- --#include "cryptoauthlib.h" -- -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --#ifdef __cplusplus --extern "C" { --#endif -- --ATCA_STATUS kit_phy_num_found(int8_t* num_found); --ATCA_STATUS kit_phy_send(ATCAIface iface, const char *txdata, int txlength); --ATCA_STATUS kit_phy_receive(ATCAIface iface, char* rxdata, int* rxlength); -- --#ifdef __cplusplus --} --#endif -- --/** @} */ -- --#endif /* ATCA_HAL_PHY_H_ */ -diff --git a/lib/hal/kit_protocol.c b/lib/hal/kit_protocol.c -deleted file mode 100644 -index 55f8708d1d94..000000000000 ---- a/lib/hal/kit_protocol.c -+++ /dev/null -@@ -1,430 +0,0 @@ --/** -- * \file -- * -- * \brief Microchip Crypto Auth hardware interface object -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "kit_phy.h" --#include "kit_protocol.h" --#include "basic/atca_helpers.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- -- --/** \brief HAL implementation of kit protocol init. This function calls back to the physical protocol to send the bytes -- * \param[in] iface instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_init(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- uint8_t kitstatus = 0; -- char address[] = "board:device(00)\n"; -- int addresssize = sizeof(address); -- char reply[KIT_RX_WRAP_SIZE + 4]; -- int replysize = sizeof(reply); -- uint8_t rxdata[2]; -- int rxsize = sizeof(rxdata); -- char selectaddress[KIT_MSG_SIZE]; -- int selectaddresssize = sizeof(selectaddress); -- char selectaddresspre[] = "s:physical:select("; -- char selectaddresspost[] = ")\n"; -- int copysize = 0; -- -- // Send the address bytes -- status = kit_phy_send(iface, address, addresssize); -- -- // Receive the reply to address "...(C0)\n" -- memset(reply, 0, replysize); -- status = kit_phy_receive(iface, reply, &replysize); -- if (status != ATCA_SUCCESS) -- { -- return ATCA_GEN_FAIL; -- } -- -- if (replysize == 4) -- { -- // Probably an error -- status = kit_parse_rsp(reply, replysize, &kitstatus, rxdata, &rxsize); -- if (status != ATCA_SUCCESS) -- { -- return status; -- } -- if (kitstatus != 0) -- { -- return ATCA_NO_DEVICES; -- } -- } -- rxsize = 2; -- memcpy(rxdata, strchr(reply, '(') + 1, rxsize); -- -- // Send the select address bytes -- memset(selectaddress, 0, selectaddresssize); -- copysize = sizeof(selectaddresspre); -- memcpy(&selectaddress[0], selectaddresspre, copysize); -- memcpy(&selectaddress[(copysize - 1)], rxdata, rxsize); -- copysize = (sizeof(selectaddresspre) + rxsize); -- memcpy(&selectaddress[(copysize - 1)], selectaddresspost, sizeof(selectaddresspost)); -- copysize = (sizeof(selectaddresspre) + rxsize + sizeof(selectaddresspost)); -- status = kit_phy_send(iface, selectaddress, copysize); -- -- // Receive the reply to select address "00()\n" -- memset(reply, 0, replysize); -- status = kit_phy_receive(iface, reply, &replysize); -- if (status != ATCA_SUCCESS) -- { -- return ATCA_GEN_FAIL; -- } -- -- return status; --} -- --/** \brief HAL implementation of kit protocol send. This function calls back to the physical protocol to send the bytes -- * \param[in] iface instance -- * \param[in] txdata pointer to bytes to send -- * \param[in] txlength number of bytes to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_send(ATCAIface iface, const uint8_t* txdata, int txlength) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- int nkitbuf = txlength * 2 + KIT_TX_WRAP_SIZE; -- char* pkitbuf = NULL; -- -- // Check the pointers -- if ((txdata == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- // Wrap in kit protocol -- pkitbuf = malloc(nkitbuf); -- memset(pkitbuf, 0, nkitbuf); -- status = kit_wrap_cmd(&txdata[1], txlength, pkitbuf, &nkitbuf); -- if (status != ATCA_SUCCESS) -- { -- free(pkitbuf); -- return ATCA_GEN_FAIL; -- } -- // Send the bytes -- status = kit_phy_send(iface, pkitbuf, nkitbuf); -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("\nKit Write: %s", pkitbuf); --#endif -- -- // Free the bytes -- free(pkitbuf); -- -- return status; --} -- --/** \brief HAL implementation to receive bytes and unwrap from kit protocol. This function calls back to the physical protocol to receive the bytes -- * \param[in] iface instance -- * \param[in] rxdata pointer to space to receive the data -- * \param[inout] rxsize ptr to expected number of receive bytes to request -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_receive(ATCAIface iface, uint8_t* rxdata, uint16_t* rxsize) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- uint8_t kitstatus = 0; -- int nkitbuf = 0; -- int dataSize = 0; -- char* pkitbuf = NULL; -- -- // Check the pointers -- if ((rxdata == NULL) || (rxsize == NULL)) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Adjust the read buffer size -- dataSize = *rxsize; -- nkitbuf = dataSize * 2 + KIT_RX_WRAP_SIZE; -- pkitbuf = malloc(nkitbuf); -- memset(pkitbuf, 0, nkitbuf); -- -- // Receive the bytes -- status = kit_phy_receive(iface, pkitbuf, &nkitbuf); -- if (status != ATCA_SUCCESS) -- { -- free(pkitbuf); -- return ATCA_GEN_FAIL; -- } -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("Kit Read: %s\r", pkitbuf); --#endif -- -- // Unwrap from kit protocol -- memset(rxdata, 0, *rxsize); -- status = kit_parse_rsp(pkitbuf, nkitbuf, &kitstatus, rxdata, &dataSize); -- *rxsize = dataSize; -- -- // Free the bytes -- free(pkitbuf); -- -- return status; --} -- --/** \brief Call the wake for kit protocol -- * \param[in] iface the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_wake(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- uint8_t kitstatus = 0; -- char wake[] = "s:w()\n"; -- int wakesize = sizeof(wake); -- char reply[KIT_RX_WRAP_SIZE + 4]; -- int replysize = sizeof(reply); -- uint8_t rxdata[10]; -- int rxsize = sizeof(rxdata); -- -- // Send the bytes -- status = kit_phy_send(iface, wake, wakesize); -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("\nKit Write: %s", wake); --#endif -- -- // Receive the reply to wake "00(04...)\n" -- memset(reply, 0, replysize); -- status = kit_phy_receive(iface, reply, &replysize); -- if (status != ATCA_SUCCESS) -- { -- return ATCA_GEN_FAIL; -- } -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("Kit Read: %s\n", reply); --#endif -- -- // Unwrap from kit protocol -- memset(rxdata, 0, rxsize); -- status = kit_parse_rsp(reply, replysize, &kitstatus, rxdata, &rxsize); -- -- return status; --} -- --/** \brief Call the idle for kit protocol -- * \param[in] iface the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_idle(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- uint8_t kitstatus = 0; -- char idle[] = "s:i()\n"; -- int idlesize = sizeof(idle); -- char reply[KIT_RX_WRAP_SIZE]; -- int replysize = sizeof(reply); -- uint8_t rxdata[10]; -- int rxsize = sizeof(rxdata); -- -- // Send the bytes -- status = kit_phy_send(iface, idle, idlesize); -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("\nKit Write: %s", idle); --#endif -- -- // Receive the reply to sleep "00()\n" -- memset(reply, 0, replysize); -- status = kit_phy_receive(iface, reply, &replysize); -- if (status != ATCA_SUCCESS) -- { -- return ATCA_GEN_FAIL; -- } -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("Kit Read: %s\r", reply); --#endif -- -- // Unwrap from kit protocol -- memset(rxdata, 0, rxsize); -- status = kit_parse_rsp(reply, replysize, &kitstatus, rxdata, &rxsize); -- -- return status; --} -- --/** \brief Call the sleep for kit protocol -- * \param[in] iface the interface object to send the bytes over -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_sleep(ATCAIface iface) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- uint8_t kitstatus = 0; -- -- char sleep[] = "s:s()\n"; -- int sleepsize = sizeof(sleep); -- char reply[KIT_RX_WRAP_SIZE]; -- int replysize = sizeof(reply); -- uint8_t rxdata[10]; -- int rxsize = sizeof(rxdata); -- -- // Send the bytes -- status = kit_phy_send(iface, sleep, sleepsize); -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("\nKit Write: %s", sleep); --#endif -- -- // Receive the reply to sleep "00()\n" -- memset(reply, 0, replysize); -- status = kit_phy_receive(iface, reply, &replysize); -- if (status != ATCA_SUCCESS) -- { -- return ATCA_GEN_FAIL; -- } -- --#ifdef KIT_DEBUG -- // Print the bytes -- printf("Kit Read: %s\r", reply); --#endif -- -- // Unwrap from kit protocol -- memset(rxdata, 0, rxsize); -- status = kit_parse_rsp(reply, replysize, &kitstatus, rxdata, &rxsize); -- -- return status; --} -- --/** \brief Wrap binary bytes in ascii kit protocol -- * \param[in] txdata pointer to the binary data to wrap -- * \param[in] txlen length of the binary data to wrap -- * \param[out] pkitcmd pointer to binary data converted to ascii kit protocol -- * \param[inout] nkitcmd pointer to the size of the binary data converted to ascii kit protocol -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_wrap_cmd(const uint8_t* txdata, int txlen, char* pkitcmd, int* nkitcmd) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- char cmdpre[] = "s:t("; // sha:talk( -- char cmdpost[] = ")\n"; --// char* pkitcmd = NULL; -- int cmdAsciiLen = txlen * 2; -- int cmdlen = txlen * 2 + sizeof(cmdpre) + sizeof(cmdpost) + 1; -- int cpylen = 0; -- int cpyindex = 0; -- -- // Check the variables -- if (txdata == NULL || pkitcmd == NULL || nkitcmd == NULL) -- { -- return ATCA_BAD_PARAM; -- } -- if (*nkitcmd > cmdlen) -- { -- return ATCA_BAD_PARAM; -- } -- -- // Wrap in kit protocol -- memset(pkitcmd, 0, *nkitcmd); -- -- // Copy the prefix -- cpylen = (int)strlen(cmdpre); -- memcpy(&pkitcmd[cpyindex], cmdpre, cpylen); -- cpyindex += cpylen; -- -- // Copy the ascii binary bytes -- status = atcab_bin2hex_(txdata, txlen, &pkitcmd[cpyindex], &cmdAsciiLen, false); -- if (status != ATCA_SUCCESS) -- { -- return status; -- } -- cpyindex += cmdAsciiLen; -- -- // Copy the postfix -- cpylen = (int)strlen(cmdpost); -- memcpy(&pkitcmd[cpyindex], cmdpost, cpylen); -- cpyindex += cpylen; -- -- *nkitcmd = cpyindex; -- -- return status; --} -- --/** \brief Parse the response ascii from the kit -- * \param[out] pkitbuf pointer to ascii kit protocol data to parse -- * \param[in] nkitbuf length of the ascii kit protocol data -- * \param[in] kitstatus status of the ascii device -- * \param[in] rxdata pointer to the binary data buffer -- * \param[in] datasize size of the pointer to the binary data buffer -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS kit_parse_rsp(const char* pkitbuf, int nkitbuf, uint8_t* kitstatus, uint8_t* rxdata, int* datasize) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- int statusId = 0; -- int dataId = 3; -- int binSize = 1; -- int asciiDataSize = 0; -- char* endDataPtr = 0; -- -- // First get the kit status -- status = atcab_hex2bin(&pkitbuf[statusId], 2, kitstatus, &binSize); -- if (status != ATCA_SUCCESS) -- { -- return status; -- } -- -- // Next get the binary data bytes -- endDataPtr = strchr((char*)pkitbuf, ')'); -- if (endDataPtr < (&pkitbuf[dataId])) -- { -- return ATCA_GEN_FAIL; -- } -- asciiDataSize = (int)(endDataPtr - (&pkitbuf[dataId])); -- status = atcab_hex2bin(&pkitbuf[dataId], asciiDataSize, rxdata, datasize); -- if (status != ATCA_SUCCESS) -- { -- return status; -- } -- -- return ATCA_SUCCESS; --} -- --/** @} */ -diff --git a/lib/hal/kit_protocol.h b/lib/hal/kit_protocol.h -deleted file mode 100644 -index 84f7fee454cb..000000000000 ---- a/lib/hal/kit_protocol.h -+++ /dev/null -@@ -1,77 +0,0 @@ --/** -- * \file -- * -- * \brief Atmel Crypto Auth hardware interface object -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef KIT_PROTOCOL_H_ --#define KIT_PROTOCOL_H_ -- --#include "cryptoauthlib.h" -- --// Define this for debugging communication --//#define KIT_DEBUG -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --// The number of bytes to wrap a command in kit protocol. sizeof("s:t()\n") --#define KIT_TX_WRAP_SIZE (7) -- --// The number of bytes to wrap a response in kit protocol. sizeof("00()\n") --#define KIT_MSG_SIZE (32) --#define KIT_RX_WRAP_SIZE (KIT_MSG_SIZE + 6) -- --#ifdef __cplusplus --extern "C" { --#endif -- --ATCA_STATUS kit_init(ATCAIface iface); -- --ATCA_STATUS kit_send(ATCAIface iface, const uint8_t* txdata, int txlength); --ATCA_STATUS kit_receive(ATCAIface iface, uint8_t* rxdata, uint16_t* rxsize); -- --ATCA_STATUS kit_wrap_cmd(const uint8_t* txdata, int txlength, char* pkitbuf, int* nkitbuf); --ATCA_STATUS kit_parse_rsp(const char* pkitbuf, int nkitbuf, uint8_t* kitstatus, uint8_t* rxdata, int* nrxdata); -- --ATCA_STATUS kit_wake(ATCAIface iface); --ATCA_STATUS kit_idle(ATCAIface iface); --ATCA_STATUS kit_sleep(ATCAIface iface); -- --#ifdef __cplusplus --} --#endif -- --/** @} */ -- --#endif // KIT_PROTOCOL_H -diff --git a/lib/hal/swi_bitbang_samd21.c b/lib/hal/swi_bitbang_samd21.c -deleted file mode 100644 -index 3c540109cb4c..000000000000 ---- a/lib/hal/swi_bitbang_samd21.c -+++ /dev/null -@@ -1,272 +0,0 @@ --/** -- * \file -- * \brief Hardware Interface Functions - SWI bit-banged -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "swi_bitbang_samd21.h" -- -- -- -- -- --SWIBuses swi_buses_default = { -- { EXT3_PIN_3, EXT3_PIN_9, EXT3_PIN_I2C_SDA, EXT3_PIN_13, EXT2_PIN_3, EXT2_PIN_5, EXT2_PIN_7, EXT2_PIN_9, EXT2_PIN_13, EXT2_PIN_15, EXT2_PIN_17, EXT1_PIN_3, EXT1_PIN_5, EXT1_PIN_7, EXT1_PIN_9, EXT1_PIN_13, EXT1_PIN_15, EXT1_PIN_17, EXT3_PIN_7, EXT3_PIN_10, EXT3_PIN_I2C_SCL, EXT3_PIN_14, EXT2_PIN_4, EXT2_PIN_6, EXT2_PIN_8, EXT2_PIN_10, EXT2_PIN_14, EXT2_PIN_16, EXT2_PIN_18, EXT1_PIN_4, EXT1_PIN_6, EXT1_PIN_8, EXT1_PIN_10, EXT1_PIN_14, EXT1_PIN_16, EXT1_PIN_18 } -- --}; -- -- --//! declaration of the variable indicating which pin the selected device is connected to --static uint8_t device_pin; -- -- --void swi_set_pin(uint8_t id) --{ -- device_pin = id; --} -- -- -- --void swi_enable(void) --{ -- struct port_config pin_conf; -- -- port_get_config_defaults(&pin_conf); -- pin_conf.direction = PORT_PIN_DIR_OUTPUT; -- port_pin_set_config(device_pin, &pin_conf); --} -- --void swi_disable(void) --{ -- struct port_config pin_conf; -- -- port_get_config_defaults(&pin_conf); -- port_pin_set_config(device_pin, &pin_conf); --} -- -- --void swi_set_signal_pin(uint8_t is_high) --{ -- if (is_high) -- { -- port_pin_set_output_level(device_pin, true); -- } -- else -- { -- port_pin_set_output_level(device_pin, false); -- } --} -- --void swi_send_wake_token(void) --{ -- swi_set_signal_pin(0); -- delay_us(60); -- swi_set_signal_pin(1); --} -- --void swi_send_bytes(uint8_t count, uint8_t *buffer) --{ -- uint8_t i, bit_mask; -- struct port_config pin_conf; -- -- port_get_config_defaults(&pin_conf); -- pin_conf.direction = PORT_PIN_DIR_OUTPUT; -- port_pin_set_config(device_pin, &pin_conf); -- -- //! Wait turn around time. -- RX_TX_DELAY; -- cpu_irq_disable(); -- -- -- for (i = 0; i < count; i++) -- { -- for (bit_mask = 1; bit_mask > 0; bit_mask <<= 1) -- { -- if (bit_mask & buffer[i]) //!< Send Logic 1 (7F) -- { -- port_pin_set_output_level(device_pin, false); -- BIT_DELAY_1L; -- port_pin_set_output_level(device_pin, true); -- BIT_DELAY_7; -- } -- else //!< Send Logic 0 (7D) -- { -- port_pin_set_output_level(device_pin, false); -- BIT_DELAY_1L; -- port_pin_set_output_level(device_pin, true); -- BIT_DELAY_1H; -- port_pin_set_output_level(device_pin, false); -- BIT_DELAY_1L; -- port_pin_set_output_level(device_pin, true); -- BIT_DELAY_5; -- } -- } -- } -- cpu_irq_enable(); -- -- -- --} -- -- --void swi_send_byte(uint8_t byte) --{ -- swi_send_bytes(1, &byte); -- --} -- -- -- -- --ATCA_STATUS swi_receive_bytes(uint8_t count, uint8_t *buffer) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- -- uint8_t i; -- uint8_t bit_mask; -- uint8_t pulse_count; -- uint16_t timeout_count; -- struct port_config pin_conf; -- -- -- port_get_config_defaults(&pin_conf); -- port_pin_set_config(device_pin, &pin_conf); -- -- -- cpu_irq_disable(); -- //! Receive bits and store in buffer. -- for (i = 0; i < count; i++) -- { -- buffer[i] = 0; -- for (bit_mask = 1; bit_mask > 0; bit_mask <<= 1) -- { -- pulse_count = 0; -- -- -- timeout_count = START_PULSE_TIME_OUT; -- //! Detect start bit. -- -- while (--timeout_count > 0) -- { -- //! Wait for falling edge. -- if (port_pin_get_input_level(device_pin) == 0) -- { -- -- break; -- } -- } -- if (timeout_count == 0) -- { -- status = ATCA_RX_TIMEOUT; -- break; -- } -- -- timeout_count = START_PULSE_TIME_OUT; -- -- do -- { -- //! Wait for rising edge. -- if (port_pin_get_input_level(device_pin) != 0) -- { -- pulse_count = 1; -- -- break; -- } -- } -- while (--timeout_count > 0); -- -- if (pulse_count == 0) -- { -- status = ATCA_RX_TIMEOUT; -- break; -- } -- -- //! let's just wait the maximum time for the falling edge of a zero bit -- //! to arrive after we have detected the rising edge of the start bit. -- timeout_count = ZERO_PULSE_TIME_OUT; -- -- //! Detect possible edge indicating zero bit. -- do -- { -- if (port_pin_get_input_level(device_pin) == 0) -- { -- pulse_count = 2; -- break; -- } -- } -- while (--timeout_count > 0); -- -- -- //! Wait for rising edge of zero pulse before returning. Otherwise we might interpret -- //! its rising edge as the next start pulse. -- if (pulse_count == 2) -- { -- timeout_count = ZERO_PULSE_TIME_OUT; -- -- do -- { -- if (port_pin_get_input_level(device_pin) != 0) -- { -- break; -- } -- } -- -- while (timeout_count-- > 0); -- -- } -- //! Update byte at current buffer index. -- else -- //! received "one" bit -- { -- buffer[i] |= bit_mask; -- } -- } -- -- -- if (status != ATCA_SUCCESS) -- { -- break; -- } -- } -- -- if (status == ATCA_RX_TIMEOUT) -- { -- if (i > 0) -- { -- //! Indicate that we timed out after having received at least one byte. -- status = ATCA_RX_FAIL; -- } -- } -- -- cpu_irq_enable(); -- -- -- return status; --} -\ No newline at end of file -diff --git a/lib/hal/swi_bitbang_samd21.h b/lib/hal/swi_bitbang_samd21.h -deleted file mode 100644 -index b6d20f6153ba..000000000000 ---- a/lib/hal/swi_bitbang_samd21.h -+++ /dev/null -@@ -1,148 +0,0 @@ --/** -- * \file -- * \brief Hardware Interface Functions - SWI bit-banged -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef SWI_BITBANG_SAMD21_H_ --#define SWI_BITBANG_SAMD21_H_ -- --#include "atca_status.h" --#include -- -- --#define MAX_SWI_BUSES 36 //!< SAMD21 xplainned pro has 36 free GPIO pins available -- -- --typedef struct --{ -- uint32_t pin_sda[MAX_SWI_BUSES]; --} SWIBuses; -- --extern SWIBuses swi_buses_default; -- -- --/** -- * \name Macros for Bit-Banged SWI Timing -- * -- * Times to drive bits at 230.4 kbps. -- @{ */ -- --//! delay macro for width of one pulse (start pulse or zero pulse) --//! should be 4.34 us, is 4.05 us -- --#define BIT_DELAY_1L delay_us(3) --//! should be 4.34 us, is 4.05us --#define BIT_DELAY_1H delay_us(3) -- --//! time to keep pin high for five pulses plus stop bit (used to bit-bang CryptoAuth 'zero' bit) --//! should be 26.04 us, is 26.92 us --#define BIT_DELAY_5 delay_us(26) // considering pin set delay -- --//! time to keep pin high for seven bits plus stop bit (used to bit-bang CryptoAuth 'one' bit) --//! should be 34.72 us, is 35.13 us --#define BIT_DELAY_7 delay_us(34) // considering pin set delay -- --//! turn around time when switching from receive to transmit --//! should be 15 us, is 15.58 us --#define RX_TX_DELAY delay_us(15) -- -- --//! Lets set the timeout value for start pulse detection to the uint8_t maximum. --//! This value is decremented while waiting for the falling edge of a start pulse. --#define START_PULSE_TIME_OUT (600) -- --//! Maximum time between rising edge of start pulse --//! and falling edge of zero pulse is 8.6 us. Therefore, a value of 40 (around 15 us) --//! gives ample time to detect a zero pulse and also leaves enough time to detect --//! the following start pulse. --//! This value is decremented while waiting for the falling edge of a zero pulse. --#define ZERO_PULSE_TIME_OUT (40) -- --/** @} */ -- -- --/** -- * \brief Set SWI signal pin. -- * Other functions will use this pin. -- * -- * \param[in] id definition of GPIO pin to be used -- */ --void swi_set_pin(uint8_t id); -- -- -- --/** -- * \brief Configure GPIO pin for SWI signal as output. -- */ --void swi_enable(void); -- --/** -- * \brief Configure GPIO pin for SWI signal as input. -- */ --void swi_disable(void); -- --/** -- * \brief Set signal pin Low or High. -- * -- * \param[in] is_high 0: Low, else: High. -- */ --void swi_set_signal_pin(uint8_t is_high); -- --/** -- * \brief Send a Wake Token. -- */ --void swi_send_wake_token(void); -- --/** -- * \brief Send a number of bytes.This function should not be called directly ,instead should use hal_swi_send() which call this function. -- * -- * \param[in] count number of bytes to send. -- * \param[in] buffer pointer to buffer containing bytes to send -- */ --void swi_send_bytes(uint8_t count, uint8_t *buffer); -- --/** -- * \brief Send one byte. -- * -- * \param[in] byte byte to send -- */ --void swi_send_byte(uint8_t byte); -- --/** -- * \brief Receive a number of bytes.This function should not be called directly ,instead should use hal_swi_receive() which call this function. -- * -- * \param[in] count number of bytes to receive -- * \param[out] buffer pointer to receive buffer -- * -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_receive_bytes(uint8_t count, uint8_t *buffer); -- -- --#endif /* SWI_BITBANG_SAMD21_H_ */ -\ No newline at end of file -diff --git a/lib/hal/swi_uart_at90usb1287_asf.c b/lib/hal/swi_uart_at90usb1287_asf.c -deleted file mode 100644 -index 68efbf61eec5..000000000000 ---- a/lib/hal/swi_uart_at90usb1287_asf.c -+++ /dev/null -@@ -1,260 +0,0 @@ --/** -- * \file -- * \brief ATXMEGA's ATCA Hardware abstraction layer for SWI interface over AT90USB1287 UART drivers. -- * -- * Prerequisite: add UART Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "usart_serial.h" --#include "swi_uart_at90usb1287_asf.h" --#include "basic/atca_helpers.h" -- --/*#define DEBUG_PIN*/ -- --#ifdef DEBUG_PIN -- #define DEBUG_PIN_1 IOPORT_CREATE_PIN(PORTB, 0) -- #define DEBUG_PIN_2 IOPORT_CREATE_PIN(PORTB, 1) --#endif -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** \brief usart configuration struct */ --static usart_serial_options_t config_usart; --/** \brief sysclk_get_per_hz value */ --static uint32_t u32sysclk; -- --/** \brief -- - this HAL implementation assumes you've included the ASF SERCOM UART libraries in your project, otherwise, -- the HAL layer will not compile because the ASF UART drivers are a dependency * -- */ -- --/** \brief Implementation of SWI UART init. -- * \param[in] instance instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance) --{ --#ifdef DEBUG_PIN -- ioport_init(); -- ioport_set_pin_dir(DEBUG_PIN_1, IOPORT_DIR_OUTPUT); -- ioport_set_pin_dir(DEBUG_PIN_2, IOPORT_DIR_OUTPUT); -- gpio_set_pin_high(DEBUG_PIN_1); -- gpio_set_pin_high(DEBUG_PIN_2); --#endif -- ATCA_STATUS status = ATCA_SUCCESS; -- -- //Save sysclk_get_per_hz value -- u32sysclk = sysclk_get_source_clock_hz(); -- // Set data size to 7 -- config_usart.charlength = USART_CHSIZE_7BIT_gc; -- // Set parity to no parity -- config_usart.paritytype = USART_PMODE_DISABLED_gc; -- // Set data byte to one stopbit -- config_usart.stopbits = false; -- // Set baudrate to 230400 -- config_usart.baudrate = 230400; -- -- switch (instance->bus_index) -- { -- case 0: instance->usart_instance = &USARTA1; break; // AT90USB1287 has only 1 UART channel which maps to ATMEGARF's UART 1 -- } -- status = usart_serial_init(instance->usart_instance, &config_usart); -- return status; --} -- --/** \brief Implementation of SWI UART deinit. -- * \param[in] instance instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- -- instance->usart_instance = NULL; -- return status; --} -- --/** \brief implementation of SWI UART change baudrate. -- * \param[in] instance instance -- * \param[in] baudrate (typically 230400 , 160000 or 115200) -- */ --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate) --{ -- /*usart_double_baud_enable(instance->usart_instance);*/ -- // Set baudrate for UART module -- usart_set_baudrate(instance->usart_instance, baudrate, u32sysclk); --} -- -- --/** \brief implementation of SWI UART change mode. -- * \param[in] instance instance -- * \param[in] mode (TRANSMIT_MODE or RECEIVE_MODE) -- */ --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode) --{ -- switch (mode) -- { -- case TRANSMIT_MODE: -- swi_uart_setbaud(instance, 230400); -- break; -- case RECEIVE_MODE: -- //Reset UART RX buffer. -- usart_rx_disable(instance->usart_instance); -- usart_rx_enable(instance->usart_instance); -- break; -- default: -- break; -- } -- --} -- --/** \brief discover UART buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] swi_uart_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- */ --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses) --{ -- /* if every PORT was a likely candidate bus, then would need to initialize the entire array to all PORT n numbers. -- * As an optimization and making discovery safer, make assumptions about bus-num / PORT map based on AT90USB1287 -- * If you were using a raw XMEGA on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- */ -- swi_uart_buses[0] = 0; // AT90USB1287 supports single UART channel --} -- --/** \brief HAL implementation of SWI UART send byte over ASF. This function send one byte over UART -- * \param[in] instance instance -- * \param[in] data byte to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data) --{ -- int8_t timeout = 0x7F; -- bool data_reg_empty = false; -- ATCA_STATUS status = ATCA_EXECUTION_ERROR /*ATCA_CMD_FAIL*/; -- -- // Send one byte over UART module --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_1); --#endif -- -- // Send one byte over UART module -- timeout = 0x7F; -- -- while ((timeout > 0) && (data_reg_empty == false)) -- { -- data_reg_empty = usart_data_register_is_empty(instance->usart_instance); -- timeout--; -- } -- -- if (data_reg_empty) -- { -- usart_serial_putchar(instance->usart_instance, data); -- while (!usart_tx_is_complete(instance->usart_instance)) -- { -- ; -- } -- usart_clear_tx_complete(instance->usart_instance); -- status = ATCA_SUCCESS; -- } -- --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_1); --#endif -- if (timeout > 0) -- { -- return status; -- } -- else -- { -- return ATCA_TIMEOUT; -- } --} -- --/** \brief HAL implementation of SWI UART receive bytes over ASF. This function receive one byte over UART -- * \param[in] instance instance -- * \param[inout] data pointer to space to receive the data -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data) --{ -- int8_t timeout, retries = 0x2; // This retry is used to compensate the baudrate that do not match when receiving response -- -- *data = 0xFF; -- bool rx_complete = false; -- ATCA_STATUS status = ATCA_EXECUTION_ERROR /*ATCA_CMD_FAIL*/; --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_2); --#endif -- // Receive one byte over UART module -- while ((retries > 0) && (status != ATCA_SUCCESS)) -- { -- timeout = 0x7F; retries--; -- while ((timeout > 0) && (rx_complete == false)) -- { -- rx_complete = usart_rx_is_complete(instance->usart_instance); -- timeout--; -- } -- -- if (rx_complete) -- { -- usart_serial_getchar(instance->usart_instance, data); -- //if ((*data == 0x7D) || (*data == 0x7F)) -- if ((*data >= 0x70) && (*data <= 0x7F)) -- { -- status = ATCA_SUCCESS; -- } -- else -- { -- status = ATCA_EXECUTION_ERROR /*ATCA_CMD_FAIL*/; -- } -- } -- } --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_2); --#endif -- if (timeout > 0) -- { -- return status; -- } -- else -- { -- return ATCA_TIMEOUT; -- } --} -- --/** @} */ -diff --git a/lib/hal/swi_uart_at90usb1287_asf.h b/lib/hal/swi_uart_at90usb1287_asf.h -deleted file mode 100644 -index 2b11b2467937..000000000000 ---- a/lib/hal/swi_uart_at90usb1287_asf.h -+++ /dev/null -@@ -1,83 +0,0 @@ --/** -- * \file -- * \brief ATMEGA's ATCA Hardware abstraction layer for SWI interface over AT90USB1287 UART drivers. -- * -- * Prerequisite: add UART Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef SWI_UART_AT90USB1287_ASF_H --#define SWI_UART_AT90USB1287_ASF_H -- --#include --#include "cryptoauthlib.h" --#include "serial.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief -- - this HAL implementation assumes you've included the ASF UART libraries in your project, otherwise, -- the HAL layer will not compile because the ASF UART drivers are a dependency * -- */ -- --#define MAX_SWI_BUSES 1 // AT90USB1287 has only 1 port -- --#define RECEIVE_MODE 0 // UART Receive mode, RX enabled --#define TRANSMIT_MODE 1 // UART Transmit mode, RX disabled --#define RX_DELAY 10 // Delay before responses come --#define TX_DELAY 90 // Delay before new flag is sent -- --/** \brief this is the hal_data for ATCA HAL for SWI UART -- */ --typedef struct atcaSWImaster --{ -- // struct usart_module for Atmel SWI interface -- usart_if usart_instance; -- // for conveniences during interface release phase -- int bus_index; --} ATCASWIMaster_t; -- -- --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance); --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance); --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate); --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode); --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses); -- --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data); --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data); -- --/** @} */ -- --#endif // SWI_UART_AT90USB1287_ASF_H -diff --git a/lib/hal/swi_uart_samd21_asf.c b/lib/hal/swi_uart_samd21_asf.c -deleted file mode 100644 -index 1a5b698381e0..000000000000 ---- a/lib/hal/swi_uart_samd21_asf.c -+++ /dev/null -@@ -1,238 +0,0 @@ --/** -- * \file -- * \brief ATXMEGA's ATCA Hardware abstraction layer for SWI interface over UART drivers. -- * -- * Prerequisite: add UART Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "swi_uart_samd21_asf.h" --#include "basic/atca_helpers.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** \brief usart configuration struct */ --static struct usart_config config_usart; --struct port_config pin_conf; //for DEBUG purpose -- -- --/** \brief -- - this HAL implementation assumes you've included the ASF SERCOM UART libraries in your project, otherwise, -- the HAL layer will not compile because the ASF UART drivers are a dependency * -- */ -- --/** \brief Implementation of SWI UART init. -- * \param[in] instance instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance) --{ --#ifdef DEBUG_PIN -- port_get_config_defaults(&pin_conf); -- pin_conf.direction = PORT_PIN_DIR_OUTPUT; -- port_pin_set_config(DEBUG_PIN_1, &pin_conf); -- port_pin_set_config(DEBUG_PIN_2, &pin_conf); -- port_pin_set_output_level(DEBUG_PIN_1, HIGH); -- port_pin_set_output_level(DEBUG_PIN_2, HIGH); --#endif -- -- ATCA_STATUS status = ATCA_SUCCESS; -- usart_get_config_defaults(&config_usart); -- // Set data size to 7 -- config_usart.character_size = USART_CHARACTER_SIZE_7BIT; -- // Set parity to no parity -- config_usart.parity = USART_PARITY_NONE; -- // Set data byte to one stopbit -- config_usart.stopbits = USART_STOPBITS_1; -- // Set baudrate to 230400 -- config_usart.baudrate = 230400; --#ifdef __SAMD21J18A__ -- config_usart.mux_setting = EXT3_UART_SERCOM_MUX_SETTING; -- config_usart.pinmux_pad0 = EXT3_UART_SERCOM_PINMUX_PAD0; -- config_usart.pinmux_pad1 = EXT3_UART_SERCOM_PINMUX_PAD1; -- config_usart.pinmux_pad2 = EXT3_UART_SERCOM_PINMUX_PAD2; -- config_usart.pinmux_pad3 = EXT3_UART_SERCOM_PINMUX_PAD3; --#endif --#ifdef __SAMR21G18A__ -- config_usart.mux_setting = EXT1_UART_SERCOM_MUX_SETTING; -- config_usart.pinmux_pad0 = EXT1_UART_SERCOM_PINMUX_PAD0; -- config_usart.pinmux_pad1 = EXT1_UART_SERCOM_PINMUX_PAD1; -- config_usart.pinmux_pad2 = EXT1_UART_SERCOM_PINMUX_PAD2; -- config_usart.pinmux_pad3 = EXT1_UART_SERCOM_PINMUX_PAD3; --#endif -- switch (instance->bus_index) -- { -- case 0: status = usart_init(&(instance->usart_instance), SERCOM0, &config_usart); break; -- case 1: status = usart_init(&(instance->usart_instance), SERCOM1, &config_usart); break; -- case 2: status = usart_init(&(instance->usart_instance), SERCOM2, &config_usart); break; -- case 3: status = usart_init(&(instance->usart_instance), SERCOM3, &config_usart); break; -- case 4: status = usart_init(&(instance->usart_instance), SERCOM4, &config_usart); break; -- case 5: status = usart_init(&(instance->usart_instance), SERCOM5, &config_usart); break; -- } -- usart_enable(&(instance->usart_instance)); -- return status; --} -- --/** \brief Implementation of SWI UART deinit. -- * \param[in] instance instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- -- usart_reset(&(instance->usart_instance)); -- return status; --} -- --/** \brief implementation of SWI UART change baudrate. -- * \param[in] instance instance -- * \param[in] baudrate (typically 230400 , 160000 or 115200) -- */ --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate) --{ -- // Disable UART module -- usart_disable(&(instance->usart_instance)); -- // Set baudrate for UART module -- config_usart.baudrate = baudrate; -- switch (instance->bus_index) -- { -- case 0: usart_init(&(instance->usart_instance), SERCOM0, &config_usart); break; -- case 1: usart_init(&(instance->usart_instance), SERCOM1, &config_usart); break; -- case 2: usart_init(&(instance->usart_instance), SERCOM2, &config_usart); break; -- case 3: usart_init(&(instance->usart_instance), SERCOM3, &config_usart); break; -- case 4: usart_init(&(instance->usart_instance), SERCOM4, &config_usart); break; -- case 5: usart_init(&(instance->usart_instance), SERCOM5, &config_usart); break; -- } -- usart_enable(&(instance->usart_instance)); --} -- -- --/** \brief implementation of SWI UART change mode. -- * \param[in] instance instance -- * \param[in] mode (TRANSMIT_MODE or RECEIVE_MODE) -- */ --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode) --{ -- usart_disable(&(instance->usart_instance)); -- // Do nothing as the available time is not enough for setting the baudrate in ASF -- usart_enable(&(instance->usart_instance)); --} -- --/** \brief discover UART buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] swi_uart_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- */ --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses) --{ -- /* if every SERCOM was a likely candidate bus, then would need to initialize the entire array to all SERCOM n numbers. -- * As an optimization and making discovery safer, make assumptions about bus-num / SERCOM map based on SAMD21 Xplained Pro board -- * If you were using a raw SAMD21 on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- */ -- swi_uart_buses[0] = 4; // default samd21 for xplained dev board --} -- -- --/** \brief HAL implementation of SWI UART send byte over ASF. This function send one byte over UART -- * \param[in] instance instance -- * \param[in] data number of byte to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data) --{ -- int8_t retries = 90; -- uint16_t bitdata = (uint16_t)data; -- -- // Send one byte over UART module --#ifdef DEBUG_PIN -- port_pin_toggle_output_level(DEBUG_PIN_1); --#endif -- -- while ((retries > 0) && (usart_write_wait(&(instance->usart_instance), bitdata) != STATUS_OK)) -- { -- retries--; -- } -- --#ifdef DEBUG_PIN -- port_pin_toggle_output_level(DEBUG_PIN_1); --#endif -- -- if (retries <= 0x00) -- { -- return ATCA_TIMEOUT; -- } -- else -- { -- return ATCA_SUCCESS; -- } --} -- --/** \brief HAL implementation of SWI UART receive bytes over ASF. This function receive one byte over UART -- * \param[in] instance instance -- * \param[out] data pointer to space to receive the data -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data) --{ -- uint8_t retries = 100; // This retry is used to compensate the baudrate that do not match when receiving response -- uint16_t bitdata = 0x00; -- --#ifdef DEBUG_PIN -- port_pin_toggle_output_level(DEBUG_PIN_2); --#endif -- // Receive one byte over UART module -- while ((retries > 0) && (usart_read_wait(&(instance->usart_instance), &bitdata) != STATUS_OK)) -- { -- retries--; -- } -- --#ifdef DEBUG_PIN -- port_pin_toggle_output_level(DEBUG_PIN_2); --#endif -- -- *data = bitdata; -- if (retries <= 0x00) -- { -- return ATCA_TIMEOUT; -- } -- else -- { -- return ATCA_SUCCESS; -- } --} -- --/** @} */ -diff --git a/lib/hal/swi_uart_samd21_asf.h b/lib/hal/swi_uart_samd21_asf.h -deleted file mode 100644 -index eb518a3430fd..000000000000 ---- a/lib/hal/swi_uart_samd21_asf.h -+++ /dev/null -@@ -1,84 +0,0 @@ --/** -- * \file -- * \brief ATXMEGA's ATCA Hardware abstraction layer for SWI interface over UART drivers. -- * -- * Prerequisite: add UART Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef SWI_UART_SAMD21_ASF_H_ --#define SWI_UART_SAMD21_ASF_H_ -- --#include --#include "cryptoauthlib.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief -- - this HAL implementation assumes you've included the ASF SERCOM UART libraries in your project, otherwise, -- the HAL layer will not compile because the ASF UART drivers are a dependency * -- */ -- --#define MAX_SWI_BUSES 6 // SAMD21 has up to 6 SERCOMS that can be configured as UART -- --#define RECEIVE_MODE 0 // UART Receive mode, RX enabled --#define TRANSMIT_MODE 1 // UART Transmit mode, RX disabled --#define RX_DELAY { volatile uint8_t delay = 90; while (delay--) { __asm__ (""); } } --#define TX_DELAY 90 -- --#define DEBUG_PIN_1 EXT2_PIN_5 --#define DEBUG_PIN_2 EXT2_PIN_6 --/** \brief this is the hal_data for ATCA HAL for ASF SERCOM -- */ --typedef struct atcaSWImaster --{ -- // struct usart_module for Atmel SWI interface -- struct usart_module usart_instance; -- // for conveniences during interface release phase -- int bus_index; --} ATCASWIMaster_t; -- -- --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance); --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance); --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate); --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode); --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses); -- --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data); --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data); -- --/** @} */ -- --#endif // SWI_UART_ASF_H -diff --git a/lib/hal/swi_uart_samd21_start.c b/lib/hal/swi_uart_samd21_start.c -deleted file mode 100644 -index 0bf4650afaa0..000000000000 ---- a/lib/hal/swi_uart_samd21_start.c -+++ /dev/null -@@ -1,208 +0,0 @@ --/** -- * \file -- * -- * \brief Atmel Crypto Auth hardware interface object -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "swi_uart_samd21_start.h" --#include "basic/atca_helpers.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** \brief -- - this HAL implementation assumes you've included the START SERCOM UART libraries in your project, otherwise, -- the HAL layer will not compile because the START UART drivers are a dependency * -- */ -- --/** \brief HAL implementation of SWI UART init. -- * \param[in] instance instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- -- instance->USART_SWI = USART_1; -- -- status |= usart_sync_set_mode(&(instance->USART_SWI), USART_MODE_ASYNCHRONOUS); -- // Set data size to 7 -- status |= usart_sync_set_character_size(&(instance->USART_SWI), USART_CHARACTER_SIZE_7BITS); -- // Set parity to no parity -- status |= usart_sync_set_parity(&(instance->USART_SWI), USART_PARITY_NONE); -- // Set data byte to one stopbit -- status |= usart_sync_set_stopbits(&(instance->USART_SWI), USART_STOP_BITS_ONE); -- // Set baudrate to 230400 -- status |= usart_sync_set_baud_rate(&(instance->USART_SWI), 230400); -- // Enable SWI UART -- status |= usart_sync_enable(&(instance->USART_SWI)); -- return status; --} -- --/** \brief HAL implementation of SWI UART deinit. -- * \param[in] instance instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- -- usart_sync_disable(&(instance->USART_SWI)); -- -- return status; --} -- --/** \brief HAL implementation of SWI UART change baudrate. -- * \param[in] instance instance -- * \param[in] baudrate (typically 230400 or 115200) -- */ --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate) --{ -- // Set baudrate for UART module -- delay_us(50); -- usart_sync_set_baud_rate(&(instance->USART_SWI), baudrate); -- --} -- -- --/** \brief HAL implementation of SWI UART change mode. -- * \param[in] instance instance -- * \param[in] mode (TRANSMIT_MODE or RECEIVE_MODE) -- */ --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode) --{ -- -- usart_sync_disable(&(instance->USART_SWI)); -- -- if (mode == TRANSMIT_MODE) -- { -- // Set baudrate to 230400 -- usart_sync_set_baud_rate(&(instance->USART_SWI), 230400); -- // Disable Receiver -- hri_sercomusart_clear_CTRLB_RXEN_bit(&(instance->USART_SWI.device.hw)); -- hri_sercomusart_set_CTRLB_TXEN_bit(&(instance->USART_SWI.device.hw)); -- } -- else if (mode == RECEIVE_MODE) -- { -- // Set baudrate to 160000 -- usart_sync_set_baud_rate(&(instance->USART_SWI), 160000); -- // Enable Receiver -- hri_sercomusart_clear_CTRLB_TXEN_bit(&(instance->USART_SWI.device.hw)); -- hri_sercomusart_set_CTRLB_RXEN_bit(&(instance->USART_SWI.device.hw)); -- } -- usart_sync_enable(&(instance->USART_SWI)); -- instance->bus_index &= 0x07; --} -- --/** \brief discover UART buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] swi_uart_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- */ --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses) --{ -- /* if every SERCOM was a likely candidate bus, then would need to initialize the entire array to all SERCOM n numbers. -- * As an optimization and making discovery safer, make assumptions about bus-num / SERCOM map based on SAMD21 Xplained Pro board -- * If you were using a raw SAMD21 on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- */ -- swi_uart_buses[0] = 4; // default samd21 for xplained dev board --} -- --/** \brief HAL implementation of SWI UART send byte over ASF. This function send one byte over UART -- * \param[in] instance instance -- * \param[in] data number of byte to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data) --{ -- uint8_t retries = 2; -- int32_t byte_sent = 0; -- --#ifdef DEBUG_PIN -- gpio_toggle_pin_level(PA20); --#endif -- // Send one byte over UART module -- while ((retries > 0) && (byte_sent < 1)) -- { -- byte_sent = io_write(&(instance->USART_SWI.io), &data, 1); -- retries--; -- } --#ifdef DEBUG_PIN -- gpio_toggle_pin_level(PA20); --#endif -- if (byte_sent <= 0) -- { -- return ATCA_TIMEOUT; -- } -- else -- { -- return ATCA_SUCCESS; -- } --} -- --/** \brief HAL implementation of SWI UART receive bytes over ASF. This function receive one byte over UART -- * \param[in] instance instance -- * \param[out] data pointer to space to receive the data -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data) --{ -- int32_t byte_sent = 0; -- uint8_t retries = 2; -- --#ifdef DEBUG_PIN -- gpio_toggle_pin_level(PA21); --#endif -- // Receive one byte over UART module -- while ((retries > 0) && (byte_sent < 1)) -- { -- byte_sent = io_read(&(instance->USART_SWI.io), data, 1); -- retries--; -- } --#ifdef DEBUG_PIN -- gpio_toggle_pin_level(PA21); --#endif -- if (byte_sent <= 0) -- { -- return ATCA_TIMEOUT; -- } -- else -- { -- return ATCA_SUCCESS; -- } --} -- --/** @} */ -diff --git a/lib/hal/swi_uart_samd21_start.h b/lib/hal/swi_uart_samd21_start.h -deleted file mode 100644 -index e039228ef7c3..000000000000 ---- a/lib/hal/swi_uart_samd21_start.h -+++ /dev/null -@@ -1,80 +0,0 @@ --/** -- * \file -- * -- * \brief Atmel Crypto Auth hardware interface object -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef SWI_UART_SAMD21_START_H_ --#define SWI_UART_SAMD21_START_H_ -- --#include --#include --#include "atmel_start.h" --#include "cryptoauthlib.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief -- - this HAL implementation assumes you've included the ASF SERCOM UART libraries in your project, otherwise, -- the HAL layer will not compile because the ASF UART drivers are a dependency * -- */ -- --#define MAX_SWI_BUSES 6 // SAMD21 has up to 6 SERCOMS that can be configured as UART -- --#define RECEIVE_MODE 0 // UART Receive mode, RX enabled --#define TRANSMIT_MODE 1 // UART Transmit mode, RX disabled --#define RX_DELAY 10 --#define TX_DELAY 93 --/** \brief this is the hal_data for ATCA HAL for ASF SERCOM -- */ --typedef struct atcaSWImaster --{ -- // struct usart_module for Atmel SWI interface -- struct usart_sync_descriptor USART_SWI; -- // for conveniences during interface release phase -- int bus_index; --} ATCASWIMaster_t; -- --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance); --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance); --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate); --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode); --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses); -- --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data); --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data); --/** @} */ -- --#endif // SWI_UART_ASF_H -diff --git a/lib/hal/swi_uart_xmega_a3bu_asf.c b/lib/hal/swi_uart_xmega_a3bu_asf.c -deleted file mode 100644 -index 26785cd795ee..000000000000 ---- a/lib/hal/swi_uart_xmega_a3bu_asf.c -+++ /dev/null -@@ -1,258 +0,0 @@ --/** -- * \file -- * \brief ATXMEGA's ATCA Hardware abstraction layer for SWI interface over XMEGA UART drivers. -- * -- * Prerequisite: add UART Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#include --#include --#include "swi_uart_xmega_a3bu_asf.h" --#include "basic/atca_helpers.h" -- --#define DEBUG_PIN 1 -- --#ifdef DEBUG_PIN -- #define DEBUG_PIN_1 IOPORT_CREATE_PIN(PORTB, 0) -- #define DEBUG_PIN_2 IOPORT_CREATE_PIN(PORTB, 1) --#endif --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- --/** \brief usart configuration struct */ --static usart_serial_options_t config_usart; --/** \brief sysclk_get_per_hz value */ --static uint32_t u32sysclk; -- -- --/** \brief -- - this HAL implementation assumes you've included the ASF SERCOM UART libraries in your project, otherwise, -- the HAL layer will not compile because the ASF UART drivers are a dependency * -- */ -- --/** \brief Implementation of SWI UART init. -- * \param[in] instance instance -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance) --{ --#ifdef DEBUG_PIN -- ioport_init(); -- ioport_set_pin_dir(DEBUG_PIN_1, IOPORT_DIR_OUTPUT); -- ioport_set_pin_dir(DEBUG_PIN_2, IOPORT_DIR_OUTPUT); -- gpio_set_pin_high(DEBUG_PIN_1); -- gpio_set_pin_high(DEBUG_PIN_2); --#endif -- ATCA_STATUS status = ATCA_SUCCESS; -- -- //Save sysclk_get_per_hz value -- u32sysclk = sysclk_get_per_hz(); -- // Set data size to 7 -- config_usart.charlength = USART_CHSIZE_7BIT_gc; -- // Set parity to no parity -- config_usart.paritytype = USART_PMODE_DISABLED_gc; -- // Set data byte to one stopbit -- config_usart.stopbits = false; -- // Set baudrate to 230400 -- config_usart.baudrate = 230400; -- -- switch (instance->bus_index) -- { -- case 0: instance->usart_instance = &USARTC0; break; -- case 1: instance->usart_instance = &USARTC1; break; -- case 2: instance->usart_instance = &USARTD0; break; -- case 3: instance->usart_instance = &USARTD1; break; -- case 4: instance->usart_instance = &USARTE0; break; -- case 5: instance->usart_instance = &USARTF0; break; -- } -- status = usart_serial_init(instance->usart_instance, &config_usart); -- return status; --} -- --/** \brief Implementation of SWI UART deinit. -- * \param[in] instance instance -- * \return ATCA_SUCCESS -- */ --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance) --{ -- ATCA_STATUS status = ATCA_SUCCESS; -- -- instance->usart_instance = NULL; -- return status; --} -- --/** \brief implementation of SWI UART change baudrate. -- * \param[in] instance instance -- * \param[in] baudrate (typically 230400 , 160000 or 115200) -- */ --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate) --{ -- // Set baudrate for UART module -- usart_set_baudrate(instance->usart_instance, baudrate, u32sysclk); --} -- -- --/** \brief implementation of SWI UART change mode. -- * \param[in] instance instance -- * \param[in] mode (TRANSMIT_MODE or RECEIVE_MODE) -- */ --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode) --{ -- switch (mode) -- { -- case TRANSMIT_MODE: -- usart_set_baudrate(instance->usart_instance, 230400, u32sysclk); -- break; -- case RECEIVE_MODE: -- //Reset UART RX buffer. -- usart_rx_disable(instance->usart_instance); -- usart_rx_enable(instance->usart_instance); -- break; -- default: -- break; -- } -- --} -- --/** \brief discover UART buses available for this hardware -- * this maintains a list of logical to physical bus mappings freeing the application -- * of the a-priori knowledge -- * \param[in] swi_uart_buses - an array of logical bus numbers -- * \param[in] max_buses - maximum number of buses the app wants to attempt to discover -- */ --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses) --{ -- /* if every PORT was a likely candidate bus, then would need to initialize the entire array to all PORT n numbers. -- * As an optimization and making discovery safer, make assumptions about bus-num / PORT map based on XMEGA-A3BU Xplained board -- * If you were using a raw XMEGA on your own board, you would supply your own bus numbers based on your particular hardware configuration. -- */ -- swi_uart_buses[0] = 4; // default xmega-a3bu for xplained dev board --} -- --/** \brief HAL implementation of SWI UART send byte over ASF. This function send one byte over UART -- * \param[in] instance instance -- * \param[in] data byte to send -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data) --{ -- int8_t timeout = 0x7F; -- bool data_reg_empty = false; -- ATCA_STATUS status = ATCA_COMM_FAIL; -- -- // Send one byte over UART module --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_1); --#endif -- // Send one byte over UART module -- timeout = 0x7F; -- while ((timeout > 0) && (data_reg_empty == false)) -- { -- data_reg_empty = usart_data_register_is_empty(instance->usart_instance); -- timeout--; -- } -- if (data_reg_empty) -- { -- usart_put(instance->usart_instance, data); -- while (!usart_tx_is_complete(instance->usart_instance)) -- { -- ; -- } -- usart_clear_tx_complete(instance->usart_instance); -- status = ATCA_SUCCESS; -- } --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_1); --#endif -- if (timeout > 0) -- { -- return status; -- } -- else -- { -- return ATCA_TIMEOUT; -- } --} -- --/** \brief HAL implementation of SWI UART receive bytes over ASF. This function receive one byte over UART -- * \param[in] instance instance -- * \param[out] data pointer to space to receive the data -- * \return ATCA_SUCCESS on success, otherwise an error code. -- */ --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data) --{ -- int8_t timeout, retries = 0x2; // This retry is used to compensate the baudrate that do not match when receiving response -- -- *data = 0xFF; -- bool rx_complete = false; -- ATCA_STATUS status = ATCA_COMM_FAIL; --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_2); --#endif -- // Receive one byte over UART module -- while ((retries > 0) && (status != ATCA_SUCCESS)) -- { -- timeout = 0x7F; retries--; -- while ((timeout > 0) && (rx_complete == false)) -- { -- rx_complete = usart_rx_is_complete(instance->usart_instance); -- timeout--; -- } -- -- if (rx_complete) -- { -- *data = usart_get(instance->usart_instance); -- if ((*data >= 0x70) && (*data <= 0x7F)) -- { -- status = ATCA_SUCCESS; -- } -- else -- { -- status = ATCA_COMM_FAIL; -- } -- } -- } --#ifdef DEBUG_PIN -- gpio_toggle_pin(DEBUG_PIN_2); --#endif -- if (timeout > 0) -- { -- return status; -- } -- else -- { -- return ATCA_TIMEOUT; -- } --} -- --/** @} */ -diff --git a/lib/hal/swi_uart_xmega_a3bu_asf.h b/lib/hal/swi_uart_xmega_a3bu_asf.h -deleted file mode 100644 -index e9bfffc58fc6..000000000000 ---- a/lib/hal/swi_uart_xmega_a3bu_asf.h -+++ /dev/null -@@ -1,83 +0,0 @@ --/** -- * \file -- * \brief ATXMEGA's ATCA Hardware abstraction layer for SWI interface over XMEGA UART drivers. -- * -- * Prerequisite: add UART Polled support to application in Atmel Studio -- * -- * \copyright (c) 2017 Microchip Technology Inc. and its subsidiaries. -- * You may use this software and any derivatives exclusively with -- * Microchip products. -- * -- * \page License -- * -- * (c) 2017 Microchip Technology Inc. and its subsidiaries. You may use this -- * software and any derivatives exclusively with Microchip products. -- * -- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER -- * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED -- * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A -- * PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION -- * WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. -- * -- * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, -- * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND -- * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS -- * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE -- * FULLEST EXTENT ALLOWED BY LAW, MICROCHIPS TOTAL LIABILITY ON ALL CLAIMS IN -- * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, -- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. -- * -- * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE -- * TERMS. -- */ -- --#ifndef SWI_UART_XMEGA_A3BU_ASF_H_ --#define SWI_UART_XMEGA_A3BU_ASF_H_ -- --#include --#include "cryptoauthlib.h" --#include "serial.h" -- --/** \defgroup hal_ Hardware abstraction layer (hal_) -- * -- * \brief -- * These methods define the hardware abstraction layer for communicating with a CryptoAuth device -- * -- @{ */ -- -- --/** \brief -- - this HAL implementation assumes you've included the ASF UART libraries in your project, otherwise, -- the HAL layer will not compile because the ASF UART drivers are a dependency * -- */ -- --#define MAX_SWI_BUSES 6 // XMEGA A3BU has up to 6 ports -- --#define RECEIVE_MODE 0 // UART Receive mode, RX enabled --#define TRANSMIT_MODE 1 // UART Transmit mode, RX disabled --#define RX_DELAY 10 // Delay before responses come --#define TX_DELAY 90 // Delay before new flag is sent -- --/** \brief this is the hal_data for ATCA HAL for SWI UART -- */ --typedef struct atcaSWImaster --{ -- // struct usart_module for Atmel SWI interface -- usart_if usart_instance; -- // for conveniences during interface release phase -- int bus_index; --} ATCASWIMaster_t; -- -- --ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance); --ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance); --void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate); --void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode); --void swi_uart_discover_buses(int swi_uart_buses[], int max_buses); -- --ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data); --ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data); -- --/** @} */ -- --#endif // SWI_UART_XMEGA_A3BU_ASF_H diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-lib-apply-library-version-number-to-CMake-VERSION-pr.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-lib-apply-library-version-number-to-CMake-VERSION-pr.patch new file mode 100644 index 000000000..031d2033e --- /dev/null +++ b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0002-lib-apply-library-version-number-to-CMake-VERSION-pr.patch @@ -0,0 +1,30 @@ +From: Gabriel Valcazar +Date: Mon, 4 Nov 2019 16:11:48 +0100 +Subject: [PATCH 2/6] lib: apply library version number to CMake VERSION + property + +This way, CMake will generate a shared library with the version number and an +additional symlink without it. This avoids bitbake errors that appear when +creating *-dev packages, as Yocto development packages should only include +the soname symlinks instead of the actual library file. + +https://jira.digi.com/browse/DEL-6826 + +Signed-off-by: Gabriel Valcazar +--- + lib/CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt +index b198d1f..88533f1 100644 +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -93,6 +93,8 @@ endif() + + add_library(cryptoauth ${CRYPTOAUTH_SRC} ${ATCACERT_DEF_SRC}) + ++set_property(TARGET cryptoauth PROPERTY VERSION "${VERSION}") ++ + set_property(TARGET cryptoauth PROPERTY C_STANDARD 99) + + if(ATCA_PRINTF) diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-Build-cryptochip-cmd-processor-application-along-wit.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-Build-cryptochip-cmd-processor-application-along-wit.patch deleted file mode 100644 index e25c35d85..000000000 --- a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-Build-cryptochip-cmd-processor-application-along-wit.patch +++ /dev/null @@ -1,50 +0,0 @@ -From: Gabriel Valcazar -Date: Mon, 26 Feb 2018 11:42:50 +0100 -Subject: [PATCH 1/2] Build cryptochip-cmd-processor application along with the - library - -This new test application is more complete than ecc-test-main. It includes a -command line with different test runs for the chip's basic functionality, -helper functions, certificate functions and allows the configuration to be -read, among other things. - -Hardcode the app to use the ATECC508A and remove all code that is specific for -other chips. - -https://jira.digi.com/browse/DEL-5763 - -Signed-off-by: Gabriel Valcazar ---- - Makefile | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/Makefile b/Makefile -index a471428..c57b1bf 100644 ---- a/Makefile -+++ b/Makefile -@@ -7,7 +7,7 @@ SUBDIRS= lib test - - .PHONY: tgt_lib tgt_test clean - --all: tgt_lib tgt_test ecc-test -+all: tgt_lib tgt_test ecc-test cmd-processor - - %.o: %.c - $(CC) $(CFLAGS) -o $@ -c $< -@@ -22,11 +22,15 @@ ecc-test: tgt_lib tgt_test - $(CC) -c ecc-test-main.c $(CFLAGS) $(LDFLAGS) -I ./lib/ -I ./test/ - $(CC) -o ecc-test-main ecc-test-main.o $(LDFLAGS) test/tls/atcatls_tests.o -L lib -L test -lm -lc -lrt -lcryptoauth -lunity - -+cmd-processor: tgt_lib tgt_test -+ $(CC) -o cryptochip-cmd-processor test/*.o $(LDFLAGS) test/*/*.o -L lib -L test -lcryptoauth -+ - install: - for a in $(SUBDIRS); do $(MAKE) -C $$a $@; done - install -d $(DESTDIR)/usr/bin - install -m 0755 ecc-test-main $(DESTDIR)/usr/bin/ -+ install -m 0755 cryptochip-cmd-processor $(DESTDIR)/usr/bin - - clean: -- rm -f *.o *.a ecc-test-main -+ rm -f *.o *.a ecc-test-main cryptochip-cmd-processor - $(foreach subdir,$(basename $(SUBDIRS)),$(MAKE) -w -C $(subdir) clean;) diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-pkcs11-rename-template-configuration-file-to-its-int.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-pkcs11-rename-template-configuration-file-to-its-int.patch new file mode 100644 index 000000000..a92d49e14 --- /dev/null +++ b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0003-pkcs11-rename-template-configuration-file-to-its-int.patch @@ -0,0 +1,84 @@ +From: Gabriel Valcazar +Date: Thu, 7 Nov 2019 13:43:53 +0100 +Subject: [PATCH 3/6] pkcs11: rename template configuration file to its + intended name + +Otherwise, users will need to manually rename the file in the rootfs to use +the pkcs11 feature. + +https://jira.digi.com/browse/DEL-6835 + +Signed-off-by: Gabriel Valcazar +--- + CMakeLists.txt | 4 ++-- + app/pkcs11/0.conf | 19 +++++++++++++++++++ + app/pkcs11/slot.conf.tmpl | 19 ------------------- + 3 files changed, 21 insertions(+), 21 deletions(-) + create mode 100644 app/pkcs11/0.conf + delete mode 100644 app/pkcs11/slot.conf.tmpl + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9326fd1..00214d3 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -80,8 +80,8 @@ install(CODE " + install(DIRECTORY DESTINATION ${DEFAULT_STORE_PATH}) + install(CODE "execute_process(COMMAND chmod 1777 ${DEFAULT_STORE_PATH})") + install(CODE " +- if(NOT EXISTS ${DEFAULT_STORE_PATH}/slot.conf.tmpl) +- file(INSTALL ${PROJECT_SOURCE_DIR}/app/pkcs11/slot.conf.tmpl ++ if(NOT EXISTS ${DEFAULT_STORE_PATH}/0.conf) ++ file(INSTALL ${PROJECT_SOURCE_DIR}/app/pkcs11/0.conf + DESTINATION ${DEFAULT_STORE_PATH}) + endif() + ") +diff --git a/app/pkcs11/0.conf b/app/pkcs11/0.conf +new file mode 100644 +index 0000000..b637abd +--- /dev/null ++++ b/app/pkcs11/0.conf +@@ -0,0 +1,19 @@ ++# Reserved Configuration for a device ++# The objects in this file will be created and marked as undeletable ++# These are processed in order. Configuration parameters must be comma ++# delimited and may not contain spaces ++ ++interface = i2c,0xB0 ++freeslots = 1,2,3 ++ ++# Slot 0 is the primary private key ++object = private,device,0 ++ ++# Slot 10 is the certificate data for the device's public key ++#object = certificate,device,10 ++ ++# Slot 12 is the intermedate/signer certificate data ++#object = certificate,signer,12 ++ ++# Slot 15 is a public key ++object = public,root,15 +diff --git a/app/pkcs11/slot.conf.tmpl b/app/pkcs11/slot.conf.tmpl +deleted file mode 100644 +index b637abd..0000000 +--- a/app/pkcs11/slot.conf.tmpl ++++ /dev/null +@@ -1,19 +0,0 @@ +-# Reserved Configuration for a device +-# The objects in this file will be created and marked as undeletable +-# These are processed in order. Configuration parameters must be comma +-# delimited and may not contain spaces +- +-interface = i2c,0xB0 +-freeslots = 1,2,3 +- +-# Slot 0 is the primary private key +-object = private,device,0 +- +-# Slot 10 is the certificate data for the device's public key +-#object = certificate,device,10 +- +-# Slot 12 is the intermedate/signer certificate data +-#object = certificate,signer,12 +- +-# Slot 15 is a public key +-object = public,root,15 diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-Remove-unnecessary-code-from-cryptochip-cmd-processo.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-Remove-unnecessary-code-from-cryptochip-cmd-processo.patch deleted file mode 100644 index cd9f30cf1..000000000 --- a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-Remove-unnecessary-code-from-cryptochip-cmd-processo.patch +++ /dev/null @@ -1,454 +0,0 @@ -From: Gabriel Valcazar -Date: Fri, 23 Feb 2018 13:50:29 +0100 -Subject: [PATCH 2/2] Remove unnecessary code from cryptochip-cmd-processor - -Some test commands apply to chips other than the ATECC508A, and can cause -errors when used incorrectly. Remove all code that doesn't apply to our -platforms. - -https://jira.digi.com/browse/DEL-5763 - -Signed-off-by: Gabriel Valcazar ---- - test/cmd-processor.c | 348 ++------------------------------------------------- - 1 file changed, 13 insertions(+), 335 deletions(-) - -diff --git a/test/cmd-processor.c b/test/cmd-processor.c -index c8c60e0..592157e 100644 ---- a/test/cmd-processor.c -+++ b/test/cmd-processor.c -@@ -92,10 +92,6 @@ static void sernum(void); - static void discover(void); - static void select_device(ATCADeviceType device_type); - static int run_test(void* fptest); --static void select_204(void); --static void select_108(void); --static void select_508(void); --static void select_608(void); - static void run_basic_tests(void); - static void run_unit_tests(void); - static void run_otpzero_tests(void); -@@ -103,20 +99,11 @@ static void run_helper_tests(void); - static void help(void); - static int parse_cmd(const char *command); - static void run_all_tests(void); --static ATCA_STATUS set_chip_mode(uint8_t i2c_user_extra_add, uint8_t ttl_enable, uint8_t watchdog, uint8_t clock_divider); --static void set_clock_divider_m0(void); --static void set_clock_divider_m1(void); --static void set_clock_divider_m2(void); - - static const char* argv[] = { "manual", "-v" }; - static t_menu_info mas_menu_info[] = - { - { "help", "Display Menu", help }, -- { "discover", "Discover Buses and Devices", discover }, -- { "204", "Set Target Device to ATECC204A", select_204 }, -- { "108", "Set Target Device to ATECC108A", select_108 }, -- { "508", "Set Target Device to ATECC508A", select_508 }, -- { "608", "Set Target Device to ATECC608A", select_608 }, - { "info", "Get the Chip Revision", info }, - { "sernum", "Get the Chip Serial Number", sernum }, - { "basic", "Run Basic Test on Selected Device", run_basic_tests }, -@@ -135,12 +122,9 @@ static t_menu_info mas_menu_info[] = - { "cio", "Run Unit Test on Cert I/O", (fp_menu_handler)certio_unit_tests }, - #endif - #ifdef TEST_SW_CRYPTO -- { "crypto", "Run Unit Tests for Software Crypto Functions", atca_crypto_sw_tests }, -+ { "crypto", "Run Unit Tests for Software Crypto Functions", (fp_menu_handler)atca_crypto_sw_tests }, - #endif - { "all", "Run all unit tests, locking as needed.", run_all_tests }, -- { "clkdivm0", "Set ATECC608A to ClockDivider M0(0x00)", set_clock_divider_m0}, -- { "clkdivm1", "Set ATECC608A to ClockDivider M1(0x05)", set_clock_divider_m1}, -- { "clkdivm2", "Set ATECC608A to ClockDivider M2(0x0D)", set_clock_divider_m2}, - { NULL, NULL, NULL }, - }; - -@@ -160,6 +144,8 @@ int main(int argc, char* argv[]) - return 1; - } - -+ select_device(ATECC508A); -+ - while (true) - { - printf("$ "); -@@ -230,96 +216,13 @@ static void help(void) - } - } - --static void select_204(void) --{ -- select_device(ATSHA204A); --} --static void select_108(void) --{ -- select_device(ATECC108A); --} --static void select_508(void) --{ -- select_device(ATECC508A); --} --static void select_608(void) --{ -- select_device(ATECC608A); --} -- --static void update_chip_mode(uint8_t* chip_mode, uint8_t i2c_user_extra_add, uint8_t ttl_enable, uint8_t watchdog, uint8_t clock_divider) --{ -- if (i2c_user_extra_add != 0xFF) -- { -- *chip_mode &= ~ATCA_CHIPMODE_I2C_ADDRESS_FLAG; -- *chip_mode |= i2c_user_extra_add & ATCA_CHIPMODE_I2C_ADDRESS_FLAG; -- } -- if (ttl_enable != 0xFF) -- { -- *chip_mode &= ~ATCA_CHIPMODE_TTL_ENABLE_FLAG; -- *chip_mode |= ttl_enable & ATCA_CHIPMODE_TTL_ENABLE_FLAG; -- } -- if (watchdog != 0xFF) -- { -- *chip_mode &= ~ATCA_CHIPMODE_WATCHDOG_MASK; -- *chip_mode |= watchdog & ATCA_CHIPMODE_WATCHDOG_MASK; -- } -- if (clock_divider != 0xFF) -- { -- *chip_mode &= ~ATCA_CHIPMODE_CLOCK_DIV_MASK; -- *chip_mode |= clock_divider & ATCA_CHIPMODE_CLOCK_DIV_MASK; -- } --} -- --static ATCA_STATUS check_clock_divider(void) --{ -- ATCA_STATUS status; -- uint8_t chip_mode = 0; -- -- if (gCfg->devtype != ATECC608A) -- { -- printf("Current device doesn't support clock divider settings (only ATECC608A)\r\n"); -- return ATCA_GEN_FAIL; -- } -- -- // Update the actual ATECC608A chip mode so it takes effect immediately -- status = atcab_init(gCfg); -- if (status != ATCA_SUCCESS) -- { -- printf("atcab_init() failed with ret=0x%08X\r\n", status); -- return status; -- } -- -- do -- { -- // Read current config values -- status = atcab_read_bytes_zone(ATCA_ZONE_CONFIG, 0, ATCA_CHIPMODE_OFFSET, &chip_mode, 1); -- if (status != ATCA_SUCCESS) -- { -- printf("atcab_read_bytes_zone() failed with ret=0x%08X\r\n", status); -- break; -- } -- -- // Update the ATECC608A test config data so all the unit tests will run with the new chip mode -- update_chip_mode(&test_ecc608_configdata[ATCA_CHIPMODE_OFFSET], 0xFF, 0xFF, chip_mode & ATCA_CHIPMODE_WATCHDOG_MASK, chip_mode & ATCA_CHIPMODE_CLOCK_DIV_MASK); -- -- } while (0); -- -- atcab_release(); -- return status; --} -- - static void run_basic_tests(void) - { -- if (gCfg->devtype == ATECC608A) -- check_clock_divider(); - run_test(RunAllBasicTests); - } - - static void run_unit_tests(void) - { -- if (gCfg->devtype == ATECC608A) -- check_clock_divider(); - run_test(RunAllFeatureTests); - } - static void run_otpzero_tests(void) -@@ -453,37 +356,6 @@ static ATCA_STATUS do_randoms(void) - - return status; - } --static void discover(void) --{ -- ATCAIfaceCfg ifaceCfgs[10]; -- int i; -- const char *devname[] = { "ATSHA204A", "ATECC108A", "ATECC508A", "ATECC608A" }; // indexed by ATCADeviceType -- -- for (i = 0; i < (int)(sizeof(ifaceCfgs) / sizeof(ATCAIfaceCfg)); i++) -- { -- ifaceCfgs[i].devtype = ATCA_DEV_UNKNOWN; -- ifaceCfgs[i].iface_type = ATCA_UNKNOWN_IFACE; -- } -- -- printf("Searching..."); -- atcab_cfg_discover(ifaceCfgs, sizeof(ifaceCfgs) / sizeof(ATCAIfaceCfg)); -- for (i = 0; i < (int)(sizeof(ifaceCfgs) / sizeof(ATCAIfaceCfg)); i++) -- { -- if (ifaceCfgs[i].devtype != ATCA_DEV_UNKNOWN) -- { -- printf("Found %s ", devname[ifaceCfgs[i].devtype]); -- if (ifaceCfgs[i].iface_type == ATCA_I2C_IFACE) -- { -- printf("@ bus %d addr %02x", ifaceCfgs[i].atcai2c.bus, ifaceCfgs[i].atcai2c.slave_address); -- } -- if (ifaceCfgs[i].iface_type == ATCA_SWI_IFACE) -- { -- printf("@ bus %d", ifaceCfgs[i].atcaswi.bus); -- } -- printf("\r\n"); -- } -- } --} - static void info(void) - { - ATCA_STATUS status; -@@ -636,18 +508,7 @@ static ATCA_STATUS get_serial_no(uint8_t *sernum) - - static void select_device(ATCADeviceType device_type) - { -- ATCA_STATUS status; -- -- status = set_test_config(device_type); -- -- if (status == ATCA_SUCCESS) -- { -- printf("Device Selected.\r\n"); -- } -- else -- { -- printf("IFace Cfg are NOT available\r\n"); -- } -+ set_test_config(device_type); - } - - static int run_test(void* fptest) -@@ -670,9 +531,6 @@ static void run_all_tests(void) - bool is_data_locked = false; - int fails = 0; - -- if (gCfg->devtype == ATECC608A) -- check_clock_divider(); -- - status = is_device_locked(LOCK_ZONE_CONFIG, &is_config_locked); - if (status != ATCA_SUCCESS) - { -@@ -814,204 +672,24 @@ static ATCA_STATUS set_test_config(ATCADeviceType deviceType) - gCfg->devtype = ATCA_DEV_UNKNOWN; - gCfg->iface_type = ATCA_UNKNOWN_IFACE; - -- switch (deviceType) -- { -- case ATSHA204A: --#if defined(ATCA_HAL_I2C) -- *gCfg = cfg_atsha204a_i2c_default; --#elif defined(ATCA_HAL_SWI) -- *gCfg = cfg_atsha204a_swi_default; --#elif defined(ATCA_HAL_KIT_HID) -- *gCfg = cfg_atsha204a_kithid_default; --#elif defined(ATCA_HAL_KIT_CDC) -- *gCfg = cfg_atsha204a_kitcdc_default; --#elif defined(ATCA_HAL_CUSTOM) -- *gCfg = g_cfg_atsha204a_custom; --#else --#error "HAL interface is not selected"; --#endif -- break; -- -- case ATECC108A: --#if defined(ATCA_HAL_I2C) -- *gCfg = cfg_ateccx08a_i2c_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_SWI) -- *gCfg = cfg_ateccx08a_swi_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_KIT_HID) -- *gCfg = cfg_ateccx08a_kithid_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_KIT_CDC) -- *gCfg = cfg_ateccx08a_kitcdc_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_CUSTOM) -- *gCfg = g_cfg_atecc108a_custom; --#else --#error "HAL interface is not selected"; --#endif -- break; -- -- case ATECC508A: --#if defined(ATCA_HAL_I2C) -- *gCfg = cfg_ateccx08a_i2c_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_SWI) -- *gCfg = cfg_ateccx08a_swi_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_KIT_HID) -- *gCfg = cfg_ateccx08a_kithid_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_KIT_CDC) -- *gCfg = cfg_ateccx08a_kitcdc_default; -- gCfg->devtype = deviceType; --#elif defined(ATCA_HAL_CUSTOM) -- *gCfg = g_cfg_atecc508a_custom; --#else --#error "HAL interface is not selected"; --#endif -- break; -- -- case ATECC608A: - #if defined(ATCA_HAL_I2C) -- *gCfg = cfg_ateccx08a_i2c_default; -- gCfg->devtype = deviceType; -+ *gCfg = cfg_ateccx08a_i2c_default; -+ gCfg->devtype = deviceType; - #elif defined(ATCA_HAL_SWI) -- *gCfg = cfg_ateccx08a_swi_default; -- gCfg->devtype = deviceType; -+ *gCfg = cfg_ateccx08a_swi_default; -+ gCfg->devtype = deviceType; - #elif defined(ATCA_HAL_KIT_HID) -- *gCfg = cfg_ateccx08a_kithid_default; -- gCfg->devtype = deviceType; -+ *gCfg = cfg_ateccx08a_kithid_default; -+ gCfg->devtype = deviceType; - #elif defined(ATCA_HAL_KIT_CDC) -- *gCfg = cfg_ateccx08a_kitcdc_default; -- gCfg->devtype = deviceType; -+ *gCfg = cfg_ateccx08a_kitcdc_default; -+ gCfg->devtype = deviceType; - #elif defined(ATCA_HAL_CUSTOM) -- *gCfg = g_cfg_atecc608a_custom; -+ *gCfg = g_cfg_atecc508a_custom; - #else - #error "HAL interface is not selected"; - #endif -- break; -- -- default: -- //device type wasn't found, return with error -- return ATCA_GEN_FAIL; -- } -- -- #ifdef ATCA_RASPBERRY_PI_3 -- gCfg->atcai2c.bus = 1; -- #endif - - return ATCA_SUCCESS; - } - --static ATCA_STATUS set_chip_mode(uint8_t i2c_user_extra_add, uint8_t ttl_enable, uint8_t watchdog, uint8_t clock_divider) --{ -- ATCA_STATUS status; -- uint8_t config_word[ATCA_WORD_SIZE]; -- bool is_config_locked = false; -- -- if (gCfg->devtype != ATECC608A) -- { -- printf("Current device doesn't support clock divider settings (only ATECC608A)\r\n"); -- return ATCA_GEN_FAIL; -- } -- -- status = is_device_locked(LOCK_ZONE_CONFIG, &is_config_locked); -- if (status != ATCA_SUCCESS) -- { -- printf("is_device_locked() failed with ret=0x%08X\r\n", status); -- return status; -- } -- -- if (is_config_locked) -- { -- printf("Current device is config locked. Can't change clock divider. "); -- } -- -- // Update the actual ATECC608A chip mode so it takes effect immediately -- status = atcab_init(gCfg); -- if (status != ATCA_SUCCESS) -- { -- printf("atcab_init() failed with ret=0x%08X\r\n", status); -- return status; -- } -- -- do -- { -- // Read current config values -- status = atcab_read_bytes_zone(ATCA_ZONE_CONFIG, 0, 16, config_word, 4); -- if (status != ATCA_SUCCESS) -- { -- printf("atcab_read_bytes_zone() failed with ret=0x%08X\r\n", status); -- break; -- } -- -- if (is_config_locked) -- { -- printf("Currently set to 0x%02X.\r\n", (int)(config_word[3] >> 3)); -- status = ATCA_GEN_FAIL; -- break; -- } -- -- // Update ChipMode -- update_chip_mode(&config_word[3], i2c_user_extra_add, ttl_enable, watchdog, clock_divider); -- -- // Write config values back to chip -- status = atcab_write_bytes_zone(ATCA_ZONE_CONFIG, 0, 16, config_word, 4); -- if (status != ATCA_SUCCESS) -- { -- printf("atcab_write_bytes_zone() failed with ret=0x%08X\r\n", status); -- break; -- } -- -- // Put to sleep so new values take effect -- status = atcab_wakeup(); -- if (status != ATCA_SUCCESS) -- { -- printf("atcab_wakeup() failed with ret=0x%08X\r\n", status); -- break; -- } -- status = atcab_sleep(); -- if (status != ATCA_SUCCESS) -- { -- printf("atcab_sleep() failed with ret=0x%08X\r\n", status); -- break; -- } -- -- // Update the ATECC608A test config data so all the unit tests will run with the new chip mode -- update_chip_mode(&test_ecc608_configdata[ATCA_CHIPMODE_OFFSET], i2c_user_extra_add, ttl_enable, watchdog, clock_divider); -- -- } while (0); -- -- atcab_release(); -- return status; --} -- --static void set_clock_divider_m0(void) --{ -- ATCA_STATUS status = set_chip_mode(0xFF, 0xFF, ATCA_CHIPMODE_WATCHDOG_SHORT, ATCA_CHIPMODE_CLOCK_DIV_M0); -- if (status == ATCA_SUCCESS) -- { -- printf("Set device to clock divider M0 (0x%02X) and watchdog to 1.3s nominal.\r\n", ATCA_CHIPMODE_CLOCK_DIV_M0 >> 3); -- } --} -- --static void set_clock_divider_m1(void) --{ -- ATCA_STATUS status = set_chip_mode(0xFF, 0xFF, ATCA_CHIPMODE_WATCHDOG_SHORT, ATCA_CHIPMODE_CLOCK_DIV_M1); -- if (status == ATCA_SUCCESS) -- { -- printf("Set device to clock divider M1 (0x%02X) and watchdog to 1.3s nominal.\r\n", ATCA_CHIPMODE_CLOCK_DIV_M1 >> 3); -- } --} -- --static void set_clock_divider_m2(void) --{ -- // Additionally set watchdog to long settings (~13s) as some commands -- // can't complete in time on the faster watchdog setting. -- ATCA_STATUS status = set_chip_mode(0xFF, 0xFF, ATCA_CHIPMODE_WATCHDOG_LONG, ATCA_CHIPMODE_CLOCK_DIV_M2); -- if (status == ATCA_SUCCESS) -- { -- printf("Set device to clock divider M2 (0x%02X) and watchdog to 13s nominal.\r\n", ATCA_CHIPMODE_CLOCK_DIV_M2 >> 3); -- } --} -\ No newline at end of file diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-lib-install-pkg-config-file-and-header-files.patch b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-lib-install-pkg-config-file-and-header-files.patch new file mode 100644 index 000000000..82f33a002 --- /dev/null +++ b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib/0004-lib-install-pkg-config-file-and-header-files.patch @@ -0,0 +1,82 @@ +From: Gabriel Valcazar +Date: Thu, 7 Nov 2019 14:16:53 +0100 +Subject: [PATCH 4/6] lib: install pkg-config file and header files + +These are needed to be able to develop using cryptoauthlib. + +https://jira.digi.com/browse/DEL-6826 + +Signed-off-by: Gabriel Valcazar +--- + CMakeLists.txt | 15 +++++++++++++++ + lib/CMakeLists.txt | 4 ++++ + lib/cryptoauthlib.pc.in | 11 +++++++++++ + 3 files changed, 30 insertions(+) + create mode 100644 lib/cryptoauthlib.pc.in + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 00214d3..f95736d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -33,6 +33,10 @@ set(DEFAULT_CONF_PATH "${CMAKE_INSTALL_FULL_SYSCONFDIR}/${PROJECT_NAME}" CACHE + STRING "The default location of ${PROJECT_NAME}.conf") + set(DEFAULT_STORE_PATH "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/${PROJECT_NAME}" CACHE + STRING "The default location of the filestore directory") ++set(DEFAULT_PKGCONFIG_PATH "${DEFAULT_LIB_PATH}/pkgconfig" CACHE ++ STRING "The default location of the library's pkg-config file") ++set(DEFAULT_INCLUDE_PATH "${CMAKE_INSTALL_FULL_INCLUDEDIR}" CACHE ++ STRING "The default location of the library's header files") + endif() + + set(DEFAULT_CONF_FILE_NAME "${PROJECT_NAME}.conf" CACHE +@@ -49,6 +53,9 @@ endif() + # Set up a default configuration file to install + configure_file(${PROJECT_SOURCE_DIR}/app/pkcs11/cryptoauthlib.conf.in ${PROJECT_BINARY_DIR}/${DEFAULT_CONF_FILE_NAME}) + ++# Set up the pkg-config file ++configure_file(${PROJECT_SOURCE_DIR}/lib/${PROJECT_NAME}.pc.in ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY) ++ + message(STATUS "Building Configuration: ${CMAKE_BUILD_TYPE}") + + # Packaging +@@ -86,3 +93,11 @@ install(CODE " + endif() + ") + ++install(DIRECTORY DESTINATION ${DEFAULT_PKGCONFIG_PATH}) ++install(CODE " ++ if(NOT EXISTS ${DEFAULT_PKGCONFIG_PATH}/${PROJECT_NAME}.pc) ++ file(INSTALL ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc ++ DESTINATION ${DEFAULT_PKGCONFIG_PATH}) ++ endif() ++ ") ++ +diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt +index 88533f1..d4749ec 100644 +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -128,3 +128,7 @@ endif() + if(DEFAULT_LIB_PATH) + install(TARGETS ${PROJECT_NAME} DESTINATION ${DEFAULT_LIB_PATH}) + endif() ++ ++if(DEFAULT_INCLUDE_PATH) ++install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DESTINATION "${DEFAULT_INCLUDE_PATH}" FILES_MATCHING PATTERN "*.h") ++endif() +diff --git a/lib/cryptoauthlib.pc.in b/lib/cryptoauthlib.pc.in +new file mode 100644 +index 0000000..e682913 +--- /dev/null ++++ b/lib/cryptoauthlib.pc.in +@@ -0,0 +1,11 @@ ++prefix=/usr ++exec_prefix=${prefix} ++libdir=@CMAKE_INSTALL_FULL_LIBDIR@ ++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ ++ ++Name: @PROJECT_NAME@ ++Description: Atmel Cryptochip library for ATECC508A ++Version: @VERSION@ ++ ++Libs: -L${libdir} -lcryptoauth ++Cflags: -I${includedir} -I${includedir}/@PROJECT_NAME@ diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb index 1ba3edc2b..d1b361806 100644 --- a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb +++ b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb @@ -1,21 +1,20 @@ -# Copyright (C) 2017, 2018 Digi International Inc. +# Copyright (C) 2017-2019 Digi International Inc. SUMMARY = "Microchip CryptoAuthentication Library" SECTION = "libs" LICENSE = "MICROCHIP_CRYPTOAUTHLIB_LICENSE" -LIC_FILES_CHKSUM = "file://license.txt;endline=19;md5=5bcd26c644867b127c2cce82960fae7b" +LIC_FILES_CHKSUM = "file://license.txt;md5=84f2905dc39d2f8cdffb00af6f9e6d4e" -SRCBRANCH = "master" -SRCREV = "c6da3358a102c10d954372598c6efef8ad84c9ee" +SRCREV = "a0007d2f6c42fddab5dca1575e0f404788829ddc" GIT_URI ?= "git://github.com/MicrochipTech/cryptoauthlib.git;protocol=https" SRC_URI = " \ ${GIT_URI};nobranch=1 \ - file://0001-Port-changes-from-the-cryptoauth-engine-repo-to-the-.patch \ - file://0002-Remove-unused-HAL-implementations.patch \ - file://0003-Build-cryptochip-cmd-processor-application-along-wit.patch \ - file://0004-Remove-unnecessary-code-from-cryptochip-cmd-processo.patch \ + file://0001-lib-add-parameters-to-be-able-to-modify-default-I2C-.patch \ + file://0002-lib-apply-library-version-number-to-CMake-VERSION-pr.patch \ + file://0003-pkcs11-rename-template-configuration-file-to-its-int.patch \ + file://0004-lib-install-pkg-config-file-and-header-files.patch \ " S = "${WORKDIR}/git" @@ -27,17 +26,16 @@ I2C_BUS_ccimx8x = "0" I2C_SPEED ?= "100000" -CFLAGS += "-DATCA_HAL_I2C_BUS=${I2C_BUS} -DATCA_HAL_I2C_SPEED=${I2C_SPEED}" +EXTRA_OECMAKE += "-DATCA_HAL_I2C_BUS=${I2C_BUS} -DATCA_HAL_I2C_SPEED=${I2C_SPEED}" -do_patch[prefuncs] = "change_line_endings" +inherit cmake -change_line_endings() { - find ${S} -type f -name '*.[ch]' -print0 | xargs -0 sed -i -e 's/\r//g' +do_install_append() { + # Rename the folder containing the header files to be more package-specific + mv ${D}${includedir}/lib ${D}${includedir}/cryptoauthlib } -do_install() { - oe_runmake DESTDIR=${D} install -} +RDEPENDS_${PN} = "libp11" PACKAGE_ARCH = "${MACHINE_ARCH}" COMPATIBLE_MACHINE = "(ccimx6qpsbc|ccimx6ul|ccimx8x)"