реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Плохая енумерация USB устройства на CY7C68001, Как с этим бороться?
jur
сообщение Sep 25 2007, 06:34
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Привет!

Давайте рассмотрим ситуацию. Имеется устройство на CY7C68001, подключенное к шине USB 2.0 и работающее в режиме High Speed. Для инициализации и управления микросхемой CY7C68001 имеется набортный микроконтроллер. Устройство подключено в стойке или внутри компьютерного корпуса, поэтому физический доступ к нему затруднен.

По включению компьютера иногда бывает, что устройство не енумерируется, т.е. в списке Менеджера Устройств Винды появляется неопознанное устройство. Обычно в такой ситуации рекомендуется переподключить устройство и надеяться, что оно опознается. Но в данном случае физическое переподключение затруднено.

Как быть в подобной ситуации?

Вроде напрашивается вариант сброса CY7C68001 и повторной ее инициализации микроконтроллером в случае непоявления бита HSGRANT после какого-то достаточно продолжительного таймаута. Но в случае работы в режиме Full Speed это не проходит (т.к. бит HSGRANT всегда будет равен 0).

Еще один вариант. Устройство собрано на микросхеме CY7C68013A. Тогда вообще хана. Если устройство неопознано, то невозможно осуществить загрузку фирмваре во встроенный микроконтроллер. Можно применить последовательную еепромку, но хотелось бы найти более "дубовое" и надежное решение повторной енумерации в случае какого-то сбоя. Может быть можно осуществить повторную енумерацию устройств штатными средствами Винды?

Какие будут соображения, коллеги?


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 25 2007, 07:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(jur @ Sep 25 2007, 10:34) *
По включению компьютера иногда бывает, что устройство не енумерируется, т.е. в списке Менеджера Устройств Винды появляется неопознанное устройство. Обычно в такой ситуации рекомендуется переподключить устройство и надеяться, что оно опознается. Но в данном случае физическое


Какие у неопознанного устройства PID и VID?
Сброс USB интерфейса устройства при включении сделан корректно?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Седой
сообщение Sep 25 2007, 11:05
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Можно попробовать выключить и включить питание порта хаба, к которому подключено устройство.
Делается это программным способом, если хаб это поддерживает .

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

Сообщение отредактировал Седой - Sep 25 2007, 11:15
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 25 2007, 11:53
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Oldring @ Sep 25 2007, 10:10) *
Какие у неопознанного устройства PID и VID?

Вот последовательность действий, которую мне удалось поймать.

1. Начальное состояние:



2. Втыкаем устройство, оно не распознается:



3. Двойной клик на неизвестном устройстве, смотрим, ничего толкового не видим:



4. В программе USB View появляется неопознанное устройство:



Видно, что PID и VID равны нулю.

5. Наконец в менеджере устройств оно тоже появляется. Причем, никаких желтых знаков вопроса не возникает:



Цитата(Oldring @ Sep 25 2007, 10:10) *
Сброс USB интерфейса устройства при включении сделан корректно?

Да, вроде вполне корректно. Схему ресета я взял из их типового примера. Кроме того, микроконтроллер тоже ресетит микросхему (получается около миллисекунды).

Цитата(Седой @ Sep 25 2007, 14:05) *
Можно попробовать выключить и включить питание порта хаба, к которому подключено устройство.
Делается это программным способом, если хаб это поддерживает.

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

Хм... Интересная мысль... А можно ли это сделать программно? А то я ни выключать питание хаба, ни выключать его использование программно не умею.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 25 2007, 13:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(jur @ Sep 25 2007, 15:53) *
Да, вроде вполне корректно. Схему ресета я взял из их типового примера. Кроме того, микроконтроллер тоже ресетит микросхему (получается около миллисекунды).


Я, к сожалению, не имею понятия, какая схема ресета в этом даташите. Искать его лень. Это self powered устройство?

То, что устройство Low speed - это так и задумано, или глюк?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 25 2007, 14:25
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(jur @ Sep 25 2007, 14:53) *
Кроме того, микроконтроллер тоже ресетит микросхему (получается около миллисекунды).

Может быть в этом и дело...
Из "EZ-USB® Technical Reference Manual" (ez_usb_r___technical_reference_manual__trm__14.pdf): "If the EZ-USB’s XTALIN pin is driven by an external clock source that continues to run while the chip is in reset, RESET# need only be asserted for 200 μs. Otherwise, it must be asserted for at least 5 ms."


Цитата(jur @ Sep 25 2007, 14:53) *
Хм... Интересная мысль... А можно ли это сделать программно? А то я ни выключать питание хаба, ни выключать его использование программно не умею.

