Jump to content

    

0000007_18014

Участник
  • Content Count

    8
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Запуск USB

    grau>Вопрос: может ли виндовый HID-драйвер работать с несколькими конечными точками? Если под конечной точкой подразумевать комбинацию EP IN, EP OUT, то скорее всего нет. У вас есть шанс попробовать так (но лучше все-таки свой драйвер написать): в usbdesc.c в USB_ConfigDescriptor есть поле bNumInterfaces: сделайте =2. Создаете копию еще одного интерфейса, в нем еще одну копию HID-дескриптора, затем еще два EP. В интерфейсе изменяете HID_REPORT_DESCRIPTOR_TYPE на HID_REPORT_DESCRIPTOR_TYPE+1. А дальше надо изменить usbcore.c здесь: case HID_HID_DESCRIPTOR_TYPE: if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { return (FALSE); /* Only Single HID Interface is supported */ } EP0Data.pData = (BYTE *)USB_ConfigDescriptor + HID_DESC_OFFSET; len = HID_DESC_SIZE; break; case HID_REPORT_DESCRIPTOR_TYPE: if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { return (FALSE); /* Only Single HID Interface is supported */ } чтобы при опросе система получала еще одну копию дескриптора в ответ на запрос HID_REPORT_DESCRIPTOR_TYPE для второго интерфейса: содержимое HID_ReportDescriptor2 - копия HID_ReportDescriptor с другим ReportID. По сути получите композитное устройство с двумя HID интерфейсами - в теории конечно - я так не пробовал делать. Будут ли hidclass.sys, hidparse.sys, hidusb.sys правильно давать запросы двум разным EP (по сути их будет 4)? Не знаю. Хотите от устройства скорости? Пишите свой драйвер или используйте готовый, но не HID. Размножение логических точек вам мало чем поможет.
  2. Запуск USB

    Цитата(grau @ May 22 2007, 15:16) Salute! Для освоения USB решил воспользоваться примером HID от Keil. Чип - LPC2148. Запустил железку, на ПК сделал файл - данные гоняются туда и обратно. Теперь хочу увеличить скорость. Правильно ли понимаю, что для увеличения скорости достаточно объявить еще одну конечную точку, добавить к репорту идентефикатор и как раньше читать данные из файла? И еще вопросик. Изменил дескриптор из примера, чтоб переназначить поток с первой EP на четвертую. USB_ENDPOINT_IN(4), /* bEndpointAddress */ после чего связь с устройством установить не удается. Может еще чего подправить надо было? >Теперь хочу увеличить скорость. Правильно ли понимаю, что для увеличения скорости достаточно объявить еще одну конечную точку, добавить к репорту идентефикатор и как раньше читать данные из файла? Если так, то надо еще один интерфейс HID-устройства добавить. Можно по другому: 1) Файл usbdesc.c - дескриптор HID-устройства HID_ReportDescriptor - здесь все надо менять. Например так попробовать. const BYTE HID_ReportDescriptor[30] = { 6, 0, 0xFF, //Usage_Page (Vendor Defined) 9, 1, //Usage (I/O Device) 0xA1, 0x80,//1, // Collection (Application) 0x85, ReportID, // REPORT_ID (>30 - репорт, какой надо) 0x19, 1, // Usage_Minimum 0x29, 1, // Usage_Maximum 0x15, 0, // Logical_Minimum (0) 0x25, 0xff, // Logical_Maximum (255) 0x75, 8, // Report_Size (8 bit) 0x95, ReportCount, // Report_Count (8, 16, 64 bytes - по вашему желанию) 0x81, 2, // Input (Data,Var,Abs) 0x19, 1, // Usage_Minimum 0x29, 1, // Usage_Maximum 0x91, 2, // Output (Data,Var,Abs) 0xC0 // End_Collection }; 2) Файл usbdesc.c - дескриптор USB-устройства USB_ConfigDescriptor - элемент bInterval поставить 1 вместо 20. 3) Неплохо бы познакомится с документами со странички http://www.usb.org/developers/hidpage/. Или c книгой "Практика программирования USB" Агурова. 4) Переписать пример в Windows, чтобы репорт нужного размера забирал. Причем наверх из устройства нужно всегда отправлять пакет, начинающийся с байта REPORT_ID. Иначе hid.dll отбросит ваш ответ. >И еще вопросик. Изменил дескриптор из примера, чтоб переназначить поток с первой EP на четвертую. Возможно просто забыли EP4 включить в устройстве.
  3. 4 bulk EP и PDIUSBD12

    Цитата(Седой @ May 22 2007, 16:01) http://www.slavna.ru/stran/ucc06.htm USB протокол Rev 2.0 (full speed) - ну зачем же так. Вижу контроллер и схему. Наверное программно времянки приходится держать? У меня вместо ALE в PDIUSB используется A0, а CLKOUT не используется. Вижу есть драйвер. Вроде свой даже. Вот только отладочную информацию из него надо выкидывать, прежде чем окончательную версию в интернет выпускать. Да и памяти у вас больше - аж целых 128 Кбайт. А сколько логических EP неясно. Нашел две ошибки. 1) Запрещались прерывания, чтобы выжать скорость, не в том месте. Ну и конечно прерывание по приходу пакета в EP1 не ловилось. 2) if( status^2 ) надо заменить на if( !(status&2) ) если кому интересно. Так что пользуйтесь народ PDIUSBD12. Сложно, но можно.
  4. 4 bulk EP и PDIUSBD12

    Седой, простите, пожалуйста, но вам сюда: Есть устройство с 4-мя bulk EP. Написан свой драйвер для Win 2000/XP. Не замечал ли кто-нибудь, что контроллер PDIUSBD12 после перевода его в режим DMA и активной работы по EP2 (Main EP) 8 Кбайт в одну сторону и 8 Кбайт в другую, при работе с EP1 отказывается отправлять пакеты? Схема подключения такая же как на странице 7 документации PDIUSBD12 (Fig 3. Example of parallel interface to an 80C51 microcontroller). Кроме того DMACK, DMREQ, EOT = '0'. Схема подключения не такая же как у контроллера Hitachi. >Что это за конкуренты такие. Это жизнь такая. >в инете куча примеров и исходников С примерами в интернете для PDIUSB я уже знаком давно (написаны они Hilbert Zhang ZhenYu). Вот только годятся они только для прототипной платы с ее объемом памяти, а не для устройства с объемом памяти от 8 до 32 Кбайт. >Работаем с этой микросхемой несколько лет. Странностей не обнаружено. А характеристики интерфейса передачи данных через PDIUSB можете привести (число EP, их тип, драйвер в ОС, используется ли режим DMA PDIUSB с двойной буферизацией через main EP)? Поконкретнее пожалуйста. А я постараюсь вам поверить. (Я ж не прошу вас давать информацию о вашем управляющем контроллере или процессоре или чего устройство в целом делает.)
  5. USB сниффер

    Цитата(zltigo @ May 21 2007, 17:27) http://aly.projektas.lt/Tools/USBTracker/USBAn.htm Хорошо, а где взять/купить? Где гарантии, что будет работать?
  6. 4 bulk EP и PDIUSBD12

    Цитата(Седой @ May 21 2007, 17:32) Работаем с этой микросхемой несколько лет. Странностей не обнаружено. Но!!! Нарушение временных диаграмм приводило к непредсказуемым результатам. PS. А вот это непонятно. Да, наблюдал неоднократно. Если времянки завалены, то внутренний конечный автомат PDIUSBD12, отвечающий за интерфейс команд/данных, в конце концов не знает чего делать. Что именно непонятно? Схема приведенная в datasheet-е к PDIUSBD12?
  7. USB сниффер

    Наболевшая тема. Программный сниффер хорошо, а вот это лучше: http://www.ellisys.com/products/usbex200/index.php Ну и стоит конечно 5K$. Если тиражи и скорости >1Мбайт/сек - то своих денег аппарат стоит.
  8. 4 bulk EP и PDIUSBD12

    Добрый день. Есть вопросы с работой PDIUSBD12 из микроконтроллера. Есть устройство с 4-мя bulk EP. Написан свой драйвер для Win 2000/XP. Не замечал ли кто-нибудь, что контроллер PDIUSBD12 после перевода его в режим DMA и активной работы по EP2 (Main EP) 8 Кбайт в одну сторону и 8 Кбайт в другую, при работе с EP1 отказывается отправлять пакеты? Ситуация странная, т.к. до начала циклов передачи/отправки по EP2 логика работы с EP1 работает просто замечательно. Также замечательно проходит обмен и по EP2, причем достигается заявленная инженерами philips/nxp? скорость передачи USB-устройство --> хост и наоборот в 1 Мбайт/cек. Общая процедура приема пакетов следующая: void EP1_ReceiveAndSend() { unsigned short status; unsigned short buffer[8]; //заполняется словами SELECT_EP1OUT(status); if( status^2 ) //EP1 Out stalled? { if( status&1 ) //EP1 buffer full? { ReceiveEP1(buffer); //receive buffer, clear buffer //пакет получен EP1_Logic(buffer); //процедура анализа и выдачи результата SELECT_EP1IN(status); //проверяем, есть ли заполненный и не отправленный буфер у PDIUSBD12 в EP1 Out if( status&2 )return ; //EP1 In stalled? Да - выход. while( status&1 ){ //буфер занят? Ждем. //здесь после активной работы в режиме DMA - проблема //бит full статуса EP контроллер PDIUSBD12 не сбрасывает - и бесконечное ожидание в цикле SELECT_EP1IN(status); if( status&2 )return ; //EP1 In stalled? Да - выход. } //отправка данных SendEP1(buffer); //send buffer, validate buffer } } } Схема подключения приблизительно такая же как на странице 7 документации PDIUSBD12 (Fig 3. Example of parallel interface to an 80C51 microcontroller). DMACK, DMREQ, EOT = '0'. Детальную схему подключения к сожалению не могу привести, т.к. есть жадные к успеху конкуренты. (Дело дошло даже до воровства компьютеров .) Буду благодарен за разумные предложения.