2 * Copyright (c) 2015-2020 Arm Limited. All rights reserved.
4 * SPDX-License-Identifier: Apache-2.0
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
10 * www.apache.org/licenses/LICENSE-2.0
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.
18 * -----------------------------------------------------------------------------
20 * Project: CMSIS-Driver Validation
21 * Title: Memory Card Interface (MCI) Driver Validation tests
23 * -----------------------------------------------------------------------------
28 #include "DV_MCI_Config.h"
29 #include "DV_Framework.h"
30 #include "Driver_MCI.h"
35 // Register Driver_USBD#
36 extern ARM_DRIVER_MCI CREATE_SYMBOL(Driver_MCI, DRV_MCI);
37 static ARM_DRIVER_MCI *drv = &CREATE_SYMBOL(Driver_MCI, DRV_MCI);
38 static ARM_MCI_CAPABILITIES capab;
41 static uint8_t volatile Event;
44 static void MCI_DrvEvent (uint32_t event) {
48 /*-----------------------------------------------------------------------------
50 *----------------------------------------------------------------------------*/
52 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
54 \defgroup dv_mci MCI Validation
55 \brief MCI driver validation
57 The MCI validation test checks the API interface compliance only.
59 \defgroup mci_tests Tests
65 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
67 \brief Function: MCI_GetCapabilities
69 The test function \b MCI_GetCapabilities verifies the function \b GetCapabilities.
71 void MCI_GetCapabilities (void) {
72 /* Get USBD capabilities */
73 capab = drv->GetCapabilities();
74 TEST_ASSERT(&capab != NULL);
77 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
79 \brief Function: MCI_Initialization
81 The test function \b MCI_Initialization verifies the MCI functions with the sequence:
82 - \b Initialize without callback
84 - \b Initialize with callback
87 void MCI_Initialization (void) {
89 /* Initialize without callback */
90 TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK);
93 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
95 /* Initialize with callback */
96 TEST_ASSERT(drv->Initialize(MCI_DrvEvent) == ARM_DRIVER_OK);
99 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
102 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
104 \brief Function: MCI_CheckInvalidInit
106 The test function \b MCI_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
108 - \b PowerControl with Power off
109 - \b PowerControl with Power on
110 - \b PowerControl with Power off
113 void MCI_CheckInvalidInit (void) {
116 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
119 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
121 /* Try to power on */
122 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
125 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
128 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
131 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
133 \brief Function: MCI_PowerControl
135 The test function \b MCI_PowerControl verifies the \b PowerControl function with the sequence:
142 void MCI_PowerControl (void) {
145 /* Initialize with callback */
146 TEST_ASSERT(drv->Initialize(MCI_DrvEvent) == ARM_DRIVER_OK);
149 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
152 val = drv->PowerControl (ARM_POWER_LOW);
153 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
154 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
157 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
160 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
163 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
165 \brief Function: MCI_SetBusSpeedMode
167 The test function \b MCI_SetBusSpeedMode verifies the \b Control function and sets the bus speed with the sequence:
180 void MCI_SetBusSpeedMode (void) {
183 /* Initialize with callback and power on*/
184 TEST_ASSERT(drv->Initialize(MCI_DrvEvent) == ARM_DRIVER_OK);
185 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
188 TEST_ASSERT(drv->Control (ARM_MCI_BUS_SPEED_MODE, ARM_MCI_BUS_DEFAULT_SPEED ) == ARM_DRIVER_OK);
191 val = drv->Control (ARM_MCI_BUS_SPEED_MODE, ARM_MCI_BUS_DEFAULT_SPEED );
192 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] High speed is not supported"); }
193 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
196 val = drv->Control (ARM_MCI_BUS_SPEED_MODE, ARM_MCI_BUS_UHS_SDR12 );
197 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] SDR12 is not supported"); }
198 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
201 val = drv->Control (ARM_MCI_BUS_SPEED_MODE, ARM_MCI_BUS_UHS_SDR25 );
202 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] SDR25 is not supported"); }
203 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
206 val = drv->Control (ARM_MCI_BUS_SPEED_MODE, ARM_MCI_BUS_UHS_SDR50 );
207 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] SDR50 is not supported"); }
208 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
211 val = drv->Control (ARM_MCI_BUS_SPEED_MODE, ARM_MCI_BUS_UHS_SDR104 );
212 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] SDR104 is not supported"); }
213 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
216 val = drv->Control (ARM_MCI_BUS_SPEED_MODE, ARM_MCI_BUS_UHS_DDR50 );
217 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] DDR50 is not supported"); }
218 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
220 /* Power off and uninitialize*/
221 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
222 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
225 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
227 \brief Function: MCI_Config_DataWidth
229 The test function \b MCI_Config_DataWidth verifies the \b Control function and set the data width with the sequence:
232 - Default data width \token{1}
233 - Data width \token{4}
234 - Data width \token{8}
235 - Data width \token{4 DDR}
236 - Data width \token{8 DDR}
240 void MCI_Config_DataWidth (void) {
243 /* Initialize with callback and power on*/
244 TEST_ASSERT(drv->Initialize(MCI_DrvEvent) == ARM_DRIVER_OK);
245 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
247 /* Default data width 1 */
248 TEST_ASSERT(drv->Control (ARM_MCI_BUS_DATA_WIDTH, ARM_MCI_BUS_DATA_WIDTH_1 ) == ARM_DRIVER_OK);
251 val = drv->Control (ARM_MCI_BUS_DATA_WIDTH, ARM_MCI_BUS_DATA_WIDTH_4 );
252 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Data width 4 is not supported"); }
253 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
256 val = drv->Control (ARM_MCI_BUS_DATA_WIDTH, ARM_MCI_BUS_DATA_WIDTH_8 );
257 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Data width 8 is not supported"); }
258 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
260 /* Data width 4 DDR */
261 val = drv->Control (ARM_MCI_BUS_DATA_WIDTH, ARM_MCI_BUS_DATA_WIDTH_4_DDR );
262 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Data width 4 DDR is not supported"); }
263 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
265 /* Data width 8 DDR */
266 val = drv->Control (ARM_MCI_BUS_DATA_WIDTH, ARM_MCI_BUS_DATA_WIDTH_8_DDR );
267 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Data width 8 DDR is not supported"); }
268 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
270 /* Power off and uninitialize*/
271 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
272 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
275 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
277 \brief Function: MCI_Config_CmdLineMode
279 The test function \b MCI_Config_CmdLineMode verifies the \b Control function with the sequence:
287 void MCI_Config_CmdLineMode (void) {
290 /* Initialize with callback and power on*/
291 TEST_ASSERT(drv->Initialize(MCI_DrvEvent) == ARM_DRIVER_OK);
292 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
294 /* Default push-pull */
295 TEST_ASSERT(drv->Control (ARM_MCI_BUS_CMD_MODE, ARM_MCI_BUS_CMD_PUSH_PULL ) == ARM_DRIVER_OK);
298 val = drv->Control (ARM_MCI_BUS_CMD_MODE, ARM_MCI_BUS_CMD_OPEN_DRAIN );
299 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Open Drain Cmd is not supported"); }
300 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
302 /* Power off and uninitialize*/
303 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
304 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
307 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
309 \brief Function: MCI_Config_DriverStrength
311 The test function \b MCI_Config_DriverStrength verifies the \b Control function and sets the driver strength with the sequence:
321 void MCI_Config_DriverStrength (void) {
324 /* Initialize with callback and power on*/
325 TEST_ASSERT(drv->Initialize(MCI_DrvEvent) == ARM_DRIVER_OK);
326 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
329 val = drv->Control ( ARM_MCI_DRIVER_STRENGTH, ARM_MCI_DRIVER_TYPE_A );
330 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Type A is not supported"); }
331 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
334 val = drv->Control ( ARM_MCI_DRIVER_STRENGTH, ARM_MCI_DRIVER_TYPE_B );
335 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Type B is not supported"); }
336 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
339 val = drv->Control ( ARM_MCI_DRIVER_STRENGTH, ARM_MCI_DRIVER_TYPE_C );
340 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Type C is not supported"); }
341 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
344 val = drv->Control ( ARM_MCI_DRIVER_STRENGTH, ARM_MCI_DRIVER_TYPE_D );
345 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Type D is not supported"); }
346 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
348 /* Power off and uninitialize*/
349 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
350 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
356 // end of group dv_mci