ghost3000
Интересующийся
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 возвращает, что не удается найти указанный файл. Я так полагаю какая-то ошибка в драйвере, регистрации символного имени или все же я не правильно обращаюсь к драйверу??
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 13-11-2008 09:17 » |
|
не знаю как у вас в паскале, а в С/С++ для вывода слеша в строку - указывается \\ то есть '\\\\.\\usb_testdrv' PS второе - если у вас виста, то вполне возможно необходимо запускать приложение с галочкой "с правами администратора" - в контекстном меню есть такой пункт. по умолчанию Vista даже при работе с админскими правами - доступ к драйверам может не давать. зависит от установки драйвера.
|
|
« Последнее редактирование: 13-11-2008 09:20 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
ghost3000
Интересующийся
Offline
|
|
« Ответ #2 : 13-11-2008 09:58 » |
|
У меня XP стоит, а в паскале там один слеш нада. Может кто сам драйвер посмотрит, я думаю все таки там что-то не то...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 13-11-2008 16:05 » |
|
выкладывай, гляну мельком...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
ghost3000
Интересующийся
Offline
|
|
« Ответ #4 : 13-11-2008 16:13 » |
|
он прикреплен в первом сообщении...
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Интересующийся
Offline
|
|
« Ответ #6 : 13-11-2008 16:30 » |
|
какой другой, он же там один, мой драйвер и все...
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Интересующийся
Offline
|
|
« Ответ #8 : 13-11-2008 17:08 » |
|
не нечего...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #10 : 13-11-2008 19:46 » |
|
еще... какие то IRP_MJ_PNP надо было завершать иначе... хотя могу ошибаться... ща поужинаю - посмотрю ишо разик...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #11 : 13-11-2008 19:50 » |
|
Offtopic: Ochkarik, ужинать - в час ночи ? )))
Поставлю в угол.
|
|
« Последнее редактирование: 13-11-2008 20:11 от Ochkarik »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 13-11-2008 20:11 » |
|
Offtopic: кому час... а кому и одинадцать только) PS а почему у тебя после сообщения переносов так много, а у меня нет?) ааа... потому что в угол...)))
ghost3000, ошибка два: в AddDevice DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; это - помоему из за этого не грузится.... отпишись по результатам.
|
|
« Последнее редактирование: 13-11-2008 20:22 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
ghost3000
Интересующийся
Offline
|
|
« Ответ #13 : 13-11-2008 21:22 » |
|
Ochkarik, огромное спасибо, действительно все было в строке DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; Теперь буду тестить дальше...
|
|
|
Записан
|
|
|
|
ghost3000
Интересующийся
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
|
|
« Ответ #15 : 20-11-2008 15:26 » |
|
метод возмите с буферизацией. он самый простой.
по остальному - увы, времени катострофически нет. сгенерите пример в Driver Studio.
прикладываю свой старый (там через read|write помоему было, но не суть важно). кажется работал, но лучше сделайте свой.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
ghost3000
Интересующийся
Offline
|
|
« Ответ #16 : 21-11-2008 18:42 » |
|
С прошлой проблемой разобрался... Еще один вопрос, как сформировать структуру URB так, чтобы передать пользовательский пакет SETUP, всмысле не со стандартным кодом запроса bRequest (получение дескриптора, установка конфигурации и т.д.), а со своим уникальным и при этом передать какое-то параметр запроса wValue??
|
|
|
Записан
|
|
|
|
ghost3000
Интересующийся
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
|
|
« Ответ #18 : 22-11-2008 19:28 » |
|
так держать сорри - хотел на работе посмотреть, но не успел... запарка
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
ghost3000
Интересующийся
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 оно зависает... В чем может быть проблема?? или может быть мою задачу надо решать как-нибудь по другому???
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
ghost3000
Интересующийся
Offline
|
|
« Ответ #21 : 15-02-2009 18:07 » |
|
Все, разобрался Дело было даже не в драйвере, проста у меня в дискрипторах был указан максимальный объем конечных точек 256 байт, а usb в режиме Full Speed поддерживает максимальный размер точки 64 байта... Но все равно спасибо за помощь.
|
|
|
Записан
|
|
|
|
|