浏览代码

[DeviceDrivers] Add pin io driver framework

Bernard Xiong 10 年之前
父节点
当前提交
d01b2ca84b
共有 3 个文件被更改,包括 211 次插入0 次删除
  1. 79 0
      components/drivers/include/drivers/pin.h
  2. 14 0
      components/drivers/misc/SConscript
  3. 118 0
      components/drivers/misc/pin.c

+ 79 - 0
components/drivers/include/drivers/pin.h

@@ -0,0 +1,79 @@
+/*
+ * File      : pin.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2015, RT-Thread Development Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2015-01-20     Bernard      the first version
+ */
+
+#ifndef PIN_H__
+#define PIN_H__
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* pin device and operations for RT-Thread */
+struct rt_device_pin
+{
+    struct rt_device parent;
+    const struct rt_pin_ops *ops;
+};
+
+#define PIN_LOW                 0x00
+#define PIN_HIGH                0x01
+
+#define PIN_MODE_OUTPUT         0x00
+#define PIN_MODE_INPUT          0x01
+#define PIN_MODE_INPUT_PULLUP   0x02
+
+struct rt_device_pin_mode
+{
+    rt_uint16_t pin;
+    rt_uint16_t mode;
+};
+struct rt_device_pin_status
+{
+    rt_uint16_t pin;
+    rt_uint16_t status;
+};
+
+struct rt_pin_ops
+{
+    void (*pin_mode) (struct rt_device* device, rt_base_t pin, rt_base_t mode);
+    void (*pin_write)(struct rt_device* device, rt_base_t pin, rt_base_t value);
+    int  (*pin_read) (struct rt_device* device, rt_base_t pin);
+
+    /* TODO: add GPIO interrupt */
+};
+
+int rt_device_pin_register(const char* name, const struct rt_pin_ops* ops, void* user_data);
+
+void rt_pin_mode(rt_base_t pin, rt_base_t mode);
+void rt_pin_write(rt_base_t pin, rt_base_t value);
+int  rt_pin_read (rt_base_t pin);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 14 - 0
components/drivers/misc/SConscript

@@ -0,0 +1,14 @@
+from building import *
+
+cwd = GetCurrentDir()
+src = [] 
+CPPPATH = [cwd + '/../include']
+group = []
+
+if GetDepend(['RT_USING_PIN']):
+    src = src + ['pin.c']
+
+if len(src):
+    group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
+
+Return('group')

+ 118 - 0
components/drivers/misc/pin.c

@@ -0,0 +1,118 @@
+/*
+ * File      : pin.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2015, RT-Thread Development Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2015-01-20     Bernard      the first version
+ */
+
+#include <drivers/pin.h>
+
+#ifdef RT_USING_FINSH
+#include <finsh.h>
+#endif
+
+static struct rt_device_pin _hw_pin;
+static rt_size_t _pin_read   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
+{
+    struct rt_device_pin_status* status;
+    struct rt_device_pin* pin = (struct rt_device_pin*)dev;
+
+    /* check parameters */
+    RT_ASSERT(pin != RT_NULL);
+
+    status = (struct rt_device_pin_status*) buffer;
+    if (status == RT_NULL || size != sizeof(*status)) return 0;
+
+    status->status = pin->ops->pin_read(dev, status->pin);
+    return size;
+}
+
+static rt_size_t _pin_write  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+    struct rt_device_pin_status* status;
+    struct rt_device_pin* pin = (struct rt_device_pin*)dev;
+
+    /* check parameters */
+    RT_ASSERT(pin != RT_NULL);
+
+    status = (struct rt_device_pin_status*) buffer;
+    if (status == RT_NULL || size != sizeof(*status)) return 0;
+
+    pin->ops->pin_write(dev, (rt_base_t)status->pin, (rt_base_t)status->status);
+
+    return size;
+}
+
+static rt_err_t  _pin_control(rt_device_t dev, rt_uint8_t cmd, void *args)
+{
+    struct rt_device_pin_mode* mode;
+    struct rt_device_pin* pin = (struct rt_device_pin*)dev;
+
+    /* check parameters */
+    RT_ASSERT(pin != RT_NULL);
+
+    mode = (struct rt_device_pin_mode*) args;
+    if (mode == RT_NULL) return -RT_ERROR;
+
+    pin->ops->pin_mode(dev, (rt_base_t)mode->pin, (rt_base_t)mode->mode);
+
+    return 0;
+}
+
+int rt_device_pin_register(const char* name, const struct rt_pin_ops* ops, void* user_data)
+{
+	_hw_pin.parent.type 		= RT_Device_Class_Miscellaneous;
+	_hw_pin.parent.rx_indicate  = RT_NULL;
+	_hw_pin.parent.tx_complete  = RT_NULL;
+
+	_hw_pin.parent.init 		= RT_NULL;
+	_hw_pin.parent.open		    = RT_NULL;
+	_hw_pin.parent.close		= RT_NULL;
+	_hw_pin.parent.read 		= _pin_read;
+	_hw_pin.parent.write 	    = _pin_write;
+	_hw_pin.parent.control 	    = _pin_control;
+
+    _hw_pin.ops                 = ops;
+	_hw_pin.parent.user_data	= user_data;
+
+	/* register a character device */
+	rt_device_register(&_hw_pin.parent, "pin", RT_DEVICE_FLAG_RDWR);
+
+    return 0;
+}
+
+/* RT-Thread Hardware PIN APIs */
+void rt_pin_mode(rt_base_t pin, rt_base_t mode)
+{
+    _hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_mode, pinMode, set hardware pin mode);
+
+void rt_pin_write(rt_base_t pin, rt_base_t value)
+{
+    _hw_pin.ops->pin_write(&_hw_pin.parent, pin, value);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_write, pinWrite, write value to hardware pin);
+
+int  rt_pin_read (rt_base_t pin)
+{
+    return _hw_pin.ops->pin_read(&_hw_pin.parent, pin);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_read, pinRead, read status from hardware pin);