/** * \file * * \brief SAM True Random Number Generator (TRNG) Driver * * Copyright (C) 2014-2015 Atmel Corporation. All rights reserved. * * \asf_license_start * * \page License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an * Atmel microcontroller product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * \asf_license_stop * */ /* * Support and FAQ: visit Atmel Support */ #include "trng.h" /** * \brief Initializes a hardware TRNG module instance. * * Enables the clock and initializes the TRNG module, based on the given * configuration values. * * \param[in,out] module_inst Pointer to the software module instance struct * \param[in] hw Pointer to the TRNG hardware module * \param[in] config Pointer to the TRNG configuration options struct * * \return Status of the initialization procedure. * * \retval STATUS_OK The module was initialized successfully */ enum status_code trng_init( struct trng_module *const module_inst, Trng *const hw, struct trng_config *const config) { /* Sanity check arguments */ Assert(module_inst); Assert(hw); Assert(config); /* Initialize device instance */ module_inst->hw = hw; /* Turn on the digital interface clock */ system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, MCLK_APBCMASK_TRNG); #if TRNG_CALLBACK_MODE == true /* Initialize parameters */ for (uint8_t i = 0; i < TRNG_CALLBACK_N; i++) { module_inst->callback[i] = NULL; } /* Initialize software flags*/ module_inst->register_callback_mask = 0x00; module_inst->enable_callback_mask = 0x00; module_inst->job_buffer = NULL; module_inst->remaining_number = 0; module_inst->job_status = STATUS_OK; /* Register this instance for callbacks*/ _trng_instance = module_inst; #endif /* Write configuration to module */ hw->CTRLA.reg = ((uint32_t)config->run_in_standby << TRNG_CTRLA_RUNSTDBY_Pos); return STATUS_OK; }