Skip to content
Snippets Groups Projects
Commit d897b4de authored by Gregory Nutt's avatar Gregory Nutt
Browse files

Enhanced timer interface from Bob Doiron

parent ae4584f0
No related branches found
No related tags found
No related merge requests found
......@@ -372,12 +372,16 @@ static int timer_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
}
break;
/* cmd: TCIOC_CAPTURE
* Description: Called this handler on timeout
/* cmd: TCIOC_SETHANDLER
* Description: Call this handler on timeout
* Argument: A pointer to struct timer_capture_s.
*
* NOTE: This ioctl cannot be support in the kernel build mode. In that
* case direct callbacks from kernel space into user space is forbidden.
*/
case TCIOC_CAPTURE:
#ifndef CONFIG_NUTTX_KERNEL
case TCIOC_SETHANDLER:
{
FAR struct timer_capture_s *capture;
......@@ -406,7 +410,7 @@ static int timer_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
}
}
break;
#endif
/* Any unrecognized IOCTL commands might be platform-specific ioctl commands */
......
......@@ -55,7 +55,7 @@
/* The timer driver uses a standard character driver framework. However,
* since the timer driver is a device control interface and not a data
* transfer interface, the majority of the functionality is implemented in
* driver ioctl calls. The timer ioctl commands are lised below:
* driver ioctl calls. The timer ioctl commands are listed below:
*
* These are detected and handled by the "upper half" timer driver.
*
......@@ -67,18 +67,21 @@
* Argument: A writeable pointer to struct timer_status_s.
* TCIOC_SETTIMEOUT - Reset the timer timeout to this value
* Argument: A 32-bit timeout value in microseconds.
* TCIOC_CAPTURE - Do not reset. Instead, called this handler.
* TCIOC_SETHANDLER - Call this handler on timer expiration
* Argument: A pointer to struct timer_capture_s.
*
* WARNING: May change TCIOC_SETTIMEOUT to pass pointer to 64bit nanoseconds
* or timespec structure.
*
* NOTE: This ioctl cannot be support in the kernel build mode. In that
* case direct callbacks from kernel space into user space is forbidden.
*/
#define TCIOC_START _TCIOC(0x001)
#define TCIOC_STOP _TCIOC(0x002)
#define TCIOC_GETSTATUS _TCIOC(0x003)
#define TCIOC_SETTIMEOUT _TCIOC(0x004)
#define TCIOC_CAPTURE _TCIOC(0x005)
#define TCIOC_SETHANDLER _TCIOC(0x005)
/* Bit Settings *************************************************************/
/* Bit settings for the struct timer_status_s flags field */
......@@ -90,12 +93,19 @@
/****************************************************************************
* Public Types
****************************************************************************/
/* This is the type of the argument passed to the TCIOC_CAPTURE ioctl */
/* User function prototype. Returns true to reload the timer, and the
* function can modify the next interval if desired.
*/
typedef bool (*tccb_t)(FAR uint32_t *next_interval_us);
/* This is the type of the argument passed to the TCIOC_SETHANDLER ioctl */
struct timer_capture_s
{
CODE xcpt_t newhandler; /* The new timer capture handler */
CODE xcpt_t oldhandler; /* The previous timer capture handler (if any) */
CODE tccb_t newhandler; /* The new timer capture handler */
CODE tccb_t oldhandler; /* The previous timer capture handler (if any) */
};
/* This is the type of the argument passed to the TCIOC_GETSTATUS ioctl and
......@@ -140,8 +150,8 @@ struct timer_ops_s
* NOTE: Providing handler==NULL disable.
*/
CODE xcpt_t (*capture)(FAR struct timer_lowerhalf_s *lower,
CODE xcpt_t handler);
CODE tccb_t (*capture)(FAR struct timer_lowerhalf_s *lower,
CODE tccb_t handler);
/* Any ioctl commands that are not recognized by the "upper-half" driver
* are forwarded to the lower half driver through this method.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment