diff options
| author | Yuval Adam <yuv.adm@gmail.com> | 2014-03-16 14:41:11 +0200 |
|---|---|---|
| committer | Yuval Adam <yuv.adm@gmail.com> | 2014-03-16 14:41:11 +0200 |
| commit | 990090a4cc9070837d31e66b58d40f0c3d038741 (patch) | |
| tree | cf1b905082c364e9b223e0c5058566103138dae5 /usblib/host/usbhhidmouse.c | |
| parent | 7f4da522479c0f00126219f0c23b804c3a93d7a6 (diff) | |
Add usblib and utils
Diffstat (limited to 'usblib/host/usbhhidmouse.c')
| -rw-r--r-- | usblib/host/usbhhidmouse.c | 452 |
1 files changed, 452 insertions, 0 deletions
diff --git a/usblib/host/usbhhidmouse.c b/usblib/host/usbhhidmouse.c new file mode 100644 index 0000000..f1eb8d5 --- /dev/null +++ b/usblib/host/usbhhidmouse.c @@ -0,0 +1,452 @@ +//*****************************************************************************
+//
+// usbhhidmouse.c - This file holds the application interfaces for USB
+// mouse devices.
+//
+// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the Tiva USB Library.
+//
+//*****************************************************************************
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "inc/hw_types.h"
+#include "usblib/usblib.h"
+#include "usblib/host/usbhost.h"
+#include "usblib/usbhid.h"
+#include "usblib/host/usbhhid.h"
+#include "usblib/host/usbhhidmouse.h"
+
+//*****************************************************************************
+//
+//! \addtogroup usblib_host_device
+//! @{
+//
+//*****************************************************************************
+
+//*****************************************************************************
+//
+// Prototypes for local functions.
+//
+//*****************************************************************************
+static uint32_t USBHMouseCallback(void *pvMouse, uint32_t ui32Event,
+ uint32_t ui32MsgParam, void *pvMsgData);
+
+//*****************************************************************************
+//
+// The size of a USB mouse report.
+//
+//*****************************************************************************
+#define USBHMS_REPORT_SIZE 4
+
+//*****************************************************************************
+//
+// These are the flags for the tUSBHMouse.ui32HIDFlags member variable.
+//
+//*****************************************************************************
+#define USBHMS_DEVICE_PRESENT 0x00000001
+
+//*****************************************************************************
+//
+// This is the structure definition for a mouse device instance.
+//
+//*****************************************************************************
+struct tUSBHMouse
+{
+ //
+ // Global flags for an instance of a mouse.
+ //
+ uint32_t ui32HIDFlags;
+
+ //
+ // The applications registered callback.
+ //
+ tUSBHIDMouseCallback pfnCallback;
+
+ //
+ // The current state of the buttons.
+ //
+ uint8_t ui8Buttons;
+
+ //
+ // This is a local buffer to hold the current HID report that comes up
+ // from the HID driver layer.
+ //
+ uint8_t pui8Buffer[USBHMS_REPORT_SIZE];
+
+ //
+ // Heap data for the mouse currently used to read the HID Report
+ // Descriptor.
+ //
+ uint8_t *pui8Heap;
+
+ //
+ // Size of the heap in bytes.
+ //
+ uint32_t ui32HeapSize;
+
+ //
+ // This is the instance value for the HID device that will be used for the
+ // mouse.
+ //
+ tHIDInstance *psHIDInstance;
+};
+
+//*****************************************************************************
+//
+// This is the per instance information for a mouse device.
+//
+//*****************************************************************************
+static tUSBHMouse g_sUSBHMouse =
+{
+ 0
+};
+
+//*****************************************************************************
+//
+//! This function is used open an instance of a mouse.
+//!
+//! \param pfnCallback is the callback function to call when new events occur
+//! with the mouse returned.
+//! \param pui8Buffer is the memory used by the driver to interact with the
+//! USB mouse.
+//! \param ui32Size is the size of the buffer provided by \e pui8Buffer.
+//!
+//! This function is used to open an instance of the mouse. The value
+//! returned from this function should be used as the instance identifier for
+//! all other USBHMouse calls. The \e pui8Buffer memory buffer is used to
+//! access the mouse. The buffer size required is at least enough to hold
+//! a normal report descriptor for the device.
+//!
+//! \return Returns the instance identifier for the mouse that is attached.
+//! If there is no mouse present this will return 0.
+//
+//*****************************************************************************
+tUSBHMouse *
+USBHMouseOpen(tUSBHIDMouseCallback pfnCallback, uint8_t *pui8Buffer,
+ uint32_t ui32Size)
+{
+ //
+ // Save the callback and data pointers.
+ //
+ g_sUSBHMouse.pfnCallback = pfnCallback;
+
+ //
+ // Save the instance pointer for the HID device that was opened.
+ //
+ g_sUSBHMouse.psHIDInstance = USBHHIDOpen(eUSBHHIDClassMouse,
+ USBHMouseCallback,
+ (void *)&g_sUSBHMouse);
+
+ //
+ // Save the heap buffer and size.
+ //
+ g_sUSBHMouse.pui8Heap = pui8Buffer;
+ g_sUSBHMouse.ui32HeapSize = ui32Size;
+
+ return(&g_sUSBHMouse);
+}
+
+//*****************************************************************************
+//
+//! This function is used close an instance of a mouse.
+//!
+//! \param psMsInstance is the instance value for this mouse.
+//!
+//! This function is used to close an instance of the mouse that was opened
+//! with a call to USBHMouseOpen(). The \e psMsInstance value is the value
+//! that was returned when the application called USBHMouseOpen().
+//!
+//! \return Returns 0.
+//
+//*****************************************************************************
+uint32_t
+USBHMouseClose(tUSBHMouse *psMsInstance)
+{
+ //
+ // Reset the callback to null.
+ //
+ psMsInstance->pfnCallback = 0;
+
+ //
+ // Call the HID driver layer to close out this instance.
+ //
+ USBHHIDClose(psMsInstance->psHIDInstance);
+
+ return(0);
+}
+
+//*****************************************************************************
+//
+//! This function is used to initialize a mouse interface after a mouse has
+//! been detected.
+//!
+//! \param psMsInstance is the instance value for this mouse.
+//!
+//! This function should be called after receiving a \b USB_EVENT_CONNECTED
+//! event in the callback function provided by USBHMouseOpen(), however it
+//! should only be called outside of the callback function. This will
+//! initialize the mouse interface and determine how it reports events to the
+//! USB host controller. The \e psMsInstance value is the value that was
+//! returned when the application called USBHMouseOpen(). This function only
+//! needs to be called once per connection event but it should be called every
+//! time a \b USB_EVENT_CONNECTED event occurs.
+//!
+//! \return Non-zero values should be assumed to indicate an error condition.
+//
+//*****************************************************************************
+uint32_t
+USBHMouseInit(tUSBHMouse *psMsInstance)
+{
+ //
+ // Set the initial rate to only update on mouse state changes.
+ //
+ USBHHIDSetIdle(psMsInstance->psHIDInstance, 0, 0);
+
+ //
+ // Read out the Report Descriptor from the mouse and parse it for
+ // the format of the reports coming back from the mouse.
+ //
+ USBHHIDGetReportDescriptor(psMsInstance->psHIDInstance,
+ psMsInstance->pui8Heap,
+ psMsInstance->ui32HeapSize);
+
+ //
+ // Set the mouse to boot protocol.
+ //
+ USBHHIDSetProtocol(psMsInstance->psHIDInstance, 1);
+
+ return(0);
+}
+
+//*****************************************************************************
+//
+// This function handles updating the state of the mouse buttons and axis.
+//
+// \param psMsInstance is the pointer to an instance of the mouse data.
+//
+// This function will check for updates to buttons or X/Y movements and send
+// callbacks to the mouse callback function.
+//
+// \return None.
+//
+//*****************************************************************************
+static void
+UpdateMouseState(tUSBHMouse *psMsInstance)
+{
+ uint32_t ui32Button;
+
+ if(psMsInstance->pui8Buffer[0] != psMsInstance->ui8Buttons)
+ {
+ for(ui32Button = 1; ui32Button <= 0x4; ui32Button <<= 1)
+ {
+ if(((psMsInstance->pui8Buffer[0] & ui32Button) != 0) &&
+ ((psMsInstance->ui8Buttons & ui32Button) == 0))
+ {
+ //
+ // Send the mouse button press notification to the application.
+ //
+ psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_PRESS,
+ ui32Button, 0);
+ }
+ if(((psMsInstance->pui8Buffer[0] & ui32Button) == 0) &&
+ ((psMsInstance->ui8Buttons & ui32Button) != 0))
+ {
+ //
+ // Send the mouse button release notification to the
+ // application.
+ //
+ psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_REL,
+ ui32Button, 0);
+ }
+ }
+
+ //
+ // Save the new state.
+ //
+ psMsInstance->ui8Buttons = psMsInstance->pui8Buffer[0];
+ }
+
+ if(psMsInstance->pui8Buffer[1] != 0)
+ {
+ //
+ // Send the mouse button release notification to the
+ // application.
+ //
+ psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_X,
+ (uint32_t)psMsInstance->pui8Buffer[1], 0);
+ }
+
+ if(psMsInstance->pui8Buffer[2] != 0)
+ {
+ //
+ // Send the mouse button release notification to the
+ // application.
+ //
+ psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_Y,
+ (uint32_t)psMsInstance->pui8Buffer[2], 0);
+ }
+}
+
+//*****************************************************************************
+//
+//! This function handles event callbacks from the USB HID driver layer.
+//!
+//! \param pvMouse is the pointer that was passed in to the USBHHIDOpen()
+//! call.
+//! \param ui32Event is the event that has been passed up from the HID driver.
+//! \param ui32MsgParam has meaning related to the \e ui32Event that occurred.
+//! \param pvMsgData has meaning related to the \e ui32Event that occurred.
+//!
+//! This function will receive all event updates from the HID driver layer.
+//! The mouse driver itself will mostly be concerned with report callbacks
+//! from the HID driver layer and parsing them into keystrokes for the
+//! application that has registered for callbacks with the USBHMouseOpen()
+//! call.
+//!
+//! \return Non-zero values should be assumed to indicate an error condition.
+//
+//*****************************************************************************
+uint32_t
+USBHMouseCallback(void *pvMouse, uint32_t ui32Event,
+ uint32_t ui32MsgParam, void *pvMsgData)
+{
+ tUSBHMouse *psMsInstance;
+
+ //
+ // Recover the pointer to the instance data.
+ //
+ psMsInstance = (tUSBHMouse *)pvMouse;
+
+ switch(ui32Event)
+ {
+ //
+ // New mouse has been connected so notify the application.
+ //
+ case USB_EVENT_CONNECTED:
+ {
+ //
+ // Remember that a mouse is present.
+ //
+ psMsInstance->ui32HIDFlags |= USBHMS_DEVICE_PRESENT;
+
+ //
+ // Notify the application that a new mouse was connected.
+ //
+ psMsInstance->pfnCallback(0, ui32Event, ui32MsgParam, pvMsgData);
+
+ break;
+ }
+ case USB_EVENT_DISCONNECTED:
+ {
+ //
+ // No mouse is present.
+ //
+ psMsInstance->ui32HIDFlags &= ~USBHMS_DEVICE_PRESENT;
+
+ //
+ // Notify the application that the mouse was disconnected.
+ //
+ psMsInstance->pfnCallback(0, ui32Event, ui32MsgParam, pvMsgData);
+
+ break;
+ }
+ case USB_EVENT_RX_AVAILABLE:
+ {
+ //
+ // New mouse report structure was received.
+ //
+ USBHHIDGetReport(psMsInstance->psHIDInstance, 0,
+ psMsInstance->pui8Buffer, USBHMS_REPORT_SIZE);
+
+ //
+ // Update the current state of the mouse and notify the application
+ // of any changes.
+ //
+ UpdateMouseState(psMsInstance);
+
+ break;
+ }
+ }
+ return(0);
+}
+
+//*****************************************************************************
+//
+//! This function forwards an LPM request for a device to enter L1 sleep state.
+//!
+//! \param psMsInstance is the HID keyboard instance that was returned
+//! from the call to USBHMouseOpen().
+//!
+//! This function forwards a request from an application to the HID device
+//! class to request that a device enter the LPM L1 sleep state. The
+//! caller must check the return value to see if the request can be
+//! attempted at this time. If another LPM transaction is busy on this or
+//! another device, then this function returns \b USBHCD_LPM_PENDING. If
+//! the LPM request was scheduled to be sent the function returns
+//! \b USBHCD_LPM_AVAIL. The caller should check the USBHCDLPMStatus()
+//! function to determine if the request completed successfully or if there
+//! was an error.
+//!
+//! \return This function returns the following values:
+//! - \b USBHCD_LPM_AVAIL - The transition to L1 state is scheduled to be sent.
+//! - \b USBHCD_LPM_PENDING - There is already an LPM request pending.
+//
+//*****************************************************************************
+uint32_t
+USBHMouseLPMSleep(tUSBHMouse *psMsInstance)
+{
+ //
+ // Call the HID function to send the sleep command.
+ //
+ return(USBHHIDLPMSleep(psMsInstance->psHIDInstance));
+}
+
+//*****************************************************************************
+//
+//! This function returns the current status of an LPM request.
+//!
+//! \param psMsInstance is the HID keyboard instance that was returned
+//! from the call to USBHMouseOpen().
+//!
+//! This function returns the current status of LPM requests for a given
+//! device. This is called to determine if a previous request completed
+//! successfully or if there was an error.
+//!
+//! \return This function returns the following values:
+//! - \b USBHCD_LPM_AVAIL - There are no pending LPM requests on this specific
+//! device or the last request completed successfully.
+//! - \b USBHCD_LPM_ERROR - The last LPM request for this device did not
+//! complete successfully.
+//! - \b USBHCD_LPM_PENDING - The last LPM request has not completed.
+//
+//*****************************************************************************
+uint32_t
+USBHMouseLPMStatus(tUSBHMouse *psMsInstance)
+{
+ //
+ // Call the HID function to get the current LPM status.
+ //
+ return(USBHHIDLPMStatus(psMsInstance->psHIDInstance));
+}
+
+//*****************************************************************************
+//
+//! @}
+//
+//*****************************************************************************
|
