| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- //*****************************************************************************
- //
- // usbhhidmouse.c - This file holds the application interfaces for USB
- // mouse devices.
- //
- // Copyright (c) 2008-2010 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 AM1808 StarterWare USB Library, modified resused from revision 6288 of the
- // stellaris USB Library
- //
- //*****************************************************************************
- #include "hw_types.h"
- #include "usblib.h"
- #include "usbhost.h"
- #include "usbhid.h"
- #include "usbhhid.h"
- #include "usbhhidmouse.h"
- //*****************************************************************************
- //
- //! \addtogroup usblib_host_device
- //! @{
- //
- //*****************************************************************************
- //*****************************************************************************
- //
- // Prototypes for local functions.
- //
- //*****************************************************************************
- static unsigned int USBHMouseCallback(void *pvCBData,
- unsigned int ulEvent,
- unsigned int ulMsgParam,
- void *pvMsgData);
- //*****************************************************************************
- //
- // The size of a USB mouse report.
- //
- //*****************************************************************************
- #define USBHMS_REPORT_SIZE 4
- //*****************************************************************************
- //
- // These are the flags for the tUSBHMouse.ulHIDFlags member variable.
- //
- //*****************************************************************************
- #define USBHMS_DEVICE_PRESENT 0x00000001
- //*****************************************************************************
- //
- // This is the structure definition for a mouse device instance.
- //
- //*****************************************************************************
- typedef struct
- {
- //
- // Global flags for an instance of a mouse.
- //
- unsigned int ulHIDFlags;
- //
- // The applications registered callback.
- //
- tUSBCallback pfnCallback;
- //
- // The current state of the buttons.
- //
- unsigned char ucButtons;
- //
- // This is a local buffer to hold the current HID report that comes up
- // from the HID driver layer.
- //
- unsigned char pucBuffer[USBHMS_REPORT_SIZE];
- //
- // Heap data for the mouse currently used to read the HID Report
- // Descriptor.
- //
- unsigned char *pucHeap;
- //
- // Size of the heap in bytes.
- //
- unsigned int ulHeapSize;
- //
- // This is the instance value for the HID device that will be used for the
- // mouse.
- //
- unsigned int ulMouseInstance;
- }
- tUSBHMouse;
- //*****************************************************************************
- //
- // 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 pucBuffer is the memory used by the driver to interact with the
- //! USB mouse.
- //! \param ulSize is the size of the buffer provided by \e pucBuffer.
- //!
- //! 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 pucBuffer 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.
- //
- //*****************************************************************************
- unsigned int
- USBHMouseOpen(unsigned int ulIndex, tUSBCallback pfnCallback,
- unsigned char *pucBuffer, unsigned int ulSize)
- {
- //
- // Save the callback and data pointers.
- //
- g_sUSBHMouse.pfnCallback = pfnCallback;
- //
- // Save the instance pointer for the HID device that was opened.
- //
- g_sUSBHMouse.ulMouseInstance = USBHHIDOpen(ulIndex, USBH_HID_DEV_MOUSE,
- USBHMouseCallback,
- (unsigned int)&g_sUSBHMouse);
- //
- // Save the heap buffer and size.
- //
- g_sUSBHMouse.pucHeap = pucBuffer;
- g_sUSBHMouse.ulHeapSize = ulSize;
- return(g_sUSBHMouse.ulMouseInstance);
- }
- //*****************************************************************************
- //
- //! This function is used close an instance of a mouse.
- //!
- //! \param ulInstance 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 ulInstance value is the value
- //! that was returned when the application called USBHMouseOpen().
- //!
- //! \return Returns 0.
- //
- //*****************************************************************************
- unsigned int
- USBHMouseClose(unsigned int ulInstance)
- {
- tUSBHMouse *pUSBHMouse;
- //
- // Recover the pointer to the instance data.
- //
- pUSBHMouse = (tUSBHMouse *)ulInstance;
- //
- // Reset the callback to null.
- //
- pUSBHMouse->pfnCallback = 0;
- //
- // Call the HID driver layer to close out this instance.
- //
- USBHHIDClose(pUSBHMouse->ulMouseInstance);
- return(0);
- }
- //*****************************************************************************
- //
- //! This function is used to initialize a mouse interface after a mouse has
- //! been detected.
- //!
- //! \param ulInstance 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 ulInstance 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.
- //
- //*****************************************************************************
- unsigned int
- USBHMouseInit(unsigned int ulInstance)
- {
- tUSBHMouse *pUSBHMouse;
- tHIDInstance *pHIDIntance;
- pHIDIntance = (tHIDInstance *)ulInstance;
- //
- // Recover the pointer to the instance data.
- //
- pUSBHMouse = (tUSBHMouse *)pHIDIntance->ulCBData;
- //
- // Set the initial rate to only update on mouse state changes.
- //
- USBHHIDSetIdle(pUSBHMouse->ulMouseInstance, 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(pUSBHMouse->ulMouseInstance,
- pUSBHMouse->pucHeap,
- pUSBHMouse->ulHeapSize);
- //
- // Set the mouse to boot protocol.
- //
- USBHHIDSetProtocol(pUSBHMouse->ulMouseInstance, 1);
- return(0);
- }
- //*****************************************************************************
- //
- // This function handles updating the state of the mouse buttons and axis.
- //
- // \param pUSBHMouse 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 *pUSBHMouse)
- {
- unsigned int ulButton;
- if(pUSBHMouse->pucBuffer[0] != pUSBHMouse->ucButtons)
- {
- for(ulButton = 1; ulButton <= 0x4; ulButton <<= 1)
- {
- if(((pUSBHMouse->pucBuffer[0] & ulButton) != 0) &&
- ((pUSBHMouse->ucButtons & ulButton) == 0))
- {
- //
- // Send the mouse button press notification to the application.
- //
- pUSBHMouse->pfnCallback(0,
- USBH_EVENT_HID_MS_PRESS,
- ulButton,
- 0);
- }
- if(((pUSBHMouse->pucBuffer[0] & ulButton) == 0) &&
- ((pUSBHMouse->ucButtons & ulButton) != 0))
- {
- //
- // Send the mouse button release notification to the
- // application.
- //
- pUSBHMouse->pfnCallback(0,
- USBH_EVENT_HID_MS_REL,
- ulButton,
- 0);
- }
- }
- //
- // Save the new state.
- //
- pUSBHMouse->ucButtons = pUSBHMouse->pucBuffer[0];
- }
- if(pUSBHMouse->pucBuffer[1] != 0)
- {
- //
- // Send the mouse button release notification to the
- // application.
- //
- pUSBHMouse->pfnCallback(0,
- USBH_EVENT_HID_MS_X,
- (unsigned int)pUSBHMouse->pucBuffer[1],
- 0);
- }
- if(pUSBHMouse->pucBuffer[2] != 0)
- {
- //
- // Send the mouse button release notification to the
- // application.
- //
- pUSBHMouse->pfnCallback(0,
- USBH_EVENT_HID_MS_Y,
- (unsigned int)pUSBHMouse->pucBuffer[2],
- 0);
- }
- }
- //*****************************************************************************
- //
- //! This function handles event callbacks from the USB HID driver layer.
- //!
- //! \param pvCBData is the pointer that was passed in to the USBHHIDOpen()
- //! call.
- //! \param ulEvent is the event that has been passed up from the HID driver.
- //! \param ulMsgParam has meaning related to the \e ulEvent that occurred.
- //! \param pvMsgData has meaning related to the \e ulEvent 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.
- //
- //*****************************************************************************
- unsigned int
- USBHMouseCallback(void *pvCBData, unsigned int ulEvent,
- unsigned int ulMsgParam, void *pvMsgData)
- {
- tUSBHMouse *pUSBHMouse;
- //
- // Recover the pointer to the instance data.
- //
- pUSBHMouse = (tUSBHMouse *)pvCBData;
- switch(ulEvent)
- {
- //
- // New mouse has been connected so notify the application.
- //
- case USB_EVENT_CONNECTED:
- {
- //
- // Remember that a mouse is present.
- //
- pUSBHMouse->ulHIDFlags |= USBHMS_DEVICE_PRESENT;
- //
- // Notify the application that a new mouse was connected.
- //
- pUSBHMouse->pfnCallback(0, ulEvent, ulMsgParam, pvMsgData);
- break;
- }
- case USB_EVENT_DISCONNECTED:
- {
- //
- // No mouse is present.
- //
- pUSBHMouse->ulHIDFlags &= ~USBHMS_DEVICE_PRESENT;
- //
- // Notify the application that the mouse was disconnected.
- //
- pUSBHMouse->pfnCallback(0, ulEvent, ulMsgParam, pvMsgData);
- break;
- }
- case USB_EVENT_RX_AVAILABLE:
- {
- //
- // New mouse report structure was received.
- //
- USBHHIDGetReport(pUSBHMouse->ulMouseInstance, 0,
- pUSBHMouse->pucBuffer,
- USBHMS_REPORT_SIZE);
- //
- // Update the current state of the mouse and notify the application
- // of any changes.
- //
- UpdateMouseState(pUSBHMouse);
- break;
- }
- }
- return(0);
- }
- //*****************************************************************************
- //
- //! @}
- //
- //*****************************************************************************
|