aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hc32f460/driver/inc/hc32f460_mpu.h
blob: 6657571ed5f21301c72f0bcea956c88cf59be491 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
/*******************************************************************************
 * Copyright (C) 2020, Huada Semiconductor Co., Ltd. All rights reserved.
 *
 * This software component is licensed by HDSC under BSD 3-Clause license
 * (the "License"); You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                    opensource.org/licenses/BSD-3-Clause
 */
/******************************************************************************/
/** \file hc32f460_mpu.h
 **
 ** A detailed description is available at
 ** @link MpuGroup MPU description @endlink
 **
 **   - 2018-10-20 CDT First version for Device Driver Library of MPU.
 **
 ******************************************************************************/
#ifndef __HC32F460_MPU_H__
#define __HC32F460_MPU_H__

/*******************************************************************************
 * Include files
 ******************************************************************************/
#include "hc32_common.h"

/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif

/**
 *******************************************************************************
 ** \defgroup MpuGroup Memory Protection Unit(MPU)
 **
 ******************************************************************************/
//@{

/*******************************************************************************
 * Global type definitions ('typedef')
 ******************************************************************************/
/**
 *******************************************************************************
 ** \brief MPU region number enumeration
 **
 ******************************************************************************/
typedef enum en_mpu_region_num
{
    MpuRegionNum0  = 0u,                    ///< MPU region number 0
    MpuRegionNum1  = 1u,                    ///< MPU region number 1
    MpuRegionNum2  = 2u,                    ///< MPU region number 2
    MpuRegionNum3  = 3u,                    ///< MPU region number 3
    MpuRegionNum4  = 4u,                    ///< MPU region number 4
    MpuRegionNum5  = 5u,                    ///< MPU region number 5
    MpuRegionNum6  = 6u,                    ///< MPU region number 6
    MpuRegionNum7  = 7u,                    ///< MPU region number 7
    MpuRegionNum8  = 8u,                    ///< MPU region number 8
    MpuRegionNum9  = 9u,                    ///< MPU region number 9
    MpuRegionNum10 = 10u,                   ///< MPU region number 10
    MpuRegionNum11 = 11u,                   ///< MPU region number 11
    MpuRegionNum12 = 12u,                   ///< MPU region number 12
    MpuRegionNum13 = 13u,                   ///< MPU region number 13
    MpuRegionNum14 = 14u,                   ///< MPU region number 14
    MpuRegionNum15 = 15u,                   ///< MPU region number 15
} en_mpu_region_num_t;

/**
 *******************************************************************************
 ** \brief MPU region size enumeration
 **
 ******************************************************************************/
typedef enum en_mpu_region_size
{
    MpuRegionSize32Byte   = 4u,             ///< 32 Byte
    MpuRegionSize64Byte   = 5u,             ///< 64 Byte
    MpuRegionSize128Byte  = 6u,             ///< 126 Byte
    MpuRegionSize256Byte  = 7u,             ///< 256 Byte
    MpuRegionSize512Byte  = 8u,             ///< 512 Byte
    MpuRegionSize1KByte   = 9u,             ///< 1K Byte
    MpuRegionSize2KByte   = 10u,            ///< 2K Byte
    MpuRegionSize4KByte   = 11u,            ///< 4K Byte
    MpuRegionSize8KByte   = 12u,            ///< 8K Byte
    MpuRegionSize16KByte  = 13u,            ///< 16K Byte
    MpuRegionSize32KByte  = 14u,            ///< 32K Byte
    MpuRegionSize64KByte  = 15u,            ///< 64K Byte
    MpuRegionSize128KByte = 16u,            ///< 128K Byte
    MpuRegionSize256KByte = 17u,            ///< 256K Byte
    MpuRegionSize512KByte = 18u,            ///< 512K Byte
    MpuRegionSize1MByte   = 19u,            ///< 1M Byte
    MpuRegionSize2MByte   = 20u,            ///< 2M Byte
    MpuRegionSize4MByte   = 21u,            ///< 4M Byte
    MpuRegionSize8MByte   = 22u,            ///< 8M Byte
    MpuRegionSize16MByte  = 23u,            ///< 16M Byte
    MpuRegionSize32MByte  = 24u,            ///< 32M Byte
    MpuRegionSize64MByte  = 25u,            ///< 64M Byte
    MpuRegionSize128MByte = 26u,            ///< 128M Byte
    MpuRegionSize256MByte = 27u,            ///< 256M Byte
    MpuRegionSize512MByte = 28u,            ///< 512M Byte
    MpuRegionSize1GByte   = 29u,            ///< 1G Byte
    MpuRegionSize2GByte   = 30u,            ///< 2G Byte
    MpuRegionSize4GByte   = 31u,            ///< 4G Byte
}  en_mpu_region_size_t;

/**
 *******************************************************************************
 ** \brief MPU region enumeration
 **
 ******************************************************************************/
