[Kernel] Add device ops feature.

This commit is contained in:
Bernard Xiong
2018-06-10 17:59:17 +08:00
parent bca65f30a9
commit 884fb70fe9
37 changed files with 795 additions and 200 deletions
+33 -15
View File
@@ -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;