Полная версия этой страницы:
работа USB OHCI в LPC23xx
Подскажите пожалуйста по логике работы с трансфер дескрипторами в USB OHCI.
Имеется девайс, у которого кроме EP0 есть еще Bulk IN EP81 и Bulk OUT EP1. Весть трафик идет только по Bulk конечным точкам.
Я формирую связанный список из двух дескрипторов конечных точек.
Далее по мере появления транзакций на чтение и запись ставлю TD в очередь соответствующего ED и хост их обрабатывает.
А как правильно потом обрабатывать завершение этих транзакций?
Что делать с теми которые завершились с ошибкой? Удалять их из списка ED или хост их сам убрал?
Если транзакция на чтение долго не завершается т.к. нет данных в девайсе для передачи, мне нужно самому убрать ее по таймауту?
Если хост не завершил транзакцию на чтение, будет ли он обрабатывать транзакцию на запись по другой конечной точке?
Dron_Gus
Dec 17 2009, 06:46
В документации на OHCI все достаточно подробно описано. Хотя для нормальной реализации все же приходится экспериментировать. Попробую ответить на те вопросы, которые еще помню.
Все выполненные транзакции добавляются в соответствующий список. При каждом добавлении возникает прерывание.
Транзакцию на чтение можно и не убирать. Я реализовывал частино на кол-бэках, поэтому запрос на чтение у меня висел до победного.
Хост поочередно перебирает все конечные точки. Если прочитать не удалось переходит к следующей. Естественно токи должны быть в соответствующем состоянии.
Допустим мой девайс имеет две Bulk конечные точки на вход и выход. Обзовем из BulkIN, BulkOUT и соответствуют дескрипторы конечных точек BulkIN_ED, BulkOUT_ED
Я их соединяю в список и цепряю к HcBulkHeadED.
Получаю HcBulkHeadED указывает на BulkIN_ED, BulkiIN_ED.NextED указывает на BulkOUT_ED, а BulkiOUT_ED.NextED=0;
Далее я планирую цеплять трансфер дескрипторы к нужным дескрипторам конечных точек и ожидаю, что хост контроллер будет бегать по ED и передавать данные в соответствии с TD.
Теперь к сути вопроса.
Девайс может как иметь данные для передачи хосту так может и не иметь.
Если он не имеет данных, я делаю TD для IN транзакции и цепляю ее к BulkIN_ED, хост ее запускает, но т.к. девайс не имеет данных для передачи,
эта транзакция висит не исполненная. В это время возникает необходимость сделать OUT транзакцию, я создаю TD и цепляю ее к BulkOUT_ED.
Хост исполнит транзакцию OUT несмотря на то, что по другой EP есть незавершенная IN ?
Если исполнит, и в ответ на нее у девайса появятся данные для передачи, то хост примет эти данные в незавершенную IN или надо ее как-то убирать и делать новую?
Необходимо заставить хост на LPC23xx читать из изохронной точки девайса по 64 байта с периодом 1мс.
Хост сконфигурировани и работает с точками Control и Bulk.
Мне нужен простой пример конфигурирования, чтобы он начал еще и запросы на чтение из изохронной точки отправлять.
В доке по OHCI написано что ED для Iso точек должны быть последними в списках ED таблицы прерываний в HCCA.
Для начала начал с прерываний.
Сделал ED для точки прерывания, прицепил к нему TD и для каждого элемента таблицы прерываний в HCCA поставил адрес этого ED.
Я расчитываю, что при такой конфигурации, хост каждый фрейм будет брать указатель на один и тот-же ED и т.о. я получу запросы на чтение из точки прерывания с периодом 1мс.
Далее в HcControl устанавливаю бит PLE. И ничего не происходит. Хост не делает ни одного запроса для чтения из точки.
Я смотрю активность на шине анализатором УСБ. Пока не получилось заставить хост выдать в шину запрос на чтение из точек прерывания или изохронной :-(
Странно, как-то склеились темы. Моя старая из другой ветки, с созданной сегодня.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.