/**
******************************************************************************
* @file Display/LCD_PicturesFromSDCard/Src/fatfs_storage.c
* @author MCD Application Team
* @version V1.0.0
* @date 17-February-2017
* @brief This file includes the Storage (FatFs) driver for the STM32F413H-DISCOVERY
* application.
******************************************************************************
* @attention
*
*
© Copyright © 2017 STMicroelectronics International N.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted, provided that the following conditions are met:
*
* 1. Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of other
* contributors to this software may be used to endorse or promote products
* derived from this software without specific written permission.
* 4. This software, including modifications and/or derivative works of this
* software, must execute solely and exclusively on microcontroller or
* microprocessor devices manufactured by or for STMicroelectronics.
* 5. Redistribution and use of this software other than as permitted under
* this license is void and will automatically terminate your rights under
* this license.
*
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
* SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "fatfs_storage.h"
/** @addtogroup STM32F413H-DISCOVERY_FAT_FS
* @{
*/
/** @defgroup FATFS_STORAGE
* @brief This file includes the Storage (FatFs) driver for the STM32F413H-DISCOVERY
* application.
* @{
*/
/** @defgroup FATFS_STORAGE_Private_Types
* @{
*/
/**
* @}
*/
/** @defgroup FATFS_STORAGE_Private_Defines
* @{
*/
/**
* @}
*/
/** @defgroup FATFS_STORAGE_Private_Macros
* @{
*/
/**
* @}
*/
/** @defgroup FATFS_STORAGE_Private_Variables
* @{
*/
uint8_t sector[512];
FATFS fs;
FILINFO fno;
DIR dir;
FIL F;
const uint8_t SlidesCheck[2] =
{
0x42, 0x4D
};
uint32_t BytesRead = 0;
/**
* @}
*/
/** @defgroup FATFS_STORAGE_Private_FunctionPrototypes
* @{
*/
/**
* @}
*/
/** @defgroup FATFS_STORAGE_Private_Functions
* @{
*/
/**
* @brief SDCARD Initialization for FatFs
* @param None
* @retval err : Error status (0=> success, 1=> fail)
*/
uint32_t Storage_Init(void)
{
BSP_SD_Init();
/****************** FatFs Volume Acess ******************************/
if(f_mount(&fs, (TCHAR const*)"",0))
{
return 1;
}
return 0;
}
/**
* @brief Open a file and copy its content to a buffer
* @param DirName: the Directory name to open
* @param FileName: the file name to open
* @param BufferAddress: A pointer to a buffer to copy the file to
* @param FileLen: the File lenght
* @retval err: Error status (0=> success, 1=> fail)
*/
uint32_t Storage_OpenReadFile(uint8_t *Address, const char* BmpName)
{
uint32_t index = 0, size = 0, i1 = 0;
uint32_t BmpAddress;
FIL F1;
if (f_open(&F1, BmpName, FA_READ) != FR_OK)
{
while(1)
{
}
}
if (f_read (&F1, sector, 30, (UINT *)&BytesRead) != FR_OK)
{
while(1)
{
}
}
BmpAddress = (uint32_t)sector;
/* Read bitmap size */
size = *(uint16_t *) (BmpAddress + 2);
size |= (*(uint16_t *) (BmpAddress + 4)) << 16;
/* Get bitmap data address offset */
index = *(uint16_t *) (BmpAddress + 10);
index |= (*(uint16_t *) (BmpAddress + 12)) << 16;
f_close (&F1);
f_open (&F1, BmpName, FA_READ);
if (size > 240*240*2)
{
size = 240*240*2;
}
do
{
if (size < 256*2)
{
i1 = size;
}
else
{
i1 = 256*2;
}
size -= i1;
f_read (&F1, sector, i1, (UINT *)&BytesRead);
for (index = 0; index < i1; index++)
{
*(__IO uint8_t*) (Address) = *(__IO uint8_t *)BmpAddress;
BmpAddress++;
Address++;
}
BmpAddress = (uint32_t)sector;
}
while (size > 0);
f_close (&F1);
return 1;
}
/**
* @brief Open a file and copy its content to a buffer
* @param DirName: the Directory name to open
* @param FileName: the file name to open
* @param BufferAddress: A pointer to a buffer to copy the file to
* @param FileLen: the File lenght
* @retval err: Error status (0=> success, 1=> fail)
*/
uint32_t Storage_CheckBitmapFile(const char* BmpName, uint32_t *FileLen)
{
if(f_mount(&fs, (TCHAR const*)"",0))
{
return 1;
}
if (f_open (&F, BmpName, FA_READ))
{
return 2;
}
f_read (&F, sector, 6, (UINT *)&BytesRead);
if (Buffercmp((uint8_t *)SlidesCheck, (uint8_t *) sector, 2) != 0)
{
return 3;
}
return 0;
}
/**
* @brief List up to 25 file on the root directory with extension .BMP
* @param None
* @retval The number of the found files
*/
uint32_t Storage_GetDirectoryBitmapFiles (const char* DirName, char* Files[])
{
FATFS fs;
FILINFO fno;
DIR dir;
uint32_t counter = 0, index = 0;
FRESULT res;
/* Open filesystem */
if(f_mount(&fs, (TCHAR const*)"",0) != FR_OK)
{
return 0;
}
/* Open directory */
res = f_opendir(&dir, DirName);
if (res == FR_OK)
{
for (;;)
{
res = f_readdir(&dir, &fno);
if (res != FR_OK || fno.fname[0] == 0)
break;
if (fno.fname[0] == '.')
continue;
if (!(fno.fattrib & AM_DIR))
{
do
{
counter++;
}
while (fno.fname[counter] != 0x2E); /* . */
if (index < MAX_BMP_FILES)
{
if ((fno.fname[counter + 1] == 'B') && (fno.fname[counter + 2] == 'M') && (fno.fname[counter + 3] == 'P'))
{
if(sizeof(fno.fname) <= (MAX_BMP_FILE_NAME + 2))
{
sprintf (Files[index], "%s", fno.fname);
index++;
}
}
}
counter = 0;
}
}
}
f_mount(NULL, (TCHAR const*)"",0);
return index;
}
/**
* @brief Compares two buffers.
* @param pBuffer1, pBuffer2: buffers to be compared.
* @param BufferLength: buffer's length.
* @retval 0: pBuffer1 identical to pBuffer2
* 1: pBuffer1 differs from pBuffer2
*/
uint8_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
while (BufferLength--)
{
if (*pBuffer1 != *pBuffer2)
{
return 1;
}
pBuffer1++;
pBuffer2++;
}
return 0;
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/