Присоединяюсь к вопросу. Как программно выключать/включать питание для USB устройства, подключенного к одному из портов хаба?
Go to the top of the page
 
+Quote Post
Седой
сообщение Sep 25 2007, 18:01
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Цитата
Присоединяюсь к вопросу. Как программно выключать/включать питание для USB устройства, подключенного к одному из портов хаба?


1. Открыть драйвер хаба.
2. Вызвать DeviceIoControl с кодом IOCTL_USB_HCD_DISABLE_PORT
3. Вызвать DeviceIoControl с кодом IOCTL_USB_HCD_ENABLE_PORT
4. Закрыть драйвер хаба.

В Windows XP можно и через прямой вызов CLEAR_FEATURE и SET_FEATURE

Более детально см. usbioctl.h и usbuser.h в DDK.

PS. Более простой способ http://www.usb.org/phpbb/viewtopic.php?t=1...highlight=reset

PS1. Еще можно использовать утилиту devcon (в DDK ее исходник), скачать http://support.microsoft.com/?kbid=311272

Сообщение отредактировал Седой - Sep 25 2007, 18:51
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 26 2007, 08:27
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(Седой @ Sep 25 2007, 21:01) *
1. Открыть драйвер хаба.
2. Вызвать DeviceIoControl с кодом IOCTL_USB_HCD_DISABLE_PORT
3. Вызвать DeviceIoControl с кодом IOCTL_USB_HCD_ENABLE_PORT
4. Закрыть драйвер хаба.

В Windows XP можно и через прямой вызов CLEAR_FEATURE и SET_FEATURE


Спасибо a14.gif . Буду пробовать.
Go to the top of the page
 
+Quote Post
al333
сообщение Sep 26 2007, 09:01
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 27-09-05
Пользователь №: 8 995



[/quote]
Я правда под Linux, но жду сигнала ENUMOK и если не нужный режим или еще что-то, то сброс CY7C68001, который определяется как физическое отключение и, затем происходит повторная инициализация.
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 26 2007, 19:35
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Oldring @ Sep 25 2007, 16:52) *
Я, к сожалению, не имею понятия, какая схема ресета в этом даташите. Искать его лень. Это self powered устройство?
Прошу прощения, забыл указать, что устройство имеет свой источник питания.

Цитата(Oldring @ Sep 25 2007, 16:52) *
То, что устройство Low speed - это так и задумано, или глюк?
Low speed - это результат того, что Винда не распознала устройство, поэтому считает, что имеет дело с какой-то паршивой мышью! ;-)

И еще прошу прощения, к сожалению не заметил темы "Нестабильное определение USB устройства". Моя проблема во многом схожа. С той разницей, что я внешних элементов не использую.
Цитата(Konst_777 @ Sep 25 2007, 17:25) *
Может быть в этом и дело...
Из "EZ-USB® Technical Reference Manual" (ez_usb_r___technical_reference_manual__trm__14.pdf): "If the EZ-USB’s XTALIN pin is driven by an external clock source that continues to run while the chip is in reset, RESET# need only be asserted for 200 μs. Otherwise, it must be asserted for at least 5 ms."
Большое спасибо за подсказку! Попробую углубиться в этот вопрос.

Кстати, нашел корявое, но работающее решение. Микроконтроллер проверяет выполнение енумерации, и в случае неудачи просто слепо ресетит микросхему и пытается еще раз. После < 10 попыток енумерация происходит.

Хотя, чувствую - коряво... :-)

Цитата(Седой @ Sep 25 2007, 21:01) *
1. Открыть драйвер хаба.
...
В Windows XP можно и через прямой вызов CLEAR_FEATURE и SET_FEATURE
Более детально см. usbioctl.h и usbuser.h в DDK.
...
Большое спасибо! Попробую.

Цитата(al333 @ Sep 26 2007, 12:01) *
Я правда под Linux, но жду сигнала ENUMOK и если не нужный режим или еще что-то, то сброс CY7C68001, который определяется как физическое отключение и, затем происходит повторная инициализация.
Во-во. Я тоже к этому же пришел, только под Виндой :-) Видать, путь правильный. Хоть и корявый...


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 26 2007, 20:05
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(jur @ Sep 26 2007, 23:35) *
Low speed - это результат того, что Винда не распознала устройство, поэтому считает, что имеет дело с какой-то паршивой мышью! ;-)


Это мне кажется очень странным.
В аналогичной ситуации, когда некоторое левое устройство не запускалось и выдавались нулевые PID и VID, если я уже не ошибаюсь, все-равно устройство диагностировалось как Full Speed. Проверьте, правильно ли устройство подтягивает линии данных после ресета в случае некорректного запуска. Если неправильно - то это явный признак, что у Вас ресет просто не всегда срабатывает.

