|
suspend & resume USB LPC23xx, зависание USB контроллера |
|
|
|
Jan 17 2011, 18:48
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Не могу разобраться с проблемой определения девайса после suspend. событие resume отлавливается, но сам контроллер не сообщает драйверу о готовности возобновить передачу. В качестве драйвера использую Thesycon. В качестве контроллера LPC2368 В качестве управляющей программы - пример от tnkernel Логическим анализатором засканил вариант отработки resume на JLink, и тестируемого устройства. При resume на D+ появляется лог 0 на 1ms, после чего происходит обмен и снова в подтверждение D+ становиться в лог 0 на 1ms. В моем случае подтверждения не получается. Аналогичная реакция происходит и при подключении устройства к USB но в этом случае подтверждение есть. Проверяю следующим образом, в device manager Windows отключаю драйвер (при этом ловим suspend) а после включаю, отлавливаю resume но далее контроллер USB не выдает подтверждение, и процесс выдает ошибку. Если в момент после suspend ресетнуть контроллер, то все проходит нормально, и драйвер активируется без проблем. Лог событий из demo приложения от Thesycon: вставляем Код OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) OnDeviceChange message: 00008004 (DBT_DEVICEREMOVECOMPLETE) The USB device \\?\USB#Vid_16c0&Pid_05dc#000010#{325ddf96-938c-11d3-9e34-0080c82727f4} has been removed. OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) OnDeviceChange message: 00008000 (DBT_DEVICEARRIVAL) A new USB device has been plugged in and is now available. Device path is: \\?\USB#Vid_16c0&Pid_05dc#000010#{325ddf96-938c-11d3-9e34-0080c82727f4}. OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) отключаем драйвер Код OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) OnDeviceChange message: 00008004 (DBT_DEVICEREMOVECOMPLETE) The USB device \\?\USB#Vid_16c0&Pid_05dc#000010#{325ddf96-938c-11d3-9e34-0080c82727f4} has been removed. задествуем драйвер после ресета программы Код OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) OnDeviceChange message: 00008000 (DBT_DEVICEARRIVAL) A new USB device has been plugged in and is now available. Device path is: \\?\USB#Vid_16c0&Pid_05dc#000010#{325ddf96-938c-11d3-9e34-0080c82727f4}. OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) если не делать сброс программы то: Код OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) и через секунду еще раз OnDeviceChange message: 00000007 (DBT_DEVNODES_CHANGED) после чего в состоянии устройства USBIO появляется ошибка: "Запуск этого устройства невозможен. (Код 10)" проверял как на BUS Powered так и на Self Powered, разницы нет. Подскажите в каком направлении двигаться, как отловить проблему, чем засканить обмен более детально, какие варианты попробовать ?
|
|
|
|
|
 |
