CleverMouse wrote:Теперь драйвер http://ftp.kolibrios.org/users/CleverMo ... sbstor.obj выводит несколько более подробную информацию об ошибках в ходе своих операций. Если в логе была ошибка "USB transfer error, disabling mass storage", как то у Sorcerer и у Mario на последней из машин, просьба перетестировать с этим драйвером. На проблемы, выражающиеся в ошибке с SET_CONFIGURATION, это не влияет.
Значит, USBшная часть драйвера флешки успешно работает. Это хорошо, можно приступать к ядерной.
Проблема с SET_CONFIGURATION, по ощущениям, вызвана тем, что флешке тупо не хватает питания. После подсоединения и сброса USB-устройство может потреблять от шины до 100 мА; в этом состоянии устройство может не работать, но должно выдавать базовую информацию о себе - в том числе потребление тока в рабочем состоянии. Мышкам/клавиатурам 100 мА заведомо хватает и для работы, а вот конкретная флешка, с которой проблемы, пишет о себе, что ей нужно 200 мА. Команда SET_CONFIGURATION как раз переводит устройство в рабочее состояние; вероятно, флешка пытается увеличить потребление тока, некоторые хосты ей этого не дают, в результате чего флешка культурно проваливает команду. Что с этим делать, не очень понятно.
Сделаем мир лучше!
Mario
CleverMouse wrote:флешка пытается увеличить потребление тока, некоторые хосты ей этого не дают
3 из 4 моих тестовых машин. Винда и Linux эту проблему каким-то образом обходят.
Посмотрел в диспетчере устройств в ВинХП - обе флешки обозначены как 200 мА
В винде и Linux, очевидно, работа с флешкой идёт через EHCI, а не OHCI.
Сделаем мир лучше!
Mario
Т.е. флешка принципиально не будет работать в OHCI 1.1 режиме?
На моем первом компьютере (относительно приобретенной флешки) в Виндовс выдавалось предупреждение, что устройство USB2 в то время как контроллер USB1, но флешка работала. Для 98SE приходилось скачивать драйвер с сайта производителя, а вот XP уже сама поддерживала.
Т.е. флешка принципиально не хочет работать на нескольких хостах, где есть и OHCI, и EHCI, в режиме OHCI. В принципе в OHCI она работает, что демонстрирует четвёртый хост.
Протестировал на eBox3300MX и M4A78VM, в обоих случаях работает просто замечательно. Большое спасибо за проделанную работу!
Тестирование проводил с мышью A4Tech X7, двумя флешками, SD картой подключенной с помощью картридера и USB хабом. Если нужно то могу предоставить более подробную информацию об этих устройствах.
Ситуация с поддержкой дисковых устройств в ядре ужасная, поэтому новая серия пока откладывается. Для тех, кому интересно, прикладываю текущий вариант API для дисковых устройств.
Spoiler:All functions are stdcall.
void* DiskAdd(DISKFUNC* functions, const char* name, void* userdata);
; The pointer 'functions' must be valid at least until the disk will be deleted
; (until DiskDel returns).
; The pointer 'name' can be invalid after this function returns.
; It should point to ASCIIZ-string without leading '/' in latin lowercase and
; digits, like 'usbhd0'.
; The value 'userdata' is any pointer-sized data, passed as is to all callbacks.
struc DISKFUNC
{
.strucsize dd ?
.querymedia dd ?
; int querymedia(DISKMEDIAINFO* info, void* userdata);
; return value: 0 = success, otherwise = error
.read dd ?
; int read(void* buffer, __int64 startsector, int* numsectors, void* userdata);
; return value: 0 = success, otherwise = error
.write dd ?
; int write(const void* buffer, __int64 startsector, int* numsectors, void* userdata);
; Optional.
; return value: 0 = success, otherwise = error
.flush dd ?
; int flush(void* userdata);
; Optional.
; Flushes the hardware cache, if it exists. Note that a driver should not implement
; a software cache for read/write, since they are called from the kernel cache manager.
}
struc DISKMEDIAINFO
{
.flags dd ?
DISK_MEDIA_READONLY = 1
.sectorsize dd ?
.capacity dq ?
}
void DiskDel(void* hDisk);
; After this function returns, the kernel will not issue any callbacks for this disk.
; It's the responsibility of the driver to properly terminate all requests issued
; before or in parallel to the call of this function. Currently all requests are
; synchronous (functions like read_async/write_async may be added in the future),
; so the kernel guarantees that after this function returns, it is safe to free
; all device-related resources.
void DiskMediaChanged(void* hDisk, int newstate);
Теперь надо ещё научить файловые системы брать данные не из глобальных переменных, а по локальному указателю. Скорее всего, для начала в таком режиме будет функционировать только FAT32 - для флешек этого обычно достаточно.