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

 
 
> USB device в LPC, глюк работы или баг в документации?
Alechek
сообщение Jun 29 2009, 08:28
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



В общем дело так, заметил я некую странность еще со времен 2148 - если запретить прерывание по используемой IN ep (необработке его до следующего кадра?), то больше оно не возникает. Прерывание сбрасывается только путем установки бита USBEPINTCLR. Пришлось обрабатывать всегда, даже если нет данных в направлении хоста.

Теперь существующие наработки пытаюсь перенести в 2388 и сделать все под OS: при открытии полученного виртуального COM порта пропадает прерывание IN ep!
Если в обработчике сбрасывать прерывание путем команды "Select Endpoint/Clear Interrupt ", то прерывание почему-то не сбрасывается, обработчик зацикливается.
Если же сброс прерывания осуществлять и путем выполнения команды, и установкой бита в USBEPINTCLR - то все работает замечательно.

Как то реальность расходится с опсанием процесса:
Цитата("LPC23XX User manual")
12.11 Select Endpoint/Clear Interrupt (Command: 0x40 - 0x5F, Data: read 1
byte)
.....
Remark: This command may be invoked by using the USBCmdCode and USBCmdData
registers, or by setting the corresponding bit in USBEpIntClr. For ease of use, using the
USBEpIntClr register is recommended.

Выходит, эти 2 действия не равнозначны?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Axel
сообщение Jun 29 2009, 10:15
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(Alechek @ Jun 29 2009, 11:28) *
В общем дело так, заметил я некую странность еще со времен 2148 - если запретить прерывание по используемой IN ep (необработке его до следующего кадра?), то больше оно не возникает. Прерывание сбрасывается только путем установки бита USBEPINTCLR. Пришлось обрабатывать всегда, даже если нет данных в направлении хоста.

А зачем его запрещать? Оно вроде как и не возникает без повода (при отсутствии передачи в хост)...
ЗЫ: Я тоже использую оба действия: в начале обработчика - команду, в конце - сбрасываю бит. Почему? Так получилось...
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jun 29 2009, 11:13
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Axel @ Jun 29 2009, 16:15) *
А зачем его запрещать? Оно вроде как и не возникает без повода (при отсутствии передачи в хост)...

Возникает.
Цитата
10.4.1 USB Endpoint Interrupt Status register
All non-isochronous IN endpoints
generate an interrupt when a packet is successfully transmitted, or when a NAK
handshake is sent on the bus and the interrupt on NAK feature is enabled (see Section
13–12.3 “Set Mode (Command: 0xF3, Data: write 1 byte)” on page 352).

Возможно можно обойтись и без прервания по NAK, но я то переделывал IARовский HID когда только-только начинал разбираться с USB. И передача организовал так, что данные отправляются из кольцевого буфера в прерывании по IN ep.
Хотел запрещать прерывания если нет данных и вновь разрешать при отправке данных. Не получилось
Go to the top of the page
 
+Quote Post
Axel
сообщение Jun 29 2009, 11:46
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(Alechek @ Jun 29 2009, 14:13) *
...Возможно можно обойтись и без прервания по NAK...


Так они же возникают редко, только в случае неприятностей, при неприеме хостом пакета и предполагают обработку дисконнекта т.е. не надо без них.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jun 29 2009, 12:19
Сообщение #5


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Axel @ Jun 29 2009, 14:46) *
Так они же возникают редко, только в случае неприятностей, при неприеме хостом пакета и предполагают обработку дисконнекта т.е. не надо без них.

Они как раз возникают часто - когда хост читает пустой буфер (если нет данных или не успели поместить данные в endpoint). Хост хочет читать - присылает IN, а в ответ ему NAK (нету у нас пока ничего) - тут то и возникает это прерывание. Другое дело что без этих NAK-ных прерываний следует обходиться - как раз из-за того что они частые.
А вопрос топикстартер поднял интересный - у самого прерывание по команде SelectEP не сбрасывается (приходится дополнительно регистром пользоваться), тоже не отказался бы узнать в чем тут дело.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jun 30 2009, 08:55
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(VslavX @ Jun 29 2009, 18:19) *
Другое дело что без этих NAK-ных прерываний следует обходиться - как раз из-за того что они частые.

Ну частые они не настолько, чтобы их боятся - возникают каждый фрейм, то есть с частотой 1000Гц. Так что их наличие без дела - вопрос чисто психологический laughing.gif
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jun 30 2009, 13:15
Сообщение #7


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Alechek @ Jun 30 2009, 11:55) *
Ну частые они не настолько, чтобы их боятся - возникают каждый фрейм, то есть с частотой 1000Гц. Так что их наличие без дела - вопрос чисто психологический laughing.gif