P.S. Заглянул в даташит, что рекомендуют производители этого кристалла по поводу ресета. Рекомендуют они лажу. По крайней мере для bus powered устройств. RC цепь в качестве ресета для них просто недопустима, так как скорость нарастания напряжения питания на USB шине в USB спецификации не нормирована. Так что будьте осторожны.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 27 2007, 19:46
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Oldring @ Sep 26 2007, 23:05) *
P.S. Заглянул в даташит, что рекомендуют производители этого кристалла по поводу ресета. Рекомендуют они лажу. По крайней мере для bus powered устройств. RC цепь в качестве ресета для них просто недопустима, так как скорость нарастания напряжения питания на USB шине в USB спецификации не нормирована. Так что будьте осторожны.
Да, спасибо за подсказку! Этот чертов ресет... Вещь в себе. Я теперь ресет делаю вообще только с помощью микроконтроллера. И его длительность тоже задаю приличную. Если что-то не получается, то я отключаюсь от USB на пару сотен миллисекунд, и только после этого снова подключаюсь и снова енумерируюсь. Сейчас хочу поиграться с этими временами, подобрать оптимальную длительность.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 28 2007, 09:06
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



"Читаем дальше..." © Жванецкий :-)

Подача ресета достаточной длительности хорошо помогает. Но я обнаружил еще один интересный эффект. Вот последовательность моих действий.

1. Включаю устройство. Микроконтроллер вызывает функцию USB_Init(), которая подает ресет на CY7C68001, программирует нужные регистры, загружает дескриптор и ждет завершения енумерации.

2. Когда приходит прерывание ENUMOK, микроконтроллер проверяет бит HSGRANT и возвращает OK.

3. Я сделал отладочную команду, которая позволяет вручную вызвать USB_Init(). Все инициализируется заново и устройство появляется в системе как High Speed, что мне и нужно.

4. Однако. USB_Init() всегда рапортует Full Speed и содержимое регистра 0x2D бывает 0 или 1!

Что за чертовщина?! Смотрю в USB View - все нормально, устройство High Speed. Вызываю другую отладочную команду для дампа регистров CY7C68001 - тоже все нормально, регистр 0x2D равен 0x81. Выяснилось, что содержимое этого регистра меняется так: 0x00 -> 0x01 -> 0x81, или так 0x00 -> 0x80 -> 0x81.

Таким образом получается, что при повторных енумерациях я не могу сразу после прерывания ENUMOK проверять бит HSGRANT. Пришлось сделать такой цикл проверки:

Код
  byte b;

  for(try_counter = 0;try_counter < 20;try_counter++) {
    delay(100);
    b = ReadRegister(0x2D);
    if((b & 0x7F) && (b & 0x80)) break;
  }

После двух-трех считываний этого регистра цикл прерывается и все работает как мне нужно (устройство получает High Speed).

Как-то криво это... Но работает :-)


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 28 2007, 09:22
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(jur @ Sep 28 2007, 13:06) *
После двух-трех считываний этого регистра цикл прерывается и все работает как мне нужно (устройство получает High Speed).

Как-то криво это... Но работает :-)


МОжет быть дело просто в том, что High Speed устройства первоначально запускаются в режиме Full Speed и только потом переводятся в режим High Speed?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 28 2007, 15:49
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Oldring @ Sep 28 2007, 12:22) *
МОжет быть дело просто в том, что High Speed устройства первоначально запускаются в режиме Full Speed и только потом переводятся в режим High Speed?
Совершенно справедливо, скорее всего именно это и происходит. Но сайпрессовцы могли бы хоть пол-словом об этом обмолвиться! :-) (Во всяком случае я как-то не припомню, чтобы такая инфа попадалась мне на глаза.)

Я ведь как рассуждаю. Если пришло прерывание ENUMOK, то резонно предположить, что этап енумерации завершен и устройство готово к работе. Логично? А получается, что оно ни хрена не готово! Оно станет готово только через бог знает сколько времени. У них даже в каком-то примере есть такой пассаж: после енумерации проверяется бит HSGRANT и соответствующим образом устанавливаются размеры рабочих буферов! Т.е. я, как дурак, повыставляю размеры буферов 64 байта, а вскорости окажется, что можно работать с размером 512 байт. (А в данный момент я вообще без 512 байт никуда. Мое устройство просто не будет работать.)

Че-то в этом месте как-то туманно... Я уже попробовал по их аппнотам пошерстить - на эту тему ничего не заметил. Может в техподдержку обратиться?... Наверное придется, т.к. вопрос все-таки сложный: как узнать, что енумерация все-таки уже совсем-совсем завершилась?...


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016