nuttx/fs/spiffs/src/spiffs.h
Xiang Xiao 40ef5bc6db libc: Move queue.h from include to include/nuttx
to avoid the conflict with libuv's queue.h

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-09-26 08:04:58 +02:00

328 lines
12 KiB
C

/****************************************************************************
* fs/spiffs/src/spiffs.h
*
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* This is a port of version 0.3.7 of SPIFFS by Peter Andersion. That
* version was originally released under the MIT license but is here re-
* released under the NuttX BSD license.
*
* Copyright (c) 2013-2017 Peter Andersson (pelleplutt1976@gmail.com)
*
* 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 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 NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER 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.
*
****************************************************************************/
#ifndef __FS_SPIFFS_SRC_SPIFFS_H
#define __FS_SPIFFS_SRC_SPIFFS_H
#if defined(__cplusplus)
extern "C"
{
#endif
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <nuttx/queue.h>
#include <nuttx/mutex.h>
#include <nuttx/mtd/mtd.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Flags on open file/directory options */
#define SFO_FLAG_UNLINKED (1 << 0)
/****************************************************************************
* Public Types
****************************************************************************/
enum spiffs_check_e
{
SPIFFS_CHECK_LOOKUP = 0,
SPIFFS_CHECK_INDEX,
SPIFFS_CHECK_PAGE
};
/* file system check callback report type */
enum spiffs_check_report_e
{
SPIFFS_CHECK_PROGRESS = 0,
SPIFFS_CHECK_ERROR,
SPIFFS_CHECK_FIX_INDEX,
SPIFFS_CHECK_FIX_LOOKUP,
SPIFFS_CHECK_DELETE_ORPHANED_INDEX,
SPIFFS_CHECK_DELETE_PAGE,
SPIFFS_CHECK_DELETE_BAD_FILE
};
/* spi read call function type */
typedef int32_t(*spiffs_read_t)(uint32_t addr, uint32_t size, uint8_t * dst);
/* spi write call function type */
typedef int32_t(*spiffs_write_t)(uint32_t addr,
uint32_t size,
uint8_t * src);
/* spi erase call function type */
typedef int32_t(*spiffs_erase_t)(uint32_t addr, uint32_t size);
/* spiffs SPI configuration struct */
/* This structure represents the current state of an SPIFFS volume */
struct spiffs_file_s; /* Forward reference */
struct spiffs_s
{
struct mtd_geometry_s geo; /* FLASH geometry */
rmutex_t lock; /* Supports mutually exclusive access */
dq_queue_t objq; /* A doubly linked list of open file objects */
FAR struct mtd_dev_s *mtd; /* The contained MTD interface */
FAR uint8_t *lu_work; /* Primary work buffer, size of a logical page */
FAR uint8_t *work; /* Secondary work buffer, size of a logical page */
FAR uint8_t *mtd_work; /* MTD I/O buffer for read-modify-write */
FAR void *cache; /* Cache memory */
#ifdef CONFIG_HAVE_LONG_LONG
off64_t media_size; /* Physical size of the SPI flash */
#else
off_t media_size; /* Physical size of the SPI flash */
#endif
int free_entry; /* Cursor for free blocks, entry index */
int lu_entry; /* Cursor when searching, entry index */
uint32_t total_pages; /* Total number of pages on the media */
uint32_t free_blocks; /* Current number of free blocks */
uint32_t alloc_pages; /* Current number of busy pages */
uint32_t deleted_pages; /* Current number of deleted pages */
#ifdef CONFIG_SPIFFS_GCDBG
uint32_t stats_gc_runs;
#endif
uint32_t cache_size; /* Cache size */
#ifdef CONFIG_SPIFFS_CACHEDBG
uint32_t cache_hits; /* Number of cache hits */
uint32_t cache_misses; /* Number of cache misses */
#endif
int16_t free_blkndx; /* Cursor for free blocks, block index */
int16_t lu_blkndx; /* Cursor when searching, block index */
int16_t max_erase_count; /* Max erase count amongst all blocks */
uint8_t pages_per_block; /* Pages per block */
};
/* This structure represents the state of an open file */
struct spiffs_cache_page_s; /* Forward reference */
struct spiffs_file_s
{
dq_entry_t entry; /* Supports a doubly linked list */
FAR struct spiffs_cache_page_s *cache_page;
int16_t crefs; /* Reference count */
int16_t objid; /* Unique ID of the file object */
uint8_t flags; /* See SFO_FLAG_* definitions */
int16_t objhdr_pgndx; /* Cached object index header page index */
int16_t objndx_pgndx; /* Cached offset object index page index */
int16_t objndx_spndx; /* Cached offset object index span index */
uint16_t oflags; /* File object open flags */
off_t size; /* Size of the file */
off_t offset; /* Current absolute offset */
};
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
struct stat; /* Forward reference */
/****************************************************************************
* Name: spiffs_stat_pgndx
*
* Description:
* Checks if there are any cached writes for the object ID associated with
* given file object. If so, these writes are flushed.
*
* Input Parameters:
* fobj - A reference to the file object to flush
*
* Returned Value:
* On success, then number of bytes flushed is returned. A negated errno
* value is returned on any failure.
*
****************************************************************************/
int spiffs_stat_pgndx(FAR struct spiffs_s *fs, int16_t pgndx, int16_t objid,
FAR struct stat *buf);
/****************************************************************************
* Name: spiffs_find_fobj_bypgndx
*
* Description:
* Given the page index of the object header, find the corresponding file
* object instance.
*
* Input Parameters:
* fs - A reference to the SPIFFS volume object instance
* pgndx - The page index to match
* ppfobj - A user provided location in which to return the matching file
* file object instance
*
* Returned Value:
* Zero (OK) is returned on success; A negated errno value is returned on
* any failure.
*
****************************************************************************/
int spiffs_find_fobj_bypgndx(FAR struct spiffs_s *fs, int16_t pgndx,
FAR struct spiffs_file_s **ppfobj);
/****************************************************************************
* Name: spiffs_find_fobj_byobjid
*
* Description:
* Given a object ID, find the corresponding file object instance
*
* Input Parameters:
* fs - A reference to the SPIFFS volume object instance
* objid - The object ID to match
* ppfobj - A user provided location in which to return the matching file
* file object instance
*
* Returned Value:
* Zero (OK) is returned on success; A negated errno value is returned on
* any failure.
*
****************************************************************************/
int spiffs_find_fobj_byobjid(FAR struct spiffs_s *fs, int16_t objid,
FAR struct spiffs_file_s **ppfobj);
/****************************************************************************
* Name: spiffs_fobj_flush
*
* Description:
* Checks if there are any cached writes for the object ID associated with
* given file object. If so, these writes are flushed.
*
* Input Parameters:
* fs - A reference to the SPIFFS volume object instance
* fobj - A reference to the file object to flush
*
* Returned Value:
* On success, then number of bytes flushed is returned. A negated errno
* value is returned on any failure.
*
****************************************************************************/
ssize_t spiffs_fobj_flush(FAR struct spiffs_s *fs,
FAR struct spiffs_file_s *fobj);
/****************************************************************************
* Name: spiffs_fobj_write
*
* Description:
* Write to a file object
*
* Input Parameters:
* fs - A reference to the volume structure
* fobj - A reference to the file object to write to
* buffer - The data to be written
* offset - The FLASH offset to be written
* len - The number of bytes to be written
*
* Returned Value:
* On success, then number of bytes written is returned. A negated errno
* value is returned on any failure.
*
****************************************************************************/
ssize_t spiffs_fobj_write(FAR struct spiffs_s *fs,
FAR struct spiffs_file_s *fobj,
FAR const void *buffer, off_t offset, size_t len);
/****************************************************************************
* Name: spiffs_fobj_read
*
* Description:
* Read from a file object
*
* Input Parameters:
* fs - A reference to the volume structure
* fobj - A reference to the file object to read from
* buffer - The location that the data is read to
* offset - The FLASH offset to be read
* len - The number of bytes to be read
* fpos - The file position to read from
*
* Returned Value:
* On success, then number of bytes written is returned. A negated errno
* value is returned on any failure.
*
****************************************************************************/
ssize_t spiffs_fobj_read(FAR struct spiffs_s *fs,
FAR struct spiffs_file_s *fobj, FAR void *buffer,
size_t buflen, off_t fpos);
/****************************************************************************
* Name: spiffs_fobj_free
*
* Description:
* Free all resources used by a file object
*
* Input Parameters:
* fs - A reference to the volume structure
* fobj - A reference to the file object to be removed
* unlink - Remove the file is it is appropriate to do so
*
* Returned Value:
* None
*
****************************************************************************/
void spiffs_fobj_free(FAR struct spiffs_s *fs,
FAR struct spiffs_file_s *fobj, bool unlink);
#if defined(__cplusplus)
}
#endif
#endif /* __FS_SPIFFS_SRC_SPIFFS_H */