RT1050_FreeRTOS_Hello/source/tasks/user_sdcard_task.c

101 lines
2.8 KiB
C

#include "FreeRTOS.h"
#include "board.h"
#include "clock_config.h"
#include "ff.h"
#include "diskio.h"
#include "fsl_debug_console.h"
#include "fsl_sd.h"
#include "fsl_sd_disk.h"
#include "pin_mux.h"
#include "sdmmc_config.h"
#include "semphr.h"
#include "task.h"
#include <stdio.h>
#include <string.h>
#include "fsl_common.h"
static volatile bool s_cardInserted = false;
static volatile bool s_cardInsertStatus = false;
static SemaphoreHandle_t s_fileAccessSemaphore = NULL;
static SemaphoreHandle_t s_CardDetectSemaphore = NULL;
static FATFS g_fileSystem;
static void SDCARD_DetectCallBack(bool isInserted, void *userData) {
s_cardInsertStatus = isInserted;
xSemaphoreGiveFromISR(s_CardDetectSemaphore, NULL);
}
static status_t DEMO_MakeFileSystem(void) {
FRESULT error;
const TCHAR driverNumberBuffer[4U] = {'S', 'D', ':', '/'};
if(f_mount(&g_fileSystem, driverNumberBuffer, 0U)) {
PRINTF("Mount volume failed.\r\n");
return kStatus_Fail;
}
#if(FF_FS_RPATH >= 2U)
error = f_chdrive((char const *)&driverNumberBuffer[0U]);
if(error) {
PRINTF("Change drive failed.\r\n");
return kStatus_Fail;
}
#endif
PRINTF("\r\nCreate directory......\r\n");
error = f_mkdir(_T("/images"));
if(error) {
if(error == FR_EXIST) {
PRINTF("Directory exists.\r\n");
} else {
PRINTF("Make directory failed.\r\n");
return kStatus_Fail;
}
}
return kStatus_Success;
}
void CardDetectTask(void *pvParameters) {
s_fileAccessSemaphore = xSemaphoreCreateBinary();
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) {
while(true) {
/* take card detect semaphore */
if(xSemaphoreTake(s_CardDetectSemaphore, portMAX_DELAY) == pdTRUE) {
if(s_cardInserted != s_cardInsertStatus) {
s_cardInserted = s_cardInsertStatus;
if(s_cardInserted) {
PRINTF("\r\nCard inserted.\r\n");
/* power off card */
SD_SetCardPower(&g_sd, false);
/* power on the card */
SD_SetCardPower(&g_sd, true);
if(DEMO_MakeFileSystem() != kStatus_Success) {
continue;
}
xSemaphoreGive(s_fileAccessSemaphore);
}
}
if(!s_cardInserted) {
PRINTF("\r\nPlease insert a card into board.\r\n");
}
}
}
} else {
PRINTF("\r\nSD host init fail\r\n");
}
vTaskSuspend(NULL);
}