The USB HID mouse driver is now functional. There are some usage issues as described in the top-level TODO list

This commit is contained in:
Gregory Nutt 2014-02-09 17:40:23 -06:00
parent 2b40128148
commit 0979cdba0e
6 changed files with 75 additions and 31 deletions

View File

@ -6553,4 +6553,8 @@
completely untested on initial check-in (2014-2-9).
* configs/olimex-lpc1766stk/src/lpc17_hidmouse.c and hidmouse: Add
support of a test of the USB HID mouse (2014-2-9).
* drivers/usbhost/usbhost_hidmouse.c: The driver appears to be
functional. But there are usability issues: How do you use the
mouse with no cursor? The HID mouse currently emulates a touchscreen
driver. That would work in the long run for several reasons (see the
top-level TODO list for details) (2014-2-9).

22
TODO
View File

@ -16,7 +16,7 @@ nuttx/
(4) C++ Support
(6) Binary loaders (binfmt/)
(17) Network (net/, drivers/net)
(4) USB (drivers/usbdev, drivers/usbhost)
(5) USB (drivers/usbdev, drivers/usbhost)
(11) Libraries (libc/, )
(12) File system/Generic drivers (fs/, drivers/)
(5) Graphics subystem (graphics/)
@ -1025,6 +1025,26 @@ o USB (drivers/usbdev, drivers/usbhost)
Status: Open
Priority: Low/Unknown. This is a feature enhancement.
Title: USB HID MOUSE LOGIC INCOMPLETE
Description: There is a working USB HID mouse driver at drivers/usbhost/usbhost_hidmouse.c.
Although the driver works, it is not useful. Currently it
emulates a touchscreen and uses the touchscreen interface.
The problems are:
- With no hardware cursor, a mouse is not usable because
you cannot tell where the mouse is positioned.
- Since it uses the touchscreen interface, there is no way
to report left or center button activity or to report
the wheel position.
- And, for the same reason, positional data is not reported
when the left button is not pressed (i.e., like touching
the screen). Data would have to be reported when no
buttons are pressed in order to driver a hardware cursor.
There is a test configuration at configs/olimex-lpc1766stk/hidmouse.
Status: Open
Priority: Low, unless you need a usable HID mouse now.
o Libraries (libc/)
^^^^^^^^^^^^^^^^^

View File

@ -958,9 +958,9 @@ Where <subdir> is one of the following:
CONFIG_WINDOWS_CYGWIN=y : Cygwin environment on Windows
CONFIG_ARMV7M_TOOLCHAIN_CODESOURCERYW=y : CodeSourcery under Windows
3. The mouse is really useless with no display and not cursor. So this
configuration is only suited for testing. It is also awkward to use.
Here are the steps:
3. The mouse is really useless with no display and no cursor. So this
configuration is only suited for low-level testing. It is also awkward
to use. Here are the steps:
- Remove the USB HID mouse and reset the board.
- When the NSH prompt comes up type 'tc'. That will fail, but it

View File

@ -407,7 +407,6 @@ CONFIG_USBHOST_NPREALLOC=4
# CONFIG_USBHOST_MSC is not set
# CONFIG_USBHOST_HIDKBD is not set
CONFIG_USBHOST_HIDMOUSE=y
CONFIG_HIDMOUSE_POLLUSEC=100000
CONFIG_HIDMOUSE_DEFPRIO=50
CONFIG_HIDMOUSE_STACKSIZE=1024
CONFIG_HIDMOUSE_BUFSIZE=64

View File

@ -157,6 +157,7 @@ config HIDMOUSE_SWAPXY
default n
---help---
Reverse the meaning of X and Y to handle different display orientations.
NOTE: All of the following settings apply AFTER X and Y have been swapped.
config HIDMOUSE_XMAX
int "Maximum X position"
@ -178,24 +179,30 @@ config HIDMOUSE_XSCALE
hex "X scaling factor"
default 0x00010000
---help---
Mouse positions are accumumated from X/Y displacements reported by
Mouse positions are accumulated from X/Y displacements reported by
the mouse device. This setting provides a scaling value for the X
displacement. This is a fixed precision floating point number with
16 bits of fraction. So a value of 0x00010000 is 1.0, 0x00018000
is 1.5, 0x00024000 is 2.25, etc.
NOTE that a negative value of HIDMOUSE_XSCALE such as 0xffff0000
(-1.0) can be used to change the direction of movement.
Default: 0x00010000 (1.0)
config HIDMOUSE_YSCALE
hex "Y scaling factor"
default 0x00010000
---help---
Mouse positions are accumumated from X/Y displacements reported by
Mouse positions are accumulated from X/Y displacements reported by
the mouse device. This setting provides a scaling value for the Y
displacement. This is a fixed precision floating point number with
16 bits of fraction. So a value of 0x00010000 is 1.0, 0x00018000
is 1.5, 0x00024000 is 2.25, etc.
NOTE that a negative value of HIDMOUSE_YSCALE such as 0xffff0000
(-1.0) can be used to change the direction of movement.
Default: 0x00010000 (1.0)
config HIDMOUSE_XTHRESH

