Перейти к содержанию
    

...если прикрутить DMA, то, в принципе, сносно должно получится.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поднял на собственном стеке HID с двумя INT точками. Сделал эхо. Все прекрасно работает. Производительность не измерял пока.

Есть непонимание по одному вопросу: Есть регистры, задающие размерность FIFO для IN конечных точек. Это OTG_FS_DIEPTXF0 для контрольной точки и OTG_FS_DIEPTXFx для рабочих точек.

С полем INEPTXFD все понятно. В мануале прямо про них написано:

Bits 31:16INEPTXFD:IN endpoint TxFIFO depth

This value is in terms of 32-bit words.

Minimum value is 16

The power-on reset value of this register is specified as the largest IN endpoint FIFO

number depth.

С полем INEPTXSA, у меня, полного понимания нет. Описание в доке:

INEPTXSA:IN endpoint FIFOx transmit RAM start address

This field contains the memory start address for IN endpoint transmit FIFOx. The address

must be aligned with a 32-bit memory location.

Т.е. вроде как исчисление в этом поле в байтах, но число должно быть выровнено на 32 бита.

Посмотрел примеры от ST. Там берется, к примеру, размер буфера в 32-бит словах (как и нужно), и это значение используется для вычисления адреса следующего буфера... Т.е. значение не делится на 4 для получения смещения в байтах...

Посмотрел в отладчике состояние этих регистров по умолчанию после инициализации OTG - там, судя по дефолтным значениям полей, происходит то же самое. Правда, для последних регистров, в итоге, занчение адреса вылезает за пределы максимального размера памяти OTG... Хоть в байтах, хоть в 32-бит словах. Опять веселье (С)aaarrr

 

Извините, может немного сумбурно объяснил вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. вроде как исчисление в этом поле в байтах, но число должно быть выровнено на 32 бита.

Нет, все в словах исчисляется. FIFO у них иной адресации и не имеет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне сейчас интересно посмотреть, какая будет производительность у это OTG_FS ядра. Вижу, что ни о каком двойном буферировании BULK точек в мануале речи не идет - надеюсь оно там есть на уровне ядра? Криво, конечно, что OUT буфер один общий и его нужно обязательно вычитывать сразу, но если прикрутить DMA, то, в принципе, сносно должно получится.

 

Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, все в словах исчисляется. FIFO у них иной адресации и не имеет.
Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено?

 

 

Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней.
Ну хотя бы для того чтобы переслать данные из памяти USB в порт, минуя копирование данных в память. Вроде как в stm32 otg это можно сделать, хотя, я еще не пробовал. За выходные вечера хочу попробовать. Организация FIFO, на мой взгляд, позволяет это сделать. При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта.

Именно что буфер FIFO заполнит, а не буфер в памяти процессора.

 

Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено?

Загадка-с. Выразились неудачно, CCCV и тому подобное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и по передаче так же.

 

Загадка-с. Выразились неудачно, CCCV и тому подобное.
Что такое CCCV? :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA.

64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что такое CCCV? :)

Ctrl-C Ctrl-V, copy-paste :)

 

Т.е. Вы уверены, что поле адреса - это 32-бит значения?

Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну хотя бы для того чтобы переслать данные из памяти USB в порт, минуя копирование данных в память. Вроде как в stm32 otg это можно сделать, хотя, я еще не пробовал. За выходные вечера хочу попробовать. Организация FIFO, на мой взгляд, позволяет это сделать. При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA.

 

Спасибо. Значит я все правильно понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной.
Согласен. Я не пробовал еще DMA, но, может быть есть возможность быстро его стартануть...

 

 

Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе.
Хм. Логика понятна - доступ только 32 бит ИО, по этому размер задается в словах. Но смещение то не обязательно должно задаваться словами...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе.

Поясню: я исходил из адресации в словах, в программе задействован не один буфер, каких-либо проблем и накладок не обнаружено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Размер трансфера данных задается все таки в байтах

 

Поясню: я исходил из адресации в словах, в программе задействован не один буфер, каких-либо проблем и накладок не обнаружено.
Я тоже, в своей программе задал буфера так, что они в любом случае, не пересекаются. Значит буду пробовать делать крэш.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Или просто переставить указатель на буфер, а этот буфер в обработку. Хотя M2M надо тоже переставить указатели и стартануть -- не так много действий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...