forked from PAWPAW-Mirror/lib_xua
First changes to move to a USB HID design that allows some degree of boot-time configurability.
These changes are far from complete. They build successfully, but have received very little bench testing.
This commit is contained in:
@@ -880,7 +880,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
|||||||
case XUD_SetData_Select(c_hid, ep_hid, result):
|
case XUD_SetData_Select(c_hid, ep_hid, result):
|
||||||
{
|
{
|
||||||
g_hidData[0]=0;
|
g_hidData[0]=0;
|
||||||
UserReadHIDData(g_hidData);
|
g_hidData[0]=UserHIDGetData();
|
||||||
XUD_SetReady_In(ep_hid, g_hidData, 1);
|
XUD_SetReady_In(ep_hid, g_hidData, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -3,21 +3,49 @@
|
|||||||
#ifndef __USER_HID_H__
|
#ifndef __USER_HID_H__
|
||||||
#define __USER_HID_H__
|
#define __USER_HID_H__
|
||||||
|
|
||||||
/* These defines relate to the HID report desc - do not mod */
|
/* These enumerated constants relate to the HID report desc - do not mod */
|
||||||
#define HID_CONTROL_PLAYPAUSE_SHIFT 0x00
|
typedef enum hidEventId_t {
|
||||||
#define HID_CONTROL_NEXT_SHIFT 0x01
|
HID_EVENT_ID_GPI0 = 0,
|
||||||
#define HID_CONTROL_PREV_SHIFT 0x02
|
HID_EVENT_ID_GPI1,
|
||||||
#define HID_CONTROL_VOLUP_SHIFT 0x03
|
HID_EVENT_ID_GPI2,
|
||||||
#define HID_CONTROL_VOLDN_SHIFT 0x04
|
HID_EVENT_ID_GPI3,
|
||||||
#define HID_CONTROL_MUTE_SHIFT 0x05
|
HID_EVENT_ID_EVT0,
|
||||||
|
HID_EVENT_ID_EVT1,
|
||||||
|
HID_EVENT_ID_EVT2,
|
||||||
|
HID_EVENT_ID_EVT3,
|
||||||
|
HID_EVENT_ID_EVT4,
|
||||||
|
HID_EVENT_ID_EVT5,
|
||||||
|
HID_EVENT_ID_EVT6,
|
||||||
|
HID_EVENT_ID_EVT7,
|
||||||
|
HID_EVENT_ID_EVT8,
|
||||||
|
HID_EVENT_ID_EVT9,
|
||||||
|
HID_EVENT_ID_EVT10,
|
||||||
|
HID_EVENT_ID_EVT11,
|
||||||
|
HID_EVENT_ID_EVT12,
|
||||||
|
HID_EVENT_ID_EVT13,
|
||||||
|
HID_EVENT_ID_EVT14,
|
||||||
|
HID_EVENT_ID_EVT15,
|
||||||
|
HID_EVENT_ID_EVT16,
|
||||||
|
HID_EVENT_ID_EVT17,
|
||||||
|
HID_EVENT_ID_EVT18,
|
||||||
|
HID_EVENT_ID_EVT19,
|
||||||
|
HID_EVENT_ID_EVT20,
|
||||||
|
HID_EVENT_ID_EVT21,
|
||||||
|
HID_EVENT_ID_EVT22,
|
||||||
|
HID_EVENT_ID_EVT23,
|
||||||
|
HID_EVENT_ID_EVT24,
|
||||||
|
HID_EVENT_ID_EVT25,
|
||||||
|
HID_EVENT_ID_EVT26,
|
||||||
|
HID_EVENT_ID_EVT27
|
||||||
|
} hidEventId_t;
|
||||||
|
|
||||||
#define HID_DATA_SIZE 1
|
#define HID_DATA_SIZE 1
|
||||||
|
|
||||||
#if( 0 < HID_CONTROLS )
|
#if( 0 < HID_CONTROLS )
|
||||||
|
|
||||||
void UserInitHIDData( void );
|
unsigned UserHIDGetData( void );
|
||||||
void UserReadHIDData( unsigned char hidData[ HID_DATA_SIZE ]);
|
void UserHIDInit( void );
|
||||||
void UserSetHIDData( const unsigned hidData );
|
void UserHIDRegisterEvent( const hidEventId_t hidEventId, const int * hidEventData, const unsigned hidEventDataSize );
|
||||||
|
|
||||||
#endif /* ( 0 < HID_CONTROLS ) */
|
#endif /* ( 0 < HID_CONTROLS ) */
|
||||||
#endif /* __USER_HID_H__ */
|
#endif /* __USER_HID_H__ */
|
||||||
|
|||||||
@@ -9,12 +9,17 @@
|
|||||||
#if( 0 < HID_CONTROLS )
|
#if( 0 < HID_CONTROLS )
|
||||||
#define MS_IN_TICKS 100000U
|
#define MS_IN_TICKS 100000U
|
||||||
|
|
||||||
static unsigned s_hidIdleActive = 0U;
|
static unsigned s_hidChangePending = 0U;
|
||||||
static unsigned s_hidCurrentPeriod = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS;
|
static unsigned s_hidCurrentPeriod = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS;
|
||||||
|
static unsigned s_hidIdleActive = 0U;
|
||||||
static unsigned s_hidIndefiniteDuration = 0U;
|
static unsigned s_hidIndefiniteDuration = 0U;
|
||||||
static unsigned s_hidNextReportTime = 0U;
|
static unsigned s_hidNextReportTime = 0U;
|
||||||
static unsigned s_hidReportTime = 0U;
|
static unsigned s_hidReportTime = 0U;
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
volatile unsigned * unsafe s_hidChangePendingPtr = &s_hidChangePending;
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned HidCalcNewReportTime( const unsigned currentPeriod, const unsigned reportTime, const unsigned reportToSetIdleInterval, const unsigned newPeriod );
|
static unsigned HidCalcNewReportTime( const unsigned currentPeriod, const unsigned reportTime, const unsigned reportToSetIdleInterval, const unsigned newPeriod );
|
||||||
static unsigned HidCalcReportToSetIdleInterval( const unsigned reportTime );
|
static unsigned HidCalcReportToSetIdleInterval( const unsigned reportTime );
|
||||||
static unsigned HidFindSetIdleActivationPoint( const unsigned currentPeriod, const unsigned timeWithinPeriod );
|
static unsigned HidFindSetIdleActivationPoint( const unsigned currentPeriod, const unsigned timeWithinPeriod );
|
||||||
@@ -51,6 +56,18 @@ XUD_Result_t HidInterfaceClassRequests(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HidClearChangePending( void )
|
||||||
|
{
|
||||||
|
unsafe {
|
||||||
|
*s_hidChangePendingPtr = 0U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned HidIsChangePending( void )
|
||||||
|
{
|
||||||
|
return( s_hidChangePending != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
unsigned HidIsSetIdleSilenced( void )
|
unsigned HidIsSetIdleSilenced( void )
|
||||||
{
|
{
|
||||||
unsigned isSilenced = s_hidIdleActive;
|
unsigned isSilenced = s_hidIdleActive;
|
||||||
@@ -67,6 +84,13 @@ unsigned HidIsSetIdleSilenced( void )
|
|||||||
return isSilenced;
|
return isSilenced;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HidSetChangePending( void )
|
||||||
|
{
|
||||||
|
unsafe {
|
||||||
|
*s_hidChangePendingPtr = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Calculate the timer value for sending the next HID Report.
|
* \brief Calculate the timer value for sending the next HID Report.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -40,6 +40,17 @@ XUD_Result_t HidInterfaceClassRequests(
|
|||||||
XUD_ep c_ep0_in,
|
XUD_ep c_ep0_in,
|
||||||
REFERENCE_PARAM( USB_SetupPacket_t, sp ));
|
REFERENCE_PARAM( USB_SetupPacket_t, sp ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register that previously changed HID Report data has reported
|
||||||
|
* to the USB Host.
|
||||||
|
*/
|
||||||
|
void HidClearChangePending( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Indicate if a change to the HID Report data has been received.
|
||||||
|
*/
|
||||||
|
unsigned HidIsChangePending( void );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Indicate whether to send a HID Report based on elapsed time.
|
* \brief Indicate whether to send a HID Report based on elapsed time.
|
||||||
*
|
*
|
||||||
@@ -58,4 +69,9 @@ XUD_Result_t HidInterfaceClassRequests(
|
|||||||
*/
|
*/
|
||||||
unsigned HidIsSetIdleSilenced( void );
|
unsigned HidIsSetIdleSilenced( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register that a change to the HID Report data has been received.
|
||||||
|
*/
|
||||||
|
void HidSetChangePending( void );
|
||||||
|
|
||||||
#endif // __XUA_HID_H__
|
#endif // __XUA_HID_H__
|
||||||
|
|||||||
Reference in New Issue
Block a user