typedef enum en_mpu_region_type
{
    SMPU1Region = 0u,                       ///< System DMA_1 MPU
    SMPU2Region = 1u,                       ///< System DMA_2 MPU
    FMPURegion  = 2u,                       ///< System USBFS_DMA MPU
} en_mpu_region_type_t;

/**
 *******************************************************************************
 ** \brief MPU action selection enumeration
 **
 ******************************************************************************/
typedef enum en_mpu_action_sel
{
    MpuNoneAction   = 0u,                   ///< MPU don't action.
    MpuTrigBusError = 1u,                   ///< MPU trigger bus error
    MpuTrigNmi      = 2u,                   ///< MPU trigger bus NMI interrupt
    MpuTrigReset    = 3u,                   ///< MPU trigger reset
} en_mpu_action_sel_t;

/**
 *******************************************************************************
 ** \brief MPU IP protection mode enumeration
 **
 ******************************************************************************/
typedef enum en_mpu_ip_prot_mode
{
    AesReadProt     = (1ul << 0),           ///< AES read protection
    AesWriteProt    = (1ul << 1),           ///< AES write protection
    HashReadProt    = (1ul << 2),           ///< HASH read protection
    HashWriteProt   = (1ul << 3),           ///< HASH write protection
    TrngReadProt    = (1ul << 4),           ///< TRNG read protection
    TrngWriteProt   = (1ul << 5),           ///< TRNG write protection
    CrcReadProt     = (1ul << 6),           ///< CRC read protection
    CrcWriteProt    = (1ul << 7),           ///< CRC write protection
    FmcReadProt     = (1ul << 8),           ///< FMC read protection
    FmcWriteProt    = (1ul << 9),           ///< FMC write protection
    WdtReadProt     = (1ul << 12),          ///< WDT read protection
    WdtWriteProt    = (1ul << 13),          ///< WDT write protection
    SwdtReadProt    = (1ul << 14),          ///< WDT read protection
    SwdtWriteProt   = (1ul << 15),          ///< WDT write protection
    BksramReadProt  = (1ul << 16),          ///< BKSRAM read protection
    BksramWriteProt = (1ul << 17),          ///< BKSRAM write protection
    RtcReadProt     = (1ul << 18),          ///< RTC read protection
    RtcWriteProt    = (1ul << 19),          ///< RTC write protection
    DmpuReadProt    = (1ul << 20),          ///< DMPU read protection
    DmpuWriteProt   = (1ul << 21),          ///< DMPU write protection
    SramcReadProt   = (1ul << 22),          ///< SRAMC read protection
    SramcWriteProt  = (1ul << 23),          ///< SRAMC write protection
    IntcReadProt    = (1ul << 24),          ///< INTC read protection
    IntcWriteProt   = (1ul << 25),          ///< INTC write protection
    SyscReadProt    = (1ul << 26),          ///< SYSC read protection
    SyscWriteProt   = (1ul << 27),          ///< SYSC write protection
    MstpReadProt    = (1ul << 28),          ///< MSTP read protection
    MstpWriteProt   = (1ul << 29),          ///< MSTP write protection
    BusErrProt      = (1ul << 31),          ///< BUSERR write protection
} en_mpu_ip_prot_mode_t;

/**
 *******************************************************************************
 ** \brief MPU protection region permission
 **
 ******************************************************************************/
typedef struct stc_mpu_prot_region_permission
{
    en_mpu_action_sel_t   enAction;         ///< Specifies MPU action

    en_functional_state_t enRegionEnable;   ///< Disable: Disable region protection; Enable:Enable region protection

    en_functional_state_t enWriteEnable;    ///< Disable: Prohibited to write; Enable:permitted to write

    en_functional_state_t enReadEnable;     ///< Disable: Prohibited to read; Enable:permitted to read

} stc_mpu_prot_region_permission_t;

/**
 *******************************************************************************
 ** \brief MPU background region permission
 **
 ******************************************************************************/
typedef struct stc_mpu_bkgd_region_permission
{
    en_functional_state_t enWriteEnable;    ///< Disable: Prohibited to write; Enable:permitted to write

    en_functional_state_t enReadEnable;     ///< Disable: Prohibited to read; Enable:permitted to read
} stc_mpu_bkgd_region_permission_t_t;

/**
 *******************************************************************************
 ** \brief MPU background region initialization configuration
 **
 ******************************************************************************/
typedef struct stc_mpu_bkgd_region_init
{
    stc_mpu_bkgd_region_permission_t_t stcSMPU1BkgdPermission;      ///< Specifies SMPU1 background permission and this stuctrue detail refer of @ref stc_mpu_bkgd_region_permission_t_t

    stc_mpu_bkgd_region_permission_t_t stcSMPU2BkgdPermission;      ///< Specifies SMPU2 background permission and this stuctrue detail refer @ref stc_mpu_bkgd_region_permission_t_t

    stc_mpu_bkgd_region_permission_t_t stcFMPUBkgdPermission;       ///< Specifies FMPU background permission and this stuctrue detail refer @ref stc_mpu_bkgd_region_permission_t_t
} stc_mpu_bkgd_region_init_t;

