Skip to content

Commit 3e29fe8

Browse files
committed
[dm][nvmem] support nvmem
Support for NVMEM(Non Volatile Memory) devices like EEPROM, EFUSES... Signed-off-by: GuEe-GUI <[email protected]>
1 parent 2fb53c8 commit 3e29fe8

File tree

6 files changed

+661
-0
lines changed

6 files changed

+661
-0
lines changed

components/drivers/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ rsource "regulator/Kconfig"
3232
rsource "reset/Kconfig"
3333
rsource "thermal/Kconfig"
3434
rsource "virtio/Kconfig"
35+
rsource "nvmem/Kconfig"
3536
rsource "dma/Kconfig"
3637
rsource "mfd/Kconfig"
3738
rsource "ofw/Kconfig"
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright (c) 2006-2023, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2023-02-25 GuEe-GUI the first version
9+
*/
10+
11+
#ifndef __NVMEM_H__
12+
#define __NVMEM_H__
13+
14+
#include <ref.h>
15+
16+
#include <drivers/ofw.h>
17+
#include <drivers/core/dm.h>
18+
#include <drivers/core/driver.h>
19+
20+
struct rt_nvmem_device
21+
{
22+
struct rt_device parent;
23+
24+
int cells_nr;
25+
rt_list_t cell_nodes;
26+
27+
rt_ssize_t (*reg_read)(struct rt_nvmem_device *, int offset, void *val, rt_size_t bytes);
28+
rt_ssize_t (*reg_write)(struct rt_nvmem_device *, int offset, void *val, rt_size_t bytes);
29+
30+
rt_ssize_t size;
31+
int word_size;
32+
int stride;
33+
34+
rt_bool_t read_only;
35+
rt_bool_t ignore_wp;
36+
rt_base_t wp_pin;
37+
rt_uint8_t wp_pin_active;
38+
39+
struct rt_ref ref;
40+
struct rt_spinlock spinlock;
41+
42+
void *priv;
43+
};
44+
45+
struct rt_nvmem_cell
46+
{
47+
rt_list_t list;
48+
49+
int index;
50+
const char *id;
51+
const rt_bool_t free_able;
52+
53+
rt_uint32_t offset;
54+
rt_uint32_t bytes;
55+
rt_uint32_t bit_offset;
56+
rt_uint32_t nbits;
57+
58+
struct rt_ref ref;
59+
60+
struct rt_ofw_node *np;
61+
struct rt_nvmem_device *nvmem;
62+
};
63+
64+
rt_err_t rt_nvmem_device_register(struct rt_nvmem_device *ndev);
65+
rt_err_t rt_nvmem_device_unregister(struct rt_nvmem_device *ndev);
66+
67+
rt_err_t rt_nvmem_device_append_cell(struct rt_nvmem_device *ndev, struct rt_nvmem_cell *cell);
68+
69+
rt_ssize_t rt_nvmem_cell_read(struct rt_nvmem_cell *cell, void *buffer, rt_size_t len);
70+
rt_ssize_t rt_nvmem_cell_write(struct rt_nvmem_cell *cell, void *buffer, rt_size_t len);
71+
72+
rt_ssize_t rt_nvmem_cell_read_u8(struct rt_nvmem_cell *cell, rt_uint8_t *out_val);
73+
rt_ssize_t rt_nvmem_cell_read_u16(struct rt_nvmem_cell *cell, rt_uint16_t *out_val);
74+
rt_ssize_t rt_nvmem_cell_read_u32(struct rt_nvmem_cell *cell, rt_uint32_t *out_val);
75+
rt_ssize_t rt_nvmem_cell_read_u64(struct rt_nvmem_cell *cell, rt_uint64_t *out_val);
76+
77+
struct rt_nvmem_cell *rt_nvmem_get_cell_by_index(struct rt_device *dev, int index);
78+
struct rt_nvmem_cell *rt_nvmem_get_cell_by_name(struct rt_device *dev, const char *id);
79+
void rt_nvmem_put_cell(struct rt_nvmem_cell *cell);
80+
81+
#endif /* __NVMEM_H__ */

components/drivers/include/rtdevice.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ extern "C" {
118118
#ifdef RT_USING_THERMAL
119119
#include "drivers/thermal.h"
120120
#endif /* RT_USING_THERMAL */
121+
122+
#ifdef RT_USING_NVMEM
123+
#include "drivers/nvmem.h"
124+
#endif /* RT_USING_NVMEM */
121125
#endif /* RT_USING_DM */
122126

123127
#ifdef RT_USING_RTC

components/drivers/nvmem/Kconfig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
menuconfig RT_USING_NVMEM
2+
bool "Using Non Volatile Memory (NVMEM) device drivers"
3+
depends on RT_USING_DM
4+
depends on RT_USING_OFW
5+
depends on RT_USING_PIN
6+
select RT_USING_ADT
7+
select RT_USING_ADT_REF
8+
default n
9+
10+
if RT_USING_NVMEM
11+
osource "$(SOC_DM_NVMEM_DIR)/Kconfig"
12+
endif
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from building import *
2+
3+
group = []
4+
5+
if not GetDepend(['RT_USING_NVMEM']):
6+
Return('group')
7+
8+
cwd = GetCurrentDir()
9+
CPPPATH = [cwd + '/../include']
10+
11+
src = ['nvmem.c']
12+
13+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
14+
15+
Return('group')

0 commit comments

Comments
 (0)