forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-04-25 a12102b90bda2f409babc8c241bfc66118a8cb70
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
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
/**
  ******************************************************************************
  * @file    fm33a0xxev_aes.h
  * @author  FM33A0XXEV Application Team
  * @version V1.0.0
  * @date    16-April-2020
  * @brief   This file contains all the functions prototypes for the AES firmware library.  
  ******************************************************************************
  */
  
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __FM33A0XXEV_AES_H
#define __FM33A0XXEV_AES_H
 
 
#ifdef __cplusplus
 extern "C" {
#endif
 
/* Includes ------------------------------------------------------------------*/
 
#include "FM33A0XXEV.h" 
 
//------------------------------------------------------------------------------   
typedef struct
{
    uint32_t    KEYLEN;            //AES¼ÓÃÜÃÜÔ¿³¤¶È£¬AESEN=1ʱ²»¿ÉÐÞ¸Ä
    uint32_t    CHMOD;            //AESÊý¾ÝÁ÷´¦Àíģʽ£¬AESEN=1ʱ²»¿ÉÐÞ¸Ä
    uint32_t    MODE;            //AES¹¤×÷ģʽ£¬AESEN=1ʱ²»¿ÉÐÞ¸Ä
    uint32_t    DATATYP;        //Ñ¡ÔñÊý¾ÝÀàÐÍ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£¾ßÌå½»»»¹æÔò¿É²Î¿¼AESÊý¾ÝÀàÐÍÕ½ڠ   
    FunState    DMAOEN;            //DMAÊý¾Ý×Ô¶¯¶Á³öʹÄÜ
    FunState    DMAIEN;            //DMAÊý¾Ý×Ô¶¯Ð´ÈëʹÄÜ
    FunState    WERRIE;            //´íÎó±êÖ¾£¨WRERR£©ÖжÏʹÄÜ
    FunState    RERRIE;            //´íÎó±êÖ¾£¨RDERR£©ÖжÏʹÄÜ
    FunState    CCFIE;            //CCF±êÖ¾ÖжÏʹÄÜ
    FunState    AESEN;            //AESʹÄÜ 
    
}AES_InitTypeDef;
     
#define    AES_CR_KEYLEN_Pos    13    /* AES¼ÓÃÜÃÜÔ¿³¤¶È£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
(Key Length)
00£º128bit
01£º192bit
10£º256bit
11£º±£Áô */
#define    AES_CR_KEYLEN_Msk    (0x3U << AES_CR_KEYLEN_Pos)
#define    AES_CR_KEYLEN_128BIT    (0x0U << AES_CR_KEYLEN_Pos)    /* 128bit */
#define    AES_CR_KEYLEN_192BIT    (0x1U << AES_CR_KEYLEN_Pos)    /* 192bit */
#define    AES_CR_KEYLEN_256BIT    (0x2U << AES_CR_KEYLEN_Pos)    /* 256bit */
#define    AES_CR_KEYLEN_    (0x3U << AES_CR_KEYLEN_Pos)    /* ±£Áô */
 
#define    AES_CR_DMAOEN_Pos    12    /* DMAÊý¾Ý×Ô¶¯¶Á³öʹÄÜ
(DMA output enable)
0£º²»¿ªÆô
1£º¿ªÆô
¸ÃλÖÃλºóÔÚģʽ1£¬Ä£Ê½3ºÍģʽ4ÏÂAESÄ£¿é»á×Ô¶¯²úÉúAES->RAMµÄ´«ÊäÇëÇó¡£Ä£Ê½2ϲ»»á²úÉú¡£ */
#define    AES_CR_DMAOEN_Msk    (0x1U << AES_CR_DMAOEN_Pos)
 
 
#define    AES_CR_DMAIEN_Pos    11    /* ¿ªÆôDMAÊý¾Ý×Ô¶¯Ð´ÈëʹÄÜ
(DMA input enable)
0£º²»¿ªÆô
1£º¿ªÆô
¸ÃλÉèÖÃΪ1ºóÔÚģʽ1£¬Ä£Ê½3ºÍģʽ4ÒÔ¼°MultHģʽÏÂAESÄ£¿é»á×Ô¶¯²úÉúRAM->AESµÄ´«ÊäÇëÇó¡£Ä£Ê½2ϲ»»á²úÉú¡£ */
#define    AES_CR_DMAIEN_Msk    (0x1U << AES_CR_DMAIEN_Pos)
 
 
#define    AES_CR_CHMOD_Pos    5    /* AESÊý¾ÝÁ÷´¦Àíģʽ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
(Cipher Mode)
00£ºECB
01£ºCBC
10£ºCTR
11£ºÊ¹ÓÃMultHÄ£¿é */
#define    AES_CR_CHMOD_Msk    (0x3U << AES_CR_CHMOD_Pos)
#define    AES_CR_CHMOD_ECB    (0x0U << AES_CR_CHMOD_Pos)    /* ECB */
#define    AES_CR_CHMOD_CBC    (0x1U << AES_CR_CHMOD_Pos)    /* CBC */
#define    AES_CR_CHMOD_CTR    (0x2U << AES_CR_CHMOD_Pos)    /* CTR */
#define    AES_CR_CHMOD_MULTH    (0x3U << AES_CR_CHMOD_Pos)    /* Ê¹ÓÃMultHÄ£¿é */
 
#define    AES_CR_MODE_Pos    3    /* AES¹¤×÷ģʽ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
(operation MODE)
00£ºÄ£Ê½1£º¼ÓÃÜ
01£ºÄ£Ê½2£ºÃÜÔ¿À©Õ¹
10£ºÄ£Ê½3£º½âÃÜ
11£ºÄ£Ê½4£ºÃÜÔ¿À©Õ¹+½âÃÜ
CTRģʽÏÂÅäÖóÉģʽ4½«×Ô¶¯½øÈëCTRµÄ½âÃÜģʽ¡£¼´ÔÚCHMOD=2¡¯b10ʱÅäÖÃMODE=2¡¯b11£¬AES½«°´ÕÕMODE=2¡¯b10µÄÇéÐÎÖ´ÐС£ */
#define    AES_CR_MODE_Msk    (0x3U << AES_CR_MODE_Pos)
#define    AES_CR_MODE_ENCRYPT    (0x0U << AES_CR_MODE_Pos)    /* Ä£Ê½1 */
#define    AES_CR_MODE_KEYEXP    (0x1U << AES_CR_MODE_Pos)    /* Ä£Ê½2 */
#define    AES_CR_MODE_DECRYPT    (0x2U << AES_CR_MODE_Pos)    /* Ä£Ê½3 */
#define    AES_CR_MODE_KEYEXPDECRYPT    (0x3U << AES_CR_MODE_Pos)    /* Ä£Ê½4 */
 
#define    AES_CR_DATATYP_Pos    1    /* Ñ¡ÔñÊý¾ÝÀàÐÍ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£¾ßÌå½»»»¹æÔò¿É²Î¿¼AESÊý¾ÝÀàÐÍÕ½ڡ£
(Data type)
00£º32bitÊý¾Ý²»½»»»
01£º16bitÊý¾Ý°ë×Ö½»»»
10£º8bitÊý¾Ý×Ö½Ú½»»»
11£º1bitÊý¾Ý±ÈÌØ½»»» */
#define    AES_CR_DATATYP_Msk    (0x3U << AES_CR_DATATYP_Pos)
#define    AES_CR_DATATYP_32BITNOEX    (0x0U << AES_CR_DATATYP_Pos)    /* 32bitÊý¾Ý²»½»»» */
#define    AES_CR_DATATYP_16BITEX    (0x1U << AES_CR_DATATYP_Pos)    /* 16bitÊý¾Ý°ë×Ö½»»» */
#define    AES_CR_DATATYP_8BITEX    (0x2U << AES_CR_DATATYP_Pos)    /* 8bitÊý¾Ý×Ö½Ú½»»» */
#define    AES_CR_DATATYP_1BITEX    (0x3U << AES_CR_DATATYP_Pos)    /* 1bitÊý¾Ý±ÈÌØ½»»» */
 
#define    AES_CR_EN_Pos    0    /* AESʹÄÜ (AES enable)
0£º²»Ê¹ÄÜ
1£ºÊ¹ÄÜ
ÔÚÈκÎʱºòÇå³ýAESENλ¶¼Äܹ»¸´Î»AESÄ£¿é
ÔÚģʽ2ϸÃλ»áÔÚÒ»´Î¼ÆËãÍê³ÉºóÓ²¼þ×Ô¶¯Çå0 */
#define    AES_CR_EN_Msk    (0x1U << AES_CR_EN_Pos)
    /* ²»Ê¹ÄÜ */
    /* Ê¹ÄÜ */
 
#define    AES_IER_WRERR_IE_Pos    2    /* Ð´´íÎóÖжÏʹÄÜ£¬1ÓÐЧ¡£(Write Error interrupt enable) */
#define    AES_IER_WRERR_IE_Msk    (0x1U << AES_IER_WRERR_IE_Pos)
 
#define    AES_IER_RDERR_IE_Pos    1    /* ¶Á´íÎóÖжÏʹÄÜ£¬1ÓÐЧ¡£(Read Error interrupt enable) */
#define    AES_IER_RDERR_IE_Msk    (0x1U << AES_IER_RDERR_IE_Pos)
 
#define    AES_IER_CCF_IE_Pos    0    /* AES¼ÆËãÍê³ÉÖжÏʹÄÜ£¬1ÓÐЧ¡£(Cipher Complete Interrupt enable) */
#define    AES_IER_CCF_IE_Msk    (0x1U << AES_IER_CCF_IE_Pos)
 
#define    AES_DIR_DIN_Pos    0    /* Êý¾ÝÊäÈë¼Ä´æÆ÷£¬µ±AESÐèÒªÊäÈë¼Ó½âÃÜÊý¾Ýʱ£¬Ó¦¸ÃÍù¸Ã¼Ä´æÆ÷Á¬ÐøÐ´4´Î¡£(AES Data Input)
ģʽ1£¨¼ÓÃÜ£©£º°ÑÃ÷ÎÄ´ÓMSBµ½LSB·Ö4´ÎдÈë¡£
ģʽ2£¨ÃÜÔ¿À©Õ¹£©£ºÎÞÐèʹÓÃÊý¾ÝÊäÈë¼Ä´æÆ÷
ģʽ3ºÍģʽ4£¨½âÃÜ£©£º°ÑÃÜÎÄ´ÓMSBµ½LSB·Ö4´ÎдÈë¡£
MultHģʽ£º°Ñ³ËÊýA»òC´ÓMSBµ½LSB·Ö4´ÎдÈë¡£ */
#define    AES_DIR_DIN_Msk    (0xffffffffU << AES_DIR_DIN_Pos)
 
#define    AES_DOR_DOUT_Pos    0    /* Êý¾ÝÊä³ö¼Ä´æÆ÷£¬µ±AES¼ÆËãÍê³Éºó£¬¿ÉÒÔ·ÖËĴζÁ³ö¼Ó½âÃܵĽá¹û¡£(AES Data Output)
ģʽ1£¨¼ÓÃÜ£©£º°ÑÃÜÎÄ´ÓMSBµ½LSB·Ö4´Î¶Á³ö¡£
ģʽ2£¨ÃÜÔ¿À©Õ¹£©£ºÎÞÐèʹÓÃÊý¾ÝÊäÊä³ö¼Ä´æÆ÷
ģʽ3ºÍģʽ4£¨½âÃÜ£©£º°ÑÃ÷ÎÄ´ÓMSBµ½LSB·Ö4´ÎÊä³ö¡£
MultHģʽ£ºÔËËã½á¹û´æ´¢ÔÚIVR¼Ä´æÆ÷ÖУ¬ÎÞÐè¶ÁÈ¡AES_DOUTR¼Ä´æÆ÷¡£ */
#define    AES_DOR_DOUT_Msk    (0xffffffffU << AES_DOR_DOUT_Pos)
 
#define    AES_KEY0_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY0_KEYx_Msk    (0xffffffffU << AES_KEY0_KEYx_Pos)
 
#define    AES_KEY1_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY1_KEYx_Msk    (0xffffffffU << AES_KEY1_KEYx_Pos)
 
#define    AES_KEY2_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY2_KEYx_Msk    (0xffffffffU << AES_KEY2_KEYx_Pos)
 
#define    AES_KEY3_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY3_KEYx_Msk    (0xffffffffU << AES_KEY3_KEYx_Pos)
 
#define    AES_KEY4_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY4_KEYx_Msk    (0xffffffffU << AES_KEY4_KEYx_Pos)
 
#define    AES_KEY5_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY5_KEYx_Msk    (0xffffffffU << AES_KEY5_KEYx_Pos)
 
#define    AES_KEY6_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY6_KEYx_Msk    (0xffffffffU << AES_KEY6_KEYx_Pos)
 
#define    AES_KEY7_KEYx_Pos    0    /* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì */
#define    AES_KEY7_KEYx_Msk    (0xffffffffU << AES_KEY7_KEYx_Pos)
 
#define    AES_IVR0_IVRx_Pos    0    /* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) */
#define    AES_IVR0_IVRx_Msk    (0xffffffffU << AES_IVR0_IVRx_Pos)
 
#define    AES_IVR1_IVRx_Pos    0    /* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) */
#define    AES_IVR1_IVRx_Msk    (0xffffffffU << AES_IVR1_IVRx_Pos)
 
#define    AES_IVR2_IVRx_Pos    0    /* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) */
#define    AES_IVR2_IVRx_Msk    (0xffffffffU << AES_IVR2_IVRx_Pos)
 
#define    AES_IVR3_IVRx_Pos    0    /* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) */
#define    AES_IVR3_IVRx_Msk    (0xffffffffU << AES_IVR3_IVRx_Pos)
 
#define    AES_H0_Hx_Pos    0    /* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] */
#define    AES_H0_Hx_Msk    (0xffffffffU << AES_H0_Hx_Pos)
 
#define    AES_H1_Hx_Pos    0    /* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] */
#define    AES_H1_Hx_Msk    (0xffffffffU << AES_H1_Hx_Pos)
 
#define    AES_H2_Hx_Pos    0    /* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] */
#define    AES_H2_Hx_Msk    (0xffffffffU << AES_H2_Hx_Pos)
 
#define    AES_H3_Hx_Pos    0    /* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] */
#define    AES_H3_Hx_Msk    (0xffffffffU << AES_H3_Hx_Pos)
 
#define    AES_ISR_WRERR_Pos    2    /* Ð´´íÎó±êÖ¾£ºÔÚ¼ÆËã»òÊä³ö½×¶Î·¢Éúд²Ù×÷ʱÖÃ룬Èí¼þд1ÇåÁã */
#define    AES_ISR_WRERR_Msk    (0x1U << AES_ISR_WRERR_Pos)
 
#define    AES_ISR_RDERR_Pos    1    /* ¶Á´íÎó±êÖ¾£ºÔÚ¼ÆËã»òÊäÈë½×¶Î·¢Éú¶Á²Ù×÷ʱÖÃ룬Èí¼þд1ÇåÁã */
#define    AES_ISR_RDERR_Msk    (0x1U << AES_ISR_RDERR_Pos)
 
#define    AES_ISR_CCF_Pos    0    /* AES¼ÆËãÍê³É±êÖ¾£¬Èí¼þд1ÇåÁã
1£º¼ÆËãÍê³É
0£º¼ÆËãûÓÐÍê³É */
#define    AES_ISR_CCF_Msk    (0x1U << AES_ISR_CCF_Pos)
//Macro_End
 
/* Exported functions --------------------------------------------------------*/ 
extern void AES_Deinit(void);
 
/* AES¼ÓÃÜÃÜÔ¿³¤¶È£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
(Key Length)
00£º128bit
01£º192bit
10£º256bit
11£º±£Áô Ïà¹Øº¯Êý */
extern void AES_CR_KEYLEN_Set(uint32_t SetValue);
extern uint32_t AES_CR_KEYLEN_Get(void);
 
/* DMAÊý¾Ý×Ô¶¯¶Á³öʹÄÜ
(DMA output enable)
0£º²»¿ªÆô
1£º¿ªÆô
¸ÃλÖÃλºóÔÚģʽ1£¬Ä£Ê½3ºÍģʽ4ÏÂAESÄ£¿é»á×Ô¶¯²úÉúAES->RAMµÄ´«ÊäÇëÇó¡£Ä£Ê½2ϲ»»á²úÉú¡£ Ïà¹Øº¯Êý */
extern void AES_CR_DMAOEN_Setable(FunState NewState);
extern FunState AES_CR_DMAOEN_Getable(void);
 
 
/* ¿ªÆôDMAÊý¾Ý×Ô¶¯Ð´ÈëʹÄÜ
(DMA input enable)
0£º²»¿ªÆô
1£º¿ªÆô
¸ÃλÉèÖÃΪ1ºóÔÚģʽ1£¬Ä£Ê½3ºÍģʽ4ÒÔ¼°MultHģʽÏÂAESÄ£¿é»á×Ô¶¯²úÉúRAM->AESµÄ´«ÊäÇëÇó¡£Ä£Ê½2ϲ»»á²úÉú¡£ Ïà¹Øº¯Êý */
extern void AES_CR_DMAIEN_Setable(FunState NewState);
extern FunState FunStateAES_CR_DMAIEN_Getable(void);
 
/* AESÊý¾ÝÁ÷´¦Àíģʽ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
(Cipher Mode)
00£ºECB
01£ºCBC
10£ºCTR
11£ºÊ¹ÓÃMultHÄ£¿é Ïà¹Øº¯Êý */
extern void AES_CR_CHMOD_Set(uint32_t SetValue);
extern uint32_t AES_CR_CHMOD_Get(void);
 
/* AES¹¤×÷ģʽ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
(operation MODE)
00£ºÄ£Ê½1£º¼ÓÃÜ
01£ºÄ£Ê½2£ºÃÜÔ¿À©Õ¹
10£ºÄ£Ê½3£º½âÃÜ
11£ºÄ£Ê½4£ºÃÜÔ¿À©Õ¹+½âÃÜ
CTRģʽÏÂÅäÖóÉģʽ4½«×Ô¶¯½øÈëCTRµÄ½âÃÜģʽ¡£¼´ÔÚCHMOD=2¡¯b10ʱÅäÖÃMODE=2¡¯b11£¬AES½«°´ÕÕMODE=2¡¯b10µÄÇéÐÎÖ´ÐС£ Ïà¹Øº¯Êý */
extern void AES_CR_MODE_Set(uint32_t SetValue);
extern uint32_t AES_CR_MODE_Get(void);
 
/* Ñ¡ÔñÊý¾ÝÀàÐÍ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£¾ßÌå½»»»¹æÔò¿É²Î¿¼AESÊý¾ÝÀàÐÍÕ½ڡ£
(Data type)
00£º32bitÊý¾Ý²»½»»»
01£º16bitÊý¾Ý°ë×Ö½»»»
10£º8bitÊý¾Ý×Ö½Ú½»»»
11£º1bitÊý¾Ý±ÈÌØ½»»» Ïà¹Øº¯Êý */
extern void AES_CR_DATATYP_Set(uint32_t SetValue);
extern uint32_t AES_CR_DATATYP_Get(void);
 
/* AESʹÄÜ (AES enable)
0£º²»Ê¹ÄÜ
1£ºÊ¹ÄÜ
ÔÚÈκÎʱºòÇå³ýAESENλ¶¼Äܹ»¸´Î»AESÄ£¿é
ÔÚģʽ2ϸÃλ»áÔÚÒ»´Î¼ÆËãÍê³ÉºóÓ²¼þ×Ô¶¯Çå0 Ïà¹Øº¯Êý */
extern void AES_CR_EN_Setable(FunState NewState);
extern FunState AES_CR_EN_Getable(void);
 
/* Ð´´íÎóÖжÏʹÄÜ£¬1ÓÐЧ¡£(Write Error interrupt enable) Ïà¹Øº¯Êý */
extern void AES_IER_WRERR_IE_Setable(FunState NewState);
extern FunState AES_IER_WRERR_IE_Getable(void);
 
/* ¶Á´íÎóÖжÏʹÄÜ£¬1ÓÐЧ¡£(Read Error interrupt enable) Ïà¹Øº¯Êý */
extern void AES_IER_RDERR_IE_Setable(FunState NewState);
extern FunState AES_IER_RDERR_IE_Getable(void);
 
/* AES¼ÆËãÍê³ÉÖжÏʹÄÜ£¬1ÓÐЧ¡£(Cipher Complete Interrupt enable) Ïà¹Øº¯Êý */
extern void AES_IER_CCF_IE_Setable(FunState NewState);
extern FunState AES_IER_CCF_IE_Getable(void);
 
/* Êý¾ÝÊäÈë¼Ä´æÆ÷£¬µ±AESÐèÒªÊäÈë¼Ó½âÃÜÊý¾Ýʱ£¬Ó¦¸ÃÍù¸Ã¼Ä´æÆ÷Á¬ÐøÐ´4´Î¡£(AES Data Input)
ģʽ1£¨¼ÓÃÜ£©£º°ÑÃ÷ÎÄ´ÓMSBµ½LSB·Ö4´ÎдÈë¡£
ģʽ2£¨ÃÜÔ¿À©Õ¹£©£ºÎÞÐèʹÓÃÊý¾ÝÊäÈë¼Ä´æÆ÷
ģʽ3ºÍģʽ4£¨½âÃÜ£©£º°ÑÃÜÎÄ´ÓMSBµ½LSB·Ö4´ÎдÈë¡£
MultHģʽ£º°Ñ³ËÊýA»òC´ÓMSBµ½LSB·Ö4´ÎдÈë¡£ Ïà¹Øº¯Êý */
extern void AES_DIR_Write(uint32_t SetValue);
extern uint32_t AES_DIR_Read(void);
 
/* Êý¾ÝÊä³ö¼Ä´æÆ÷£¬µ±AES¼ÆËãÍê³Éºó£¬¿ÉÒÔ·ÖËĴζÁ³ö¼Ó½âÃܵĽá¹û¡£(AES Data Output)
ģʽ1£¨¼ÓÃÜ£©£º°ÑÃÜÎÄ´ÓMSBµ½LSB·Ö4´Î¶Á³ö¡£
ģʽ2£¨ÃÜÔ¿À©Õ¹£©£ºÎÞÐèʹÓÃÊý¾ÝÊäÊä³ö¼Ä´æÆ÷
ģʽ3ºÍģʽ4£¨½âÃÜ£©£º°ÑÃ÷ÎÄ´ÓMSBµ½LSB·Ö4´ÎÊä³ö¡£
MultHģʽ£ºÔËËã½á¹û´æ´¢ÔÚIVR¼Ä´æÆ÷ÖУ¬ÎÞÐè¶ÁÈ¡AES_DOUTR¼Ä´æÆ÷¡£ Ïà¹Øº¯Êý */
extern uint32_t AES_DOR_Read(void);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY0_Write(uint32_t SetValue);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY1_Write(uint32_t SetValue);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY2_Write(uint32_t SetValue);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY3_Write(uint32_t SetValue);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY4_Write(uint32_t SetValue);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY5_Write(uint32_t SetValue);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY6_Write(uint32_t SetValue);
 
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
extern void AES_KEY7_Write(uint32_t SetValue);
 
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
extern void AES_IVR0_Write(uint32_t SetValue);
extern uint32_t AES_IVR0_Read(void);
 
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
extern void AES_IVR1_Write(uint32_t SetValue);
extern uint32_t AES_IVR1_Read(void);
 
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
extern void AES_IVR2_Write(uint32_t SetValue);
extern uint32_t AES_IVR2_Read(void);
 
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
extern void AES_IVR3_Write(uint32_t SetValue);
extern uint32_t AES_IVR3_Read(void);
 
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
extern void AES_H0_Write(uint32_t SetValue);
extern uint32_t AES_H0_Read(void);
 
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
extern void AES_H1_Write(uint32_t SetValue);
extern uint32_t AES_H1_Read(void);
 
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
extern void AES_H2_Write(uint32_t SetValue);
extern uint32_t AES_H2_Read(void);
 
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
extern void AES_H3_Write(uint32_t SetValue);
extern uint32_t AES_H3_Read(void);
 
/* Ð´´íÎó±êÖ¾£ºÔÚ¼ÆËã»òÊä³ö½×¶Î·¢Éúд²Ù×÷ʱÖÃ룬Èí¼þд1ÇåÁã Ïà¹Øº¯Êý */
extern void AES_ISR_WRERR_Clr(void);
extern FlagStatus AES_ISR_WRERR_Chk(void);
 
/* ¶Á´íÎó±êÖ¾£ºÔÚ¼ÆËã»òÊäÈë½×¶Î·¢Éú¶Á²Ù×÷ʱÖÃ룬Èí¼þд1ÇåÁã Ïà¹Øº¯Êý */
extern void AES_ISR_RDERR_Clr(void);
extern FlagStatus AES_ISR_RDERR_Chk(void);
 
/* AES¼ÆËãÍê³É±êÖ¾£¬Èí¼þд1ÇåÁã
1£º¼ÆËãÍê³É
0£º¼ÆËãûÓÐÍê³É Ïà¹Øº¯Êý */
extern void AES_ISR_CCF_Clr(void);
extern FlagStatus AES_ISR_CCF_Chk(void);
//Announce_End
 
 
extern void AES_KEY_WriteEx(uint8_t *KeyIn, uint8_t Len);
extern void AES_IVR_WriteEx(uint8_t *IVRIn);
extern void AES_IVR_ReadEx(uint8_t *IVROut);
extern void AES_DIN_GroupWrite_128BIT(uint8_t *DataIn);
extern void AES_DOUT_GroupRead_128BIT(uint8_t *DataOut);
extern uint8_t AES_GroupWriteAndRead_128BIT(uint8_t *DataIn, uint8_t *DataOut);
extern uint8_t AES_GroupWriteAndRead_128BIT_IVR(uint8_t *DataIn, uint8_t *DataOut);
extern void AES_Init(AES_InitTypeDef* para);
extern void AES_Hx_WriteEx(uint8_t *HxIn, uint8_t Len);
extern void AES_Hx_ReadEx(uint8_t *HxOut, uint8_t Len);
 
#ifdef __cplusplus
}
#endif
 
#endif /*__FM33A0XXEV_AES_H */