/**
 *******************************************************************************
 ** \brief MPU protect region initialization configuration
 **
 ******************************************************************************/
typedef struct stc_mpu_prot_region_init
{
    uint32_t                         u32RegionBaseAddress;  ///< Specifies region base address

    en_mpu_region_size_t             enRegionSize;          ///< Specifies region size and This parameter can be a value of @ref en_mpu_region_size_t

    stc_mpu_prot_region_permission_t stcSMPU1Permission;    ///< Specifies DMA1 MPU region permission and this structure detail refer @ref stc_mpu_prot_region_permission_t

    stc_mpu_prot_region_permission_t stcSMPU2Permission;    ///< Specifies DMA2 MPU region permission and this structure detail refer @ref stc_mpu_prot_region_permission_t

    stc_mpu_prot_region_permission_t stcFMPUPermission;     ///< Specifies USBFS-DMA MPU region permission and this structure detail refer @ref stc_mpu_prot_region_permission_t
} stc_mpu_prot_region_init_t;

/*******************************************************************************
 * Global pre-processor symbols/macros ('#define')
 ******************************************************************************/

/*******************************************************************************
 * Global variable definitions ('extern')
 ******************************************************************************/

/*******************************************************************************
 * Global function prototypes (definition in C source)
 ******************************************************************************/
en_result_t MPU_ProtRegionInit(en_mpu_region_num_t enRegionNum,
                                const stc_mpu_prot_region_init_t *pstcInitCfg);
en_result_t MPU_BkgdRegionInit(const stc_mpu_bkgd_region_init_t *pstcInitCfg);
en_result_t MPU_SetRegionSize(en_mpu_region_num_t enRegionNum,
                                en_mpu_region_size_t enRegionSize);
en_mpu_region_size_t MPU_GetRegionSize(en_mpu_region_num_t enRegionNum);
en_result_t MPU_SetRegionBaseAddress(en_mpu_region_num_t enRegionNum,
                                uint32_t u32RegionBaseAddr);
uint32_t MPU_GetRegionBaseAddress(en_mpu_region_num_t enRegionNum);
en_result_t MPU_SetNoPermissionAcessAction(en_mpu_region_type_t enMpuRegionType,
                                en_mpu_action_sel_t enActionSel);
en_mpu_action_sel_t MPU_GetNoPermissionAcessAction(en_mpu_region_type_t enMpuRegionType);
en_result_t MPU_ProtRegionCmd(en_mpu_region_num_t enRegionNum,
                                en_mpu_region_type_t enMpuRegionType,
                                en_functional_state_t enState);
en_result_t MPU_RegionTypeCmd(en_mpu_region_type_t enMpuRegionType,
                                en_functional_state_t enState);
en_flag_status_t MPU_GetStatus(en_mpu_region_type_t enMpuRegionType);
en_result_t MPU_ClearStatus(en_mpu_region_type_t enMpuRegionType);
en_result_t MPU_SetProtRegionReadPermission(en_mpu_region_num_t enRegionNum,
                                en_mpu_region_type_t enMpuRegionType,
                                en_functional_state_t enState);
en_functional_state_t MPU_GetProtRegionReadPermission(en_mpu_region_num_t enRegionNum,
                                en_mpu_region_type_t enMpuRegionType);
en_result_t MPU_SetProtRegionWritePermission(en_mpu_region_num_t enRegionNum,
                                en_mpu_region_type_t enMpuRegionType,
                                en_functional_state_t enState);
en_functional_state_t MPU_GetProtRegionWritePermission(en_mpu_region_num_t enRegionNum,
                                en_mpu_region_type_t enMpuRegionType);
en_result_t MPU_SetBkgdRegionReadPermission(en_mpu_region_type_t enMpuRegionType,
                                en_functional_state_t enState);
en_functional_state_t MPU_GetBkgdRegionReadPermission(en_mpu_region_type_t enMpuRegionType);
en_result_t MPU_SetBkgdRegionWritePermission(en_mpu_region_type_t enMpuRegionType,
                                en_functional_state_t enState);
en_functional_state_t MPU_GetBkgdRegionWritePermission(en_mpu_region_type_t enMpuRegionType);
en_result_t MPU_WriteProtCmd(en_functional_state_t enState);
en_result_t MPU_IpProtCmd(uint32_t u32ProtMode,
                                en_functional_state_t enState);

//@} // MpuGroup

#ifdef __cplusplus
}
#endif

#endif /* __HC32F460_MPU_H__ */

/*******************************************************************************
 * EOF (not truncated)
 ******************************************************************************/