[processor-sdk/performance-audio-sr.git] / psdk_cust / pdk_k2g_1_0_1_0_eng / packages / ti / platform_org / evmk2g / platform_test / src / emmc_test.c
1 /*
2 * Copyright (c) 2015, 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 */
34 /**
35 *
36 * \file emmc_test.c
37 *
38 * \brief This file contains emmc test functions.
39 *
40 ******************************************************************************/
42 #include "emmc_test.h"
43 #include "platform_internal.h"
45 //TODO: Need to update the test to use platform_device_xxx APIs after bring-up
46 uint8_t emmcWriteBuf[EMMC_TESTSECTORS * SECTOR_SIZE];
47 uint8_t emmcReadBuf[EMMC_TESTSECTORS * SECTOR_SIZE];
48 uint8_t emmcSaveBuf[EMMC_TESTSECTORS * SECTOR_SIZE];
50 /**
51 * \brief This function performs emmc read/write test
52 *
53 * \param mmcCard - MMC handle
54 *
55 * \return
56 * \n TEST_PASS - Test Passed
57 * \n TEST_FAIL - Test Failed
58 *
59 */
60 static TEST_STATUS emmc_access_test (mmchsCardInfo *mmcCard)
61 {
62 int32_t retVal;
63 int32_t block = EMMC_STARTSECTOR;
64 uint32_t index;
66 for(block = EMMC_STARTSECTOR; block < (EMMC_TESTSECTOR_COUNT + EMMC_STARTSECTOR);
67 block += EMMC_TESTSECTORS)
68 {
69 memset (emmcWriteBuf, EMMC_TEST_PATTERN,
70 sizeof(uint8_t) * (EMMC_TESTSECTORS * SECTOR_SIZE));
71 memset (emmcReadBuf, 0x00, sizeof(uint8_t) * (EMMC_TESTSECTORS * SECTOR_SIZE));
73 #ifdef ENABLE_MEMORY_BACKUP
74 platform_write ("Reading the Current Contents of 0x%x to emmcSaveBuf\n", block);
75 retVal = mmchsBlockRead (mmcCard, block,
76 EMMC_TESTSECTORS, emmcSaveBuf);
77 if (retVal != MMCHS_RET_OK)
78 {
79 platform_write ("\tUnable to Read Block data at 0x%x\n",block);
80 return (TEST_FAIL);
81 }
82 #endif
84 platform_write ("\teMMC: Writing a pattern to Block %d....", block);
85 retVal = mmchsBlockWrite (mmcCard, block,
86 EMMC_TESTSECTORS, emmcWriteBuf);
88 if (retVal != MMCHS_RET_OK)
89 {
90 platform_write ("Unable to Write Sector at 0x%x\n",block);
91 return (TEST_FAIL);
92 }
94 platform_write ("Reading back the pattern to emmcReadBuf\n");
95 retVal = mmchsBlockRead (mmcCard, block,
96 EMMC_TESTSECTORS, emmcReadBuf);
97 if (retVal != MMCHS_RET_OK)
98 {
99 platform_write ("\tUnable to Read Block data at 0x%x\n",block);
100 return (TEST_FAIL);
101 }
103 #ifdef ENABLE_MEMORY_BACKUP
104 platform_write ("Writing back the original contents from emmcSaveBuf\n");
105 retVal = mmchsBlockWrite (mmcCard, block, \
106 EMMC_TESTSECTORS, emmcSaveBuf);
108 if (retVal != MMCHS_RET_OK)
109 {
110 platform_write ("Unable to Write Sector at 0x%x\n",block);
111 return (TEST_FAIL);
112 }
113 #endif
115 for ( index = 0 ; index < (EMMC_TESTSECTORS * SECTOR_SIZE) ; index++ )
116 {
117 if (emmcWriteBuf[index] != emmcReadBuf[index])
118 {
119 platform_write ("Data comparison failed at %d\n",index);
120 return (TEST_FAIL);
121 }
122 }
123 block = EMMC_TESTSECTOR_COUNT + EMMC_STARTSECTOR;
124 }
126 return (TEST_PASS);
127 }
129 /**
130 * \brief This function performs emmc erase test
131 *
132 * \param mmcCard - MMC handle
133 *
134 * \return
135 * \n TEST_PASS - Test Passed
136 * \n TEST_FAIL - Test Failed
137 *
138 */
139 static TEST_STATUS emmc_erase_test (mmchsCardInfo *mmcCard)
140 {
141 int32_t retVal;
142 int32_t block = EMMC_ERASE_START;
143 uint32_t index;
145 memset (emmcWriteBuf, EMMC_TEST_PATTERN,
146 sizeof(uint8_t) * (EMMC_TESTSECTORS * SECTOR_SIZE));
147 memset (emmcReadBuf, 0x00, sizeof(uint8_t) * (EMMC_TESTSECTORS * SECTOR_SIZE));
149 #ifdef ENABLE_MEMORY_BACKUP
150 platform_write ("Reading the current contents of 0x%x to emmcSaveBuf\n", block);
151 retVal = mmchsBlockRead (mmcCard, block,
152 EMMC_TESTSECTORS, emmcSaveBuf);
153 if (retVal != MMCHS_RET_OK)
154 {
155 platform_write ("\tUnable to Read Block data at 0x%x\n",block);
156 return (TEST_FAIL);
157 }
158 #endif
160 platform_write ("\teMMC: Writing a pattern to Block %d....", block);
161 retVal = mmchsBlockWrite (mmcCard, block,
162 EMMC_TESTSECTORS, emmcWriteBuf);
164 if (retVal != MMCHS_RET_OK)
165 {
166 platform_write ("Unable to Write Sector at 0x%x\n",block);
167 return (TEST_FAIL);
168 }
170 platform_write ("Reading back the pattern 0XAA to emmcReadBuf\n");
171 retVal = mmchsBlockRead (mmcCard, block,
172 EMMC_TESTSECTORS, emmcReadBuf);
174 if (retVal != MMCHS_RET_OK)
175 {
176 platform_write ("\tUnable to Read Block data at 0x%x\n",block);
177 return (TEST_FAIL);
178 }
180 platform_write ("Erase the blocks from %d to %d\n", EMMC_ERASE_START, EMMC_ERASE_END);
181 retVal = mmchsBlockErase (mmcCard, EMMC_ERASE_START, EMMC_ERASE_END);
182 if (retVal != MMCHS_RET_OK)
183 {
184 platform_write ("\tBlock Erase Failed\n");
185 return (TEST_FAIL);
186 }
188 platform_delay(10000);
190 retVal = mmchsBlockRead (mmcCard, block,
191 EMMC_TESTSECTORS, emmcReadBuf);
192 if (retVal != MMCHS_RET_OK)
193 {
194 platform_write ("\tRead after Erase Failed\n");
195 return (TEST_FAIL);
196 }
198 #ifdef ENABLE_MEMORY_BACKUP
199 platform_write ("Writing back the original contents from emmcSaveBuf\n");
200 retVal = mmchsBlockWrite (mmcCard, block, \
201 EMMC_TESTSECTORS, emmcSaveBuf);
203 if (retVal != MMCHS_RET_OK)
204 {
205 platform_write ("Unable to Write Sector at 0x%x\n",block);
206 return (TEST_FAIL);
207 }
208 #endif
210 platform_write ("Compare if the erased blocks are 0 from %d to %d\n", EMMC_ERASE_START, EMMC_ERASE_END);
212 for ( index = 0 ; index < (EMMC_TESTSECTORS * SECTOR_SIZE) ; index++ )
213 {
214 if (emmcReadBuf[index] != 0)
215 {
216 platform_write ("Data comparison failed at %d\n",index);
217 return (TEST_FAIL);
218 }
219 }
221 platform_write ("Data comparison passed !!\n",index);
223 return (TEST_PASS);
224 }
226 /**
227 * \brief Executes eMMC tests
228 *
229 * \param testArgs [IN] Test arguments
230 *
231 * \return
232 * \n TEST_PASS - Test Passed
233 * \n TEST_FAIL - Test Failed
234 */
235 static TEST_STATUS run_emmc_test(void *testArgs)
236 {
237 mmchsInfo* mmcInfo;
238 mmchsCardInfo *mmcCard;
239 TEST_STATUS retVal = TEST_PASS;
241 platform_write("\nRunning eMMC Chip Detect Test\n");
243 mmcInfo = mmchsInit(MMCHS_MMC_INST);
244 if ((mmcInfo == NULL) || (mmcInfo->card == NULL))
245 {
246 platform_write ("eMMC Test: Error Initializing the eMMC Card \n");
247 return (TEST_FAIL);
248 }
250 mmcCard = mmcInfo->card;
251 if (mmcCard->cardType == MMCHS_MMC)
252 {
253 platform_write ("\teMMC Chip Identified\n");
254 }
255 else
256 {
257 platform_write ("\teMMC Chip not Identified\n");
258 platform_write("\neMMC Chip Detect Test Failed!\n");
259 return (TEST_FAIL);
260 }
262 platform_write ("\teMMC Card Info:\n");
263 mmchsPrintCardInfo (mmcCard);
265 platform_write("\neMMC Chip Detect Test Passed!\n");
267 platform_write("\nRunning eMMC Memory Access Test\n");
269 retVal = emmc_access_test(mmcCard);
270 if(retVal != TEST_PASS)
271 {
272 platform_write("\neMMC Memory Access Test Failed!\n");
273 return (retVal);
274 }
276 platform_write("\neMMC Memory Access Test Passed!\n");
278 platform_write("\nRunning eMMC Block Erase Test\n");
279 retVal = emmc_erase_test(mmcCard);
280 if(retVal != TEST_PASS)
281 {
282 platform_write("\neMMC Block Earse Test Failed!\n");
283 return (retVal);
284 }
286 platform_write("\neMMC Block Earse Test Passed!\n");
288 return (retVal);
289 }
291 /**
292 * \brief This function performs emmc test
293 *
294 * \param testArgs - Test arguments
295 *
296 * \return
297 * \n TEST_PASS - Test Passed
298 * \n TEST_FAIL - Test Failed
299 *
300 */
301 TEST_STATUS emmcTest(void *testArgs)
302 {
303 TEST_STATUS testStatus;
304 emmcTestArgs_t *args = (emmcTestArgs_t *)testArgs;
306 platform_write("\n***********************\n");
307 platform_write( " eMMC Test \n");
308 platform_write( "***********************\n");
310 if(args->autoRun == FALSE)
311 {
312 /* Read test inputs from user if needed */
313 }
315 testStatus = run_emmc_test(args);
316 if(testStatus != TEST_PASS)
317 {
318 platform_write("\neMMC Test Failed!\n");
319 }
320 else
321 {
322 platform_write("\neMMC Test Passed!\n");
323 }
325 platform_write("\neMMC Tests Completed!!\n");
326 platform_write("\n-----------------X-----------------\n\n\n");
328 return(testStatus);
330 } // emmcTest
332 /* Nothing past this point */