diff options
| author | GuEe-GUI <[email protected]> | 2025-12-09 20:25:52 +0800 |
|---|---|---|
| committer | R b b666 <[email protected]> | 2025-12-10 17:04:23 +0800 |
| commit | 22a77f2694dae2a675e27c7bf482960c86ba303e (patch) | |
| tree | 95864f6aa4be9929b056b75decb4308a538e6234 /components/drivers/include | |
| parent | e465ec567d2df14f7754cd04d66fd629d2addea6 (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.h | 81 | ||||
| -rw-r--r-- | components/drivers/include/rtdevice.h | 4 |
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 |