View File

@ -228,8 +228,8 @@ struct usbhost_state_s
sem_t exclsem; /* Used to maintain mutual exclusive access */
sem_t waitsem; /* Used to wait for mouse data */
FAR uint8_t *tbuffer; /* The allocated transfer buffer */
b16_t xpos; /* Current integrated X position */
b16_t ypos; /* Current integrated Y position */
b16_t xaccum; /* Current integrated X position */
b16_t yaccum; /* Current integrated Y position */
b16_t xlast; /* Last reported X position */
b16_t ylast; /* Last reported Y position */
size_t tbuflen; /* Size of the allocated transfer buffer */
@ -753,53 +753,67 @@ static int usbhost_mouse_poll(int argc, char *argv[])
*/
#ifdef CONFIG_HIDMOUSE_SWAPXY
xdisp = rpt->ydisp;
if ((rpt->ydisp & 0x80) != 0)
{
xdisp |= 0xffffff00;
}
#else
xdisp = rpt->xdisp;
if ((rpt->xdisp & 0x80) != 0)
{
xdisp |= 0xffffff00;
}
#else
xdisp = rpt->ydisp;
if ((rpt->ydisp & 0x80) != 0)
{
ydisp |= 0xffffff00;
}
#endif
/* Scale the X displacement and determine the new X position */
xpos = priv->xpos + CONFIG_HIDMOUSE_XSCALE * xdisp;
xpos = priv->xaccum + CONFIG_HIDMOUSE_XSCALE * xdisp;
/* Make sure that the scaled X position does not exceed the
* maximum.
/* Make sure that the scaled X position does not become negative
* or exceed the maximum.
*/
if (xpos > HIDMOUSE_XMAX_B16)
{
xpos = HIDMOUSE_XMAX_B16;
}
else if (xpos < 0)
{
xpos = 0;
}
/* Save the updated X position */
priv->xaccum = xpos;
/* Do the same for the Y position */
#ifdef CONFIG_HIDMOUSE_SWAPXY
ydisp = rpt->xdisp;
if ((rpt->xdisp & 0x80) != 0)
{
ydisp |= 0xffffff00;
}
#else
ydisp = rpt->ydisp;
if ((rpt->ydisp & 0x80) != 0)
{
ydisp |= 0xffffff00;
}
#else
ydisp = rpt->xdisp;
if ((rpt->xdisp & 0x80) != 0)
{
xdisp |= 0xffffff00;
}
#endif
ypos = priv->ypos + CONFIG_HIDMOUSE_YSCALE * ydisp;
ypos = priv->yaccum + CONFIG_HIDMOUSE_YSCALE * ydisp;
if (ypos > HIDMOUSE_YMAX_B16)
{
ypos = HIDMOUSE_YMAX_B16;
}
else if (ypos < 0)
{
ypos = 0;
}
priv->yaccum = ypos;
/* Check if the left button is pressed */
@ -841,9 +855,9 @@ static int usbhost_mouse_poll(int argc, char *argv[])
else if (priv->sample.event == BUTTON_RELEASED)
{
/* If we have not yet processed the last pen up event, then we
* cannot handle this pen down event. We will have to discard
* it and wait for the next sample data.
/* If we have not yet processed the button release event, then
* we cannot handle this button press event. We will have to
* discard the data and wait for the next sample.
*/
goto ignored;
@ -1891,8 +1905,8 @@ static int usbhost_open(FAR struct file *filep)
/* Set the reported position to the center of the range */
priv->xpos = (CONFIG_HIDMOUSE_XMAX >> 1);
priv->ypos = (CONFIG_HIDMOUSE_YMAX >> 1);
priv->xaccum = (HIDMOUSE_XMAX_B16 >> 1);
priv->yaccum = (HIDMOUSE_YMAX_B16 >> 1);
}
/* Otherwise, just increment the reference count on the driver */