summaryrefslogtreecommitdiff
path: root/components/drivers/include
diff options
context:
space:
mode:
authorGuEe-GUI <[email protected]>2025-12-09 20:25:52 +0800
committerR b b666 <[email protected]>2025-12-10 17:04:23 +0800
commit22a77f2694dae2a675e27c7bf482960c86ba303e (patch)
tree95864f6aa4be9929b056b75decb4308a538e6234 /components/drivers/include
parente465ec567d2df14f7754cd04d66fd629d2addea6 (diff)
[dm][nvmem] support nvmem
Support for NVMEM(Non Volatile Memory) devices like EEPROM, EFUSES... Signed-off-by: GuEe-GUI <[email protected]>
Diffstat (limited to 'components/drivers/include')
-rw-r--r--components/drivers/include/drivers/nvmem.h81
-rw-r--r--components/drivers/include/rtdevice.h4
2 files changed, 85 insertions, 0 deletions
diff --git a/components/drivers/include/drivers/nvmem.h b/components/drivers/include/drivers/nvmem.h
new file mode 100644
index 0000000000..39aa04be97
--- /dev/null
+++ b/components/drivers/include/drivers/nvmem.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2023-02-25 GuEe-GUI the first version
+ */
+
+#ifndef __NVMEM_H__
+#define __NVMEM_H__
+
+#include <ref.h>
+
+#include <drivers/ofw.h>
+#include <drivers/core/dm.h>
+#include <drivers/core/driver.h>
+
+struct rt_nvmem_device
+{
+ struct rt_device parent;
+
+ int cells_nr;
+ rt_list_t cell_nodes;
+
+ rt_ssize_t (*reg_read)(struct rt_nvmem_device *, int offset, void *val, rt_size_t bytes);
+ rt_ssize_t (*reg_write)(struct rt_nvmem_device *, int offset, void *val, rt_size_t bytes);
+
+ rt_ssize_t size;
+ int word_size;
+ int stride;
+
+ rt_bool_t read_only;
+ rt_bool_t ignore_wp;
+ rt_base_t wp_pin;
+ rt_uint8_t wp_pin_active;
+
+ struct rt_ref ref;
+ struct rt_spinlock spinlock;
+
+ void *priv;
+};
+
+struct rt_nvmem_cell
+{
+ rt_list_t list;
+
+ int index;
+ const char *id;
+ const rt_bool_t free_able;
+
+ rt_uint32_t offset;
+ rt_uint32_t bytes;
+ rt_uint32_t bit_offset;
+ rt_uint32_t nbits;
+
+ struct rt_ref ref;
+
+ struct rt_ofw_node *np;
+ struct rt_nvmem_device *nvmem;
+};
+
+rt_err_t rt_nvmem_device_register(struct rt_nvmem_device *ndev);
+rt_err_t rt_nvmem_device_unregister(struct rt_nvmem_device *ndev);
+
+rt_err_t rt_nvmem_device_append_cell(struct rt_nvmem_device *ndev, struct rt_nvmem_cell *cell);
+
+rt_ssize_t rt_nvmem_cell_read(struct rt_nvmem_cell *cell, void *buffer, rt_size_t len);
+rt_ssize_t rt_nvmem_cell_write(struct rt_nvmem_cell *cell, void *buffer, rt_size_t len);
+
+rt_ssize_t rt_nvmem_cell_read_u8(struct rt_nvmem_cell *cell, rt_uint8_t *out_val);
+rt_ssize_t rt_nvmem_cell_read_u16(struct rt_nvmem_cell *cell, rt_uint16_t *out_val);
+rt_ssize_t rt_nvmem_cell_read_u32(struct rt_nvmem_cell *cell, rt_uint32_t *out_val);
+rt_ssize_t rt_nvmem_cell_read_u64(struct rt_nvmem_cell *cell, rt_uint64_t *out_val);
+
+struct rt_nvmem_cell *rt_nvmem_get_cell_by_index(struct rt_device *dev, int index);
+struct rt_nvmem_cell *rt_nvmem_get_cell_by_name(struct rt_device *dev, const char *id);
+void rt_nvmem_put_cell(struct rt_nvmem_cell *cell);
+
+#endif /* __NVMEM_H__ */
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index 9f427c49c4..88a388b6f0 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -125,6 +125,10 @@ extern "C" {
#ifdef RT_USING_THERMAL
#include "drivers/thermal.h"
#endif /* RT_USING_THERMAL */
+
+#ifdef RT_USING_NVMEM
+#include "drivers/nvmem.h"
+#endif /* RT_USING_NVMEM */
#endif /* RT_USING_DM */
#ifdef RT_USING_RTC