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

 
 
 
Reply to this topicStart new topic
> Задерживаются данные при записи 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
upc2
сообщение Aug 1 2006, 12:15
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



Плохо воспринимаю функции вашей программы,но вижу , что есть операция чтения
В спецификации на HID есть предупреждение по использованию функции ReadFile().При ее вызове
пользовательская программа проваливается в системный HID драйвер и будет находится там до тех пор ,пока не получит от HID устройства запрошенное кол-во данных.
Необходимо разместить вызов функции ReadFile() в том месте программы,где-бы она не вешала
основное приложение при ожидании данных от устройства.
Go to the top of the page
 
+Quote Post
Rius
сообщение Aug 1 2006, 12:55
Сообщение #3


Участник
*

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



да читал. но это не ReadFile (он рабоатет нормально, как и HidD_GetFeature)

проблема есть при записи - я отсылаю репорт в USB, а контроллер принимает предыдущий отосланный репорт.
пример hclient из Windows XP DDK "работает" также.

либо у pic18f4455 есть какой-то приёмный буфер вне 2 кБ ОЗУ, либо устройство заставляет хост задерживать передачу репортов...

вот лог USB Monitor'a:

отправка пакета репорта повторно
Цитата
000037: Class-Specific Request (DOWN), 01.08.2006 16:27:10.8593750 +29.9843750
Destination: Inrterface, Index 0
Reserved Bits: 34
Request: 0x9
Value: 0x300
Send 0x7 bytes to the device

00 01 03 04 05 06 08 .......

000038: Control Transfer (UP), 01.08.2006 16:27:10.8750000 +0.0156250
Pipe Handle: 0xfdfc0c28
00 01 03 04 05 06 08 .......

Setup Packet
21 09 00 03 00 00 07 00 !.......

Recipient: Inrterface
Request Type: Class
Direction: Host->Device
Request: 0x9 (Unknown)
Value: 0x300
Index: 0x0
Length: 0x7


запрос текущих данных (устанавливаются записью репорта с хоста)
Цитата
000039: Class-Specific Request (DOWN), 01.08.2006 16:27:18.9531250 +8.0781250
Destination: Inrterface, Index 0
Reserved Bits: 34
Request: 0x1
Value: 0x300
Get 0x7 bytes from the device

00 00 00 00 00 00 00 .......

000040: Control Transfer (UP), 01.08.2006 16:27:18.9687500 +0.0156250
Pipe Handle: 0xfdfc0c28
00 01 03 04 05 06 08 .......

Setup Packet
A1 01 00 03 00 00 07 00 Ў.......

Recipient: Inrterface
Request Type: Class
Direction: Device->Host
Request: 0x1 (Unknown)
Value: 0x300
Index: 0x0
Length: 0x7


запись нового репорта
Цитата
000041: Class-Specific Request (DOWN), 01.08.2006 16:27:32.7500000 +13.7812500
Destination: Inrterface, Index 0
Reserved Bits: 34
Request: 0x9
Value: 0x300
Send 0x7 bytes to the device

00 01 AA 04 BB 06 FF ..Є.».я

000042: Control Transfer (UP), 01.08.2006 16:27:32.7656250 +0.0156250
Pipe Handle: 0xfdfc0c28
00 01 AA 04 BB 06 FF ..Є.».я

Setup Packet
21 09 00 03 00 00 07 00 !.......

Recipient: Inrterface
Request Type: Class
Direction: Host->Device
Request: 0x9 (Unknown)
Value: 0x300
Index: 0x0
Length: 0x7


запрос данных (должны были быть изменены вышеуказанной записью репорта, но не изменились)
Цитата
000043: Class-Specific Request (DOWN), 01.08.2006 16:27:35.4531250 +2.6875000
Destination: Inrterface, Index 0
Reserved Bits: 34
Request: 0x1
Value: 0x300
Get 0x7 bytes from the device

00 00 00 00 00 00 00 .......

000044: Control Transfer (UP), 01.08.2006 16:27:35.4531250 +0.0
Pipe Handle: 0xfdfc0c28
00 01 03 04 05 06 08 .......

Setup Packet
A1 01 00 03 00 00 07 00 Ў.......

Recipient: Inrterface
Request Type: Class
Direction: Device->Host
Request: 0x1 (Unknown)
Value: 0x300
Index: 0x0
Length: 0x7


повторная запись нового репорта
Цитата
000045: Class-Specific Request (DOWN), 01.08.2006 16:27:38.7187500 +3.2656250
Destination: Inrterface, Index 0
Reserved Bits: 34
Request: 0x9
Value: 0x300
Send 0x7 bytes to the device

00 01 AA 04 BB 06 FF ..Є.».я

000046: Control Transfer (UP), 01.08.2006 16:27:38.7343750 +0.0156250
Pipe Handle: 0xfdfc0c28
00 01 AA 04 BB 06 FF ..Є.».я

Setup Packet
21 09 00 03 00 00 07 00 !.......

Recipient: Inrterface
Request Type: Class
Direction: Host->Device
Request: 0x9 (Unknown)
Value: 0x300
Index: 0x0
Length: 0x7


запрос данных. они изменились после повторной записи репорта
Цитата
000047: Class-Specific Request (DOWN), 01.08.2006 16:27:40.2812500 +1.5468750
Destination: Inrterface, Index 0
Reserved Bits: 34
Request: 0x1
Value: 0x300
Get 0x7 bytes from the device

00 00 00 00 00 00 00 .......

000048: Control Transfer (UP), 01.08.2006 16:27:40.2812500 +0.0
Pipe Handle: 0xfdfc0c28
00 01 AA 04 BB 06 FF ..Є.».я

Setup Packet
A1 01 00 03 00 00 07 00 Ў.......

Recipient: Inrterface
Request Type: Class
Direction: Device->Host
Request: 0x1 (Unknown)
Value: 0x300
Index: 0x0
Length: 0x7


Сообщение отредактировал Rius - Aug 1 2006, 12:57
Go to the top of the page
 
+Quote Post
upc2
сообщение Aug 2 2006, 05:26
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



У PIC184550 все нормально.У меня все работает.
Вероятно причина в разнице структур репортов CY63000 и PIC18F4550. Весь обмен происходит по
прерыванию, по установке флагов.Вероятно какие-то данные пишутся не на свое место .
Go to the top of the page
 
+Quote Post
Rius
сообщение Aug 2 2006, 12:37
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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 Текстовая версия Сейчас: 16th June 2025 - 13:24
Рейтинг@Mail.ru


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