aaarrr 69 7 ноября, 2015 Опубликовано 7 ноября, 2015 · Жалоба ...если прикрутить DMA, то, в принципе, сносно должно получится. Вот не уверен. Вручную запрягать и обслуживать M2M на каждый чих может оказаться накладнее, чем быстренько выгрузить данные программно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Поднял на собственном стеке 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 Извините, может немного сумбурно объяснил вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Т.е. вроде как исчисление в этом поле в байтах, но число должно быть выровнено на 32 бита. Нет, все в словах исчисляется. FIFO у них иной адресации и не имеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Мне сейчас интересно посмотреть, какая будет производительность у это OTG_FS ядра. Вижу, что ни о каком двойном буферировании BULK точек в мануале речи не идет - надеюсь оно там есть на уровне ядра? Криво, конечно, что OUT буфер один общий и его нужно обязательно вычитывать сразу, но если прикрутить DMA, то, в принципе, сносно должно получится. Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Нет, все в словах исчисляется. FIFO у них иной адресации и не имеет.Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено? Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней.Ну хотя бы для того чтобы переслать данные из памяти USB в порт, минуя копирование данных в память. Вроде как в stm32 otg это можно сделать, хотя, я еще не пробовал. За выходные вечера хочу попробовать. Организация FIFO, на мой взгляд, позволяет это сделать. При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Именно что буфер FIFO заполнит, а не буфер в памяти процессора. Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено? Загадка-с. Выразились неудачно, CCCV и тому подобное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Ну и по передаче так же. Загадка-с. Выразились неудачно, CCCV и тому подобное. Что такое CCCV? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA. 64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Выразились неудачноТ.е. Вы уверены, что поле адреса - это 32-бит значения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Что такое CCCV? :) Ctrl-C Ctrl-V, copy-paste :) Т.е. Вы уверены, что поле адреса - это 32-бит значения? Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Ну хотя бы для того чтобы переслать данные из памяти USB в порт, минуя копирование данных в память. Вроде как в stm32 otg это можно сделать, хотя, я еще не пробовал. За выходные вечера хочу попробовать. Организация FIFO, на мой взгляд, позволяет это сделать. При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA. Спасибо. Значит я все правильно понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба 64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной.Согласен. Я не пробовал еще DMA, но, может быть есть возможность быстро его стартануть... Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе.Хм. Логика понятна - доступ только 32 бит ИО, по этому размер задается в словах. Но смещение то не обязательно должно задаваться словами... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе. Поясню: я исходил из адресации в словах, в программе задействован не один буфер, каких-либо проблем и накладок не обнаружено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Размер трансфера данных задается все таки в байтах Поясню: я исходил из адресации в словах, в программе задействован не один буфер, каких-либо проблем и накладок не обнаружено.Я тоже, в своей программе задал буфера так, что они в любом случае, не пересекаются. Значит буду пробовать делать крэш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 20 ноября, 2015 Опубликовано 20 ноября, 2015 · Жалоба Вот не уверен. Вручную запрягать и обслуживать M2M на каждый чих может оказаться накладнее, чем быстренько выгрузить данные программно. Или просто переставить указатель на буфер, а этот буфер в обработку. Хотя M2M надо тоже переставить указатели и стартануть -- не так много действий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться