Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите новичку с драйвером USB  (Прочитано 23537 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ghost3000
Интересующийся

ua
Offline Offline

« : 13-11-2008 07:28 » 

  Написал драйвер, который должен считывать с USB устройства 8 байт данных. После подключения устройства драйвер создает символьную ссылку на устройство (usb_testdrv).
  Из пользовательского приложения функция QueryDosDevice(nil, P, BufSize) возвращает в буфер P список устройств, в котором присуствует и мое, однако при попытке открыть его:
hDevice:= CreateFile('\\.\usb_testdrv',
             GENERIC_READ or GENERIC_WRITE,
             0,nil,
             OPEN_EXISTING,
             FILE_ATTRIBUTE_NORMAL,
             0
           );
происходит ошибка, GetLastError возвращает, что не удается найти указанный файл.
  Я так полагаю какая-то ошибка в драйвере, регистрации символного имени или все же я не правильно обращаюсь к драйверу??

* USB_testdrv.rar (55.03 Кб - загружено 1085 раз.)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-11-2008 09:17 » 

не знаю как у вас в паскале, а в С/С++ для вывода слеша в строку - указывается \\
то есть '\\\\.\\usb_testdrv'
PS второе - если у вас виста, то вполне возможно необходимо запускать приложение с галочкой "с правами администратора" - в контекстном меню есть такой пункт. по умолчанию Vista даже при работе с админскими правами - доступ к драйверам может не давать. зависит от установки драйвера.
« Последнее редактирование: 13-11-2008 09:20 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #2 : 13-11-2008 09:58 » 

У меня XP стоит, а в паскале там один слеш нада. Может кто сам драйвер посмотрит, я думаю все таки там что-то не то...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 13-11-2008 16:05 » 

выкладывай, гляну мельком...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #4 : 13-11-2008 16:13 » 

 он прикреплен в первом сообщении...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 13-11-2008 16:26 » 

Так замечание по ходу... GetLastError вернёт "Файл не найден" и в том случае, если не будет найден какой-нить другой файл затребованный данной ф-ей по цепочке.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #6 : 13-11-2008 16:30 » 

какой другой, он же там один, мой драйвер и все...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 13-11-2008 16:44 » 

Ну я ж не знаю сколько у тебя там чего. А твой драйвер ничего не использует? Никаких других длл например?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #8 : 13-11-2008 17:08 » 

не нечего...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 13-11-2008 18:23 » 

слона то я и не заметил)))))

добавьте:
Код:
    for(i=0; i<=IRP_MJ_MAXIMUM_FUNCTION; i++)
DriverObject->MajorFunction[i] = CommonDispatch;

положено обрабатывать все запросы... вобще говоря...иначе сделает кто-нибудь WriteFile. а оно и грохнется насмерть)
может и из за этого...

в дереве устройств винды он вобще видится?
inf - файл нормальный?
« Последнее редактирование: 13-11-2008 19:03 от Алексей1153++ » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 13-11-2008 19:46 » 

еще... какие то IRP_MJ_PNP надо было завершать иначе... хотя могу ошибаться... ща поужинаю - посмотрю ишо разик...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #11 : 13-11-2008 19:50 » 

Offtopic:

Ochkarik, ужинать - в час ночи ? )))
Поставлю в угол.
« Последнее редактирование: 13-11-2008 20:11 от Ochkarik » Записан

Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 13-11-2008 20:11 » 

Offtopic:

кому час... а кому и одинадцать только)
PS а почему у тебя после сообщения переносов так много, а у меня нет?)
ааа... потому что в угол...)))


ghost3000,
ошибка два: в AddDevice
Код:
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
это - помоему из за этого не грузится....
отпишись по результатам.
« Последнее редактирование: 13-11-2008 20:22 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #13 : 13-11-2008 21:22 » 

Ochkarik, огромное спасибо, действительно все было в строке DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
Теперь буду тестить дальше...
Записан
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #14 : 20-11-2008 09:52 » 

  Как написать обработчик IRP_MJ_DEVICE_CONTROL, в котором при определенных IOCTL кодах будут считываться данные с первой или со второй конечной точки интерфейса USB??

  Конкретно интересует какой необходим в данном случае способ получения доступа к буферу данных (METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, METHOD_NEITHER) и в какие поля IRР пакет необходимо записать полученные данные, что бы передать их пользовательскому приложению??
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 20-11-2008 15:26 » 

