update hid
This commit is contained in:
@@ -16,6 +16,18 @@
|
|||||||
#include "debug_print.h"
|
#include "debug_print.h"
|
||||||
|
|
||||||
#if XUA_HID_ENABLED
|
#if XUA_HID_ENABLED
|
||||||
|
#include <xccompat.h>
|
||||||
|
|
||||||
|
#define HID_PASS_REPORT_ID 0x1
|
||||||
|
#define HID_BUTTON_REPORT_ID 0x2
|
||||||
|
unsigned char g_hid_pass_push[65] = {0x1};
|
||||||
|
|
||||||
|
static unsigned s_hidChangePending = 0U;
|
||||||
|
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_hidNextReportTime = 0U;
|
||||||
|
static unsigned s_hidReportTime = 0U;
|
||||||
extern unsigned g_log_switch;
|
extern unsigned g_log_switch;
|
||||||
|
|
||||||
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 );
|
||||||
@@ -24,6 +36,14 @@ static unsigned HidFindSetIdleActivationPoint( const unsigned currentPeriod,
|
|||||||
static XUD_Result_t HidProcessSetIdleRequest( XUD_ep c_ep0_out, XUD_ep c_ep0_in, USB_SetupPacket_t &sp );
|
static XUD_Result_t HidProcessSetIdleRequest( XUD_ep c_ep0_out, XUD_ep c_ep0_in, USB_SetupPacket_t &sp );
|
||||||
static unsigned HidTimeDiff( const unsigned earlierTime, const unsigned laterTime );
|
static unsigned HidTimeDiff( const unsigned earlierTime, const unsigned laterTime );
|
||||||
|
|
||||||
|
extern int xmos_printf(unsigned char *data, unsigned char len);
|
||||||
|
|
||||||
|
extern void flash_read_did(uint8_t data[], unsigned char len);
|
||||||
|
extern void flash_read_uid(uint8_t data[], unsigned char len);
|
||||||
|
extern uint8_t key_verify(unsigned sec_write, uint8_t expected_bin[]);
|
||||||
|
extern void flash_sec_erase();
|
||||||
|
extern unsigned int read_key(void);
|
||||||
|
extern unsigned int g_xu316_id;
|
||||||
extern unsigned char process_send_params(uint8_t data[], uint16_t len);
|
extern unsigned char process_send_params(uint8_t data[], uint16_t len);
|
||||||
extern unsigned char process_read_params(uint8_t response[]);
|
extern unsigned char process_read_params(uint8_t response[]);
|
||||||
XUD_Result_t HidInterfaceClassRequests(
|
XUD_Result_t HidInterfaceClassRequests(
|
||||||
@@ -44,19 +64,35 @@ XUD_Result_t HidInterfaceClassRequests(
|
|||||||
case HID_GET_REPORT:
|
case HID_GET_REPORT:
|
||||||
unsigned ret_len = 65;
|
unsigned ret_len = 65;
|
||||||
|
|
||||||
#if ((USE_EX3D == 1) || (EQ_EN == 1))
|
if ((sp.wValue & 0xff) == HID_PASS_REPORT_ID)
|
||||||
buffer[0] = 0x1;
|
{
|
||||||
process_read_params(&buffer[1]);
|
buffer[0] = HID_PASS_REPORT_ID;
|
||||||
#endif
|
process_read_params(&buffer[1]);
|
||||||
#if DEBUG_MEMORY_LOG_ENABLED
|
|
||||||
unsigned log_switch;
|
|
||||||
buffer[0] = 0x1;
|
|
||||||
|
|
||||||
GET_SHARED_GLOBAL(log_switch, g_log_switch);
|
|
||||||
if (log_switch) {
|
|
||||||
ret_len = 65;
|
|
||||||
UserReadHIDLog(&buffer[1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if DEBUG_MEMORY_LOG_ENABLED
|
||||||
|
unsigned log_switch;
|
||||||
|
GET_SHARED_GLOBAL(log_switch, g_log_switch);
|
||||||
|
if (log_switch) {
|
||||||
|
ret_len = 65;
|
||||||
|
UserReadHIDLog(&buffer[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((sp.wValue & 0xff) == 0)
|
||||||
|
{
|
||||||
|
ret_len = 65;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
debug_printf("%d:\n", ret_len);
|
||||||
|
for(int i=0; i < ret_len; i++)
|
||||||
|
{
|
||||||
|
printhex((buffer, unsigned char[])[i]);
|
||||||
|
printstr("-");
|
||||||
|
}
|
||||||
|
printstrln("\n");
|
||||||
#endif
|
#endif
|
||||||
return XUD_DoGetRequest(c_ep0_out, c_ep0_in, (buffer, unsigned char []), ret_len, sp.wLength);
|
return XUD_DoGetRequest(c_ep0_out, c_ep0_in, (buffer, unsigned char []), ret_len, sp.wLength);
|
||||||
break;
|
break;
|
||||||
@@ -67,45 +103,61 @@ XUD_Result_t HidInterfaceClassRequests(
|
|||||||
/* Do nothing - i.e. STALL */
|
/* Do nothing - i.e. STALL */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if ((USE_EX3D == 1) || (EQ_EN == 1))
|
case HID_SET_REPORT:
|
||||||
case HID_SET_REPORT:
|
// only support to get 64Bytes max for each XUD_GetBuffer. For more than 64Bytes, need to call XUD_GetBuffer every 64Bytes and call XUD_DoSetRequestStatus finally after get all the data
|
||||||
result = XUD_GetBuffer(c_ep0_out, (buffer, unsigned char[]), datalength);
|
if((result = XUD_GetBuffer(c_ep0_out, (buffer, unsigned char[]), datalength)) != XUD_RES_OKAY)
|
||||||
if(result == XUD_RES_OKAY) {
|
{
|
||||||
#if 0// USE_EX3D == 1
|
// debug_printf("HID_SET_REPORT return\n");
|
||||||
if(datalength > 0) {
|
return result;
|
||||||
unsafe
|
|
||||||
{
|
|
||||||
c_hidRcvData <: (unsigned char)datalength;
|
|
||||||
for(unsigned i=0; i<datalength; i++) {
|
|
||||||
c_hidRcvData <: buffer[i];
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
if((sp.wValue & 0xff) == HID_PASS_REPORT_ID)
|
||||||
|
{
|
||||||
|
if (buffer[1] == 0x55 && buffer[2] == 0xAA && buffer[3] == 0x00 && buffer[4] == 0xEE && buffer[5] == 0x39)
|
||||||
|
{
|
||||||
|
if (xmos_printf(&buffer[1], datalength-1) == -1)
|
||||||
|
{
|
||||||
|
// debug_printf(" HID_SET_REPORT error\n");
|
||||||
|
return XUD_RES_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
process_send_params(&buffer[1], datalength - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if((sp.wValue & 0xff) == 0)
|
||||||
|
{
|
||||||
|
#if MQA_EN
|
||||||
|
MQA_XMOS_HostReadWrite(buffer, sizeof(buffer)-1, datalength);
|
||||||
|
#if 0
|
||||||
|
debug_printf("%d:\n", datalength);
|
||||||
|
for(int i=0; i < datalength; i++)
|
||||||
|
{
|
||||||
|
debug_printf("%c",(buffer, unsigned char[])[i]);
|
||||||
|
}
|
||||||
|
debug_printf("\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if (buffer[1] == 0x77 && ((buffer[2] >= 0x70) || (buffer[2] == 0x5b)))
|
|
||||||
{
|
|
||||||
process_send_params(&buffer[1], datalength - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
result = XUD_DoSetRequestStatus(c_ep0_in);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
case HID_SET_IDLE:
|
/* Send 0 Length as status stage */
|
||||||
result = HidProcessSetIdleRequest( c_ep0_out, c_ep0_in, sp );
|
XUD_DoSetRequestStatus(c_ep0_in);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_SET_PROTOCOL:
|
case HID_SET_IDLE:
|
||||||
break;
|
result = HidProcessSetIdleRequest( c_ep0_out, c_ep0_in, sp );
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
case HID_SET_PROTOCOL:
|
||||||
break;
|
/* Do nothing - i.e. STALL */
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return XUD_RES_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned HidIsSetIdleSilenced( const unsigned id )
|
unsigned HidIsSetIdleSilenced( const unsigned id )
|
||||||
|
|||||||
Reference in New Issue
Block a user