summaryrefslogtreecommitdiff
path: root/components/drivers/include
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2018-09-21 17:09:46 +0800
committerGitHub <[email protected]>2018-09-21 17:09:46 +0800
commitb5202d17fbd8e226a737caa38d536a4cd7a55956 (patch)
tree4df28e82517bc51eb2208933e54848560def5982 /components/drivers/include
parentf7423741f2868cca2a64619a0907668acf02bd5d (diff)
parentb611f317fe83aa262879a07d77c8102434d3b847 (diff)
Merge branch 'master' into dev
Diffstat (limited to 'components/drivers/include')
-rw-r--r--components/drivers/include/drivers/mtd.h109
-rw-r--r--components/drivers/include/drivers/mtdnand.h105
-rw-r--r--components/drivers/include/drivers/mtdnor.h39
-rw-r--r--components/drivers/include/rtdevice.h25
4 files changed, 262 insertions, 16 deletions
diff --git a/components/drivers/include/drivers/mtd.h b/components/drivers/include/drivers/mtd.h
new file mode 100644
index 0000000000..9cc7c470d2
--- /dev/null
+++ b/components/drivers/include/drivers/mtd.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/*
+ * File : mtd.h
+ *
+ * Change Logs:
+ * Date Author Notes
+ 2018-09-10 heyuanjie87 first version
+
+ */
+
+#ifndef __MTD_H__
+#define __MTD_H__
+
+#include <rtthread.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#define MTD_TYPE_NOR 1
+#define MTD_TYPE_NAND 2
+
+ /**
+ * MTD operation modes
+ *
+ * @MTD_OPM_PLACE_OOB: OOB data are placed at the given offset (default)
+ * @MTD_OPM_AUTO_OOB: OOB data are automatically placed at the free areas
+ * @MTD_OPM_RAW: data are transferred as-is, with no error correction;
+ */
+enum mtd_opm
+{
+ MTD_OPM_PLACE_OOB = 0,
+ MTD_OPM_AUTO_OOB = 1,
+ MTD_OPM_RAW = 2,
+};
+
+#ifndef loff_t
+typedef long loff_t;
+#endif
+
+struct mtd_oob_region
+{
+ uint8_t offset;
+ uint8_t length;
+};
+
+typedef struct mtd_info
+{
+ struct rt_device parent;
+
+ const struct mtd_ops *ops;
+
+ uint16_t oob_size;
+ uint16_t sector_size; /* Minimal writable flash unit size */
+ uint32_t block_size:28; /* Erase size for the device */
+ uint32_t type:4;
+
+ size_t size; /* Total size of the MTD */
+ loff_t offset; /* At which this MTD starts, from the beginning of the MEMORY */
+ struct mtd_info *master;
+
+ void *priv;
+}rt_mtd_t;
+
+struct mtd_io_desc
+{
+ uint8_t mode; /* operation mode(enum mtd_opm) */
+ uint8_t ooblen; /* number of oob bytes to write/read */
+ uint8_t oobretlen; /* number of oob bytes written/read */
+ uint8_t ooboffs; /* offset in the oob area */
+ uint8_t *oobbuf;
+
+ size_t datlen; /* number of data bytes to write/read */
+ size_t datretlen; /* number of data bytes written/read */
+ uint8_t *datbuf; /* if NULL only oob are read/written */
+};
+
+struct mtd_ops
+{
+ int(*erase)(rt_mtd_t *mtd, loff_t addr, size_t len); /* return 0 if success */
+ int(*read) (rt_mtd_t *mtd, loff_t from, struct mtd_io_desc *ops); /* return 0 if success */
+ int(*write) (rt_mtd_t *mtd, loff_t to, struct mtd_io_desc *ops); /* return 0 if success */
+ int(*isbad) (rt_mtd_t *mtd, uint32_t block); /* return 1 if bad, 0 not bad */
+ int(*markbad) (rt_mtd_t *mtd, uint32_t block); /* return 0 if success */
+};
+
+struct mtd_part
+{
+ const char *name; /* name of the MTD partion */
+ loff_t offset; /* start addr of partion */
+ size_t size; /* size of partion */
+};
+
+int rt_mtd_erase(rt_mtd_t *mtd, loff_t addr, size_t size);
+int rt_mtd_block_erase(rt_mtd_t *mtd, uint32_t block);
+int rt_mtd_read_oob(rt_mtd_t *mtd, loff_t from, struct mtd_io_desc *desc);
+int rt_mtd_write_oob(rt_mtd_t *mtd, loff_t to, struct mtd_io_desc *desc);
+int rt_mtd_read(rt_mtd_t *mtd, loff_t from, uint8_t *buf, size_t len);
+int rt_mtd_write(rt_mtd_t *mtd, loff_t to, const uint8_t *buf, size_t len);
+int rt_mtd_block_markbad(rt_mtd_t *mtd, uint32_t block);
+int rt_mtd_block_isbad(rt_mtd_t *mtd, uint32_t block);
+
+rt_mtd_t* rt_mtd_get(const char *name);
+int rt_mtd_register(rt_mtd_t *master, const struct mtd_part *parts, int np);
+
+#endif
diff --git a/components/drivers/include/drivers/mtdnand.h b/components/drivers/include/drivers/mtdnand.h
new file mode 100644
index 0000000000..c767e4ac9c
--- /dev/null
+++ b/components/drivers/include/drivers/mtdnand.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/*
+ * File : mtdnand.h
+ *
+ * Change Logs:
+ * Date Author Notes
+ 2018-09-10 heyuanjie87 first version
+
+ */
+
+#ifndef _MTDNAND_H_
+#define _MTDNAND_H_
+
+#include "mtd.h"
+
+ /* Status bits */
+#define NAND_STATUS_FAIL 0x01
+#define NAND_STATUS_FAIL_N1 0x02
+#define NAND_STATUS_WP 0x80
+
+typedef enum
+{
+ NAND_CMD_PAGE_RD, /* read data to chip's page buffer,do WaitBusy after this cmd in low driver */
+ NAND_CMD_PAGE_WR0, /* write data to chip's page buffer */
+ NAND_CMD_PAGE_WR1, /* do flash programe */
+ NAND_CMD_BLK_ERASE, /* erase block */
+ NAND_CMD_ECC_EN, /* enable gen HWECC */
+ NAND_CMD_ECC_DIS /* disable gen HWECC */
+} nand_cmd_t;
+
+typedef enum
+{
+ NAND_ECCM_NONE,
+ NAND_ECCM_HW,
+} nand_eccmode_t;
+
+struct nand_chip;
+struct nand_ops;
+
+/**
+* struct nand_buffers - buffer structure for read/write
+* @ecccalc: buffer pointer for calculated ECC, size is oobsize.
+* @ecccode: buffer pointer for ECC read from flash, size is oobsize.
+*
+*/
+struct nand_buffers
+{
+ uint8_t *ecccalc;
+ uint8_t *ecccode;
+};
+
+struct nand_ecc
+{
+ uint8_t mode; /* nand_eccmode_t */
+ uint8_t bytes; /* gen ecc bytes per ecc step(usually 3) */
+ uint16_t stepsize:12; /* min 256 */
+ uint16_t _step:4; /* */
+
+ /* driver must set the two interface if HWECC */
+ void (*calculate)(struct nand_chip *chip, const uint8_t *dat, uint8_t *ecc_code);
+ /* return max bit flips if can't correct,return -1 ECC is error(0 success) */
+ int(*correct)(struct nand_chip *chip, uint8_t *dat, uint8_t *read_ecc, uint8_t *calc_ecc);
+ /* ignore if NONECC */
+ const struct mtd_oob_region *layout;
+};
+
+typedef struct nand_chip
+{
+ rt_mtd_t parent;
+
+ /* driver must init these */
+ const struct nand_ops *ops;
+ struct nand_ecc ecc;
+ const struct mtd_oob_region *freelayout;
+
+ /* driver do not touch */
+ struct nand_buffers buffers;
+ uint8_t *oob_poi;
+ uint8_t *pagebuf;
+ uint32_t size;
+ uint16_t oobsize;
+ uint8_t pages_pb;
+ uint16_t page_size;
+ int(*read_page)(struct nand_chip *chip, uint8_t *buf, int oob_required, int page);
+ int(*write_page)(struct nand_chip *chip, const uint8_t *buf, int oob_required, int page);
+}rt_nand_t;
+
+struct nand_ops
+{
+ int(*cmdfunc)(rt_nand_t *nand, int cmd, int page, int offset); /* send nand operation cmd, return Status bits(0 success),
+ if nand is busy please wait in low driver */
+ int(*read_buf)(rt_nand_t *nand, uint8_t *buf, int len); /* read data from nand chip's page buffer */
+ int(*write_buf)(rt_nand_t *nand, const uint8_t *buf, int len);/* write data to nand chip's page buffer */
+ int(*isbad)(rt_nand_t *nand, uint32_t blk); /* if NULL OOB[0] used as bad mark(not 0xff is bad) */
+ int(*markbad)(rt_nand_t *nand, uint32_t blk); /* if NULL OOB[0] used as bad mark(set to 0x00) */
+};
+
+int rt_mtd_nand_init(rt_nand_t *nand, int blk_size, int page_size, int oob_size);
+
+#endif /* MTD_NAND_H_ */
diff --git a/components/drivers/include/drivers/mtdnor.h b/components/drivers/include/drivers/mtdnor.h
new file mode 100644
index 0000000000..709efe29a4
--- /dev/null
+++ b/components/drivers/include/drivers/mtdnor.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/*
+ * File : mtdnor.h
+ *
+ * Change Logs:
+ * Date Author Notes
+ 2018-09-10 heyuanjie87 first version
+
+ */
+
+#ifndef __MTDNOR_H__
+#define __MTDNOR_H__
+
+#include <drivers/mtd.h>
+
+struct nor_ops;
+
+typedef struct
+{
+ rt_mtd_t parent;
+
+ const struct nor_ops *ops; /* operations interface */
+}rt_nor_t;
+
+struct nor_ops
+{
+ int (*erase)(rt_nor_t *nor, loff_t addr, size_t len); /* return success erased len or error code */
+ int (*read)(rt_nor_t *nor, loff_t addr, uint8_t *buf, size_t len); /* return success data size or error code */
+ int (*write)(rt_nor_t *nor, loff_t addr, const uint8_t *buf, size_t len); /* return success data size or error code */
+};
+
+int rt_mtd_nor_init(rt_nor_t *nor, int blksize);
+
+#endif
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index b7fec50b73..e0499dcd20 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -1,21 +1,7 @@
/*
- * File : rtdevice.h
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
+ * Copyright (c) 2006-2018, RT-Thread Development Team
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
@@ -121,6 +107,13 @@ extern "C" {
#include "drivers/wlan.h"
#endif
+#ifdef MTD_USING_NOR
+#include "drivers/mtdnor.h"
+#endif
+#ifdef MTD_USING_NAND
+#include "drivers/mtdnand.h"
+#endif
+
#ifdef __cplusplus
}
#endif