Ответов
|
Jan 27 2011, 08:24
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
привожу результаты последних исследований. Цитата *((int*)0xFFE0C008) = 1; после этого ядро USB отваливается, J-LINK показавает в области памяти USB 0xAAAAAAAA т.о. действия описанные в Errata можно расценивать как дезу, ну или все таки оно работает на единственной ревизии "-" найти которую уже не получиться. т.о. имеем проблему с тем, что USB_NEED_CLK никогда не становиться равным 0. похожая проблема поднималась тут и тут и осталась без решения. Кроме предложенного вырианта от NXP, был проверен пакет code.bundle.lpc23xx.lpc24xx.uvision.zip в котором вроде как, suspend и resume обрабатываются. результат не удивил, при suspend происходит зависание на цикле ожидания USB_NEED_CLK; непонятно как это работало у человека, который писал этот код Есть ли у кого из присутсвующих возможность проверить данный код на платах ENG_BOARD_LPC24XX или KEIL_BOARD_LPC23XX или SK-LPC2378 (c мелкими изменениями в инициализации) ? Есть ли адрес службы поддержки NXP (не то что на сайте, а тот с которого отвечают  ), или какие другие предложения по поиску решения ?
|
|
|
|
|
Jan 27 2011, 09:17
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(andrvisht @ Jan 27 2011, 11:24)  или какие другие предложения по поиску решения ? Я с LPC23xx не работал, посему на роль носителя абсолютной истины не претендую. Но все же. Вчитайтесь в описание бита "AP_CLK" в п.9.3 описания на LPC214x (UM10139): 9.3 Set Mode (Command: 0xF3, Data: write 1 byte) AP_CLK = 0: usb_needclk is functional; 48 MHz clock can be stopped when the device enters suspend state. AP_CLK = 1: usb_needclk always have the value 1. 48 MHz clock cannot be stopped in case when the device enters suspend state. Вообще, в чем проблема ? В том, что вы не знаете, что на шине пропали маркеры SOF и вы не знаете, когда переходить в Suspend ?
|
|
|
|
|
Jan 27 2011, 09:47
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(kovigor @ Jan 27 2011, 12:17)  Вообще, в чем проблема ? В том, что вы не знаете, что на шине пропали маркеры SOF и вы не знаете, когда переходить в Suspend ? в моем случае AP_CLK = 0, т.е. я должен дождаться пока usb_needclk не сброситься, и потом могу убрать тактирование с USB модуля. SOF пропадает, это я вижу на осциллографе, но вот usb_needclk продолжает быть 1. и соответственно дальше ничего не возможно делать. Получается, что я не вижу аппаратно пропадание SOF.
|
|
|
|
|
Jan 27 2011, 10:05
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(andrvisht @ Jan 27 2011, 12:47)  в моем случае AP_CLK = 0, т.е. я должен дождаться пока usb_needclk не сброситься, и потом могу убрать тактирование с USB модуля. SOF пропадает, это я вижу на осциллографе, но вот usb_needclk продолжает быть 1. и соответственно дальше ничего не возможно делать. Получается, что я не вижу аппаратно пропадание SOF. Хорошо. А если не обращать на этот бит внимания, а просто, например, раз в миллисекунду в обработчике любого подходящего прерывания проверять USBDevIntSt.DEV_STAT ? Этот бит укажет вам на "USB suspend change". Дальше подаете команду: Get Device Status (Command: 0xFE, Data: read 1 byte). Она выдаст вам, пропали маркеры на шине или не пропали (см. Table230, описание битов SUS и SUS_CH). Дальше все просто, и usb_needclk оказывается не нужным. Я, правда, так не делал, поэтому ничего не обещаю ...
|
|
|
|
|
Jan 27 2011, 10:14
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(kovigor @ Jan 27 2011, 13:05)  Хорошо. А если не обращать на этот бит внимания, а просто, например, раз в миллисекунду в обработчике любого подходящего прерывания проверять USBDevIntSt.DEV_STAT ? Этот бит укажет вам на "USB suspend change". Дальше подаете команду: Get Device Status (Command: 0xFE, Data: read 1 byte). Она выдаст вам, пропали маркеры на шине или не пропали (см. Table230, описание битов SUS и SUS_CH). Дальше все просто, и usb_needclk оказывается не нужным. Я, правда, так не делал, поэтому ничего не обещаю ... Само прерывание по suspend() работает, с FE попробую, но ... ведь тот же usb_needclk используется для просыпания контроллера, и соответственно он уже не проснется.
|
|
|
|
|
Jan 27 2011, 10:33
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(andrvisht @ Jan 27 2011, 13:14)  Само прерывание по suspend() работает, с FE попробую, но ... ведь тот же usb_needclk используется для просыпания контроллера, и соответственно он уже не проснется. Ну что я могу сказать ? Заведите линию D+ или D- на вход внешнего прерывания МК, можно через КМОП - повторитель вроде SN74LVC1G07. На 12МБит все должно работать. У меня, во всяком случае, работало и работает. Т.е., вы обнаружили, что маркеры SOF пропали. Чудесно. Теперь линия D+ всегда стоит в "1". Настраиваем внешнее прерывание на возникновение по спадающему фронту сигнала на входе прерывания МК и засыпаем, и спим, сколько угодно. Как только по шине пройдет первый маркер, у вас на входе прерывания напряжение упадет до нуля, произойдет прерывание и МК проснется. Думаю, это единственный способ решить вашу проблему ...
Сообщение отредактировал kovigor - Jan 27 2011, 10:34
|
|
|
|
Сообщений в этой теме
andrvisht suspend & resume USB LPC23xx Jan 17 2011, 18:48 kovigor Цитата(andrvisht @ Jan 17 2011, 21:48) По... Jan 17 2011, 19:58 andrvisht Цитата(kovigor @ Jan 17 2011, 23:58) Мног... Jan 17 2011, 21:52  kovigor Цитата(andrvisht @ Jan 18 2011, 00:52) на... Jan 17 2011, 22:34   andrvisht Решил пойти другим путем.
1. скачал с сайта произв... Jan 20 2011, 19:15    kovigor Цитата(andrvisht @ Jan 20 2011, 22:15) Мо... Jan 20 2011, 20:06     andrvisht Цитата(kovigor @ Jan 21 2011, 00:06) Там ... Jan 22 2011, 12:30      andrvisht Цитата(kovigor @ Jan 27 2011, 13:33) Ну ч... Jan 28 2011, 06:39       kovigor Цитата(andrvisht @ Jan 28 2011, 10:39) Бы... Jan 28 2011, 09:11        andrvisht За обещанный промежуток в 5 рабочих дней техподдре... Feb 7 2011, 19:00         kovigor Цитата(andrvisht @ Feb 7 2011, 23:00) По ... Feb 7 2011, 20:01          andrvisht Цитата(kovigor @ Feb 8 2011, 00:01) По то... Feb 7 2011, 21:32           kovigor Цитата(andrvisht @ Feb 8 2011, 01:32) Так... Feb 8 2011, 09:01            andrvisht Цитата(kovigor @ Feb 8 2011, 13:01) Не за... Feb 8 2011, 18:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|