Эх сурвалжийг харах

Merge pull request #1 from StackRyan/main

[add] add initial vdevice peripherals for virtual environment.
Tangyuxin 5 жил өмнө
parent
commit
8b7b6ccde4
7 өөрчлөгдсөн 452 нэмэгдсэн , 1 устгасан
  1. 26 1
      README.md
  2. 11 0
      SConscript
  3. BIN
      doc/img/entry.PNG
  4. BIN
      doc/img/vdev_mcfg.PNG
  5. 91 0
      vgpio.c
  6. 183 0
      vlcd.c
  7. 141 0
      vtouch.c

+ 26 - 1
README.md

@@ -1,2 +1,27 @@
 # vdevice
-虚拟 IO 设备
+基于 rt-thread device 框架的虚拟 IO 设备
+
+## 虚拟IO列表
+
+| 设备     | 描述            |
+| -------- | --------------- |
+| vgpio.c  | 虚拟 GPIO 设备  |
+| vlcd.c   | 虚拟 LCD 设备   |
+| vtouch.c | 虚拟 TOUCH 设备 |
+
+## 使用说明
+
+- 使用 menuconfig 使能 vdevice。
+- 选择需要虚拟化的设备。
+
+![entry_png](doc/img/entry.PNG)
+
+![vdev_mcfg_png](doc/img/vdev_mcfg.PNG)
+
+## 维护地址
+
+```
+https://github.com/stackRyan/vdevice
+yuanjyjyj@163.com
+```
+

+ 11 - 0
SConscript

@@ -0,0 +1,11 @@
+Import('RTT_ROOT')
+Import('rtconfig')
+from building import *
+
+cwd     = GetCurrentDir()
+src     = Glob('*.c') + Glob('*.cpp')
+CPPPATH = [cwd, str(Dir('#'))]
+
+group = DefineGroup('vdevice', src, depend = ['PKG_USING_VDEVICE'], CPPPATH = CPPPATH)
+
+Return('group')

BIN
doc/img/entry.PNG


BIN
doc/img/vdev_mcfg.PNG


+ 91 - 0
vgpio.c

@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-12-21     stackRyan    first version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#define DBG_TAG VDEVICE_PIN_NAME
+#define DBG_LVL DBG_LOG
+#include <rtdbg.h>
+
+#ifdef PKG_USING_PIN
+
+static void _pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode)
+{
+    /* Todo:set pin mode */
+    LOG_D("pin_mode: pin_%d,mode_%d", pin, mode);
+}
+
+static void _pin_write(struct rt_device *device, rt_base_t pin, rt_base_t value)
+{
+    /* Todo:set pin low or high */
+    LOG_D("pin_write: pin_%d,value_%d", pin, value);
+}
+
+static int _pin_read(struct rt_device *device, rt_base_t pin)
+{
+    /* Todo:get pin status and return status value */
+    LOG_D("pin_read: pin_%d,value_0");
+    return 0;
+}
+
+static rt_err_t _pin_attach_irq(struct rt_device *device, rt_int32_t pin,
+                                rt_uint32_t mode, void (*hdr)(void *args), void *args)
+{
+    rt_err_t ret = RT_EOK;
+
+    /* Todo:attach hdr to pin ISR */
+    LOG_D("pin_attach_irq: pin_%d,mode_%d", pin, mode);
+
+    return ret;
+}
+
+static rt_err_t _pin_detach_irq(struct rt_device *device, rt_int32_t pin)
+{
+    rt_err_t ret = RT_EOK;
+
+    /* Todo:detach hdr from pin ISR */
+    LOG_D("pin_detach_irq: pin_%d", pin);
+
+    return ret;
+}
+
+static rt_err_t _pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled)
+{
+    rt_err_t ret = RT_EOK;
+
+    /* Todo:enable pin ISR */
+    LOG_D("pin_irq_enable: pin_%d,Enabled:%d", pin, enabled);
+
+    return ret;
+}
+
+const static struct rt_pin_ops _pin_ops =
+{
+    _pin_mode,
+    _pin_write,
+    _pin_read,
+
+    _pin_attach_irq,
+    _pin_detach_irq,
+    _pin_irq_enable
+};
+
+int rt_hw_pin_init(void)
+{
+    rt_err_t ret = RT_EOK;
+
+    ret = rt_device_pin_register(VDEVICE_PIN_NAME, &_pin_ops, RT_NULL);
+    LOG_D("rt_hw_pin_init succeed!");
+    return ret;
+}
+INIT_DEVICE_EXPORT(rt_hw_pin_init);
+
+#endif /* PKG_USING_PIN */