Это если endpoint типа interrupt. А если bulk?
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 1 2009, 06:02
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(VslavX @ Jun 30 2009, 19:15) *
Это если endpoint типа interrupt. А если bulk?

Если Interrupt - то реже. Если булка - то каждый фрейм. Если точка сказала NAK - то более в текущем фрейме к ней обращения нет. Чтобы понять мехаинизм передачи получше, надо понять как устроен USB хост! wink.gif

Хотя про безобидность - я поспешил. Если разрешть прерывания по NAK - то загрузка проца у меня возрастает до 95 процентов!!

**** По теме *****
В общем методом научного тыка было установлено, что если выполнить
USB_Cmd(CMD_USB_SET_MODE, INAK_BI | INAK_BO);
то при сбросе прерывания IN ep только битом они более не возникают. При разрешении только INAK_BI или вообще запрете NAK прерываний - все работает отлично.
Все сказанное относится к BULK точке
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jul 1 2009, 08:14
Сообщение #9


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Alechek @ Jul 1 2009, 09:02) *
Если Interrupt - то реже. Если булка - то каждый фрейм. Если точка сказала NAK - то более в текущем фрейме к ней обращения нет.

А можете это ссылкой на соответствующее место в стандарте подтвердить? А то мне кажется, что для bulk отдается вся свободная полоса, и IN соответственно может быть не один, невзирая на полученный ранее NAK.
Цитата(Alechek @ Jul 1 2009, 09:02) *
Чтобы понять мехаинизм передачи получше, надо понять как устроен USB хост! wink.gif

А я сейчас как раз хост пишу - OHCI на LPC2388. И нету там в дескрипторах бита типа "вот в этом фрейме у нас был NAK, больше IN не делать", соответсвенно bulk/contol list обрабатываются многократно - пока фрейм не закончится (или список) - и IN-ов может быть во фрейме много. Для EP типа interrupt - согласен - periodic list обрабатывается один раз за фрейм - соответственно IN будет только один.
Цитата(Alechek @ Jul 1 2009, 09:02) *
Хотя про безобидность - я поспешил. Если разрешть прерывания по NAK - то загрузка проца у меня возрастает до 95 процентов!!

Ну дык, неудивительно - при пустом буфере IN/NAK происходят в течение фрейма многократно, а не один раз. Измерьте частоту прерываний и убедитесь.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 1 2009, 11:17
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(VslavX @ Jul 1 2009, 14:14) *
А я сейчас как раз хост пишу - OHCI на LPC2388. И нету там в дескрипторах бита типа "вот в этом фрейме у нас был NAK, больше IN не делать", соответсвенно bulk/contol list обрабатываются многократно - пока фрейм не закончится (или список) - и IN-ов может быть во фрейме много. Для EP типа interrupt - согласен - periodic list обрабатывается один раз за фрейм - соответственно IN будет только один.
Ну дык, неудивительно - при пустом буфере IN/NAK происходят в течение фрейма многократно, а не один раз. Измерьте частоту прерываний и убедитесь.

А я хост уже написал! wink.gif
Так вот, как я понял, есть список связанных ED к которым прилинкованы TD (bulk + control и отдельно изохорный). Этот список прогоняется с началом каждого фрейма. Если у ED несколько TD, то они все обрабатываются, пока идет успешная обработка. Как только передача по EP прекратилась, присупаем к обработке следующего ED.
Таким образом NAK многократно в течении фрейма просто не может возникнуть, список обрабатывается один раз за фрейм!
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jul 1 2009, 14:08
Сообщение #11


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Alechek @ Jul 1 2009, 14:17) *
Так вот, как я понял, есть список связанных ED к которым прилинкованы TD (bulk + control и отдельно изохорный). Этот список прогоняется с началом каждого фрейма. Если у ED несколько TD, то они все обрабатываются, пока идет успешная обработка. Как только передача по EP прекратилась, присупаем к обработке следующего ED.

А передача по EP прекращается после успешного/ошибочного OUT или результативного IN. NAK на IN не считается ни ошибкой ни результативным, поэтому такой вводной TD не изменяется и остается в списке ED.

