Jump to content
    

i.MX6 USB_OTG при болтающемся кабеле Linux валится

известна ли такая проблема?

ошибку точно не воспроизведу, что-то типа "нуль поинтер внутри otg драйвера"

--------------

но вопрос не про софт, вопрос про железо - как такое может быть?

при включении девайса - работает как хост, при включении хоста - работает как девайс. ошибок нет.

но если линуксбутится при подключеном кабеле (~1.5М - короткий). то kernel panic

если в разъем кабель не воткнут - то проходит. на схеме каких-то хитростей нет - стандартное подключение, TVS + common mode filter - ничего больше между i.MX и разъемом нет

-------------

кабель подключен как девайс, то есть UDB_ID=1. 

 

============

 

upd: не понимаю, как USB_OTG DEVICE определяет, что подключается HOST? наверно VBUS все-таки должно присутствовать? в i.MX два USB_OTG и питание USB_IP работает как бы по "ИЛИ". но детектор наличия питания наверно свой на каждый USB1 / USB2. ну и непонятно, чем ситуация кабель/нет кабеля отличаются - в обоих случаях внешнего питания нет и USB_ID=1... кабелей вроде проверили несколько, ну и как бы утечки с кабеля на VBUS не должно быть - он все-таки работает как кабель, когда воткнут в HOST/DEVICE...

Share this post


Link to post
Share on other sites

2 часа назад, yes сказал:

не понимаю, как USB_OTG DEVICE определяет, что подключается HOST?

А 4я ножка в мини усб разъеме вам ни о чем не говорит?))

image.png.a4772a611cb8004a4e79129565231b1f.png

Если ID  в драйвере не отрабатывается, то возможно сначала запускается драйвер девайса, если нет реакции то переходит на хост, в процессе этого перехода, если что-то где-то кривовато прописано, то может и сглючить, ИМХО

2 часа назад, yes сказал:

но вопрос не про софт, вопрос про железо - как такое может быть?

Не может. Уже 7 лет работает своя система на i.MX6s и такого никогда не было, ищите ошибку в ПО.

2 часа назад, yes сказал:

на схеме каких-то хитростей нет - стандартное подключение, TVS + common mode filter - ничего больше между i.MX и разъемом нет

Если на втором конце кабеля ничего нет, то возможно проблема не в усб контроллере, а в ЭМС, тут уже что-то в вашей схемотехнике...

Edited by mantech

Share this post


Link to post
Share on other sites

On 3/21/2023 at 3:09 PM, yes said:

как USB_OTG DEVICE определяет, что подключается HOST?

в кабеле на разъёмах со стороны хоста ID подключен к земле, со стороны девайса никуда не подключен

3.3 USB OTG Plug Connection

https://ww1.microchip.com/downloads/en/Appnotes/Atmel_11201_USB-OTG-Like-Connector-Implementation_SAM9G-SAM9X-SAMA5D3_Application-Note.pdf

 

ЗЫ на imx6q/d/s ID это дискратные входы, а в imx6ull штатный ID которого boot rom опрашивает аналоговый, там схема с измерением сопротивления относительно земли, но есть и альтернативный ID дискретный

Edited by sasamy

Share this post


Link to post
Share on other sites

10 hours ago, mantech said:

А 4я ножка в мини усб разъеме вам ни о чем не говорит?))

image.png.a4772a611cb8004a4e79129565231b1f.png

 

это подключено к ножке USB_ID микроконтролера.

если я пишу 1 или 0, то это значит 3.3В или 0В (мне казалось, должно быть понятно из контекста. или замечание не об этом?)

----------------------------

там весьма "кудрявая схема" всяких соединительных плат и т.п. и кабель не type-ab без привязки ID к земле в кабеле. мне кажется, что натекает ток в VBUS1 через все эти соединители.  как раз когда включен кабель. так как питается USB от VBUS2 другого подключения (5В), то тока по VBUS1 нет и даже через 100К может натечь до 3.3В, чтобы сработал детектор VBUS и как-то криво запустил драйвер

пока доберусь до платы померить... описано где-нибудь как запускается i.mx6 в режиме device и если существует какой-то порог обнаружения VBUS, то чему он равен ???

10 hours ago, sasamy said:

в кабеле на разъёмах со стороны хоста ID подключен к земле, со стороны девайса никуда не подключен

 

про подключение - мне было непонятно, в стандартном OTG не различается со стороны девайса включен кабель или нет - на ID ножке стоит подтягивающий резистор и 3.3 В всегда

то есть должно быть какое-то еще условие, что сторонний хост подключился - кажется, что наличие VBUS (которое подает хост) годный признак. как на самом деле? я не разбирался с USB и всегда рисовал стандартные схемы, в которых все работало "ис коропки". а тут попалось креативное решение...

i.mx6sx

Share this post


Link to post
Share on other sites

On 3/22/2023 at 4:03 AM, yes said:

на ID ножке стоит подтягивающий резистор и 3.3 В всегда

то есть должно быть какое-то еще условие, что сторонний хост подключился

зачем оно нужно если порт как девайс включен и подключается к хосту ? Я при прошивке emmc подключаю платы с imx6dqs к РС только 3 проводами gnd, d+, d- (снимаю перемычку с питания порта USB на плате), у PC своё питание у платы своё. В переходниках ID к земле подключается и порт переключается на хост, например флешку подключить - флешки OTG не поддерживает и порты не могут по протоколу налету договориться кто их них кто.

 

PS может я не понял, а вопрос был "как правильно подключать VBUS чтобы соотвествовать протоколу OTG" то это я не знаю - лучше на референсы nxp смотреть

Edited by sasamy

Share this post


Link to post
Share on other sites

3 hours ago, sasamy said:

зачем оно нужно если порт как девайс включен и подключается к хосту ?

 

ну а как софт узнает, что пора драйвер позвать или что-то такое? извиняюсь за такие обобщения - пока в детали не вник

сторонний хост запустил какую-то процедуру подключения (енумерации или как оно называется, хотя наверно есть еще до нее какой-то протокол определения, что что-то висит на USB) - как наш i.mx6 device узнает, что вот пришло время железке что-то хосту ответить и свой софт как-то проинформировать, что надо девайсом работать?

upd: это не совсем тот сценарий, что есть у меня - кернель валится при установке драйвера, точнее во время стартапа. буду разбираться, наверно, на следующей неделе. но все-равно интереснее готовый ответ получить, чем стандарты читать 🙂

 

 

Share this post


Link to post
Share on other sites

On 3/22/2023 at 3:34 PM, yes said:

как наш i.mx6 device узнает, что вот пришло время железке что-то хосту ответить и свой софт как-то проинформировать, что надо девайсом работать?

вы на второй круг пошли - по состоянию ID он определяет хостом ему быть или девайсом, срабатывает прерывание при изменении состояния ID, драйвер проверяет надо ли менять роль в обработчике прерывания

https://elixir.bootlin.com/linux/latest/source/drivers/usb/chipidea/otg.c#L217

https://elixir.bootlin.com/linux/latest/source/drivers/usb/chipidea/otg.c#L168

если надо - останавливает текущую роль и включает другую. Можно просто указать через DT роль - хостом порт должен работать или девайсом и забить на OTG

 

Edited by sasamy

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...