From 8b38a238756dcfe6230f587112a04439632a3644 Mon Sep 17 00:00:00 2001 From: quanzhao Date: Sat, 19 Dec 2020 15:03:15 +0800 Subject: [PATCH] Add the RANDOM device. --- components/drivers/Kconfig | 4 ++ components/drivers/misc/SConscript | 3 + components/drivers/misc/rt_random.c | 86 +++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 components/drivers/misc/rt_random.c diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index 5cc039d245..bfbe5d42f6 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -123,6 +123,10 @@ config RT_USING_NULL bool "Using NULL device drivers" default n +config RT_USING_RANDOM + bool "Using RANDOM device drivers" + default n + config RT_USING_PWM bool "Using PWM device drivers" default n diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index 338a6e3cd0..76bfaf8946 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -26,6 +26,9 @@ if GetDepend(['RT_USING_INPUT_CAPTURE']): if GetDepend(['RT_USING_NULL']): src = src + ['rt_null.c'] +if GetDepend(['RT_USING_RANDOM']): + src = src + ['rt_random.c'] + if len(src): group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/components/drivers/misc/rt_random.c b/components/drivers/misc/rt_random.c new file mode 100644 index 0000000000..5aa7e49a3e --- /dev/null +++ b/components/drivers/misc/rt_random.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2011-2020, Shanghai Real-Thread Electronic Technology Co.,Ltd + * + * Change Logs: + * Date Author Notes + * 2020-12-18 quanzhao the first version + */ + +#include +#include +#include + +static struct rt_device random_dev; +static unsigned long seed; + +static rt_uint16_t calc_random(void) +{ + seed = 214013L * seed + 2531011L; + return (seed >> 16) & 0x7FFF; /* return bits 16~30 */ +} + +static rt_size_t random_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_uint16_t rand = calc_random(); + ssize_t ret = sizeof(rand); + rt_memcpy(buffer, &rand, ret); + return ret; +} + +static rt_size_t random_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + ssize_t ret = sizeof(seed); + rt_memcpy(&seed, buffer, ret); + return ret; +} + +static rt_err_t random_control(rt_device_t dev, int cmd, void *args) +{ + return RT_EOK; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops random_ops = +{ + RT_NULL, + RT_NULL, + RT_NULL, + random_read, + random_write, + random_control +}; +#endif + +int random_device_init(void) +{ + static rt_bool_t init_ok = RT_FALSE; + + if (init_ok) + { + return 0; + } + RT_ASSERT(!rt_device_find("random")); + random_dev.type = RT_Device_Class_Miscellaneous; + +#ifdef RT_USING_DEVICE_OPS + random_dev.ops = &random_ops; +#else + random_dev.init = RT_NULL; + random_dev.open = RT_NULL; + random_dev.close = RT_NULL; + random_dev.read = random_read; + random_dev.write = random_write; + random_dev.control = random_control; +#endif + + /* no private */ + random_dev.user_data = RT_NULL; + + rt_device_register(&random_dev, "random", RT_DEVICE_FLAG_RDWR); + + init_ok = RT_TRUE; + + return 0; +} +INIT_DEVICE_EXPORT(random_device_init); + -- Gitee