mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
340 lines
10 KiB
C
340 lines
10 KiB
C
/**
|
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** Group: Memory data */
|
|
|
|
/** Group: Clock gate register */
|
|
/** Type of clk register
|
|
* Key Manager clock gate control register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** clk_en : R/W; bitpos: [0]; default: 1;
|
|
* Write 1 to force on register clock gate.
|
|
*/
|
|
uint32_t clk_en:1;
|
|
/** mem_cg_force_on : R/W; bitpos: [1]; default: 0;
|
|
* Write 1 to force on memory clock gate.
|
|
*/
|
|
uint32_t mem_cg_force_on:1;
|
|
uint32_t reserved_2:30;
|
|
};
|
|
uint32_t val;
|
|
} keymng_clk_reg_t;
|
|
|
|
|
|
/** Group: Interrupt registers */
|
|
/** Type of int_raw register
|
|
* Key Manager interrupt raw register, valid in level.
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** prep_done_int_raw : RO/WTC/SS; bitpos: [0]; default: 0;
|
|
* The raw interrupt status bit for the km_prep_done_int interrupt
|
|
*/
|
|
uint32_t prep_done_int_raw:1;
|
|
/** proc_done_int_raw : RO/WTC/SS; bitpos: [1]; default: 0;
|
|
* The raw interrupt status bit for the km_proc_done_int interrupt
|
|
*/
|
|
uint32_t proc_done_int_raw:1;
|
|
/** post_done_int_raw : RO/WTC/SS; bitpos: [2]; default: 0;
|
|
* The raw interrupt status bit for the km_post_done_int interrupt
|
|
*/
|
|
uint32_t post_done_int_raw:1;
|
|
uint32_t reserved_3:29;
|
|
};
|
|
uint32_t val;
|
|
} keymng_int_raw_reg_t;
|
|
|
|
/** Type of int_st register
|
|
* Key Manager interrupt status register.
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** prep_done_int_st : RO; bitpos: [0]; default: 0;
|
|
* The masked interrupt status bit for the km_prep_done_int interrupt
|
|
*/
|
|
uint32_t prep_done_int_st:1;
|
|
/** proc_done_int_st : RO; bitpos: [1]; default: 0;
|
|
* The masked interrupt status bit for the km_proc_done_int interrupt
|
|
*/
|
|
uint32_t proc_done_int_st:1;
|
|
/** post_done_int_st : RO; bitpos: [2]; default: 0;
|
|
* The masked interrupt status bit for the km_post_done_int interrupt
|
|
*/
|
|
uint32_t post_done_int_st:1;
|
|
uint32_t reserved_3:29;
|
|
};
|
|
uint32_t val;
|
|
} keymng_int_st_reg_t;
|
|
|
|
/** Type of int_ena register
|
|
* Key Manager interrupt enable register.
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** prep_done_int_ena : R/W; bitpos: [0]; default: 0;
|
|
* The interrupt enable bit for the km_prep_done_int interrupt
|
|
*/
|
|
uint32_t prep_done_int_ena:1;
|
|
/** proc_done_int_ena : R/W; bitpos: [1]; default: 0;
|
|
* The interrupt enable bit for the km_proc_done_int interrupt
|
|
*/
|
|
uint32_t proc_done_int_ena:1;
|
|
/** post_done_int_ena : R/W; bitpos: [2]; default: 0;
|
|
* The interrupt enable bit for the km_post_done_int interrupt
|
|
*/
|
|
uint32_t post_done_int_ena:1;
|
|
uint32_t reserved_3:29;
|
|
};
|
|
uint32_t val;
|
|
} keymng_int_ena_reg_t;
|
|
|
|
/** Type of int_clr register
|
|
* Key Manager interrupt clear register.
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** prep_done_int_clr : WT; bitpos: [0]; default: 0;
|
|
* Set this bit to clear the km_prep_done_int interrupt
|
|
*/
|
|
uint32_t prep_done_int_clr:1;
|
|
/** proc_done_int_clr : WT; bitpos: [1]; default: 0;
|
|
* Set this bit to clear the km_proc_done_int interrupt
|
|
*/
|
|
uint32_t proc_done_int_clr:1;
|
|
/** post_done_int_clr : WT; bitpos: [2]; default: 0;
|
|
* Set this bit to clear the km_post_done_int interrupt
|
|
*/
|
|
uint32_t post_done_int_clr:1;
|
|
uint32_t reserved_3:29;
|
|
};
|
|
uint32_t val;
|
|
} keymng_int_clr_reg_t;
|
|
|
|
|
|
/** Group: Static configuration registers */
|
|
/** Type of static register
|
|
* Key Manager static configuration register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** use_efuse_key : R/W; bitpos: [1:0]; default: 0;
|
|
* Set each bit to choose efuse key instead of key manager deployed key. Each bit
|
|
* stands for a key type: bit 1 for xts_key; bit 0 for ecdsa_key
|
|
*/
|
|
uint32_t use_efuse_key:2;
|
|
uint32_t reserved_2:2;
|
|
/** rnd_switch_cycle : R/W; bitpos: [8:4]; default: 15;
|
|
* The core clock cycle number to sample one rng input data. Please set it bigger than
|
|
* the clock cycle ratio: T_rng/T_km
|
|
*/
|
|
uint32_t rnd_switch_cycle:5;
|
|
/** use_sw_init_key : R/W; bitpos: [9]; default: 0;
|
|
* Set this bit to use software written init key instead of efuse_init_key.
|
|
*/
|
|
uint32_t use_sw_init_key:1;
|
|
/** xts_aes_key_len : R/W; bitpos: [10]; default: 0;
|
|
* Set this bit to choose using xts-aes-256 or xts-aes-128. 1: use xts-aes-256. 0: use
|
|
* xts-aes-128.
|
|
*/
|
|
uint32_t xts_aes_key_len:1;
|
|
uint32_t reserved_11:21;
|
|
};
|
|
uint32_t val;
|
|
} keymng_static_reg_t;
|
|
|
|
/** Type of lock register
|
|
* Key Manager static configuration locker register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** use_efuse_key_lock : R/W1; bitpos: [1:0]; default: 0;
|
|
* Write 1 to lock reg_use_efuse_key. Each bit locks the corresponding bit of
|
|
* reg_use_efuse_key.
|
|
*/
|
|
uint32_t use_efuse_key_lock:2;
|
|
uint32_t reserved_2:2;
|
|
/** rnd_switch_cycle_lock : R/W1; bitpos: [4]; default: 0;
|
|
* Write 1 to lock reg_rnd_switch_cycle.
|
|
*/
|
|
uint32_t rnd_switch_cycle_lock:1;
|
|
/** use_sw_init_key_lock : R/W1; bitpos: [5]; default: 0;
|
|
* Write 1 to lock reg_use_sw_init_key.
|
|
*/
|
|
uint32_t use_sw_init_key_lock:1;
|
|
/** xts_aes_key_len_lock : R/W1; bitpos: [6]; default: 0;
|
|
* Write 1 to lock reg_xts_aes_key_len.
|
|
*/
|
|
uint32_t xts_aes_key_len_lock:1;
|
|
uint32_t reserved_7:25;
|
|
};
|
|
uint32_t val;
|
|
} keymng_lock_reg_t;
|
|
|
|
|
|
/** Group: Configuration registers */
|
|
/** Type of conf register
|
|
* Key Manager configuration register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** kgen_mode : R/W; bitpos: [2:0]; default: 0;
|
|
* Set this field to choose the key generator deployment mode. 0: random mode. 1: AES
|
|
* mode. 2: ECDH0 mode. 3: ECDH1 mode. 4: recover mode. 5: export mode. 6-7: reserved.
|
|
*/
|
|
uint32_t kgen_mode:3;
|
|
/** key_purpose : R/W; bitpos: [6:3]; default: 0;
|
|
* Set this field to choose the key purpose. 1: ecdsa_key 2: xts_256_1_key. 3:
|
|
* xts_256_2_key. 4. xts_128_key. others: reserved.
|
|
*/
|
|
uint32_t key_purpose:4;
|
|
uint32_t reserved_7:25;
|
|
};
|
|
uint32_t val;
|
|
} keymng_conf_reg_t;
|
|
|
|
|
|
/** Group: Control registers */
|
|
/** Type of start register
|
|
* Key Manager control register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** start : WT; bitpos: [0]; default: 0;
|
|
* Write 1 to continue Key Manager operation at LOAD/GAIN state.
|
|
*/
|
|
uint32_t start:1;
|
|
/** continue : WT; bitpos: [1]; default: 0;
|
|
* Write 1 to start Key Manager at IDLE state.
|
|
*/
|
|
uint32_t conti:1;
|
|
uint32_t reserved_2:30;
|
|
};
|
|
uint32_t val;
|
|
} keymng_start_reg_t;
|
|
|
|
|
|
/** Group: State registers */
|
|
/** Type of state register
|
|
* Key Manager state register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** state : RO; bitpos: [1:0]; default: 0;
|
|
* The state of Key Manager. 0: IDLE. 1: LOAD. 2: GAIN. 3: BUSY.
|
|
*/
|
|
uint32_t state:2;
|
|
uint32_t reserved_2:30;
|
|
};
|
|
uint32_t val;
|
|
} keymng_state_reg_t;
|
|
|
|
|
|
/** Group: Result registers */
|
|
/** Type of result register
|
|
* Key Manager operation result register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** proc_result : RO/SS; bitpos: [0]; default: 0;
|
|
* The procedure result bit of Key Manager, only valid when Key Manager procedure is
|
|
* done. 1: Key Manager procedure succeeded. 0: Key Manager procedure failed.
|
|
*/
|
|
uint32_t proc_result:1;
|
|
uint32_t reserved_1:31;
|
|
};
|
|
uint32_t val;
|
|
} keymng_result_reg_t;
|
|
|
|
/** Type of key_vld register
|
|
* Key Manager key status register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** key_ecdsa_vld : RO; bitpos: [0]; default: 0;
|
|
* The status bit for key_ecdsa. 1: The key has been deployed correctly. 0: The key
|
|
* has not been deployed yet.
|
|
*/
|
|
uint32_t key_ecdsa_vld:1;
|
|
/** key_xts_vld : RO; bitpos: [1]; default: 0;
|
|
* The status bit for key_xts. 1: The key has been deployed correctly. 0: The
|
|
* key has not been deployed yet.
|
|
*/
|
|
uint32_t key_xts_vld:1;
|
|
uint32_t reserved_2:30;
|
|
};
|
|
uint32_t val;
|
|
} keymng_key_vld_reg_t;
|
|
|
|
/** Type of huk_vld register
|
|
* Key Manager HUK status register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** huk_valid : RO; bitpos: [0]; default: 0;
|
|
* The HUK status. 0: HUK is not valid. 1: HUK is valid.
|
|
*/
|
|
uint32_t huk_valid:1;
|
|
uint32_t reserved_1:31;
|
|
};
|
|
uint32_t val;
|
|
} keymng_huk_vld_reg_t;
|
|
|
|
|
|
/** Group: Version register */
|
|
/** Type of date register
|
|
* Version control register
|
|
*/
|
|
typedef union {
|
|
struct {
|
|
/** date : R/W; bitpos: [27:0]; default: 36720704;
|
|
* Key Manager version control register.
|
|
*/
|
|
uint32_t date:28;
|
|
uint32_t reserved_28:4;
|
|
};
|
|
uint32_t val;
|
|
} keymng_date_reg_t;
|
|
|
|
|
|
typedef struct {
|
|
uint32_t reserved_000;
|
|
volatile keymng_clk_reg_t clk;
|
|
volatile keymng_int_raw_reg_t int_raw;
|
|
volatile keymng_int_st_reg_t int_st;
|
|
volatile keymng_int_ena_reg_t int_ena;
|
|
volatile keymng_int_clr_reg_t int_clr;
|
|
volatile keymng_static_reg_t static_conf;
|
|
volatile keymng_lock_reg_t lock;
|
|
volatile keymng_conf_reg_t conf;
|
|
volatile keymng_start_reg_t start;
|
|
volatile keymng_state_reg_t state;
|
|
volatile keymng_result_reg_t result;
|
|
volatile keymng_key_vld_reg_t key_vld;
|
|
volatile keymng_huk_vld_reg_t huk_vld;
|
|
uint32_t reserved_038[49];
|
|
volatile keymng_date_reg_t date;
|
|
volatile uint32_t assist_info[16];
|
|
volatile uint32_t public_info[16];
|
|
volatile uint32_t sw_init_key[8];
|
|
} keymng_dev_t;
|
|
|
|
|
|
#ifndef __cplusplus
|
|
_Static_assert(sizeof(keymng_dev_t) == 0x1a0, "Invalid size of keymng_dev_t structure");
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|