Fixed compilation issue with poll fds notification

Author: Alan Carvalho de Assis <acassis@gmail.com>
    Fix all nxstyle reported issues

Author: Robin Raymond <robin@opticaltone.com>
    Fixed compilation issue with poll fds notification.
    https://github.com/apache/incubator-nuttx/issues/483
This commit is contained in:
Alan Carvalho de Assis 2020-03-07 19:18:50 -03:00
parent c8b39b48bb
commit 953a1fafae
1 changed files with 34 additions and 20 deletions

View File

@ -47,6 +47,7 @@
#include <errno.h>
#include <debug.h>
#include <fcntl.h>
#include <poll.h>
#include <nuttx/irq.h>
#include <nuttx/kmalloc.h>
@ -185,6 +186,13 @@ struct usbhost_state_s
pid_t pollpid; /* PID of the poll task */
size_t out_seq_num; /* The sequence number for outgoing packets */
struct xbox_controller_buttonstate_s rpt; /* The latest report out of the controller. */
/* The following is a list if poll structures of threads waiting for
* driver events. The 'struct pollfd' reference for each open is also
* retained in the f_priv field of the 'struct file'.
*/
struct pollfd *fds[CONFIG_XBOXCONTROLLER_NPOLLWAITERS];
};
/****************************************************************************
@ -211,7 +219,10 @@ static inline void usbhost_mkdevname(FAR struct usbhost_state_s *priv,
/* Worker thread actions */
static void usbhost_destroy(FAR void *arg);
static void usbhost_notify(FAR struct usbhost_state_s *priv);
/* Polling support */
static void usbhost_pollnotify(FAR struct usbhost_state_s *dev);
static int usbhost_xboxcontroller_poll(int argc, char *argv[]);
/* Helpers for usbhost_connect() */
@ -254,7 +265,7 @@ static ssize_t usbhost_read(FAR struct file *filep,
FAR char *buffer, size_t len);
static ssize_t usbhost_write(FAR struct file *filep,
FAR const char *buffer, size_t len);
static int usbhost_ioctl(FAR struct file* filep, int cmd, unsigned long arg);
static int usbhost_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
static int usbhost_poll(FAR struct file *filep, FAR struct pollfd *fds,
bool setup);
@ -269,6 +280,7 @@ static int usbhost_poll(FAR struct file *filep, FAR struct pollfd *fds,
static const struct usbhost_id_s g_xboxcontroller_id[] =
{
/* XBox One classic controller */
{
USB_CLASS_VENDOR_SPEC, /* base -- Must be one of the USB_CLASS_* definitions in usb.h */
0x0047, /* subclass -- depends on the device */
@ -514,7 +526,7 @@ static void usbhost_destroy(FAR void *arg)
}
/****************************************************************************
* Name: usbhost_notify
* Name: usbhost_pollnotify
*
* Description:
* Wake any threads waiting for controller data
@ -527,7 +539,7 @@ static void usbhost_destroy(FAR void *arg)
*
****************************************************************************/
static void usbhost_notify(FAR struct usbhost_state_s *priv)
static void usbhost_pollnotify(FAR struct usbhost_state_s *priv)
{
int i;
@ -637,7 +649,7 @@ static int usbhost_xboxcontroller_poll(int argc, char *argv[])
uerr(" Too many errors... aborting: %d\n", nerrors);
ret = (int)nbytes;
break;
}
}
}
}
@ -681,6 +693,7 @@ static int usbhost_xboxcontroller_poll(int argc, char *argv[])
break;
case USBHOST_GUIDE_BUTTON_STATUS:
/* Get exclusive access to the controller state data */
usbhost_takesem(&priv->exclsem);
@ -723,7 +736,7 @@ static int usbhost_xboxcontroller_poll(int argc, char *argv[])
/* Notify any waiters that new controller data is available */
usbhost_notify(priv);
usbhost_pollnotify(priv);
/* Release our lock on the state structure */
@ -732,6 +745,7 @@ static int usbhost_xboxcontroller_poll(int argc, char *argv[])
break;
case USBHOST_BUTTON_DATA:
/* Ignore the controller data if no task has opened the driver. */
if (priv->open)
@ -787,23 +801,23 @@ static int usbhost_xboxcontroller_poll(int argc, char *argv[])
XBOX_BUTTON_SET(priv->tbuffer, XBOX_BUTTON_STICK_RIGHT_INDEX,
XBOX_BUTTON_STICK_RIGHT_MASK);
priv->rpt.trigger_left =
((int16_t*)(priv->tbuffer))[XBOX_BUTTON_TRIGGER_LEFT];
((int16_t *)(priv->tbuffer))[XBOX_BUTTON_TRIGGER_LEFT];
priv->rpt.trigger_right =
((int16_t*)(priv->tbuffer))[XBOX_BUTTON_TRIGGER_RIGHT];
((int16_t *)(priv->tbuffer))[XBOX_BUTTON_TRIGGER_RIGHT];
priv->rpt.stick_left_x =
((int16_t*)(priv->tbuffer))[XBOX_BUTTON_STICK_LEFT_X];
((int16_t *)(priv->tbuffer))[XBOX_BUTTON_STICK_LEFT_X];
priv->rpt.stick_left_y =
((int16_t*)(priv->tbuffer))[XBOX_BUTTON_STICK_LEFT_Y];
((int16_t *)(priv->tbuffer))[XBOX_BUTTON_STICK_LEFT_Y];
priv->rpt.stick_right_x =
((int16_t*)(priv->tbuffer))[XBOX_BUTTON_STICK_RIGHT_X];
((int16_t *)(priv->tbuffer))[XBOX_BUTTON_STICK_RIGHT_X];
priv->rpt.stick_right_y =
((int16_t*)(priv->tbuffer))[XBOX_BUTTON_STICK_RIGHT_Y];
((int16_t *)(priv->tbuffer))[XBOX_BUTTON_STICK_RIGHT_Y];
priv->valid = true;
/* Notify any waiters that new controller data is available */
usbhost_notify(priv);
usbhost_pollnotify(priv);
/* Release our lock on the state structure */
@ -1434,7 +1448,7 @@ static void usbhost_putle32(uint8_t *dest, uint32_t val)
/* Little endian means LS halfword first in byte stream */
usbhost_putle16(dest, (uint16_t)(val & 0xffff));
usbhost_putle16(dest+2, (uint16_t)(val >> 16));
usbhost_putle16(dest + 2, (uint16_t)(val >> 16));
}
#endif
@ -1544,7 +1558,7 @@ static FAR struct usbhost_class_s *usbhost_create(FAR struct usbhost_hubport_s *
if (usbhost_allocdevno(priv) == OK)
{
/* Initialize class method function pointers */
/* Initialize class method function pointers */
priv->usbclass.hport = hport;
priv->usbclass.connect = usbhost_connect;
@ -1584,6 +1598,7 @@ static FAR struct usbhost_class_s *usbhost_create(FAR struct usbhost_hubport_s *
/****************************************************************************
* struct usbhost_class_s methods
****************************************************************************/
/****************************************************************************
* Name: usbhost_connect
*
@ -1727,6 +1742,7 @@ static int usbhost_disconnected(struct usbhost_class_s *usbclass)
/****************************************************************************
* Character driver methods
****************************************************************************/
/****************************************************************************
* Name: usbhost_open
*
@ -2000,7 +2016,7 @@ static ssize_t usbhost_write(FAR struct file *filep, FAR const char *buffer,
*
****************************************************************************/
static int usbhost_ioctl(FAR struct file* filep, int cmd, unsigned long arg)
static int usbhost_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
FAR struct inode *inode;
FAR struct usbhost_state_s *priv;
@ -2038,7 +2054,6 @@ static int usbhost_ioctl(FAR struct file* filep, int cmd, unsigned long arg)
switch (cmd)
{
case XBOX_CONTROLLER_IOCTL_RUMBLE:
/* The least significant byte is the weak actuator strength.
@ -2047,8 +2062,8 @@ static int usbhost_ioctl(FAR struct file* filep, int cmd, unsigned long arg)
memcpy(priv->obuffer, rumble_cmd, sizeof(rumble_cmd));
priv->obuffer[2] = priv->out_seq_num++;
priv->obuffer[8] = (arg >> 1) & 0xff; // Strong (left actuator)
priv->obuffer[9] = arg & 0xff; // Weak (right actuator)
priv->obuffer[8] = (arg >> 1) & 0xff; /* Strong (left actuator) */
priv->obuffer[9] = arg & 0xff; /* Weak (right actuator) */
/* Perform the transfer. */
@ -2190,7 +2205,6 @@ errout:
int usbhost_xboxcontroller_init(void)
{
/* Perform any one-time initialization of the class implementation */
nxsem_init(&g_exclsem, 0, 1);