MCUXpresso_LPC55S69/boards/lpcxpresso55s69/demo_apps/multi_peripherals_test/cm33_core0/sdcard.c

171 lines
5.3 KiB
C

/*
* Copyright 2020 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_debug_console.h"
#include "board.h"
#include "demo_config.h"
#include "sdmmc_config.h"
#include "fsl_sd.h"
#include "fsl_sd_disk.h"
#include "ff.h"
#include "task.h"
#include "semphr.h"
#include "event_groups.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define BUFFER_SIZE 100
/*******************************************************************************
* Variables
******************************************************************************/
sd_card_t g_sdCard;
static FATFS g_fileSystem; /* File system object */
static FIL g_fileObject; /* File object */
const TCHAR g_driverNumberBuffer[3] = {SDDISK + '0', ':', '/'};
SDK_ALIGN(uint8_t g_bufferWrite[BUFFER_SIZE], BOARD_SDMMC_DATA_BUFFER_ALIGN_SIZE);
SDK_ALIGN(uint8_t g_bufferRead[BUFFER_SIZE], BOARD_SDMMC_DATA_BUFFER_ALIGN_SIZE);
static QueueHandle_t s_CardDetectSemaphore = NULL;
extern EventGroupHandle_t g_errorEvent;
/*******************************************************************************
* Prototypes
******************************************************************************/
static void SDCARD_DetectCallBack(bool isInserted, void *userData);
static status_t sdcardWaitCardInsert(void);
static void sdcard_task(void *pvParameters);
/*******************************************************************************
* Code
******************************************************************************/
static void SDCARD_DetectCallBack(bool isInserted, void *userData)
{
xSemaphoreGiveFromISR(s_CardDetectSemaphore, NULL);
}
void sdcard_init(void)
{
if (xTaskCreate(sdcard_task, "SDCard Task", 1000UL / sizeof(portSTACK_TYPE), NULL, 4U, NULL) != pdPASS)
{
PRINTF("SDCard Task Creation Failed!\r\n");
while (1)
;
}
}
static status_t sdcardWaitCardInsert(void)
{
s_CardDetectSemaphore = xSemaphoreCreateBinary();
BOARD_SD_Config(&g_sd, SDCARD_DetectCallBack, BOARD_SDMMC_SD_HOST_IRQ_PRIORITY, NULL);
/* SD host init function */
if (SD_HostInit(&g_sd) != kStatus_Success)
{
PRINTF("\r\nSD host init fail\r\n");
return kStatus_Fail;
}
return kStatus_Success;
}
static void sdcard_task(void *pvParameters)
{
FRESULT error;
UINT bytesRead;
UINT bytesWritten;
if (sdcardWaitCardInsert() != kStatus_Success)
{
PRINTF("SDCard Init Failed!\r\n");
return;
}
while (1)
{
if (xSemaphoreTake(s_CardDetectSemaphore, portMAX_DELAY) == pdTRUE)
{
if (f_mount(&g_fileSystem, g_driverNumberBuffer, 0U))
{
PRINTF("SDCARD: Mount volume failed!\r\n");
continue;
}
#if (FF_FS_RPATH >= 2U)
error = f_chdrive((char const *)&g_driverNumberBuffer[0U]);
if (error)
{
PRINTF("Change drive failed.\r\n");
continue;
}
#endif
error = f_open(&g_fileObject, _T("testfile.txt"), (FA_READ | FA_WRITE | FA_CREATE_ALWAYS));
if (error)
{
if (error == FR_EXIST)
{
PRINTF("SDCARD: File exists.\r\n");
}
else
{
PRINTF("SDCARD: Failed to open testfile.txt!\r\n");
continue;
}
}
memset(g_bufferWrite, 'a', sizeof(g_bufferWrite));
g_bufferWrite[BUFFER_SIZE - 2U] = '\r';
g_bufferWrite[BUFFER_SIZE - 1U] = '\n';
PRINTF("\r\nSDCARD: Write/read file ......\r\n");
PRINTF("\r\nWrite to testfile.txt.\r\n");
error = f_write(&g_fileObject, g_bufferWrite, sizeof(g_bufferWrite), &bytesWritten);
if ((error) || (bytesWritten != sizeof(g_bufferWrite)))
{
PRINTF("SDCARD: Write file failed. \r\n");
continue;
}
/* Move the file pointer */
if (f_lseek(&g_fileObject, 0U))
{
PRINTF("SDCARD: Set file pointer position failed. \r\n");
continue;
}
PRINTF("\r\nRead from testfile.txt.\r\n");
memset(g_bufferRead, 0U, sizeof(g_bufferRead));
error = f_read(&g_fileObject, g_bufferRead, sizeof(g_bufferRead), &bytesRead);
if (error || (bytesRead != sizeof(g_bufferRead)))
{
PRINTF("SDCARD: Failed to read file!\r\n");
continue;
}
PRINTF("Compare the read/write content......\r\n");
if (memcmp(g_bufferRead, g_bufferRead, sizeof(g_bufferWrite)) == 0)
{
PRINTF("SDCARD Tested OK!\r\n");
f_close(&g_fileObject);
break;
}
else
{
PRINTF("SDCARD: File content not correct!\r\n");
PRINTF("SDCARD: Expected: %s\r\n", g_bufferWrite);
PRINTF("SDCARD: Found: %s\r\n", g_bufferRead);
xEventGroupSetBits(g_errorEvent, 1U);
f_close(&g_fileObject);
break;
}
}
}
vTaskSuspend(NULL);
}