реклама на сайте
подробности

 
 
> Задерживаются данные при записи HIDd_SetFeature, почему?
Rius
сообщение Aug 1 2006, 01:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 19-04-05
Пользователь №: 4 283



запаздывание на одну посылку - то что я записал HIDd_SetFeature сейчас, попадает в контроллер только при следующей записи ф-цией HIDd_SetFeature. WriteFile на втором разе просто повисает.
при старте винды в первый раз в контролллер пишется какая-то чушь, потом этот буфер "FIFO" заполняется до двух элементов и поехало...

что посылается в драйвер проверял прогой USB Monitor, что принимает контроллер - проверял поиском нужной посылки во всей его озу.
программа переделана из примера usbhidio.cs
Код
        private void SetFeature(byte []data, byte index)
        {
            FileIOApiDeclarations.SECURITY_ATTRIBUTES Security = new HID_System.FileIOApiDeclarations.SECURITY_ATTRIBUTES();
            bool Success = false;
            bool AlreadyOpened = false;
            if (DevHandle != FileIOApiDeclarations.INVALID_HANDLE_VALUE) AlreadyOpened = true;

            if (!AlreadyOpened)
            {
                // Get another handle to use in overlapped ReadFiles (for requesting Input reports).
                DevHandle = FileIOApiDeclarations.CreateFile(DevInfo.Path,
                    FileIOApiDeclarations.GENERIC_READ | FileIOApiDeclarations.GENERIC_WRITE,
                    FileIOApiDeclarations.FILE_SHARE_READ | FileIOApiDeclarations.FILE_SHARE_WRITE,
                    ref Security,
                    FileIOApiDeclarations.OPEN_EXISTING,
                    FileIOApiDeclarations.FILE_FLAG_OVERLAPPED, 0);
                //int n = 1;
                //Success = HID_System.HidApiDeclarations.HidD_SetNumInputBuffers(DevHandle, n);
                Debug.WriteLine(_MyDebugging.ResultOfAPICall("CreateFile, ReadHandle"));
                Debug.WriteLine("  Returned handle: " + DevHandle.ToString("x") + "h");
            }

            {//передача репорта
                byte[] reportBuffer = new byte[DevInfo.FeatureReportLength];
                for (byte i = 0; i < (DevInfo.FeatureReportLength-1) && i < data.Length; i++) reportBuffer[i+1] = data[i];
                reportBuffer[0] = index;
                //int NumberOfBytesWritten = 0;
                //int Result = FileIOApiDeclarations.WriteFile(DevHandle, ref reportBuffer[0], DevInfo.FeatureReportLength, ref NumberOfBytesWritten, 0);
                Success = HidApiDeclarations.HidD_SetFeature(DevHandle, ref reportBuffer[0], DevInfo.FeatureReportLength);
            }
            if (!AlreadyOpened)
            {
                int Result = FileIOApiDeclarations.CloseHandle(DevHandle);
                Debug.WriteLine(_MyDebugging.ResultOfAPICall("CloseHandle"));
                DevHandle = FileIOApiDeclarations.INVALID_HANDLE_VALUE;
            }
        }
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rius
сообщение Aug 2 2006, 12:37
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 19-04-05
Пользователь №: 4 283



хм, данным в контроллере больше некуда писаться, кроме как в озу, а там оказывается предыдущий репорт.
я 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 вызывается он, а про то что там надо бы писать, я образца не нашёл sad.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 03:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01936 секунд с 7
ELECTRONIX ©2004-2016