123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /*
- * Copyright (c) 2021 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
- #ifndef HPM_BKEY_DRV_H
- #define HPM_BKEY_DRV_H
- #include "hpm_common.h"
- #include "hpm_bkey_regs.h"
- /**
- *
- * @brief BKEY driver APIs
- * @defgroup bkey_interface BKEY driver APIs
- * @ingroup io_interfaces
- * @{
- */
- /**
- * @brief Lock type
- */
- typedef enum bkey_lock_type {
- bkey_lock_write = BKEY_ECC_WLOCK_MASK,
- bkey_lock_read = BKEY_ECC_RLOCK_MASK,
- bkey_lock_both = BKEY_ECC_RLOCK_MASK | BKEY_ECC_WLOCK_MASK,
- } bkey_lock_type_t;
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * @brief bkey set key content
- *
- * Program key content
- *
- * @param[in] ptr BKEY base address
- * @param[in] key Key index
- * @param[in] start Key content data start index
- * @param[in] data pointer of actual data to be programmed
- * @param[in] size data total size in 32-bit
- */
- static inline void bkey_set_key_data(BKEY_Type *ptr, uint8_t key, uint8_t start, uint32_t *data, uint8_t size)
- {
- for (uint8_t i = 0; i < size; i++) {
- ptr->KEY[key].DATA[start + i] = *(data + i);
- }
- }
- /**
- * @brief bkey fetch key content
- *
- * Fetch key content
- *
- * @param[in] ptr BKEY base address
- * @param[in] key key index
- * @param[in] start key content data start index
- * @param[in] data pointer of buffer to received key content
- * @param[in] size data total size in 32-bit
- */
- static inline void bkey_get_key_data(BKEY_Type *ptr, uint8_t key, uint8_t start, uint32_t *data, uint8_t size)
- {
- for (uint8_t i = 0; i < size; i++) {
- *(data + i) = ptr->KEY[key].DATA[start + i];
- }
- }
- /**
- * @brief bkey lock key
- *
- * Feed correct ecc data of current key content and lock it
- *
- * @param[in] ptr BKEY base address
- * @param[in] key key index
- * @param[in] lock lock type
- * @param[in] ecc ecc value of current key content
- */
- static inline void bkey_lock(BKEY_Type *ptr, uint8_t key, bkey_lock_type_t lock, uint16_t ecc)
- {
- ptr->ECC[key] = BKEY_ECC_ECC_SET(ecc) | lock;
- }
- /**
- * @brief bkey select key
- *
- * Select which key to use
- *
- * @param[in] ptr BKEY base address
- * @param[in] key key index
- * @arg 0 select key0 in secure mode, key1 in non-secure mode
- * @arg 1 select key1 in secure or non-secure mode
- */
- static inline void bkey_select_key(BKEY_Type *ptr, uint8_t key)
- {
- ptr->SELECT = BKEY_SELECT_SELECT_SET(key);
- }
- #ifdef __cplusplus
- }
- #endif
- /**
- * @}
- */
- #endif /* HPM_BKEY_DRV_H */
|