+ 183 - 0
vlcd.c

@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-12-21     stackRyan    first version
+ */
+
+#include <rtdevice.h>
+#include <rtthread.h>
+
+#define DBG_TAG VDEVICE_LCD_NAME
+#define DBG_LVL DBG_LOG
+#include <rtdbg.h>
+
+#ifdef PKG_USING_LCD
+
+#define LCD_USING_RGB565
+//#define LCD_USING_RGB888
+
+#define LCD_HEIGHT 360
+#define LCD_WIDTH 360
+
+#ifdef LCD_USING_RGB565
+#define LCD_BITS_PER_PIXEL 16
+#define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB565
+#endif
+
+#ifdef LCD_USING_RGB888
+#define LCD_BITS_PER_PIXEL 24
+#define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB888
+#endif
+
+#define LCD_FRAMEBUFFER_SIZE (LCD_WIDTH * LCD_HEIGHT * LCD_BITS_PER_PIXEL / 8)
+
+rt_uint8_t lcd_framebuffer[LCD_FRAMEBUFFER_SIZE];
+
+static struct rt_device_graphic_info lcd_info;
+static struct rt_device lcd_dev;
+
+static rt_err_t _lcd_init(rt_device_t dev)
+{
+    rt_err_t ret = RT_EOK;
+
+    RT_ASSERT(dev != RT_NULL);
+
+    /* Todo: init LCD */
+    LOG_D("lcd_init");
+
+    return ret;
+}
+
+static rt_err_t _lcd_open(rt_device_t dev, rt_uint16_t oflag)
+{
+    rt_err_t ret = RT_EOK;
+
+    RT_ASSERT(dev != RT_NULL);
+
+    /* Todo: enable LCD */
+    LOG_D("lcd_open");
+
+    return ret;
+}
+
+static rt_err_t _lcd_close(rt_device_t dev)
+{
+    rt_err_t ret = RT_EOK;
+
+    RT_ASSERT(dev != RT_NULL);
+
+    /* Todo: close LCD */
+    LOG_D("lcd_close");
+
+    return ret;
+}
+
+static rt_err_t _lcd_control(rt_device_t dev, int cmd, void *args)
+{
+    rt_err_t ret = RT_EOK;
+
+    RT_ASSERT(dev != RT_NULL);
+
+    switch (cmd)
+    {
+    case RTGRAPHIC_CTRL_RECT_UPDATE:
+    {
+        struct rt_device_rect_info *rect_info = (struct rt_device_rect_info *)args;
+        LOG_D("lcd_control: RTGRAPHIC_CTRL_RECT_UPDATE:");
+        LOG_D("height: %d", rect_info->height);
+        LOG_D("width: %d", rect_info->width);
+        LOG_D("x: %d", rect_info->x);
+        LOG_D("y: %d", rect_info->y);
+
+        /* Todo: update LCD data */
+
+        break;
+    }
+
+    case RTGRAPHIC_CTRL_POWERON:
+        /* Todo: power on */
+        LOG_D("lcd_control: RTGRAPHIC_CTRL_POWERON");
+        break;
+
+    case RTGRAPHIC_CTRL_POWEROFF:
+        /* Todo: power off */
+        LOG_D("lcd_control: RTGRAPHIC_CTRL_POWEROFF");
+        break;
+
+    case RTGRAPHIC_CTRL_GET_INFO:
+    {
+        struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args;
+        info->pixel_format = lcd_info.pixel_format;
+        info->bits_per_pixel = lcd_info.bits_per_pixel;
+        info->width = lcd_info.width;
+        info->height = lcd_info.height;
+        info->framebuffer = lcd_info.framebuffer;
+
+        LOG_D("lcd_control: RTGRAPHIC_CTRL_GET_INFO:");
+        LOG_D("pixel_format: %d", info->pixel_format);
+        LOG_D("bits_per_pixel: %d", info->bits_per_pixel);
+        LOG_D("width: %d", info->width);
+        LOG_D("height: %d", info->height);
+        LOG_D("framebuffer: %d", info->framebuffer);
+
+        break;
+    }
+
+    case RTGRAPHIC_CTRL_SET_MODE:
+        LOG_D("lcd_control: RTGRAPHIC_CTRL_SET_MODE");
+
+        break;
+    default:
+        break;
+    }
+
+    return ret;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops _lcd_ops =
+{
+    _lcd_init,
+    _lcd_open,
+    _lcd_close,
+    _lcd_control
+};
+#endif
+
+int rt_hw_lcd_init(void)
+{
+    rt_err_t ret = RT_EOK;
+
+    lcd_info.bits_per_pixel = LCD_BITS_PER_PIXEL;
+    lcd_info.framebuffer = lcd_framebuffer;
+    lcd_info.height = LCD_HEIGHT;
+    lcd_info.width = LCD_WIDTH;
+    lcd_info.pixel_format = LCD_PIXEL_FORMAT;
+
+    lcd_dev.type = RT_Device_Class_Graphic;
+    lcd_dev.rx_indicate = RT_NULL;
+    lcd_dev.tx_complete = RT_NULL;
+
+#ifdef RT_USING_DEVICE_OPS
+    lcd_dev.ops = &_lcd_ops;
+#else
+    lcd_dev.init = _lcd_init;
+    lcd_dev.open = _lcd_open;
+    lcd_dev.close = _lcd_close;
+    lcd_dev.control = _lcd_control;
+#endif
+
+    lcd_dev.user_data = (void *)&lcd_info;
+
+    ret = rt_device_register(&lcd_dev, VDEVICE_LCD_NAME, RT_DEVICE_FLAG_RDWR);
+
+    LOG_D("rt_hw_lcd_init succeed!");
+    return ret;
+}
+INIT_DEVICE_EXPORT(rt_hw_lcd_init);
+
+#endif /* PKG_USING_LCD */

+ 141 - 0
vtouch.c

@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-12-21     stackRyan    first version
+ */
+
+#include "rtconfig.h"
+
+#ifdef PKG_USING_TOUCH
+
+#include <rtthread.h>
+#include <rtdevice.h>
+#include "string.h"
+#include <touch.h>
+
+#define DBG_TAG    VDEVICE_TOUCH_NAME
+#define DBG_LVL    DBG_LOG
+#include <rtdbg.h>
+
+#define TOUCH_WIDTH     320     //resolution ratio config X
+#define TOUCH_HEIGHT    320     //resolution ratio config Y
+#define TOUCH_POINT_NUM     1   //touchpoint number
+
+static struct rt_touch_device touch_device;
+
+static rt_size_t device_touch_readpoint(struct rt_touch_device *touch, void *buf, rt_size_t touch_num)
+{
+    struct rt_touch_data touch_data = {0};
+    /*make a fake touch data and event*/
+    touch_data.event = RT_TOUCH_EVENT_UP;
+    touch_data.x_coordinate = 100;
+    touch_data.y_coordinate = 100;
+
+    rt_memcpy(buf, &touch_data, sizeof(struct rt_touch_data));
+
+    LOG_D("_touch_readpoint");
+    return touch_num;
+}
+
+static rt_err_t device_touch_control(struct rt_touch_device *touch, int cmd, void *arg)
+{
+    RT_ASSERT(touch != RT_NULL);
+
+    switch (cmd)
+    {
+    case RT_TOUCH_CTRL_GET_ID:
+    {
+        *(rt_uint8_t *)arg = 0x5a;
+        LOG_D("RT_TOUCH_CTRL_GET_ID: %d", *(rt_uint8_t *)arg);
+        break;
+    }
+
+    case RT_TOUCH_CTRL_GET_INFO:
+    {
+        *(rt_uint8_t *)arg = 0xa5;
+        LOG_D("RT_TOUCH_CTRL_GET_INFO: %d", *(rt_uint8_t *)arg);
+        break;
+    }
+
+    case RT_TOUCH_CTRL_SET_MODE:
+    {
+        /* */
+        rt_uint8_t mode = *(rt_uint8_t *)arg;
+        LOG_D("RT_TOUCH_CTRL_SET_MODE: %d", mode);
+        break;
+    }
+
+    case RT_TOUCH_CTRL_SET_X_RANGE:
+    {
+        touch_device.info.range_x = *(rt_uint32_t *)arg;
+        LOG_D("RT_TOUCH_CTRL_SET_X_RANGE: %d", touch_device.info.type);
+        break;
+    }
+
+    case RT_TOUCH_CTRL_SET_Y_RANGE:
+    {
+        touch_device.info.range_x = *(rt_uint32_t *)arg;
+        LOG_D("RT_TOUCH_CTRL_SET_Y_RANGE: %d", touch_device.info.type);
+        break;
+    }
+    case RT_TOUCH_CTRL_SET_X_TO_Y:
+        LOG_D("RT_TOUCH_CTRL_SET_X_TO_Y");
+        break;
+    case RT_TOUCH_CTRL_DISABLE_INT:
+        LOG_D("RT_TOUCH_CTRL_DISABLE_INT");
+        break;
+    case RT_TOUCH_CTRL_ENABLE_INT:
+        LOG_D("RT_TOUCH_CTRL_ENABLE_INT");
+        break;
+    case RT_TOUCH_CTRL_POWER_ON:
+        LOG_D("RT_TOUCH_CTRL_POWER_ON");
+        break;
+    case RT_TOUCH_CTRL_POWER_OFF:
+        LOG_D("RT_TOUCH_CTRL_POWER_OFF");
+        break;
+    case RT_TOUCH_CTRL_GET_STATUS:
+        LOG_D("RT_TOUCH_CTRL_GET_STATUS");
+        break;
+
+    default:
+        break;
+    }
+
+    return RT_EOK;
+}
+
+static struct rt_touch_ops touch_ops =
+{
+    .touch_readpoint = device_touch_readpoint,
+    .touch_control = device_touch_control,
+};
+
+static int rt_hw_touch_init(void)
+{
+    rt_err_t result = RT_EOK;
+    /* touch infomation */
+    touch_device.info.type = RT_TOUCH_TYPE_CAPACITANCE;
+    touch_device.info.vendor = RT_TOUCH_VENDOR_UNKNOWN;
+    touch_device.info.point_num = TOUCH_POINT_NUM;
+    touch_device.info.range_x = TOUCH_WIDTH;
+    touch_device.info.range_y = TOUCH_HEIGHT;
+    touch_device.config.user_data = RT_NULL;
+    touch_device.ops = &touch_ops;
+
+#ifdef RT_TOUCH_USING_PIN
+    touch_device.config.irq_pin.pin = RT_PIN_NONE;
+    touch_device.config.irq_pin.mode = PIN_MODE_INPUT;
+#endif /* RT_TOUCH_USING_PIN */
+
+    result = rt_hw_touch_register(&touch_device, VDEVICE_TOUCH_NAME, RT_DEVICE_FLAG_INT_RX, RT_NULL);
+
+    LOG_D("rt_hw_touch_init succeed!");
+    return result;
+}
+INIT_DEVICE_EXPORT(rt_hw_touch_init);
+
+#endif /* PKG_USING_TOUCH */