Как работает хост - есть Periodic List - это interrupt + isochronous (строго говоря это группа из 32 пересекающихся списков), и есть два списка Bulk List и Control List. Сначала хост обрабатывает Bulk+Control, при достижении времени фрейма некоторого программируемого порога (Periodic Limit) начинается однократная обработка Periodic List. Когда периодический список закончился снова начинается обработка bulk+control. Когда эти списки заканчиваются - их обработка начинается снова/сначала (если не пустые) - и так до самого конца фрейма. Где это явно написано в OHCI-спецификации я не нашел, но фактически это так - иначе оставшуюся bandwidth использовать не получится. Поэтому, если в bulk/control endpoint есть запрос на IN и на него получен NAK - то это не считатся ошибкой, трансфер дескриптор не изменяется и при следующем заходе на список (возможно, в этом же фрейме) IN будет повторен.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 1 2009, 17:39
Сообщение #12


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(VslavX @ Jul 1 2009, 18:08) *
А передача по EP прекращается после успешного/ошибочного OUT или результативного IN. NAK на IN не считается ни ошибкой ни результативным, поэтому такой вводной TD не изменяется и остается в списке ED.

Как работает хост - есть Periodic List - это interrupt + isochronous (строго говоря это группа из 32 пересекающихся списков), и есть два списка Bulk List и Control List. Сначала хост обрабатывает Bulk+Control, при достижении времени фрейма некоторого программируемого порога (Periodic Limit) начинается однократная обработка Periodic List. Когда периодический список закончился снова начинается обработка bulk+control. Когда эти списки заканчиваются - их обработка начинается снова/сначала (если не пустые) - и так до самого конца фрейма. Где это явно написано в OHCI-спецификации я не нашел, но фактически это так - иначе оставшуюся bandwidth использовать не получится. Поэтому, если в bulk/control endpoint есть запрос на IN и на него получен NAK - то это не считатся ошибкой, трансфер дескриптор не изменяется и при следующем заходе на список (возможно, в этом же фрейме) IN будет повторен.

Ну с IN`ами вроде разобрались - если девайс занят и данных на передачу нет - сразу после отправки токена IN хост получает токен NAK и повторяет запрос снова. То есть имеем минимальный обмен данными на шине.

А как обстоят дела с OUT транзакциями?
Хост отправляет токен OUT, затем передаёт пакет данных, и только потом получает NAK? Будет ли он сразу же повторять этот OUT снова?
В любом случае, OUT и затем NAK это совершенно пустая трата времени и уменьшение пропускной способности шины.

Это относится к Full Speed USB.
В High Speed вроде этой проблемы можно избежать...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jul 2 2009, 05:31
Сообщение #13


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(sonycman @ Jul 1 2009, 20:39) *
Хост отправляет токен OUT, затем передаёт пакет данных, и только потом получает NAK? Будет ли он сразу же повторять этот OUT снова?
В любом случае, OUT и затем NAK это совершенно пустая трата времени и уменьшение пропускной способности шины.

Думаю, да, будет повторять - после того как список EP закончится и начнется новая обработка списка сначала. Если список содержит несколько EP - то до нового OUT для NAK-нутой EP очередь подойдет спустя какое-то время - устройство может успеть выгребсти буфер и вероятность нового NAK снижается. Если же EP единственная в списке - то вся полоса в ее распоряжении - жалеть про бесполезные OUT/NAK особо не стоит, ИМХО.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 4 2009, 13:36
Сообщение #14


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(VslavX @ Jul 2 2009, 10:31) *
Думаю, да, будет повторять...

Спасибо!

Ещё вот хотел задать вопрос по работе хоста.
Имеется Mass Storage девайс, и хост, при чтении с него данных, использует команду SCSI_READ10.
При этом максимальный размер запрашиваемого блока данных равен 65536 байт.
Что весьма мало, так как ему приходится использовать много таких запросов для чтения объёмных данных.

Чем руководствуется хост при выставлении такого размера? Почему бы не использовать транзакции в сотни килобайт для уменьшения оверхеда на постоянные запросы маленьких кусочков данных?

Тут, наверное, надо разбираться с драйвером Mass Storage. Возможно, определённым образом отвечая на запросы SCSI_MODE_SENSE можно заставить драйвер увеличить размер буфера?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alechek   USB device в LPC   Jun 29 2009, 08:28
|- - Axel   Цитата(Alechek @ Jun 30 2009, 11:55) Ну ч...   Jun 30 2009, 12:08
|- - sonycman   Хм, если таким образом NAK многократно в течении ф...   Jul 1 2009, 12:36
||- - Alechek   Цитата(sonycman @ Jul 1 2009, 18:36) Хм, ...   Jul 1 2009, 12:50
- - shahr   Цитата(Alechek @ Jun 29 2009, 12:28) Выхо...   Jul 1 2009, 06:47
- - Alechek   Цитата(shahr @ Jul 1 2009, 12:47) То есть...   Jul 1 2009, 08:14


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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 17:34
Рейтинг@Mail.ru


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