From 990090a4cc9070837d31e66b58d40f0c3d038741 Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Sun, 16 Mar 2014 14:41:11 +0200 Subject: Add usblib and utils --- usblib/host/usbhhidmouse.c | 452 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 452 insertions(+) create mode 100644 usblib/host/usbhhidmouse.c (limited to 'usblib/host/usbhhidmouse.c') 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 +#include +#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)); +} + +//***************************************************************************** +// +//! @} +// +//***************************************************************************** -- cgit v1.3.1