Jump to content

    

Длина 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 байта и получается лажа.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
4 minutes ago, _3m said:

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

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

Share this post


Link to post
Share on other sites
16 минут назад, aaarrr сказал:

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

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

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

Share this post


Link to post
Share on other sites
9 minutes ago, _3m said:

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

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

Share this post


Link to post
Share on other sites
31 минуту назад, aaarrr сказал:

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

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

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

Share this post


Link to post
Share on other sites
58 minutes ago, _3m said:

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

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

Share this post


Link to post
Share on other sites
37 минут назад, aaarrr сказал:

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

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

Share this post


Link to post
Share on other sites
2 minutes ago, _3m said:

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

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

Share this post


Link to post
Share on other sites
15 минут назад, _3m сказал:

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

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

Share this post


Link to post
Share on other sites
8 minutes ago, Сергей Борщ said:

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

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

Share this post


Link to post
Share on other sites
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 байт ?

Share this post


Link to post
Share on other sites
11 минут назад, _3m сказал:

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

 

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

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this