quanzhao 5 лет назад
Родитель
Сommit
8b38a23875

+ 4 - 0
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

+ 3 - 0
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)
 

+ 86 - 0
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 <time.h>
+#include <string.h>
+#include <rtthread.h>
+
+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);
+