From 3bbd808628d29e35405d1bfda24b3a104cb0302b Mon Sep 17 00:00:00 2001 From: Vincent Dupont Date: Thu, 27 Jul 2017 11:37:46 +0200 Subject: [PATCH] devfs: add /dev/{urandom,hwrng} with random/hwrng --- Makefile.dep | 9 +++++ makefiles/pseudomodules.inc.mk | 1 + sys/fs/devfs/auto_init_devfs.c | 23 +++++++++++++ sys/fs/devfs/random-vfs.c | 61 ++++++++++++++++++++++++++++++++++ sys/fs/devfs/random-vfs.h | 48 ++++++++++++++++++++++++++ 5 files changed, 142 insertions(+) create mode 100644 sys/fs/devfs/random-vfs.c create mode 100644 sys/fs/devfs/random-vfs.h diff --git a/Makefile.dep b/Makefile.dep index adabdabd7c..3749e3ac6b 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -856,6 +856,15 @@ endif ifneq (,$(filter periph_gpio_irq,$(USEMODULE))) FEATURES_REQUIRED += periph_gpio endif + +ifneq (,$(filter devfs_hwrng,$(USEMODULE))) + FEATURES_REQUIRED += periph_hwrng +endif + +ifneq (,$(filter devfs_random,$(USEMODULE))) + USEMODULE += random +endif + # always select gpio (until explicit dependencies are sorted out) FEATURES_OPTIONAL += periph_gpio diff --git a/makefiles/pseudomodules.inc.mk b/makefiles/pseudomodules.inc.mk index b4b6abd897..3d98ef8544 100644 --- a/makefiles/pseudomodules.inc.mk +++ b/makefiles/pseudomodules.inc.mk @@ -9,6 +9,7 @@ PSEUDOMODULES += cord_ep_standalone PSEUDOMODULES += core_% PSEUDOMODULES += cortexm_fpu PSEUDOMODULES += cpu_check_address +PSEUDOMODULES += devfs_% PSEUDOMODULES += ecc_% PSEUDOMODULES += emb6_router PSEUDOMODULES += event_% diff --git a/sys/fs/devfs/auto_init_devfs.c b/sys/fs/devfs/auto_init_devfs.c index 5754a2b190..3237d066ce 100644 --- a/sys/fs/devfs/auto_init_devfs.c +++ b/sys/fs/devfs/auto_init_devfs.c @@ -21,6 +21,7 @@ #include "vfs.h" #include "fs/devfs.h" +#include "random-vfs.h" #define ENABLE_DEBUG (0) #include "debug.h" @@ -30,8 +31,30 @@ static vfs_mount_t _devfs_auto_init_mount = { .mount_point = "/dev", }; +#ifdef MODULE_DEVFS_HWRNG +static devfs_t hwrng_devfs = { + .path = "/hwrng", + .f_op = &hwrng_vfs_ops, +}; +#endif + +#ifdef MODULE_DEVFS_RANDOM +static devfs_t random_devfs = { + .path = "/urandom", + .f_op = &random_vfs_ops, +}; +#endif + void auto_init_devfs(void) { DEBUG("auto_init_devfs: mounting /dev\n"); vfs_mount(&_devfs_auto_init_mount); + +#ifdef MODULE_DEVFS_HWRNG + devfs_register(&hwrng_devfs); +#endif + +#ifdef MODULE_DEVFS_RANDOM + devfs_register(&random_devfs); +#endif } diff --git a/sys/fs/devfs/random-vfs.c b/sys/fs/devfs/random-vfs.c new file mode 100644 index 0000000000..d5be014193 --- /dev/null +++ b/sys/fs/devfs/random-vfs.c @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017 OTA keys S.A. + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + * + */ + +/** + * @ingroup sys_fs_devfs + * @{ + * + * @file + * @brief Random backends for devfs implementation + * + * @author Vincent Dupont + * + * @} + */ + +#include "vfs.h" + +#ifdef MODULE_DEVFS_HWRNG + +#include "periph/hwrng.h" + +static ssize_t hwrng_vfs_read(vfs_file_t *filp, void *dest, size_t nbytes); + +const vfs_file_ops_t hwrng_vfs_ops = { + .read = hwrng_vfs_read, +}; + +static ssize_t hwrng_vfs_read(vfs_file_t *filp, void *dest, size_t nbytes) +{ + (void)filp; + + hwrng_read(dest, nbytes); + + return nbytes; +} +#endif /* MODULE_PERIPH_HWRNG */ + +#ifdef MODULE_DEVFS_RANDOM + +#include "random.h" + +static ssize_t random_vfs_read(vfs_file_t *filp, void *dest, size_t nbytes); + +const vfs_file_ops_t random_vfs_ops = { + .read = random_vfs_read, +}; + +static ssize_t random_vfs_read(vfs_file_t *filp, void *dest, size_t nbytes) +{ + (void)filp; + random_bytes(dest, nbytes); + + return nbytes; +} +#endif /* MODULE_RANDOM */ diff --git a/sys/fs/devfs/random-vfs.h b/sys/fs/devfs/random-vfs.h new file mode 100644 index 0000000000..b6e7f8a81b --- /dev/null +++ b/sys/fs/devfs/random-vfs.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2017 OTA keys S.A. + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + * + */ + +/** + * @ingroup sys_fs_devfs + * @{ + * + * @file + * @brief Random backends for devfs + * + * @author Vincent Dupont + */ + +#ifndef RANDOM_VFS_H +#define RANDOM_VFS_H + +#include "vfs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MODULE_PERIPH_HWRNG) || defined(DOXYGEN) +/** + * @brief hwrng driver for vfs + */ +extern const vfs_file_ops_t hwrng_vfs_ops; +#endif + +#if defined(MODULE_RANDOM) || defined(DOXYGEN) +/** + * @brief urandom driver for vfs + */ +extern const vfs_file_ops_t random_vfs_ops; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* RANDOM_VFS_H */ +/** @} */