]> begriffs open source - cmsis-driver-validation/blob - Source/DV_I2C.c
Minor update to WiFi driver validation
[cmsis-driver-validation] / Source / DV_I2C.c
1 /*
2  * Copyright (c) 2015-2020 Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Licensed under the Apache License, Version 2.0 (the License); you may
7  * not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * -----------------------------------------------------------------------------
19  *
20  * Project:     CMSIS-Driver Validation
21  * Title:       Inter-Integrated Circuit (I2C) Driver Validation tests
22  *
23  * -----------------------------------------------------------------------------
24  */
25
26
27 #include "cmsis_dv.h" 
28 #include "DV_I2C_Config.h"
29 #include "DV_Framework.h"
30 #include "Driver_I2C.h"
31 #include <stdio.h>
32 #include <stdlib.h> 
33 #include <string.h> 
34
35 // Register Driver_I2C#
36 extern ARM_DRIVER_I2C CREATE_SYMBOL(Driver_I2C, DRV_I2C);
37 static ARM_DRIVER_I2C *drv = &CREATE_SYMBOL(Driver_I2C, DRV_I2C);
38 static ARM_I2C_CAPABILITIES capab;  
39
40 // Event flags
41 static uint8_t volatile Event;    
42
43 // I2C event
44 static void I2C_DrvEvent (uint32_t event) {
45   Event |= event;
46 }
47
48 /*-----------------------------------------------------------------------------
49  *      Tests
50  *----------------------------------------------------------------------------*/
51  
52 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
53 /**
54 \defgroup dv_i2c I2C Validation
55 \brief I2C driver validation
56 \details
57 The I2C validation test checks the API interface compliance only.
58
59 \defgroup i2c_tests Tests
60 \ingroup dv_i2c
61
62 @{
63 */
64
65 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
66 /**
67 \brief Function: I2C_GetCapabilities
68 \details
69 The test function \b I2C_GetCapabilities verifies the function \b GetCapabilities.
70 */
71 void I2C_GetCapabilities (void) {                    
72   /* Get SPI capabilities */
73   capab = drv->GetCapabilities();
74   TEST_ASSERT(&capab != NULL); 
75 }
76
77 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
78 /**
79 \brief  Function: I2C_Initialization
80 \details
81 The test function \b I2C_Initialization verifies the I2C functions with the sequence:
82   - \b Initialize  without callback
83   - \b Uninitialize
84   - \b Initialize with callback
85   - \b Uninitialize
86 */
87 void I2C_Initialization (void) { 
88   
89   /* Initialize without callback */
90   TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK); 
91     
92   /* Uninitialize */
93   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
94   
95   /* Initialize with callback */
96   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
97   
98   /* Uninitialize */
99   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
100 }
101
102 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
103 /**
104 \brief  Function: I2C_CheckInvalidInit
105 \details
106 The test function \b I2C_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
107   - \b Uninitialize
108   - \b PowerControl with Power off
109   - \b PowerControl with Power on
110   - \b Control with bus speed fast 
111   - \b PowerControl with Power off
112   - \b Uninitialize
113 */
114 void I2C_CheckInvalidInit (void) { 
115   
116   /* Uninitialize */
117   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
118   
119   /* Power off */
120   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
121   
122   /* Try to power on */
123   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK); 
124   
125   /* Try to set configuration */
126   TEST_ASSERT(drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST) != ARM_DRIVER_OK);
127
128   /* Power off */
129   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
130   
131   /* Uninitialize */
132   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
133 }
134
135 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
136 /**
137 \brief  Function: I2C_PowerControl
138 \details
139 The test function \b I2C_PowerControl verifies the \b PowerControl function with the sequence:
140  - Initialize 
141  - Power on
142  - Power low
143  - Power off 
144  - Uninitialize 
145 */
146 void I2C_PowerControl (void) { 
147   int32_t val;
148   
149   /* Initialize with callback */
150   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
151   
152   /* Power on */
153   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);  
154   
155   /* Power low */
156   val = drv->PowerControl (ARM_POWER_LOW);
157   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
158   else { TEST_ASSERT(val == ARM_DRIVER_OK); }
159    
160   /* Power off */
161   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
162   
163   /* Uninitialize */
164   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
165 }
166
167 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
168 /**
169 \brief  Function: I2C_SetBusSpeed
170 \details
171 The test function \b I2C_SetBusSpeed verifies the \b Control function with the sequence:
172  - Initialize 
173  - Power on
174  - Set bus speed standard 
175  - Set bus speed fast 
176  - Set bus speed fast plus 
177  - Set bus speed high 
178  - Power off 
179  - Uninitialize 
180 */
181 void I2C_SetBusSpeed (void) { 
182 int32_t val;  
183   
184   /* Initialize with callback and power on */
185   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
186   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK); 
187   
188   /* Set bus speed standard */
189   TEST_ASSERT(drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD) == ARM_DRIVER_OK);
190   
191   /* Set bus speed fast */
192   val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);
193   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Fast speed is not supported"); }
194   else { TEST_ASSERT(val == ARM_DRIVER_OK); } 
195   
196   /* Set bus speed fast plus */
197   val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST_PLUS);
198   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Fast plus speed is not supported"); }
199   else { TEST_ASSERT(val == ARM_DRIVER_OK); } 
200   
201   /* Set bus speed high */
202   val = drv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_HIGH);
203   if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] High speed is not supported"); }
204   else { TEST_ASSERT(val == ARM_DRIVER_OK); } 
205   
206   /* Power off and uninitialize*/
207   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
208   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
209 }
210
211 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
212 /**
213 \brief  Function: I2C_SetOwnAddress
214 \details
215 The test function \b I2C_SetOwnAddress verifies the \b Control function with the sequence:
216  - Initialize 
217  - Power on
218  - Set slave own address \token{0x0000}
219  - Set slave own address \token{0x0001}
220  - Set slave own address \token{0x00FF}
221  - Set slave own address \token{0x03FF}
222  - Power off 
223  - Uninitialize 
224 */
225 void I2C_SetOwnAddress (void) { 
226   
227   /* Initialize with callback and power on */
228   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
229   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK); 
230   
231   /* Set slave own address */
232   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x0000) == ARM_DRIVER_OK);
233   
234   /* Set slave own address */
235   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x0001) == ARM_DRIVER_OK);
236   
237   /* Set slave own address */
238   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x00FF) == ARM_DRIVER_OK);
239   
240   /* Set slave own address */
241   TEST_ASSERT(drv->Control(ARM_I2C_OWN_ADDRESS, 0x03FF) == ARM_DRIVER_OK);
242   
243   /* Power off and uninitialize*/
244   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
245   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);   
246 }
247
248 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
249 /**
250 \brief  Function: I2C_BusClear
251 \details
252 The test function \b I2C_BusClear verifies the \b Control function with the sequence:
253  - Initialize 
254  - Power on
255  - Clear Bus
256  - Power off 
257  - Uninitialize 
258 */
259 void I2C_BusClear (void) { 
260   
261   /* Initialize with callback and power on */
262   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
263   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
264   
265   /* Clear Bus */
266   TEST_ASSERT(drv->Control(ARM_I2C_BUS_CLEAR, 0x0000) == ARM_DRIVER_OK);
267   
268   /* Power off and uninitialize*/
269   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
270   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
271 }
272   
273 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
274 /**
275 \brief  Function: I2C_AbortTransfer
276 \details
277 The test function \b I2C_AbortTransfer verifies the \b Control function with the sequence:
278  - Initialize 
279  - Power on
280  - Abort transfer
281  - Power off 
282  - Uninitialize 
283 */
284 void I2C_AbortTransfer (void) { 
285   
286   /* Initialize with callback and power on */
287   TEST_ASSERT(drv->Initialize(I2C_DrvEvent) == ARM_DRIVER_OK); 
288   TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
289   
290   /* Abort transfer */
291   TEST_ASSERT(drv->Control(ARM_I2C_ABORT_TRANSFER, 0x0000) == ARM_DRIVER_OK);
292   
293   /* Power off and uninitialize*/
294   TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
295   TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK); 
296 }
297
298 /**
299 @}
300 */ 
301 // end of group dv_i2c
302