202 lines
6.1 KiB
C
202 lines
6.1 KiB
C
/**
|
|
* Copyright (c) 2016 - 2020, Nordic Semiconductor ASA
|
|
*
|
|
* 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. Redistributions of source code must retain the above copyright notice, this
|
|
* list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
|
* such product, 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 Nordic Semiconductor ASA nor the names of its
|
|
* contributors may be used to endorse or promote products derived from this
|
|
* software without specific prior written permission.
|
|
*
|
|
* 4. This software, with or without modification, must only be used with a
|
|
* Nordic Semiconductor ASA integrated circuit.
|
|
*
|
|
* 5. Any software provided in binary form under this license must not be reverse
|
|
* engineered, decompiled, modified and/or disassembled.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
|
|
*
|
|
*/
|
|
/** @file
|
|
* @defgroup fatfs_example_main main.c
|
|
* @{
|
|
* @ingroup fatfs_example
|
|
* @brief FATFS Example Application main file.
|
|
*
|
|
* This file contains the source code for a sample application using FAT filesystem and SD card library.
|
|
*
|
|
*/
|
|
|
|
|
|
#include "nrf.h"
|
|
#include "bsp.h"
|
|
#include "ff.h"
|
|
#include "diskio_blkdev.h"
|
|
#include "nrf_block_dev_sdc.h"
|
|
|
|
|
|
#include "nrf_log.h"
|
|
#include "nrf_log_ctrl.h"
|
|
#include "nrf_log_default_backends.h"
|
|
|
|
#define FILE_NAME "NORDIC.TXT"
|
|
#define TEST_STRING "SD card example."
|
|
|
|
#define SDC_SCK_PIN ARDUINO_13_PIN ///< SDC serial clock (SCK) pin.
|
|
#define SDC_MOSI_PIN ARDUINO_11_PIN ///< SDC serial data in (DI) pin.
|
|
#define SDC_MISO_PIN ARDUINO_12_PIN ///< SDC serial data out (DO) pin.
|
|
#define SDC_CS_PIN ARDUINO_10_PIN ///< SDC chip select (CS) pin.
|
|
|
|
/**
|
|
* @brief SDC block device definition
|
|
* */
|
|
NRF_BLOCK_DEV_SDC_DEFINE(
|
|
m_block_dev_sdc,
|
|
NRF_BLOCK_DEV_SDC_CONFIG(
|
|
SDC_SECTOR_SIZE,
|
|
APP_SDCARD_CONFIG(SDC_MOSI_PIN, SDC_MISO_PIN, SDC_SCK_PIN, SDC_CS_PIN)
|
|
),
|
|
NFR_BLOCK_DEV_INFO_CONFIG("Nordic", "SDC", "1.00")
|
|
);
|
|
|
|
/**
|
|
* @brief Function for demonstrating FAFTS usage.
|
|
*/
|
|
static void fatfs_example()
|
|
{
|
|
static FATFS fs;
|
|
static DIR dir;
|
|
static FILINFO fno;
|
|
static FIL file;
|
|
|
|
uint32_t bytes_written;
|
|
FRESULT ff_result;
|
|
DSTATUS disk_state = STA_NOINIT;
|
|
|
|
// Initialize FATFS disk I/O interface by providing the block device.
|
|
static diskio_blkdev_t drives[] =
|
|
{
|
|
DISKIO_BLOCKDEV_CONFIG(NRF_BLOCKDEV_BASE_ADDR(m_block_dev_sdc, block_dev), NULL)
|
|
};
|
|
|
|
diskio_blockdev_register(drives, ARRAY_SIZE(drives));
|
|
|
|
NRF_LOG_INFO("Initializing disk 0 (SDC)...");
|
|
for (uint32_t retries = 3; retries && disk_state; --retries)
|
|
{
|
|
disk_state = disk_initialize(0);
|
|
}
|
|
if (disk_state)
|
|
{
|
|
NRF_LOG_INFO("Disk initialization failed.");
|
|
return;
|
|
}
|
|
|
|
uint32_t blocks_per_mb = (1024uL * 1024uL) / m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_size;
|
|
uint32_t capacity = m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_count / blocks_per_mb;
|
|
NRF_LOG_INFO("Capacity: %d MB", capacity);
|
|
|
|
NRF_LOG_INFO("Mounting volume...");
|
|
ff_result = f_mount(&fs, "", 1);
|
|
if (ff_result)
|
|
{
|
|
NRF_LOG_INFO("Mount failed.");
|
|
return;
|
|
}
|
|
|
|
NRF_LOG_INFO("\r\n Listing directory: /");
|
|
ff_result = f_opendir(&dir, "/");
|
|
if (ff_result)
|
|
{
|
|
NRF_LOG_INFO("Directory listing failed!");
|
|
return;
|
|
}
|
|
|
|
do
|
|
{
|
|
ff_result = f_readdir(&dir, &fno);
|
|
if (ff_result != FR_OK)
|
|
{
|
|
NRF_LOG_INFO("Directory read failed.");
|
|
return;
|
|
}
|
|
|
|
if (fno.fname[0])
|
|
{
|
|
if (fno.fattrib & AM_DIR)
|
|
{
|
|
NRF_LOG_RAW_INFO(" <DIR> %s",(uint32_t)fno.fname);
|
|
}
|
|
else
|
|
{
|
|
NRF_LOG_RAW_INFO("%9lu %s", fno.fsize, (uint32_t)fno.fname);
|
|
}
|
|
}
|
|
}
|
|
while (fno.fname[0]);
|
|
NRF_LOG_RAW_INFO("");
|
|
|
|
NRF_LOG_INFO("Writing to file " FILE_NAME "...");
|
|
ff_result = f_open(&file, FILE_NAME, FA_READ | FA_WRITE | FA_OPEN_APPEND);
|
|
if (ff_result != FR_OK)
|
|
{
|
|
NRF_LOG_INFO("Unable to open or create file: " FILE_NAME ".");
|
|
return;
|
|
}
|
|
|
|
ff_result = f_write(&file, TEST_STRING, sizeof(TEST_STRING) - 1, (UINT *) &bytes_written);
|
|
if (ff_result != FR_OK)
|
|
{
|
|
NRF_LOG_INFO("Write failed\r\n.");
|
|
}
|
|
else
|
|
{
|
|
NRF_LOG_INFO("%d bytes written.", bytes_written);
|
|
}
|
|
|
|
(void) f_close(&file);
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @brief Function for main application entry.
|
|
*/
|
|
int main(void)
|
|
{
|
|
bsp_board_init(BSP_INIT_LEDS);
|
|
|
|
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
|
|
NRF_LOG_DEFAULT_BACKENDS_INIT();
|
|
|
|
NRF_LOG_INFO("FATFS example started.");
|
|
|
|
fatfs_example();
|
|
|
|
while (true)
|
|
{
|
|
__WFE();
|
|
}
|
|
}
|
|
|
|
/** @} */
|