diff --git a/device/pin/pin.c b/device/pin/pin.c index 8f882f9..a99d487 100644 --- a/device/pin/pin.c +++ b/device/pin/pin.c @@ -256,9 +256,7 @@ static int pin_isr(struct mr_device *device, uint32_t event, void *args) /* This EXTI will be ignored */ return MR_EINVAL; } - - /* Returns the number that triggered the EXTI interrupt */ - return *number; + return MR_EOK; } default: { diff --git a/device/serial/serial.c b/device/serial/serial.c index 0f0e90e..f39463d 100644 --- a/device/serial/serial.c +++ b/device/serial/serial.c @@ -351,18 +351,18 @@ static int serial_isr(struct mr_device *device, uint32_t event, void *args) { int count = 1; - /* If FIFO is empty, the read operation is abandoned */ - if (mr_fifo_size_get(&serial->rfifo) == 0) - { - return MR_EOK; - } - if (args != NULL) { /* Hardware FIFO is considered to be used */ count = *((int *)args); } + /* If FIFO is empty, the read operation is abandoned */ + if (mr_fifo_size_get(&serial->rfifo) == 0) + { + return MR_EOK; + } + /* Read all data from hardware FIFO */ for (size_t rcount = 0; rcount < count; rcount++) { @@ -378,9 +378,7 @@ static int serial_isr(struct mr_device *device, uint32_t event, void *args) /* Force write data to FIFO */ mr_fifo_write_force(&serial->rfifo, &data, sizeof(data)); } - - /* Return number of bytes received */ - return count; + return MR_EOK; } case MR_EVENT_SERIAL_WR_COMPLETE_INT: { diff --git a/source/device.c b/source/device.c index 923485e..341f1f3 100644 --- a/source/device.c +++ b/source/device.c @@ -15,9 +15,9 @@ #define _MAGIC_NUMBER (0xdeadbeef) /**< Magic number */ -#define _RD_LOCK_MASK (0xffff0000) /**< Read lock mask */ -#define _WR_LOCK_MASK (0x0000ffff) /**< Write lock mask */ -#define _RDWR_LOCK_MASK (0xffffffff) /**< Read/write lock mask */ +#define _LOCK_RD_MASK (0xffff0000) /**< Read lock mask */ +#define _LOCK_WR_MASK (0x0000ffff) /**< Write lock mask */ +#define _LOCK_ALL_MASK (0xffffffff) /**< Read/write lock mask */ /** * @brief Device event complete structure. @@ -43,8 +43,8 @@ static struct mr_device _root_device = { #endif /* MR_CFG_DESCRIPTOR_MAX */ static struct mr_descriptor _descriptor_map[MR_CFG_DESCRIPTOR_MAX] = {0}; -static struct mr_device *_device_find_from(const char *name, - struct mr_device *parent) +MR_INLINE struct mr_device *_device_find_from(const char *name, + struct mr_device *parent) { /* Deal with special names */ if (strcmp(name, "..") == 0) @@ -68,8 +68,8 @@ static struct mr_device *_device_find_from(const char *name, return NULL; } -static struct mr_device *_device_next_find(const char **path, - struct mr_device *parent) +MR_INLINE struct mr_device *_device_next_find(const char **path, + struct mr_device *parent) { /* Skip the leading '/' */ if ((*path)[0] == '/') @@ -134,6 +134,21 @@ static struct mr_device *_device_find_iter(const char *path, } } +MR_INLINE struct mr_device *_device_find(const char *path) +{ + struct mr_device *device; + + /* Critical section enter */ + mr_critical_enter(); + + /* Find the device */ + device = _device_find_iter(path, &_root_device); + + /* Critical section exit */ + mr_critical_exit(); + return device; +} + MR_INLINE bool _device_flags_is_valid(struct mr_device *device, uint32_t flags) { return MR_BIT_IS_SET(device->flags, flags); @@ -150,21 +165,6 @@ MR_INLINE bool _descriptor_flags_is_valid(int descriptor, uint32_t flags) return MR_BIT_IS_SET(_descriptor_map[descriptor].flags, flags); } -MR_INLINE struct mr_device *_device_find(const char *path) -{ - struct mr_device *device; - - /* Critical section enter */ - mr_critical_enter(); - - /* Find the device */ - device = _device_find_iter(path, &_root_device); - - /* Critical section exit */ - mr_critical_exit(); - return device; -} - MR_INLINE int _device_take(struct mr_device *device, int descriptor, uint32_t mask) { @@ -172,7 +172,7 @@ MR_INLINE int _device_take(struct mr_device *device, int descriptor, int ret; /* If the device is not FDX, the read/write must be locked */ - mask = (device->fdx == true) ? mask : _RDWR_LOCK_MASK; + mask = (device->fdx == true) ? mask : _LOCK_ALL_MASK; /* Calculate the lock mask, since the descriptor can be 0, need to add 1 */ lock = (((descriptor + 1) << 16) | (descriptor + 1)) & mask; @@ -180,9 +180,10 @@ MR_INLINE int _device_take(struct mr_device *device, int descriptor, /* Critical section enter */ mr_critical_enter(); - /* Take the device lock */ - if (((device->lock & mask) == 0) && - (_descriptor_is_valid(descriptor) == true)) + if (_descriptor_is_valid(descriptor) == false) + { + ret = MR_EINVAL; + } else if ((device->lock & mask) == 0) { MR_BIT_SET(device->lock, lock); ret = MR_EOK; @@ -199,7 +200,7 @@ MR_INLINE int _device_take(struct mr_device *device, int descriptor, MR_INLINE void _device_release(struct mr_device *device, uint32_t mask) { /* If the device is not FDX, the read/write must be locked */ - mask = (device->fdx == true) ? mask : _RDWR_LOCK_MASK; + mask = (device->fdx == true) ? mask : _LOCK_ALL_MASK; /* Release the device lock */ MR_BIT_CLR(device->lock, mask); @@ -413,6 +414,7 @@ static int _device_unregister(struct mr_device *device) static int _device_isr(struct mr_device *device, uint32_t event, void *args) { + uint32_t mask; int ret; /* Critical section enter */ @@ -436,12 +438,12 @@ static int _device_isr(struct mr_device *device, uint32_t event, void *args) } /* Release the device based on event */ - uint32_t mask = (event & MR_EVENT_RD_COMPLETE) ? _RD_LOCK_MASK : 0; - mask |= (event & MR_EVENT_WR_COMPLETE) ? _WR_LOCK_MASK : 0; + mask = (event & MR_EVENT_RD_COMPLETE) ? _LOCK_RD_MASK : 0; + mask |= (event & MR_EVENT_WR_COMPLETE) ? _LOCK_WR_MASK : 0; _device_release(device, mask); /* Call the event handler */ - _device_event_handler(device, event, &ret); + _device_event_handler(device, event, args); ret = MR_EOK; _exit: @@ -467,13 +469,12 @@ static int _device_open(const char *path, uint32_t flags) descriptor = _descriptor_allocate(device, flags); if (descriptor < 0) { - ret = descriptor; - goto _exit; + return descriptor; } /* Take the device */ - ret = _device_take(device, descriptor, _RDWR_LOCK_MASK); - if (ret != MR_EOK) + ret = _device_take(device, descriptor, _LOCK_ALL_MASK); + if (ret < 0) { _descriptor_free(descriptor); return ret; @@ -498,7 +499,7 @@ static int _device_open(const char *path, uint32_t flags) _exit: /* Release the device */ - _device_release(device, _RDWR_LOCK_MASK); + _device_release(device, _LOCK_ALL_MASK); return ret; } @@ -515,8 +516,8 @@ static int _device_close(int descriptor) } /* Take the device */ - ret = _device_take(device, descriptor, _RDWR_LOCK_MASK); - if (ret != MR_EOK) + ret = _device_take(device, descriptor, _LOCK_ALL_MASK); + if (ret < 0) { return ret; } @@ -525,7 +526,7 @@ static int _device_close(int descriptor) if ((device->ref_count == 1) && (device->ops->close != NULL)) { ret = device->ops->close(device); - if (ret != MR_EOK) + if (ret < 0) { goto _exit; } @@ -542,7 +543,7 @@ static int _device_close(int descriptor) _exit: /* Release the device */ - _device_release(device, _RDWR_LOCK_MASK); + _device_release(device, _LOCK_ALL_MASK); return ret; } @@ -560,8 +561,8 @@ static ssize_t _device_read(int descriptor, void *buf, size_t count) } /* Take the device */ - ret = _device_take(device, descriptor, _RD_LOCK_MASK); - if (ret != MR_EOK) + ret = _device_take(device, descriptor, _LOCK_RD_MASK); + if (ret < 0) { return ret; } @@ -590,7 +591,7 @@ static ssize_t _device_read(int descriptor, void *buf, size_t count) } /* Release the device */ - _device_release(device, _RD_LOCK_MASK); + _device_release(device, _LOCK_RD_MASK); return ret; } @@ -608,8 +609,8 @@ static ssize_t _device_write(int descriptor, const void *buf, size_t count) } /* Take the device */ - ret = _device_take(device, descriptor, _WR_LOCK_MASK); - if (ret != MR_EOK) + ret = _device_take(device, descriptor, _LOCK_WR_MASK); + if (ret < 0) { return ret; } @@ -638,11 +639,11 @@ static ssize_t _device_write(int descriptor, const void *buf, size_t count) } /* Release the device */ - _device_release(device, _WR_LOCK_MASK); + _device_release(device, _LOCK_WR_MASK); return ret; } -static int _device_ioctl(int descriptor, int cmd, void *arg) +static int _device_ioctl(int descriptor, int cmd, void *args) { struct mr_device *device; int pos, ret; @@ -655,8 +656,8 @@ static int _device_ioctl(int descriptor, int cmd, void *arg) } /* Take the device */ - ret = _device_take(device, descriptor, _RDWR_LOCK_MASK); - if (ret != MR_EOK) + ret = _device_take(device, descriptor, _LOCK_ALL_MASK); + if (ret < 0) { return ret; } @@ -670,68 +671,68 @@ static int _device_ioctl(int descriptor, int cmd, void *arg) case MR_CTRL_SET(MR_CMD_POS): { /* Check the argument */ - if (arg == NULL) + if (args == NULL) { ret = MR_EINVAL; goto _exit; } /* Set the position */ - _descriptor_map[descriptor].pos = *(int *)arg; + _descriptor_map[descriptor].pos = *(int *)args; ret = MR_EOK; break; } case MR_CTRL_GET(MR_CMD_POS): { /* Check the argument */ - if (arg == NULL) + if (args == NULL) { ret = MR_EINVAL; goto _exit; } /* Get the position */ - *(int *)arg = pos; + *(int *)args = pos; ret = MR_EOK; break; } case MR_CTRL_NEW(MR_CMD_EVENT): { /* Check the argument */ - if (arg == NULL) + if (args == NULL) { ret = MR_EINVAL; goto _exit; } - struct mr_device_event *event = (struct mr_device_event *)arg; - ret = _device_event_create(device, descriptor, event); + /* Create the event */ + ret = _device_event_create(device, descriptor,args); break; } case MR_CTRL_DEL(MR_CMD_EVENT): { /* Check the argument */ - if (arg == NULL) + if (args == NULL) { ret = MR_EINVAL; goto _exit; } - struct mr_device_event *event = (struct mr_device_event *)arg; - ret = _device_event_destroy(device, descriptor, event); + /* Destroy the event */ + ret = _device_event_destroy(device, descriptor, args); break; } default: { /* CMD is defined by the device */ - ret = device->ops->ioctl(device, pos, cmd, arg); + ret = device->ops->ioctl(device, pos, cmd, args); break; } } _exit: /* Release the device */ - _device_release(device, _RDWR_LOCK_MASK); + _device_release(device, _LOCK_ALL_MASK); return ret; }