aboutsummaryrefslogtreecommitdiffstats
path: root/os/ex/Micron/n25q128_spi.h
diff options
context:
space:
mode:
Diffstat (limited to 'os/ex/Micron/n25q128_spi.h')
-rw-r--r--os/ex/Micron/n25q128_spi.h211
1 files changed, 211 insertions, 0 deletions
diff --git a/os/ex/Micron/n25q128_spi.h b/os/ex/Micron/n25q128_spi.h
new file mode 100644
index 000000000..0dd019e35
--- /dev/null
+++ b/os/ex/Micron/n25q128_spi.h
@@ -0,0 +1,211 @@
+/*
+ N25Q128 Flash Driver - Copyright (C) 2016 Giovanni Di Sirio
+
+ This file is part of ChibiOS.
+
+ ChibiOS 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 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS 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, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file n25q128_spi.h
+ * @brief N25Q128 over SPI driver header.
+ *
+ * @addtogroup n25q128_spi
+ * @{
+ */
+
+#ifndef N25Q128_H
+#define N25Q128_H
+
+#include "hal_flash.h"
+
+/*===========================================================================*/
+/* Driver constants. */
+/*===========================================================================*/
+
+/**
+ * @name Command codes
+ * @{
+ */
+#define N25Q128_CMD_RESET_ENABLE 0x66
+#define N25Q128_CMD_RESET_MEMORY 0x99
+#define N25Q128_CMD_READ_ID 0x9E
+#define N25Q128_CMD_READ_DISCOVERY_PARAMETER 0x5A
+#define N25Q128_CMD_READ 0x03
+#define N25Q128_CMD_FAST_READ 0x08
+#define N25Q128_CMD_WRITE_ENABLE 0x06
+#define N25Q128_CMD_WRITE_DISABLE 0x04
+#define N25Q128_CMD_READ_STATUS_REGISTER 0x05
+#define N25Q128_CMD_WRITE_STATUS_REGISTER 0x01
+#define N25Q128_CMD_READ_LOCK_REGISTER 0xE8
+#define N25Q128_CMD_WRITE_LOCK_REGISTER 0xE5
+#define N25Q128_CMD_READ_FLAG_STATUS_REGISTER 0x70
+#define N25Q128_CMD_CLEAR_FLAG_STATUS_REGISTER 0x50
+#define N25Q128_CMD_READ_NV_CONFIGURATION_REGISTER 0xB5
+#define N25Q128_CMD_WRITE_NV_CONFIGURATION_REGISTER 0xB1
+#define N25Q128_CMD_READ_V_CONF_REGISTER 0x85
+#define N25Q128_CMD_WRITE_V_CONF_REGISTER 0x81
+#define N25Q128_CMD_READ_ENHANCED_V_CONF_REGISTER 0x65
+#define N25Q128_CMD_WRITE_ENHANCED_V_CONF_REGISTER 0x61
+#define N25Q128_CMD_PAGE_PROGRAM 0x02
+#define N25Q128_CMD_SUBSECTOR_ERASE 0x20
+#define N25Q128_CMD_SECTOR_ERASE 0xD8
+#define N25Q128_CMD_BULK_ERASE 0xC7
+#define N25Q128_CMD_PROGRAM_ERASE_RESUME 0x7A
+#define N25Q128_CMD_PROGRAM_ERASE_SUSPEND 0x75
+#define N25Q128_CMD_READ_OTP_ARRAY 0x4B
+#define N25Q128_CMD_PROGRAM_OTP_ARRAY 0x42
+/** @} */
+
+/**
+ * @name Status register bits
+ * @{
+ */
+#define N25Q128_STS_PROGRAM_ERASE 0x80U
+#define N25Q128_STS_ERASE_SUSPEND 0x40U
+#define N25Q128_STS_ERASE_ERROR 0x20U
+#define N25Q128_STS_PROGRAM_ERROR 0x10U
+#define N25Q128_STS_VPP_ERROR 0x08U
+#define N25Q128_STS_PROGRAM_SUSPEND 0x04U
+#define N25Q128_STS_PROTECTION_ERROR 0x02U
+#define N25Q128_STS_RESERVED 0x01U
+#define N25Q128_STS_ALL_ERRORS (N25Q128_STS_ERASE_ERROR | \
+ N25Q128_STS_PROGRAM_ERROR | \
+ N25Q128_STS_VPP_ERROR | \
+ N25Q128_STS_PROTECTION_ERROR)
+/** @} */
+
+/*===========================================================================*/
+/* Driver pre-compile time settings. */
+/*===========================================================================*/
+
+/**
+ * @name Configuration options
+ * @{
+ */
+/**
+ * @brief N25Q128 shared SPI switch.
+ * @details If set to @p TRUE the device acquires SPI bus ownership
+ * on each transaction.
+ * @note The default is @p FALSE. Requires SPI_USE_MUTUAL_EXCLUSION
+ */
+#if !defined(N25Q128_SHARED_SPI) || defined(__DOXYGEN__)
+#define N25Q128_SHARED_SPI TRUE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the flash waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also when the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(N25Q128_NICE_WAITING) || defined(__DOXYGEN__)
+#define N25Q128_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief Uses 4kB sub-sectors rather than 64kB sectors.
+ */
+#if !defined(N25Q128_USE_SUB_SECTORS) || defined(__DOXYGEN__)
+#define N25Q128_USE_SUB_SECTORS FALSE
+#endif
+/** @} */
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+#if !HAL_USE_SPI
+#error "this module requires HAL_USE_SPI"
+#endif
+
+#if N25Q128_SHARED_SPI && !SPI_USE_MUTUAL_EXCLUSION
+#error "N25Q128_SHARED_SPI requires SPI_USE_MUTUAL_EXCLUSION"
+#endif
+
+/*===========================================================================*/
+/* Driver data structures and types. */
+/*===========================================================================*/
+
+/**
+ * @brief Type of a N25Q128 configuration structure.
+ */
+typedef struct {
+ /**
+ * @brief SPI driver associated to this L3GD20.
+ */
+ SPIDriver *spip;
+ /**
+ * @brief SPI configuration associated to this L3GD20.
+ */
+ const SPIConfig *spicfg;
+} N25Q128Config;
+
+/**
+ * @brief @p N25Q128 specific methods.
+ */
+#define _n25q128_methods \
+ _base_flash_methods
+
+/**
+ * @extends BaseGyroscopeVMT
+ *
+ * @brief @p L3GD20 virtual methods table.
+ */
+struct N25Q128DriverVMT {
+ _n25q128_methods
+};
+
+/**
+ * @extends BaseFlash
+ *
+ * @brief Type of N25Q128 flash class.
+ */
+typedef struct {
+ /**
+ * @brief BaseFlash Virtual Methods Table.
+ */
+ const struct N25Q128DriverVMT *vmt_baseflash;
+ _base_flash_data
+ /**
+ * @brief Current configuration data.
+ */
+ const N25Q128Config *config;
+} N25Q128Driver;
+
+/*===========================================================================*/
+/* Driver macros. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void n25q128ObjectInit(N25Q128Driver *devp);
+ void n25q128Start(N25Q128Driver *devp, const N25Q128Config *config);
+ void n25q128Stop(N25Q128Driver *devp);
+ void n25q128ReadId(N25Q128Driver *devp, uint8_t *rp, size_t n);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* N25Q128_H */
+
+/** @} */
+