
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (14) « Первая ... 5 6 [7] 8 9 ... 13 14 все ( Перейти к последнему сообщению ) |
Сообщ.
#91
,
|
|
|
UsbMon сейчас попробую. Только по ходу он у меня наверное не пойдёт - я под Win98 вишу.
Насчёт документации - да нет, там про 32 как раз написано. UHCI11d.pdf: ![]() ![]() 3.2.5 RESERVED FOR SOFTWARE (DWORDS [7:4]) The last 4 DWords of the Transfer Descriptor are reserved for use by software. Но реально использовать можно и 16байт. А насчёт QH из восьми байт - не очень удобно. Она всё равно должна быть выровняна на границу 16 байт. Но в принципе можно и только 8 использовать. |
Сообщ.
#92
,
|
|
|
cppasm у меня возник вопрос на тему ресета порта UHC:
как я понял из документации, надо сначала установить бит ресета, подождать какое-то время, а потом его снать, правильно? Так вот, если я это делаю, то у меня сбрасывается флаг подключения устройства... Как ты делал ресет порта контроллера? А вообще, можешь показать твою инициализацию контроллера? Как-то все в этом UHC странно после OHC ![]() |
Сообщ.
#93
,
|
|
|
Цитата Gerret @ Как-то все в этом UHC странно после OHC Во-во, а мне наоборот странно было... ![]() Там бит ресета лучше вообще не трогать. Как написано у Кулакова (я проверял - оно так и есть) бит ресета щас на большинстве контроллеров зарезервирован. Там ресет явно делать не надо - делаешь enable и толи автоматом ресет происходит толи чего, но устройство имеет адрес 0 чего и требовалось. Вот код: ![]() ![]() void uhci_init(HC *hc,int hcn) { int i,k; dword FL=0x110000,QH=0x120000; for(i=0;i<hcn;i++) { // Disable legacy support. pci_write_cfg(&hc[i].pci,0xC0,0x02,0x2000); // Reset USB Controller. outportw(hc[i].base,0x04); delay(10); outportw(hc[i].base,0x00); delay(10); // Initialize Frame List. for(k=0;k<0x1000;k+=0x04) writed(FL+k,QH | Q); // Initialize Queue Head. writed(QH+0x00,T); writed(QH+0x04,T); // Set Frame List Address. outportd(hc[i].base+0x08,FL); FL+=0x1000; QH+=0x10; // Run UHCI USB Controller. outportw(hc[i].base,0x0081); } } А вот enable порта: ![]() ![]() // Enable Port of USB Controller. outportw(hc[i].base+port,0x000E); Это точно работает. Я думал что это из-за ресета контроллера. Но потом просто вставил ожидание нажатия клавиши - всё равно работает. Т.е. проверял так: - делаю ресет HC - прога ждёт пока не нажму кнопку - я конекчу устройство - жму кнопку Устройство с HC 100% не ресетилось, но после port enable всё равно имеет адрес 0. Так что я думаю при горячем подключении тоже работать будет. В аттаче моя прога - попробуй. Если не заработает - буду разбираться. Но вроди должна работать. На счёт OHCI LowSpeed если тебе интересно - там просто задержки 20мс не хватало. Лучше ставить проверку - там у порта есть статус завершения ресета и определять по нему. А так всё Ок. Прикреплённый файл ![]() |
Сообщ.
#94
,
|
|
|
Цитата cppasm @ Вот код: Спасибо! Разобрался ![]() Да уж, с ресетом там муть какая-то... Прога твоя зараотала отлично! Цитата cppasm @ там просто задержки 20мс не хватало задержки где? |
Сообщ.
#95
,
|
|
|
Задержки после ресета порта.
Было что-то такое: ресет порта, задержка 20мс. А лучше: ресет порта, проверка по биту завершения ресета: если таймаут (50мс), то выход, если ресет завершён - выход; иначе цикл. Если не трудно кинь лог проги сюда. |
Сообщ.
#96
,
|
|
|
Вот смотри:
![]() ![]() Detecting UHCI USB Controllers... 1 UHCI USB Controller(s) detected UHCI USB Controller 0: VENDOR ID = 8086h, DEVICE ID = 7112h PCI BUS = 0, PCI DEV = 7, PCI FN = 2 IO BASE = FFE0h, IRQ = 11 Detecting USB Devices... 1 USB Device(s) detected ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 2.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 40h VendorID : 0EA0h ProductID : 2168h Device version : 2.0 iManufacturer : 01h iProduct : 02h iSerialNumber : 00h NumConfigurations: : 01h Supported LangID(s) : 0409h Manufacturer : USB Product : Flash Disk ======================================================================== CONFIGURATION DESCRIPTOR ======================================================================== NumInterfaces : 01h ConfigurationValue : 01h iConfiguration : 00h Remote Wakeup : NO Self Powered : NO MaxPower : 200 mA ======================================================================== INTERFACE DESCRIPTOR ======================================================================== Interface Number : 00h Alternate Setting : 00h NumEndpoints : 03h Interface Class : 08h Interface SubClass : 06h Interface Protocol : 50h iInterface : 00h ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 81h (01h, IN) Attributes : 02h (Bulk pipe) MaxPacketSize : 40h Interval : 0 ms ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 02h (02h, OUT) Attributes : 02h (Bulk pipe) MaxPacketSize : 40h Interval : 0 ms ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 83h (03h, IN) Attributes : 03h (Interrupt pipe) MaxPacketSize : 02h Interval : 1 ms В ней есть какая-то странность: Этот лог от флешки Transcend 1GB, а когда я ее запускаю с флешкой Kingstone, она виснет на строке Detecting USB Devices намертво... Я попробовал ее запустить еще и с флешкой Seitec, так она повисла после вывода Device descriptor, но когда я ее вытащил из порта прога продолжила выполнятся... вот лог от Seitec: ![]() ![]() Detecting UHCI USB Controllers... 1 UHCI USB Controller(s) detected UHCI USB Controller 0: VENDOR ID = 8086h, DEVICE ID = 7112h PCI BUS = 0, PCI DEV = 7, PCI FN = 2 IO BASE = FFE0h, IRQ = 11 Detecting USB Devices... 1 USB Device(s) detected ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 2.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 40h VendorID : 0457h ProductID : 0151h Device version : 1.0 iManufacturer : 00h iProduct : 00h iSerialNumber : 00h NumConfigurations: : 01h Supported LangID(s) : 21CDh 1173h 95E8h C7FBh 0506h 13A7h C6A1h FF06h 0197h 42E9h C708h 0506h 44A7h BAA2h 99C4h A2E8h E804h 3005h 1EC3h 1E8Eh A3E5h 3E80h 0373h 7400h 830Ah 763Eh FF03h 1274h 53E9h B8D8h 122Eh 05B2h 3E8Bh 038Bh 068Eh 038Dh 2FCDh E81Fh 031Bh 068Eh A3E5h A126h 030Fh A326h 0016h A126h 0311h A326h 000Ah A126h 0313h A326h 000Ch 8E06h F506h B4A3h CD49h 0721h 4CB4h A026h 036Bh 21CDh D233h 3689h A67Dh 98E8h 3C2Fh 74FFh 3D09h 0000h 0175h E840h 0015h 89C3h 7D36h E8A6h 2F83h FF3Ch 0874h 003Dh 7400h E803h 0001h C6C3h FB06h 0297h FDBAh C697h 0004h ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 2.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 40h VendorID : 0457h ProductID : 0151h Device version : 1.0 iManufacturer : 00h iProduct : 00h iSerialNumber : 00h NumConfigurations: : 01h Supported LangID(s) : 2E89h 9F48h А с LG вообще непонятно, там лог вноль такой же как у Transcend'а... Так что вот! |
Сообщ.
#97
,
|
|
|
Gerret, я был не прав!
Ресет порта делать надо - это крайне положительно сказывается на многих устройствах. У меня например с принтером и сканером нормально работало, а подключаю телефон - работает через раз. Т.е. или нормально работает, или намертво вешает всю систему. Сделал ресет порта и всё Ок. Вот код: ![]() ![]() for(port=0x10;port<0x14;port+=0x02) // Цикл по портам if(inportw(hc[i].base+port) & 1) // Если устройство подключено { // Reset Port of USB Controller. outportw(hc[i].base+port,0x200); delay(20); outportw(hc[i].base+port,0x000); // Wait for connection bit set. // Ждём пока устройство завершит reset и установит бит своего подключения. // Если за 20мс устройство не появилось - наверное его отключили. for(k=0;k<20;k++) { if(inportw(hc[i].base+port) & 0x01) break; delay(1); } // Enable Port of USB Controller. outportw(hc[i].base+port,0x000E); // Wait for enable completition. // Ждём пока действительно enable. // Возможна задержка срабатывания!!! for(k=0;k<50;k++) { if(inportw(hc[i].base+port) & 0x04) break; delay(1); } // Дальше инициализация устройства: SET_ADDRESS и т.д. ... } Прога в архиве - поробуй. Ну и логи в студию ![]() Единственное - может ещё дескрипторы строк как-то не так получаются... Я для получения язык указываю английский, а вдруг он не поддерживается. Хотя очень мало вероятно. Прикреплённый файл ![]() |
Сообщ.
#98
,
|
|
|
Да уж, ресет порта помог, проблемы с разными флешками ушли.
Только у Seitec осталось как раньше... У этой флешки нет дескрипторов строк. Если индекс строки = 0, это значит его нет вообще и запрашивать его нельзя. Я архив закину с логами для разных устройств (что под рукой были). Прикреплённый файл ![]() |
Сообщ.
#99
,
|
|
|
Проблем меньше - это хорошо
![]() Насчёт индекса строки - я это проверяю. Здаётся мне она виснет при запросе строки с индексом 0 - т.е. строки с кодами поддерживаемых устройством языков. А как проверить оно поддерживает её или нет - не знаю, вроди по стандарту все должны поддерживать. В следующей версии это убиру наверное и отладочных записей больше добавлю, чтоб видно было точнее где виснет. PS: как я понял виснет не наглухо? Может оно NAK возвращает всё время, а он за ошибку не считается. Таймаута у меня там нет. |
Сообщ.
#100
,
|
|
|
Я понял!
![]() Если у устройства не определена ни одна строка, то может быть не определена и строка с кодами поддерживаемых языков. Вот из спецификации USB 1.1: ![]() ![]() A USB device may omit all string descriptors. USB devices that omit all string descriptors shall not return an array of LANGID codes. Она просто не нужна. А я в любом случае её получаю. Хотя Мышь например абсолютно нормально вернула пустой дескриптор - типа никаких я языков не поддерживаю. Но чтение LanguageID я убрал - я всё-равно его не использую, а так стабильнее. И ещё такой вопрос - ты случайно лог для LG не после Transcend создавал? Смущает меня что они одинаковые... У этих флэшек хоть объём одинаковый? В принципе вполне возможно - LG на чипах Transcend'a сделала флэшку и потому там VID и PID Transcend'a. Вроди и глюка быть не должно: перед получением дескриптора память очищается - старый дескриптор там остаться не мог. Но для чистоты эксперимента попробуй создать лог для LG не подключая до этого Transcend. Прога как всегда прикреплена. Вроди всё теперь исправил. А у тебя как дела с разработкой? Ну просто ты мне очень помог - ОГРОМНОЕ СПАСИБО. У меня под рукой столько устройств нет. Прикреплённый файл ![]() |
Сообщ.
#101
,
|
|
|
Я, когда дескрепторы строк получал, проверял значение индекса и если он - 0, то не запрашивал дескриптор.
Цитата cppasm @ Смущает меня что они одинаковые... У этих флэшек хоть объём одинаковый? Нет размер у них разный, у LG - 512, а у Transcend - 1GB. У них есть одна общая особенность, после каких-то моих экспериментов, они обе стали защащенными от записи... при том, что у LG вообще нет ползунка защиты, а у Transcend'а он стоит в положении "открыто". Снять эту защиты пока не удалось... Отсюда можно сделать вывод, что контроллеры у них одинаковые. Цитата cppasm @ А у тебя как дела с разработкой? В общем-то не плохо ![]() ![]() Сейчас занимаюсь повторением этого же, но для UHC. Цитата cppasm @ У меня под рукой столько устройств нет. Да уж, я убедил своего начальника, что нам надо их по больше после небольшой лажи с заказчиком... Я сначала сделал демонстрационную прогу, что бы показать заказчику, что мы это можем, и отлаживал ее только на одной флешке ![]() ![]() ![]() В понедельник на работу приеду и потестирую твою прогу ![]() |
Сообщ.
#102
,
|
|
|
Цитата Gerret @ Я, когда дескрепторы строк получал, проверял значение индекса и если он - 0, то не запрашивал дескриптор Я тоже так делаю. Суть проблеммы была не в этом. Есть просто дескриптор с индексом 0. Он содержит коды поддерживаемых языков. В других дескрипторах указатель на него не фигурирует. И вот этот дескриптор я получал. А как позже оказалось (см. цитату из спецификации выше) если у устройства нет дескрипторов строк - может не быть и дескриптора с кодами языков. А я этого не учитывал и всё равно его получал. Отсюда и проблеммы... |
Сообщ.
#103
,
|
|
|
Сообщ.
#104
,
|
|
|
В который раз ОГРОМНОЕ спасибо за помощ.
![]() Теперь вроди проблеммы закончились. Кстати - ты не пробовал флэшки разблокировать родной прогой Transcend'a? Я не уверен что поможет, но а вдруг. У меня с флэшкой на CD вместе с дровами шла. Если надо - могу выслать. Называется RecoverDisk. Но она при этом флэшку форматирует - так что данным скорее всего будет конец. |
Сообщ.
#105
,
|
|
|
Цитата cppasm @ В который раз ОГРОМНОЕ спасибо за помощ. Пожалуйста ![]() Пробовал, не помогает ![]() К стати, а в каком виде ты хочешь потом сделать свой USB стек? (драйвер, резидент, ???) |