Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /*
sahilmgandhi 18:6a4db94011d3 2 * Hardware entropy collector for NUC472's RNGA
sahilmgandhi 18:6a4db94011d3 3 *
sahilmgandhi 18:6a4db94011d3 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
sahilmgandhi 18:6a4db94011d3 5 * SPDX-License-Identifier: Apache-2.0
sahilmgandhi 18:6a4db94011d3 6 *
sahilmgandhi 18:6a4db94011d3 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
sahilmgandhi 18:6a4db94011d3 8 * not use this file except in compliance with the License.
sahilmgandhi 18:6a4db94011d3 9 * You may obtain a copy of the License at
sahilmgandhi 18:6a4db94011d3 10 *
sahilmgandhi 18:6a4db94011d3 11 * http://www.apache.org/licenses/LICENSE-2.0
sahilmgandhi 18:6a4db94011d3 12 *
sahilmgandhi 18:6a4db94011d3 13 * Unless required by applicable law or agreed to in writing, software
sahilmgandhi 18:6a4db94011d3 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
sahilmgandhi 18:6a4db94011d3 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sahilmgandhi 18:6a4db94011d3 16 * See the License for the specific language governing permissions and
sahilmgandhi 18:6a4db94011d3 17 * limitations under the License.
sahilmgandhi 18:6a4db94011d3 18 *
sahilmgandhi 18:6a4db94011d3 19 */
sahilmgandhi 18:6a4db94011d3 20
sahilmgandhi 18:6a4db94011d3 21 #if DEVICE_TRNG
sahilmgandhi 18:6a4db94011d3 22
sahilmgandhi 18:6a4db94011d3 23 #include <stdlib.h>
sahilmgandhi 18:6a4db94011d3 24 #include <string.h>
sahilmgandhi 18:6a4db94011d3 25 #include "cmsis.h"
sahilmgandhi 18:6a4db94011d3 26 #include "NUC472_442.h"
sahilmgandhi 18:6a4db94011d3 27 #include "us_ticker_api.h"
sahilmgandhi 18:6a4db94011d3 28 #include "trng_api.h"
sahilmgandhi 18:6a4db94011d3 29
sahilmgandhi 18:6a4db94011d3 30 /*
sahilmgandhi 18:6a4db94011d3 31 * Get Random number generator.
sahilmgandhi 18:6a4db94011d3 32 */
sahilmgandhi 18:6a4db94011d3 33 static volatile int g_PRNG_done;
sahilmgandhi 18:6a4db94011d3 34 volatile int g_AES_done;
sahilmgandhi 18:6a4db94011d3 35
sahilmgandhi 18:6a4db94011d3 36 void CRYPTO_IRQHandler()
sahilmgandhi 18:6a4db94011d3 37 {
sahilmgandhi 18:6a4db94011d3 38 if (PRNG_GET_INT_FLAG()) {
sahilmgandhi 18:6a4db94011d3 39 g_PRNG_done = 1;
sahilmgandhi 18:6a4db94011d3 40 PRNG_CLR_INT_FLAG();
sahilmgandhi 18:6a4db94011d3 41 } else if (AES_GET_INT_FLAG()) {
sahilmgandhi 18:6a4db94011d3 42 g_AES_done = 1;
sahilmgandhi 18:6a4db94011d3 43 AES_CLR_INT_FLAG();
sahilmgandhi 18:6a4db94011d3 44 }
sahilmgandhi 18:6a4db94011d3 45 }
sahilmgandhi 18:6a4db94011d3 46
sahilmgandhi 18:6a4db94011d3 47 static void trng_get(unsigned char *pConversionData)
sahilmgandhi 18:6a4db94011d3 48 {
sahilmgandhi 18:6a4db94011d3 49 uint32_t *p32ConversionData;
sahilmgandhi 18:6a4db94011d3 50
sahilmgandhi 18:6a4db94011d3 51 p32ConversionData = (uint32_t *)pConversionData;
sahilmgandhi 18:6a4db94011d3 52
sahilmgandhi 18:6a4db94011d3 53 PRNG_Open(PRNG_KEY_SIZE_256, 1, us_ticker_read());
sahilmgandhi 18:6a4db94011d3 54 PRNG_Start();
sahilmgandhi 18:6a4db94011d3 55 while (!g_PRNG_done);
sahilmgandhi 18:6a4db94011d3 56
sahilmgandhi 18:6a4db94011d3 57 PRNG_Read(p32ConversionData);
sahilmgandhi 18:6a4db94011d3 58 }
sahilmgandhi 18:6a4db94011d3 59
sahilmgandhi 18:6a4db94011d3 60 void trng_init(trng_t *obj)
sahilmgandhi 18:6a4db94011d3 61 {
sahilmgandhi 18:6a4db94011d3 62 (void)obj;
sahilmgandhi 18:6a4db94011d3 63 /* Unlock protected registers */
sahilmgandhi 18:6a4db94011d3 64 SYS_UnlockReg();
sahilmgandhi 18:6a4db94011d3 65 /* Enable IP clock */
sahilmgandhi 18:6a4db94011d3 66 CLK_EnableModuleClock(CRPT_MODULE);
sahilmgandhi 18:6a4db94011d3 67
sahilmgandhi 18:6a4db94011d3 68 /* Lock protected registers */
sahilmgandhi 18:6a4db94011d3 69 SYS_LockReg();
sahilmgandhi 18:6a4db94011d3 70
sahilmgandhi 18:6a4db94011d3 71 NVIC_EnableIRQ(CRPT_IRQn);
sahilmgandhi 18:6a4db94011d3 72 PRNG_ENABLE_INT();
sahilmgandhi 18:6a4db94011d3 73 }
sahilmgandhi 18:6a4db94011d3 74
sahilmgandhi 18:6a4db94011d3 75 void trng_free(trng_t *obj)
sahilmgandhi 18:6a4db94011d3 76 {
sahilmgandhi 18:6a4db94011d3 77 (void)obj;
sahilmgandhi 18:6a4db94011d3 78 PRNG_DISABLE_INT();
sahilmgandhi 18:6a4db94011d3 79 NVIC_DisableIRQ(CRPT_IRQn);
sahilmgandhi 18:6a4db94011d3 80 }
sahilmgandhi 18:6a4db94011d3 81
sahilmgandhi 18:6a4db94011d3 82 int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
sahilmgandhi 18:6a4db94011d3 83 {
sahilmgandhi 18:6a4db94011d3 84 (void)obj;
sahilmgandhi 18:6a4db94011d3 85
sahilmgandhi 18:6a4db94011d3 86 *output_length = 0;
sahilmgandhi 18:6a4db94011d3 87 if (length < 32) {
sahilmgandhi 18:6a4db94011d3 88 unsigned char tmpBuff[32];
sahilmgandhi 18:6a4db94011d3 89 trng_get(tmpBuff);
sahilmgandhi 18:6a4db94011d3 90 memcpy(output, &tmpBuff, length);
sahilmgandhi 18:6a4db94011d3 91 *output_length = length;
sahilmgandhi 18:6a4db94011d3 92 } else {
sahilmgandhi 18:6a4db94011d3 93 for (int i = 0; i < (length/32); i++) {
sahilmgandhi 18:6a4db94011d3 94 trng_get(output);
sahilmgandhi 18:6a4db94011d3 95 *output_length += 32;
sahilmgandhi 18:6a4db94011d3 96 output += 32;
sahilmgandhi 18:6a4db94011d3 97 }
sahilmgandhi 18:6a4db94011d3 98 }
sahilmgandhi 18:6a4db94011d3 99
sahilmgandhi 18:6a4db94011d3 100 return 0;
sahilmgandhi 18:6a4db94011d3 101 }
sahilmgandhi 18:6a4db94011d3 102
sahilmgandhi 18:6a4db94011d3 103 #endif
sahilmgandhi 18:6a4db94011d3 104