forked
Diff: targets/TARGET_Realtek/TARGET_AMEBA/trng_api.c
- Revision:
- 167:e84263d55307
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/targets/TARGET_Realtek/TARGET_AMEBA/trng_api.c Wed Jun 21 17:46:44 2017 +0100 @@ -0,0 +1,73 @@ +/* mbed Microcontroller Library + * Copyright (c) 2013-2016 Realtek Semiconductor Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "trng_api.h" +#include "analogin_api.h" +#include "analogin_ext.h" + +#ifdef DEVICE_TRNG + + +void trng_init(trng_t *obj) +{ + _memset((void *)obj, 0, sizeof(trng_t)); + analogin_init(&obj->tradcng, ADC0); + obj->inited = 1; +} + +void trng_free(trng_t *obj) +{ + if (!obj->inited) { + return; + } + + obj->inited = 0; + analogin_deinit(&obj->tradcng); +} + +static void trng_get_byte(trng_t *obj, unsigned char *byte) +{ + size_t bit; + uint32_t adc[2]; + + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PSAL_ADC_HND pSalADCHND = NULL; + + pSalADCMngtAdpt = &(obj->tradcng.SalADCMngtAdpt); + pSalADCHND = &(pSalADCMngtAdpt->pSalHndPriv->SalADCHndPriv); + + *byte = 0; + for (bit = 0; bit < 8; bit++) { + RtkADCRxManualRotate(pSalADCHND, adc); + *byte |= (adc[0] & 0x01) << bit; + } +} + +int trng_get_bytes(trng_t *obj, uint8_t *buf, size_t len, size_t *output_len) +{ + size_t i; + + if (!obj->inited) { + return -1; + } + + for (i = 0; i < len; i++) { + trng_get_byte(obj, buf + i); + } + + *output_len = len; + return 0; +} +#endif