summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2018-06-10 17:59:17 +0800
committerBernard Xiong <[email protected]>2018-06-10 17:59:17 +0800
commit884fb70fe9973eaf01a7df04941cbcb0475ba8d5 (patch)
tree7c8e3f42629e46b3d7ecb0c8507f67934d9fae47 /src
parentbca65f30a90857287dc1371ddbc8d5f165691c7f (diff)
[Kernel] Add device ops feature.
Diffstat (limited to 'src')
-rw-r--r--src/Kconfig4
-rw-r--r--src/device.c48
2 files changed, 37 insertions, 15 deletions
diff --git a/src/Kconfig b/src/Kconfig
index d8ddbfc838..89f709478b 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -192,6 +192,10 @@ menu "Kernel Device Object"
bool "Using device object"
default y
+ config RT_USING_DEVICE_OPS
+ bool "Using ops for each device object"
+ default n
+
config RT_USING_INTERRUPT_INFO
bool "Enable additional interrupt trace information"
default n
diff --git a/src/device.c b/src/device.c
index 231a052b86..2a919cace6 100644
--- a/src/device.c
+++ b/src/device.c
@@ -32,12 +32,28 @@
#ifdef RT_USING_DEVICE
+#ifdef RT_USING_DEVICE_OPS
+#define device_init (dev->ops->init)
+#define device_open (dev->ops->open)
+#define device_close (dev->ops->close)
+#define device_read (dev->ops->read)
+#define device_write (dev->ops->write)
+#define device_control (dev->ops->control)
+#else
+#define device_init (dev->init)
+#define device_open (dev->open)
+#define device_close (dev->close)
+#define device_read (dev->read)
+#define device_write (dev->write)
+#define device_control (dev->control)
+#endif
+
/**
* This function registers a device driver with specified name.
*
* @param dev the pointer of device driver structure
* @param name the device driver's name
- * @param flags the flag of device
+ * @param flags the capabilities flag of device
*
* @return the error code, RT_EOK on initialization successfully.
*/
@@ -154,6 +170,8 @@ rt_device_t rt_device_create(int type, int attach_size)
rt_device_t device;
size = RT_ALIGN(sizeof(struct rt_device), RT_ALIGN_SIZE);
+ attach_size = RT_ALIGN(attach_size, RT_ALIGN_SIZE);
+ /* use the totoal size */
size += attach_size;
device = (rt_device_t)rt_malloc(size);
@@ -197,11 +215,11 @@ rt_err_t rt_device_init(rt_device_t dev)
RT_ASSERT(dev != RT_NULL);
/* get device init handler */
- if (dev->init != RT_NULL)
+ if (device_init != RT_NULL)
{
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{
- result = dev->init(dev);
+ result = device_init(dev);
if (result != RT_EOK)
{
rt_kprintf("To initialize device:%s failed. The error code is %d\n",
@@ -234,9 +252,9 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)
/* if device is not initialized, initialize it. */
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{
- if (dev->init != RT_NULL)
+ if (device_init != RT_NULL)
{
- result = dev->init(dev);
+ result = device_init(dev);
if (result != RT_EOK)
{
rt_kprintf("To initialize device:%s failed. The error code is %d\n",
@@ -257,9 +275,9 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)
}
/* call device open interface */
- if (dev->open != RT_NULL)
+ if (device_open != RT_NULL)
{
- result = dev->open(dev, oflag);
+ result = device_open(dev, oflag);
}
else
{
@@ -304,9 +322,9 @@ rt_err_t rt_device_close(rt_device_t dev)
return RT_EOK;
/* call device close interface */
- if (dev->close != RT_NULL)
+ if (device_close != RT_NULL)
{
- result = dev->close(dev);
+ result = device_close(dev);
}
/* set open flag */
@@ -343,9 +361,9 @@ rt_size_t rt_device_read(rt_device_t dev,
}
/* call device read interface */
- if (dev->read != RT_NULL)
+ if (device_read != RT_NULL)
{
- return dev->read(dev, pos, buffer, size);
+ return device_read(dev, pos, buffer, size);
}
/* set error code */
@@ -381,9 +399,9 @@ rt_size_t rt_device_write(rt_device_t dev,
}
/* call device write interface */
- if (dev->write != RT_NULL)
+ if (device_write != RT_NULL)
{
- return dev->write(dev, pos, buffer, size);
+ return device_write(dev, pos, buffer, size);
}
/* set error code */
@@ -407,9 +425,9 @@ rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg)
RT_ASSERT(dev != RT_NULL);
/* call device write interface */
- if (dev->control != RT_NULL)
+ if (device_control != RT_NULL)
{
- return dev->control(dev, cmd, arg);
+ return device_control(dev, cmd, arg);
}
return -RT_ENOSYS;