1
0
Fork 0
forked from nuttx/nuttx-update

timer driver:support poll.

Signed-off-by: yangguangcai <yangguangcai@xiaomi.com>
This commit is contained in:
yangguangcai 2024-05-24 16:33:06 +08:00 committed by Xiang Xiao
parent dee4c63adb
commit 45625cbe3b

View file

@ -39,6 +39,7 @@
#include <nuttx/fs/fs.h>
#include <nuttx/mutex.h>
#include <nuttx/timers/timer.h>
#include <sys/poll.h>
#ifdef CONFIG_TIMER
@ -53,6 +54,7 @@ struct timer_upperhalf_s
mutex_t lock; /* Supports mutual exclusion */
uint8_t crefs; /* The number of times the device has been opened */
FAR char *path; /* Registration path */
FAR struct pollfd *fds;
/* The contained signal info */
@ -77,6 +79,8 @@ static ssize_t timer_write(FAR struct file *filep, FAR const char *buffer,
size_t buflen);
static int timer_ioctl(FAR struct file *filep, int cmd,
unsigned long arg);
static int timer_poll(FAR struct file *filep,
FAR struct pollfd *fds, bool setup);
/****************************************************************************
* Private Data
@ -90,6 +94,9 @@ static const struct file_operations g_timerops =
timer_write, /* write */
NULL, /* seek */
timer_ioctl, /* ioctl */
NULL, /* mmap */
NULL, /* truncate */
timer_poll, /* poll */
};
/****************************************************************************
@ -115,6 +122,8 @@ static bool timer_notifier(FAR uint32_t *next_interval_us, FAR void *arg)
/* Signal the waiter.. if there is one */
poll_notify(&upper->fds, 1, POLLIN);
nxsig_notification(notify->pid, &notify->event, SI_QUEUE, &upper->work);
return notify->periodic;
@ -396,6 +405,46 @@ static int timer_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
return ret;
}
/****************************************************************************
* Name: timer_poll
****************************************************************************/
static int timer_poll(FAR struct file *filep,
FAR struct pollfd *fds, bool setup)
{
FAR struct inode *inode = filep->f_inode;
FAR struct timer_upperhalf_s *upper = inode->i_private;
irqstate_t flags;
int ret = OK;
if (upper == NULL || fds == NULL)
{
return -EINVAL;
}
flags = enter_critical_section();
if (setup)
{
if (upper->fds)
{
ret = -EBUSY;
goto errout;
}
upper->fds = fds;
}
else
{
upper->fds = NULL;
}
errout:
leave_critical_section(flags);
return ret;
}
/****************************************************************************
* Public Functions
****************************************************************************/
@ -560,7 +609,7 @@ int timer_setcallback(FAR void *handle, tccb_t callback, FAR void *arg)
/* Check if the lower half driver supports the setcallback method */
if (lower->ops->setcallback != NULL) /* Optional */
if (lower->ops->setcallback != NULL)
{
/* Yes.. Defer the handler attachment to the lower half driver */