drivers: eeprom: add API for EEPROM devices

Add API for accessing Electrically Erasable Programmable Read-Only
Memory (EEPROM) devices.

EEPROMs have an erase block size of 1 byte, a long lifetime, and allows
overwriting data on byte-by-byte access.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
This commit is contained in:
Henrik Brix Andersen 2019-10-20 21:22:03 +02:00 committed by Anas Nashif
commit a2a7b776cb
8 changed files with 177 additions and 0 deletions

View file

@ -120,6 +120,7 @@
/drivers/display/display_framebuf.c @andrewboie /drivers/display/display_framebuf.c @andrewboie
/drivers/dma/*sam0* @Sizurka /drivers/dma/*sam0* @Sizurka
/drivers/dma/dma_stm32* @cybertale /drivers/dma/dma_stm32* @cybertale
/drivers/eeprom/ @henrikbrixandersen
/drivers/espi/ @albertofloyd @franciscomunoz @scottwcpg /drivers/espi/ @albertofloyd @franciscomunoz @scottwcpg
/drivers/ps2/ @albertofloyd @franciscomunoz @scottwcpg /drivers/ps2/ @albertofloyd @franciscomunoz @scottwcpg
/drivers/kscan/ @albertofloyd @franciscomunoz @scottwcpg /drivers/kscan/ @albertofloyd @franciscomunoz @scottwcpg

View file

@ -36,6 +36,7 @@ add_subdirectory_if_kconfig(espi)
add_subdirectory_if_kconfig(ps2) add_subdirectory_if_kconfig(ps2)
add_subdirectory_if_kconfig(kscan) add_subdirectory_if_kconfig(kscan)
add_subdirectory_if_kconfig(video) add_subdirectory_if_kconfig(video)
add_subdirectory_if_kconfig(eeprom)
add_subdirectory_ifdef(CONFIG_FLASH_HAS_DRIVER_ENABLED flash) add_subdirectory_ifdef(CONFIG_FLASH_HAS_DRIVER_ENABLED flash)
add_subdirectory_ifdef(CONFIG_SERIAL_HAS_DRIVER serial) add_subdirectory_ifdef(CONFIG_SERIAL_HAS_DRIVER serial)

View file

@ -87,4 +87,6 @@ source "drivers/kscan/Kconfig"
source "drivers/video/Kconfig" source "drivers/video/Kconfig"
source "drivers/eeprom/Kconfig"
endmenu endmenu

View file

@ -0,0 +1,5 @@
# SPDX-License-Identifier: Apache-2.0
zephyr_library()
zephyr_library_sources_ifdef(CONFIG_USERSPACE eeprom_handlers.c)

17
drivers/eeprom/Kconfig Normal file
View file

@ -0,0 +1,17 @@
# EEPROM driver configuration options
# Copyright (c) 2019 Vestas Wind Systems A/S
# SPDX-License-Identifier: Apache-2.0
menuconfig EEPROM
bool "EEPROM hardware support"
help
Enable support for EEPROM hardware.
if EEPROM
module = EEPROM
module-str = eeprom
source "subsys/logging/Kconfig.template.log_config"
endif # EEPROM

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2019 Vestas Wind Systems A/S
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <syscall_handler.h>
#include <drivers/eeprom.h>
static inline int z_vrfy_eeprom_read(struct device *dev, off_t offset,
void *data, size_t len)
{
Z_OOPS(Z_SYSCALL_DRIVER_EEPROM(dev, read));
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(data, len));
return z_impl_eeprom_read((struct device *)dev, offset, (void *)data,
len);
}
#include <syscalls/eeprom_read_mrsh.c>
static inline int z_vrfy_eeprom_write(struct device *dev, off_t offset,
const void *data, size_t len)
{
Z_OOPS(Z_SYSCALL_DRIVER_EEPROM(dev, write));
Z_OOPS(Z_SYSCALL_MEMORY_READ(data, len));
return z_impl_eeprom_write((struct device *)dev, offset,
(const void *)data, len);
}
#include <syscalls/eeprom_write_mrsh.c>
static inline size_t z_vrfy_eeprom_get_size(struct device *dev)
{
Z_OOPS(Z_SYSCALL_DRIVER_EEPROM(dev, size));
return z_impl_eeprom_get_size((struct device *)dev);
}
#include <syscalls/eeprom_get_size_mrsh.c>

115
include/drivers/eeprom.h Normal file
View file

@ -0,0 +1,115 @@
/*
* Copyright (c) 2019 Vestas Wind Systems A/S
*
* Heavily based on drivers/flash.h which is:
* Copyright (c) 2017 Nordic Semiconductor ASA
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Public API for EEPROM drivers
*/
#ifndef ZEPHYR_INCLUDE_DRIVERS_EEPROM_H_
#define ZEPHYR_INCLUDE_DRIVERS_EEPROM_H_
/**
* @brief EEPROM Interface
* @defgroup eeprom_interface EEPROM Interface
* @ingroup io_interfaces
* @{
*/
#include <zephyr/types.h>
#include <stddef.h>
#include <sys/types.h>
#include <device.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef int (*eeprom_api_read)(struct device *dev, off_t offset, void *data,
size_t len);
typedef int (*eeprom_api_write)(struct device *dev, off_t offset,
const void *data, size_t len);
typedef size_t (*eeprom_api_size)(struct device *dev);
struct eeprom_driver_api {
eeprom_api_read read;
eeprom_api_write write;
eeprom_api_size size;
};
/**
* @brief Read data from EEPROM
*
* @param dev EEPROM device
* @param offset Address offset to read from.
* @param data Buffer to store read data.
* @param len Number of bytes to read.
*
* @return 0 on success, negative errno code on failure.
*/
__syscall int eeprom_read(struct device *dev, off_t offset, void *data,
size_t len);
static inline int z_impl_eeprom_read(struct device *dev, off_t offset,
void *data, size_t len)
{
const struct eeprom_driver_api *api = dev->driver_api;
return api->read(dev, offset, data, len);
}
/**
* @brief Write data to EEPROM
*
* @param dev EEPROM device
* @param offset Address offset to write data to.
* @param data Buffer with data to write.
* @param len Number of bytes to write.
*
* @return 0 on success, negative errno code on failure.
*/
__syscall int eeprom_write(struct device *dev, off_t offset, const void *data,
size_t len);
static inline int z_impl_eeprom_write(struct device *dev, off_t offset,
const void *data, size_t len)
{
const struct eeprom_driver_api *api = dev->driver_api;
return api->write(dev, offset, data, len);
}
/**
* @brief Get the size of the EEPROM in bytes
*
* @param dev EEPROM device.
*
* @return EEPROM size in bytes.
*/
__syscall size_t eeprom_get_size(struct device *dev);
static inline size_t z_impl_eeprom_get_size(struct device *dev)
{
const struct eeprom_driver_api *api = dev->driver_api;
return api->size(dev);
}
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#include <syscalls/eeprom.h>
#endif /* ZEPHYR_INCLUDE_DRIVERS_EEPROM_H_ */

View file

@ -112,6 +112,7 @@ subsystems = [
"uart_driver_api", "uart_driver_api",
"can_driver_api", "can_driver_api",
"ptp_clock_driver_api", "ptp_clock_driver_api",
"eeprom_driver_api",
# Fake 'sample driver' subsystem, used by tests/samples # Fake 'sample driver' subsystem, used by tests/samples
"sample_driver_api" "sample_driver_api"