1 /**
2 * \file
3 *
4 * \brief SAM True Random Number Generator (TRNG) Driver
5 *
6 * Copyright (C) 2014-2015 Atmel Corporation. All rights reserved.
7 *
8 * \asf_license_start
9 *
10 * \page License
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are met:
14 *
15 * 1. Redistributions of source code must retain the above copyright notice,
16 * this list of conditions and the following disclaimer.
17 *
18 * 2. Redistributions in binary form must reproduce the above copyright notice,
19 * this list of conditions and the following disclaimer in the documentation
20 * and/or other materials provided with the distribution.
21 *
22 * 3. The name of Atmel may not be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * 4. This software may only be redistributed and used in connection with an
26 * Atmel microcontroller product.
27 *
28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGE.
39 *
40 * \asf_license_stop
41 *
42 */
43 /*
44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
45 */
46
47 #include "trng.h"
48
49 /**
50 * \brief Initializes a hardware TRNG module instance.
51 *
52 * Enables the clock and initializes the TRNG module, based on the given
53 * configuration values.
54 *
55 * \param[in,out] module_inst Pointer to the software module instance struct
56 * \param[in] hw Pointer to the TRNG hardware module
57 * \param[in] config Pointer to the TRNG configuration options struct
58 *
59 * \return Status of the initialization procedure.
60 *
61 * \retval STATUS_OK The module was initialized successfully
62 */
trng_init(struct trng_module * const module_inst,Trng * const hw,struct trng_config * const config)63 enum status_code trng_init(
64 struct trng_module *const module_inst,
65 Trng *const hw,
66 struct trng_config *const config)
67 {
68 /* Sanity check arguments */
69 Assert(module_inst);
70 Assert(hw);
71 Assert(config);
72
73 /* Initialize device instance */
74 module_inst->hw = hw;
75
76 /* Turn on the digital interface clock */
77 system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, MCLK_APBCMASK_TRNG);
78
79 #if TRNG_CALLBACK_MODE == true
80 /* Initialize parameters */
81 for (uint8_t i = 0; i < TRNG_CALLBACK_N; i++) {
82 module_inst->callback[i] = NULL;
83 }
84
85 /* Initialize software flags*/
86 module_inst->register_callback_mask = 0x00;
87 module_inst->enable_callback_mask = 0x00;
88 module_inst->job_buffer = NULL;
89 module_inst->remaining_number = 0;
90 module_inst->job_status = STATUS_OK;
91
92 /* Register this instance for callbacks*/
93 _trng_instance = module_inst;
94 #endif
95
96 /* Write configuration to module */
97 hw->CTRLA.reg = ((uint32_t)config->run_in_standby << TRNG_CTRLA_RUNSTDBY_Pos);
98
99 return STATUS_OK;
100 }
101
102