diff --git a/fs/driver/Make.defs b/fs/driver/Make.defs index e8fb165881..46890334c4 100644 --- a/fs/driver/Make.defs +++ b/fs/driver/Make.defs @@ -49,6 +49,9 @@ CSRCS += fs_blockpartition.c ifeq ($(CONFIG_MTD),y) CSRCS += fs_registermtddriver.c fs_unregistermtddriver.c fs_findmtddriver.c CSRCS += fs_mtdproxy.c +ifeq ($(CONFIG_MTD_PARTITION),y) +CSRCS += fs_mtdpartition.c +endif endif ifneq ($(CONFIG_DISABLE_PSEUDOFS_OPERATIONS),y) diff --git a/fs/driver/fs_mtdpartition.c b/fs/driver/fs_mtdpartition.c new file mode 100644 index 0000000000..620c6f16f8 --- /dev/null +++ b/fs/driver/fs_mtdpartition.c @@ -0,0 +1,116 @@ +/**************************************************************************** + * fs/driver/fs_mtdpartition.c + * + * Copyright (C) 2018 Pinecone Inc. All rights reserved. + * Author: Xiang Xiao + * + * 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +#include "driver/driver.h" +#include "inode/inode.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: register_mtdpartition + * + * Description: + * Register a mtd partition driver inode the pseudo file system. + * + * Input Parameters: + * partition - The path to the partition inode + * parent - The path to the parent inode + * firstblock - The offset in block to the partition + * nblocks - The number of block in the partition + * + * Returned Value: + * Zero on success (with the inode point in 'inode'); A negated errno + * value is returned on a failure (all error values returned by + * inode_reserve): + * + * EINVAL - 'path' is invalid for this operation + * EEXIST - An inode already exists at 'path' + * ENOMEM - Failed to allocate in-memory resources for the operation + * + ****************************************************************************/ + +int register_mtdpartition(FAR const char *partition, + mode_t mode, FAR const char *parent, + off_t firstblock, size_t nblocks) +{ + FAR struct mtd_dev_s *part; + FAR struct inode *mtd; + int ret; + + /* Find the mtd driver */ + + ret = find_mtddriver(parent, &mtd); + if (ret < 0) + { + return ret; + } + + /* Create the mtd partition */ + + part = mtd_partition(mtd->u.i_mtd, firstblock, nblocks); + inode_release(mtd); + if (part == NULL) + { + return -EINVAL; + } + +#ifdef CONFIG_MTD_PARTITION_NAMES + mtd_setpartitionname(part, partition); +#endif + + /* Register the mtd partition */ + + ret = register_mtddriver(partition, part, mode, part); + if (ret < 0) + { + return ret; + } + + return OK; +} + diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h index fe22dcce01..334021211e 100644 --- a/include/nuttx/fs/fs.h +++ b/include/nuttx/fs/fs.h @@ -641,11 +641,40 @@ int unregister_blockdriver(FAR const char *path); * ****************************************************************************/ -#ifdef CONFIG_MTD +#ifdef CONFIG_MTD_PARTITION int register_mtddriver(FAR const char *path, FAR struct mtd_dev_s *mtd, mode_t mode, FAR void *priv); #endif +/**************************************************************************** + * Name: register_mtdpartition + * + * Description: + * Register a mtd partition driver inode the pseudo file system. + * + * Input Parameters: + * partition - The path to the partition inode + * parent - The path to the parent inode + * firstblock - The offset in block to the partition + * nblocks - The number of block in the partition + * + * Returned Value: + * Zero on success (with the inode point in 'inode'); A negated errno + * value is returned on a failure (all error values returned by + * inode_reserve): + * + * EINVAL - 'path' is invalid for this operation + * EEXIST - An inode already exists at 'path' + * ENOMEM - Failed to allocate in-memory resources for the operation + * + ****************************************************************************/ + +#ifdef CONFIG_MTD +int register_mtdpartition(FAR const char *partition, + mode_t mode, FAR const char *parent, + off_t firstblock, size_t nblocks); +#endif + /**************************************************************************** * Name: unregister_mtddriver *