diff options
| author | Bernard Xiong <[email protected]> | 2018-06-10 17:59:17 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2018-06-10 17:59:17 +0800 |
| commit | 884fb70fe9973eaf01a7df04941cbcb0475ba8d5 (patch) | |
| tree | 7c8e3f42629e46b3d7ecb0c8507f67934d9fae47 /src | |
| parent | bca65f30a90857287dc1371ddbc8d5f165691c7f (diff) | |
[Kernel] Add device ops feature.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Kconfig | 4 | ||||
| -rw-r--r-- | src/device.c | 48 |
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; |
