Тестируем поддержку USB

Drivers for periphery equipment
  • http://ftp.kolibrios.org/users/CleverMo ... sbstor.obj - есть хорошие шансы, что эта версия чинит проблему уровня драйвера mass storage, "USB transfer error, disabling mass storage".
    Сделаем мир лучше!
  • ASRock M3A770DE
    Spoiler:
    BOARDLOG.TXT (2.79 KiB)
    Downloaded 132 times
  • Сделаем мир лучше!
  • ASRock M3A770DE
    Spoiler:
    BOARDLOG.TXT (2.88 KiB)
    Downloaded 130 times
  • Сделаем мир лучше!
  • ASRock M3A770DE
    Spoiler:
    BOARDLOG.TXT (3.36 KiB)
    Downloaded 136 times
  • Значит, USBшная часть драйвера флешки успешно работает. Это хорошо, можно приступать к ядерной.

    Проблема с SET_CONFIGURATION, по ощущениям, вызвана тем, что флешке тупо не хватает питания. После подсоединения и сброса USB-устройство может потреблять от шины до 100 мА; в этом состоянии устройство может не работать, но должно выдавать базовую информацию о себе - в том числе потребление тока в рабочем состоянии. Мышкам/клавиатурам 100 мА заведомо хватает и для работы, а вот конкретная флешка, с которой проблемы, пишет о себе, что ей нужно 200 мА. Команда SET_CONFIGURATION как раз переводит устройство в рабочее состояние; вероятно, флешка пытается увеличить потребление тока, некоторые хосты ей этого не дают, в результате чего флешка культурно проваливает команду. Что с этим делать, не очень понятно.
    Сделаем мир лучше!
  • CleverMouse wrote:флешка пытается увеличить потребление тока, некоторые хосты ей этого не дают
    3 из 4 моих тестовых машин. Винда и Linux эту проблему каким-то образом обходят.
    Посмотрел в диспетчере устройств в ВинХП - обе флешки обозначены как 200 мА
  • В винде и Linux, очевидно, работа с флешкой идёт через EHCI, а не OHCI.
    Сделаем мир лучше!
  • Т.е. флешка принципиально не будет работать в OHCI 1.1 режиме?

    На моем первом компьютере (относительно приобретенной флешки) в Виндовс выдавалось предупреждение, что устройство USB2 в то время как контроллер USB1, но флешка работала. Для 98SE приходилось скачивать драйвер с сайта производителя, а вот XP уже сама поддерживала.

    З.Ы. Я не помню какой там был тип контроллера.
  • Т.е. флешка принципиально не хочет работать на нескольких хостах, где есть и OHCI, и EHCI, в режиме OHCI. В принципе в OHCI она работает, что демонстрирует четвёртый хост.
    Сделаем мир лучше!
  • Протестировал на eBox3300MX и M4A78VM, в обоих случаях работает просто замечательно. Большое спасибо за проделанную работу! :)

    Тестирование проводил с мышью A4Tech X7, двумя флешками, SD картой подключенной с помощью картридера и USB хабом. Если нужно то могу предоставить более подробную информацию об этих устройствах.
    Attachments
    Downloaded 150 times
    Downloaded 197 times
    OHCI_M4A78VM.txt (1.89 KiB)
    Downloaded 144 times
  • Ситуация с поддержкой дисковых устройств в ядре ужасная, поэтому новая серия пока откладывается. Для тех, кому интересно, прикладываю текущий вариант 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 - для флешек этого обычно достаточно.
    Сделаем мир лучше!
  • Who is online

    Users browsing this forum: No registered users and 1 guest