Перейти к содержанию
    

Длина String descriptor для iManufacturer и iProduct

Какую длину использовать при передаче String descriptor для iManufacturer и iProduct ?

Использовать длину из самого дескриптора или из поля wLength запроса GET_DESCRIPTOR ?

Ковыряю имеющийся код там используется длина из запроса.

При энумерации хост запрашивает 4 байта для StringDescriptor_0, 16 байт для StringDescriptor_1 и 24 байта для StringDescriptor_2. Откуда берутся эти цифры  (причем и в win и lin они одинаковые)? В спецификации и букварях нигде не нашел ограничений на длину StringDescriptor кроме 255 байт.

StringDescriptor_2 у меня длиной 52 байта и получается лажа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отдавать не более чем запросил хост. Он в два этапа читает - запрашивает начало, где размер. А потом еще раз целиком.

Если у Вас дескриптор на 5 байт а хост запросил 8 - отдаем 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 минуты назад, GenaSPB сказал:

Отдавать не более чем запросил хост. Он в два этапа читает - запрашивает начало, где размер. А потом еще раз целиком.

Если у Вас дескриптор на 5 байт а хост запросил 8 - отдаем 5

Хост действительно запрашивает 2 или 3 раза но всегда с фиксированной длиной. Целиком ни разу не запрашивает.

Вот передергивание кабеля.

I0L4D4 - сообщения обработчика GetStringDescriptor
I - индекс дескриптора, L - поле wLength запроса, D - фактическая длина дескриптора

Windows (Full speed)
--------------------------------------------------
Suspend Request Interrupt
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed

I0L4D4

I2L24D52

I0L4D4

I1L16D22

I2L24D52

I2L24D52

USBR_GET_STATUS

value of dx->remotewakeup is 0

I0L4D4

I1L16D22

I2L24D52

 

LINUX (Full speed)
--------------------------------------------------
Suspend Request Interrupt
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed

I0L4D4

I2L24D52

I0L4D4

I1L16D22

I2L24D52

I2L24D52

I0L4D4

I1L16D22

I2L24D52
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed
Reset Status Interrupt
Full speed after reset
Device is configured for Full Speed

I0L4D4

I2L24D52

I1L16D22

I0L4D4

I2L24D52

Запрос полного дескриптора должен быть I2L52D52 а вместо этого всегда I2L24D52.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, _3m said:

Целиком ни разу не запрашивает.

Не должно быть так. А что в самих дескрипторах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, aaarrr сказал:

Не должно быть так. А что в самих дескрипторах?

В дескрипторах текст. Поле длины соответствует.

Я проверил вариант с передачей по длине дескриптора. Все работает, lsusb String descriptor-ы показывает правильно. Под виндой еще не нашел чем посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, _3m said:

В дескрипторах текст. Поле длины соответствует.

Увидеть это можно в исходнике?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, aaarrr сказал:

Увидеть это можно в исходнике?

это ковыряю, переделал на gcc.

цель чтобы один и тот же xusb работал как с windows так и с linux и на любых хостах. Сейчас работает нестабильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

58 minutes ago, _3m said:

это ковыряю, переделал на gcc

Сочувствую. По-моему, это лучше не чинить, а писать заново.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, aaarrr сказал:

Сочувствую. По-моему, это лучше не чинить, а писать заново.

Тем не менее вопрос почему хост не запрашивает полные дескрипторы остается открытым.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, _3m said:

Тем не менее вопрос почему хост не запрашивает полные дескрипторы остается открытым.

Сниффером посмотрите. Под linux'ом wireshark, например, умеет USB.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, _3m сказал:

Тем не менее вопрос почему хост не запрашивает полные дескрипторы остается открытым.

Может ему не нравится ваш ответ на запрос короткого дескриптора? Он переспросил, вы ему снова чушь ответили, он обиделся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Сергей Борщ said:

Может ему не нравится ваш ответ на запрос короткого дескриптора?

Может. Например, если при запросе 8 байт отправляется 8 байт + ZLP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 минут назад, Сергей Борщ сказал:

Может ему не нравится ваш ответ на запрос короткого дескриптора? Он переспросил, вы ему снова чушь ответили, он обиделся.

Нашел.

#define STR0_DSCPT_LEN 4
#define STR1_DSCPT_LEN 16

#define STR2_DSCPT_LEN 24

https://github.com/OpenNuvoton/NUC970_NuWriter/blob/master/NuWriterFW/NuWriterFW/source/usbd.c#L44

https://github.com/OpenNuvoton/NUC970_NuWriter/blob/master/NuWriterFW/NuWriterFW/source/usbd.c#L530

Еще на неподдерживаемые дескрипторы (например OS String Descriptor) лучше отдавать stall а не бред. Бред не нравится усб стеку.

Поправил, стало лучше но все равно для Windows и linux приходится собирать разные бинарники.

Линукс хочет чтобы было выполнено честное переподключение с извлечением устройства а винда подхватывает на лету.

Теперь так:

WINDOWS (High speed)
------------------------------------
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
I0L255D4        0x3F14FB0
I1L255D22       0x3F14FB4
I2L255D52       0x3F14FCC
I0L255D4        0x3F14FB0
I0L255D4        0x3F14FB0
I2L255D52       0x3F14FCC
I0L255D4        0x3F14FB0
I0L255D4        0x3F14FB0
I2L255D52       0x3F14FCC

USBR_GET_STATUS

value of dx->remotewakeup is 0
I0L255D4        0x3F14FB0
I1L255D22       0x3F14FB4
I2L255D52       0x3F14FCC
I0L512D4        0x3F14FB0
I1L512D22       0x3F14FB4
I2L512D52       0x3F14FCC

 

LINUX (High speed)
------------------------------------
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
I0L255D4        0x3F14FB0
I1L255D22       0x3F14FB4
I2L255D52       0x3F14FCC
I0L255D4        0x3F14FB0
I0L255D4        0x3F14FB0
I2L255D52       0x3F14FCC
I0L255D4        0x3F14FB0
I0L255D4        0x3F14FB0
I2L255D52       0x3F14FCC
I0L255D4        0x3F14FB0
I1L255D22       0x3F14FB4
I2L255D52       0x3F14FCC
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
I0L512D4        0x3F14FB0
I1L512D22       0x3F14FB4
I2L512D52       0x3F14FCC
Reset Status Interrupt
HS after reset
Reset Status Interrupt
HS after reset
I0L255D4        0x3F14FB0
I2L255D52       0x3F14FCC
I1L255D22       0x3F14FB4
I0L255D4        0x3F14FB0
I2L255D52       0x3F14FCC

Хост запрашивает сразу 255 байт. А что там за повторные запросы по 512 байт ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, _3m сказал:

А что там за повторные запросы по 512 байт ?

 

1 час назад, aaarrr сказал:

Сниффером посмотрите. Под linux'ом wireshark, например, умеет USB.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...