diff --git a/CODEOWNERS b/CODEOWNERS index 11426da2e5e..00dec63ef44 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -120,6 +120,7 @@ /drivers/display/display_framebuf.c @andrewboie /drivers/dma/*sam0* @Sizurka /drivers/dma/dma_stm32* @cybertale +/drivers/eeprom/ @henrikbrixandersen /drivers/espi/ @albertofloyd @franciscomunoz @scottwcpg /drivers/ps2/ @albertofloyd @franciscomunoz @scottwcpg /drivers/kscan/ @albertofloyd @franciscomunoz @scottwcpg diff --git a/drivers/CMakeLists.txt b/drivers/CMakeLists.txt index c28be9257a8..89c4d6a719a 100644 --- a/drivers/CMakeLists.txt +++ b/drivers/CMakeLists.txt @@ -36,6 +36,7 @@ add_subdirectory_if_kconfig(espi) add_subdirectory_if_kconfig(ps2) add_subdirectory_if_kconfig(kscan) add_subdirectory_if_kconfig(video) +add_subdirectory_if_kconfig(eeprom) add_subdirectory_ifdef(CONFIG_FLASH_HAS_DRIVER_ENABLED flash) add_subdirectory_ifdef(CONFIG_SERIAL_HAS_DRIVER serial) diff --git a/drivers/Kconfig b/drivers/Kconfig index a42d3884e25..d8c53bda07d 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -87,4 +87,6 @@ source "drivers/kscan/Kconfig" source "drivers/video/Kconfig" +source "drivers/eeprom/Kconfig" + endmenu diff --git a/drivers/eeprom/CMakeLists.txt b/drivers/eeprom/CMakeLists.txt new file mode 100644 index 00000000000..6d62f00606f --- /dev/null +++ b/drivers/eeprom/CMakeLists.txt @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() + +zephyr_library_sources_ifdef(CONFIG_USERSPACE eeprom_handlers.c) diff --git a/drivers/eeprom/Kconfig b/drivers/eeprom/Kconfig new file mode 100644 index 00000000000..41efaa202b2 --- /dev/null +++ b/drivers/eeprom/Kconfig @@ -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 diff --git a/drivers/eeprom/eeprom_handlers.c b/drivers/eeprom/eeprom_handlers.c new file mode 100644 index 00000000000..c2057f47d7e --- /dev/null +++ b/drivers/eeprom/eeprom_handlers.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2019 Vestas Wind Systems A/S + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +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 + +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 + +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 diff --git a/include/drivers/eeprom.h b/include/drivers/eeprom.h new file mode 100644 index 00000000000..7e34215b134 --- /dev/null +++ b/include/drivers/eeprom.h @@ -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 +#include +#include +#include + +#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 + +#endif /* ZEPHYR_INCLUDE_DRIVERS_EEPROM_H_ */ diff --git a/scripts/gen_kobject_list.py b/scripts/gen_kobject_list.py index bf34a46b1e3..1e2cdd2be25 100755 --- a/scripts/gen_kobject_list.py +++ b/scripts/gen_kobject_list.py @@ -112,6 +112,7 @@ subsystems = [ "uart_driver_api", "can_driver_api", "ptp_clock_driver_api", + "eeprom_driver_api", # Fake 'sample driver' subsystem, used by tests/samples "sample_driver_api"