метод возмите с буферизацией. он самый простой.

по остальному - увы, времени катострофически нет.
сгенерите пример в Driver Studio.

прикладываю свой старый (там через read|write помоему было, но не суть важно).
кажется работал, но лучше сделайте свой.

* USB_FTDI.RAR (62.46 Кб - загружено 1005 раз.)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #16 : 21-11-2008 18:42 » 

  С прошлой проблемой разобрался...
  Еще один вопрос, как сформировать структуру URB так, чтобы передать пользовательский пакет SETUP, всмысле не со стандартным кодом запроса bRequest (получение дескриптора, установка конфигурации и т.д.), а со своим уникальным и при этом передать какое-то параметр запроса wValue??
Записан
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #17 : 22-11-2008 13:46 » 

  Все, разобрался... Нада было использовать:
Код:
UsbBuildVendorRequest(urb, 
      URB_FUNCTION_VENDOR_OTHER,
      sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
          (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK), 
      0, // Reserved Bits
      SET_VALUE, // Request
      (USHORT) ioBuffer[0], // Value
      (USHORT) ioBuffer[1], // Index
      NULL, // Transfer Buffer
      NULL, // TransferBufferMDL OPTIONAL
      0, // Transfer Buffer Lenght
      NULL); // Link OPTIONAL
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 22-11-2008 19:28 » 

так держать Класс!
сорри - хотел на работе посмотреть, но не успел... запарка С ума сойти...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #19 : 15-02-2009 09:27 » 

  Наконец то собрал устройство и начал писать прошивку для МК, но тут опять возникли роблемы с дравером...
  В обработчике IRP_MJ_DEVICE_CONTROL, считываются данные с двух конечных точек типа bulk, при этом для формирования urb запроса используется макрос:
Код:
UsbBuildInterruptOrBulkTransferRequest(
urb,
(USHORT) sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->hpipe3,
Irp->AssociatedIrp.SystemBuffer,
NULL,
cbout,
USBD_TRANSFER_DIRECTION_IN │ USBD_SHORT_TRANSFER_OK,
NULL);
  Я так понимаю флаг USBD_SHORT_TRANSFER_OK указывает на то, что данные передаваемые через конечную точку не превышают размер конечной точки, однако в моей задаче объем данных больше размера конечной точки; удалив данный флаг, драйвер вообще перестает работать, при вызове из приложения функции DeviceIoControl оно зависает... В чем может быть проблема?? или может быть мою задачу надо решать как-нибудь по другому???

* usb_driver.rar (5.09 Кб - загружено 997 раз.)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 15-02-2009 10:48 » 

флаг разрешает пересылки короче чем зарегистрированная у HCD  длинна пакета.
если он снят - то для передач с длинной пакета меньше указанной в HCD - генерится ошибка.
если выставлен - то такие пакеты все равно отсылаются.

видимо не согласованность между выставленной максимальной длинной пакета и тем что вы отправляете.
если вы хотите работать только с одной длинной пакета - то при инициализации измените длинну pii->Pipes[ip].MaximumTransferSize =USBD_MAXIMUM_TRANSFER_SIZE
и соответственно используйте только заданную длинну со снятым флагом коротких пересылок.

кажется так)) если я правильно DDK понимаю)

PS кстати... я не знаю как правильно но...
почему у вас urb = USBD_CreateConfigurationRequestEx(pcd, interfaces);
вызывается до того, как заполнится структура interfaces[] ?
это точно правильно?

не могу сеййчас посмотреть что делает USBD_CreateConfigurationRequestEx - это макрос или функция которая копирует входные данные?
PPS это все таки функция по ходу дела...
Цитата
USBD_CreateConfigurationRequestEx returns an URB that can be sent to the host controller driver (HCD) to set the device in a configured state. The routine allocates memory for this URB that the caller must free when finished with the URB.
хотя вроде да... вроде правильно.
« Последнее редактирование: 15-02-2009 11:04 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ghost3000
Интересующийся

ua
Offline Offline

« Ответ #21 : 15-02-2009 18:07 » new

  Все, разобрался  Внимание! Говорит и показывает...
  Дело было даже не в драйвере, проста у меня в дискрипторах был указан максимальный объем конечных точек 256 байт, а usb в режиме Full Speed поддерживает максимальный размер точки 64 байта...
  Но все равно спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines