diff --git a/drivers/input/mouse_upper.c b/drivers/input/mouse_upper.c index 1a51698457..62d625e26a 100644 --- a/drivers/input/mouse_upper.c +++ b/drivers/input/mouse_upper.c @@ -68,6 +68,8 @@ static int mouse_open(FAR struct file *filep); static int mouse_close(FAR struct file *filep); static ssize_t mouse_read(FAR struct file *filep, FAR char *buffer, size_t buflen); +static int mouse_ioctl(FAR struct file *filep, int cmd, + unsigned long arg); static int mouse_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); @@ -82,7 +84,7 @@ static const struct file_operations g_mouse_fops = mouse_read, /* read */ NULL, /* write */ NULL, /* seek */ - NULL, /* ioctl */ + mouse_ioctl, /* ioctl */ NULL, /* mmap */ NULL, /* truncate */ mouse_poll /* poll */ @@ -217,6 +219,36 @@ out: return ret; } +/**************************************************************************** + * Name: mouse_ioctl + ****************************************************************************/ + +static int mouse_ioctl(FAR struct file *filep, int cmd, unsigned long arg) +{ + FAR struct inode *inode = filep->f_inode; + FAR struct mouse_upperhalf_s *upper = inode->i_private; + FAR struct mouse_lowerhalf_s *lower = upper->lower; + int ret; + + ret = nxmutex_lock(&upper->lock); + if (ret < 0) + { + return ret; + } + + if (lower->control) + { + ret = lower->control(lower, cmd, arg); + } + else + { + ret = -ENOTTY; + } + + nxmutex_unlock(&upper->lock); + return ret; +} + /**************************************************************************** * Name: mouse_poll ****************************************************************************/ diff --git a/include/nuttx/fs/ioctl.h b/include/nuttx/fs/ioctl.h index aa383e7084..16bbfcc9d2 100644 --- a/include/nuttx/fs/ioctl.h +++ b/include/nuttx/fs/ioctl.h @@ -108,6 +108,7 @@ #define _PINCTRLBASE (0x4000) /* Pinctrl driver ioctl commands */ #define _PCIBASE (0x4100) /* Pci ioctl commands */ #define _I3CBASE (0x4200) /* I3C driver ioctl commands */ +#define _MSEIOCBASE (0x4300) /* Mouse ioctl commands */ #define _WLIOCBASE (0x8b00) /* Wireless modules ioctl network commands */ /* boardctl() commands share the same number space */ @@ -370,6 +371,11 @@ #define _TSIOCVALID(c) (_IOC_TYPE(c)==_TSIOCBASE) #define _TSIOC(nr) _IOC(_TSIOCBASE,nr) +/* NuttX mouse ioctl definitions (see nuttx/input/mouse.h) ******************/ + +#define _MSEIOCVALID(c) (_IOC_TYPE(c)==_MSEIOCBASE) +#define _MSEIOC(nr) _IOC(_MSEIOCBASE,nr) + /* NuttX sensor ioctl definitions (see nuttx/sensor/ioctl.h) ****************/ #define _SNIOCVALID(c) (_IOC_TYPE(c)==_SNIOCBASE) diff --git a/include/nuttx/input/mouse.h b/include/nuttx/input/mouse.h index 2f7f3f0ae0..81c60667c6 100644 --- a/include/nuttx/input/mouse.h +++ b/include/nuttx/input/mouse.h @@ -37,6 +37,7 @@ ****************************************************************************/ #include +#include /**************************************************************************** * Pre-processor Definitions @@ -50,6 +51,13 @@ #define MOUSE_BUTTON_2 (1 << 1) /* True: Right mouse button pressed */ #define MOUSE_BUTTON_3 (1 << 2) /* True: Middle mouse button pressed */ +/* IOCTL Commands ***********************************************************/ + +/* Common mouse IOCTL commands */ + +#define MSE_FIRST 0x0001 /* First common command */ +#define MSE_NCMDS 1 /* One common commands */ + /**************************************************************************** * Public Types ****************************************************************************/ @@ -75,6 +83,25 @@ struct mouse_report_s struct mouse_lowerhalf_s { FAR void *priv; /* Save the upper half pointer */ + + /************************************************************************** + * Name: control + * + * Description: + * Users can use this interface to implement custom IOCTL. + * + * Arguments: + * lower - The instance of lower half of mouse device. + * cmd - User defined specific command. + * arg - Argument of the specific command. + * + * Return Value: + * Zero(OK) on success; a negated errno value on failure. + * -ENOTTY - The command is not supported. + **************************************************************************/ + + CODE int (*control)(FAR struct mouse_lowerhalf_s *lower, + int cmd, unsigned long arg); }; /****************************************************************************