хм, данным в контроллере больше некуда писаться, кроме как в озу, а там оказывается предыдущий репорт.
я CY63000 не использую.
с WriteFile заработало, оказалось надо было принимать посылку ф-цией HIDRxReport, но с SetFeature всё равно глючит.
вот код из переделанного примера мышки от microchip'a
Код
void HIDGetReportHandler(void)
{//эта ф-ция работает нормально
int i;
ctrl_trf_session_owner = MUID_HID;
for(i=0; i<7; i++) send_buffer[i] = recv_buffer[i];
pSrc.bRam = send_buffer;
wCount._word = 7;
usb_stat.ctrl_trf_mem = _RAM;
mLED_5_Toggle(); // Мигание светодиодом 5 при каждом запросе данных
}//end HIDGetReportHandler
void HIDSetReportHandler(void)
{//http://forum.microchip.com/tm.aspx?m=119661#119835
int i = 0;
ctrl_trf_session_owner = MUID_HID;
pDst.bRam = (byte*)&hid_report_out;
i = HIDRxReport(recv_buffer, HID_INT_OUT_EP_SIZE);//i всё время = 0, т.к. rx чем-то занят...
/*
//а этим кодом репорт принимается, но предыдущий
int i = 0;
byte *p = 0;
while(i < 7)
{
recv_buffer[i] = hid_report_out[i];
i++;
}
i = 0;
HID_BD_OUT.Cnt = sizeof(hid_report_out);
mUSBBufferReady(HID_BD_OUT);
*/
mLED_5_Toggle();
}//end HIDSetReportHandler
в этой функции репорты, переданные через WriteFile, принимаются нормально (вовремя)
Код
void Emulate_Mouse(void)
{
if(recv_buffer[0] == 0) { mLED_3_Off(); mLED_4_Off(); }
if(recv_buffer[0] == 2) { mLED_3_Off(); mLED_4_On(); }
if(recv_buffer[0] == 1) { mLED_3_On(); mLED_4_Off(); }
if(recv_buffer[0] == 3) { mLED_3_On(); mLED_4_On(); }
if(!mHIDTxIsBusy())
{
// HIDTxReport(recv_buffer,7);
movement_length++;
}//end if(mHIDIsPutReportReady())
if(!mHIDRxIsBusy())
{
HIDRxReport(recv_buffer,7);
movement_length++;
}//end if(mHIDIsPutReportReady())
}//end Emulate_Mouse
ошибка возможно в обработчике SetReport, т.к. на SetFeature вызывается он, а про то что там надо бы писать, я образца не нашёл