1 /*
2  * Copyright (c) 2023, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef ti_drivers_RCL_commands_adc_noise_h__include
34 #define ti_drivers_RCL_commands_adc_noise_h__include
35 
36 #include <ti/drivers/rcl/RCL_Command.h>
37 #include <ti/drivers/rcl/handlers/adc_noise.h>
38 
39 typedef struct RCL_CMD_ADC_NOISE_GET RCL_CmdAdcNoiseGet;
40 
41 /* Command IDs */
42 #define RCL_CMDID_ADC_NOISE_GET 0x0001
43 
44 /* Max number of samples that can be collected in one session */
45 #define RCL_ADC_NOISE_MAX_NUM_WORDS (1024)
46 
47 /**
48  *  @brief ADC noise command
49  *
50  *  Command to collect ADC samples from radio.
51  *
52  *  This command is used to collect ADC samples from the radio. The samples represent noise (random data),
53  *  and is intended only to be used as input for entropy generation.
54  *
55  *  If the output buffer is set to NULL, the samples must be read out by the caller before submitting a new RCL command.
56  *  The location of the samples can always be read from the output-pointer, which will be updated by the RCL-handler
57  *  in the case where a NULL-pointer is passed.
58  *
59  *  # Data format #
60  *
61  *  The data format of the output is described below
62  *
63  *  |  Word  |   word[31]   |   word[30..26]   |   word[25..21]   |   word[20..16]   |   word[15]   |   word[14..10]   |   word[9..5]   |   word[4..0]   |
64  *  | --- | --- | --- | --- | --- | --- | --- | --- | --- |
65  *  |  0  |  ‘0’  |  IAC2  |  IAC1  |  IAC0  |  ‘0’  |  QAC2  |  QAC1  |  QAC0  |
66  *  |  1  |  ‘0’  |  IAC5  |  IAC4  |  IAC3  |  ‘0’  |  QAC5  |  QAC4  |  QAC3  |
67  *  |  ...  |      |      |      |      |      |      |      |      |
68  *  |   i   |  ‘0’  |  IAC(3i+2)  |  IAC(3i+1)  |  IAC(3i)  |  ‘0’  |  QAC(3i+2)  |  QAC(3i+1)  |  QAC(3i)  |
69  *
70  *
71  */
72 struct RCL_CMD_ADC_NOISE_GET
73 {
74     RCL_Command common;
75     uint32_t numWords; /*!< Number of ADC sample words to collect. Range [1..1024] */
76     uint32_t *output;  /*!< Buffer for storing ADC samples. NULL: Do not copy samples, but leave them in the LRF RAM.
77                         *   This pointer will be updated by the RCL-handler to point to the location in RAM where
78                         *   the data is stored.
79                         */
80 };
81 
82 #define RCL_CmdAdcNoiseGet_Default()                                    \
83     (RCL_CmdAdcNoiseGet)                                                \
84     {                                                                   \
85         .common = RCL_Command_Default(RCL_CMDID_ADC_NOISE_GET,          \
86                                       RCL_Handler_ADC_Noise_getNoise),  \
87         .numWords = RCL_ADC_NOISE_MAX_NUM_WORDS,                        \
88         .output = NULL,                                                 \
89     }
90 
91 #endif // ti_drivers_RCL_commands_adc_noise_h__include
92