Страница 30 из 30 Первая ... 20282930
Показано с 581 по 592 из 592

Тема: Open-Source USB транспорт на PIC32MZ

  1. #1 Показать/скрыть первое сообщение.
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,991

    По умолчанию Open-Source USB транспорт на PIC32MZ

    Проект делался для личных нужд, поэтому публикуется как есть, в том виде как сейчас зашит в моем транспорте.

    Причина разработки своего транспорта - отсутствие в продаже USB транспортов с I2S входом для использования АЦП. Кроме того, те транспорты что есть в продаже не устраивали по тем или иным причинам (либо плохо сделана плата, либо большое потребление).
    Раньше сдерживающим фактором было отсутствие uac2 драйверов. Однако с переходом на win10 с нативным драйвером данная проблема была решена.
    Ну и вообще, т.к. на дворе 21-ый век, то для меня не понятно - почему uac2 еще не перекочевал в открытый доступ. Данная публикация призвана исправить такое досадное упущение.

    Почему PIC32MZ: Преимущество перед ARM процессорами - встроенный USB HS мост и одновременно удобный компактный корпус с удобной распиновкой. А по сравнению с кмосом - низкое потребление: порядка 70..80мА максимум.

    Изначально планировал использовать фреймворк (harmony configurator), однако по ходу выяснилось, что данный фреймворк генерирует только USB AUDIO приложение для формата Class 1.
    Кроме того по форумам полно отзывов по касякам в фреймворке. Дорабатывать фреймворк оказалось крайне контр-продуктивно из-за жесточайшей инкапсуляции, громоздкого стека и отсутствия его описания.

    Намаявшись с фреймворком принял решение писать свой код с нуля. Но очень скоро обломался, т.к. выяснилось что для PIC32 процессоров описание USB моста полностью отсутствует! Т.е. микрочип предлагает только пользоваться их кривыми фреймворками.
    Однако на форуме микрочипа нашлись добрые люди, которые поделились исходниками своих проектов USB девайсов на PIC32MZ: https://www.microchip.com/forums/m1083508.aspx
    Пользуясь данными примерами, а так же методом тыка, удалось написать свой достаточно эффективный код (итоговый размер с оптимизацией gcc компилятора уровня 2 - менее 16кБт).
    Конечно код не такой красивый как в фреймворках, слабовата инкапсуляция. Зато, разобраться в нем и доработать под свои нужды гораздо проще. А главное проще обходить касяки периферии, которые как оказалось имеют место быть.
    В частности есть не описанные в эррате проблемы с DMA модулями.

    Что в итоге удалось реализовать на самом чипе, без обвеса дополнительными микросхемами:
    1. Вывод стандартного стерео: 32bit 768kHz (Правда драйвер не отображает частоты выше 384к, но по факту 768к выводит). И сам модуль I2S пика позволяет выводить данные с частотой не выше 384к. 768к вывести тоже можно, но каким-то нестандартным интерфейсом, типа QSPI или параллельным портом.
    2. Вывод многоканала: 8-каналов 32bit 192kHz (опробовал только в отладочном режиме, подробнее ниже).
    3. Стерео вход: 32bit 768kHz (опробовал по факту только 192, т.к. мой АЦП больше не выдает).
    4. Распознавание DoP формата и вывод из него стерео DSD-битстрима частотой до DSD256 включительно.
    5. До кучи - добавлено CDC устройство (виртуальный COM-порт) для обмена данными с транспортом (в проекте используется в отладочном виде, на любые принятые данные отвечает строкой "CDC is works").

    Вывод многоканала физически не реализован, т.к. изначально в транспорте он не предусматривался. Работу проверял в отладочном режиме, переключая на выход пары каналов по очереди (остальные каналы выводили данные в отладочные буферы).
    Весь описанный выше функционал реализован на DMA модулях, благодаря чему хватает небольшой тактовой частоты процессора (160МГц для работы многоканала + стерео-входа).
    Причем изначально вывод данных в I2S модули выполнялся на DMA с прерываниями. Однако, выяснилось, что прерывания DMA работаю криво, из-за чего модуль может самопроизвольно вырубаться.
    Описал проблему на форуме микрочипа (в конце ветки), но - глухо как в танке: https://www.microchip.com/forums/FindPost/1219136

    Пришлось выкручиваться по другому. В результате получилось даже лучше, т.к. передача данных между I2S буферами и FIFO данных получилась полностью аппаратной (DMA модули перегружаются автоматически в цикле).
    Кроме того, для дополнительного снижения потребления добавлено 3 режима с разной тактовой частотой, в зав-ти от кол-ва каналов и выбранной ЧД.
    В результате потребление от USB шины (контроллер + развязка) с питанием через step-down получилось от 40мА (стерео-вывод), до 55мА (8-каналов + стерео вход).
    Отмечу, что в режиме FS (uac1) потребление можно опустить еще ниже: до 20..30мА, что может быть актуально для портативного девайса.

    Проект сделан в IDE MPLabX 6.05, с компилятором CX32 v4.1. Проверялся только на win10. Актуальная схема транспорта ниже во вложении.
    Конечно, нативный uac2 драйвер в win10 достаточно корявый, легко ломается сам и еще легче ложит винду (хватает ошибки в дескрипторе). Но готовый проект значительно облегчает отладку USB девайса, достаточно выпилить лишний функционал из дескриптора и обработчика команд.
    Особенности конфигурации USB моста или DMA модуля я постарался подробно описать комментариями, но если у кого-то найдутся другие проблемы - можно обсудить в ветке ниже.
    Вложения Вложения
    Последний раз редактировалось dortonyan; 24.12.2022 в 14:13.

  2. #581
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,008

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от dortonyan Посмотреть сообщение
    В system.c забыл добавить маску юарта для регистра PMD5, чтобы запретить для него power saving режим.
    Поправил и залил на гит. Правда не проверял, т.к. не на чем.
    Заработало! Спасибо!

    Эх... ещё бы разобраться с многоканальным Wasapi Exclusive выводом из Roon. Почему то он не видит транспорт как многоканальный (хотя через Asio4All видит).

    Попробовал ещё JRiver плеер. Ведет себя похоже. В Exclusive работает только двухканальный вывод. При переключении на 7.1 выдает:
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	JRiver.png 
Просмотров:	37 
Размер:	44.4 Кб 
ID:	477207  
    Максим vmaudio@mail.ru

  3. #582
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,991

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    С помощью искусственного разума нашел причину. Для 8-канального вывода нужно задавать отдельный поток, иначе он конфликтует с 2-канальным.
    При удалении 2-канальных режимов из дескрипторов 8-канальный эксклюзивный вывод заработал.

  4. #583
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,008

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    dortonyan, Алексей, очень круто что удалось разобраться!
    А проектом без 2-х канальных режимов не поделитесь?
    Максим vmaudio@mail.ru

  5. #584
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,991

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Максим, проект без 2-х канального вывода к сожалению не сохранил. Начал сразу "пилить" два отдельных вывода на 2 и 8 каналов в одном девайсе.
    Но пока что-то не очень получается, для многоканала в звуковых устройствах винды неактивен выбор форматов данных.

  6. #585
    Старый знакомый Аватар для eclipsevl
    Регистрация
    31.01.2009
    Адрес
    Гаага
    Возраст
    31
    Сообщений
    514

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Максим, проект без 2-х канального вывода к сожалению не сохранил. Начал сразу "пилить" два отдельных вывода на 2 и 8 каналов в одном девайсе.
    Но пока что-то не очень получается, для многоканала в звуковых устройствах винды неактивен выбор форматов данных.
    Я с таким сталкивался когда пытался запилить в дескриптор конфигурации 7.1/5.1 и т.д.
    Пока не успешно, но выяснил что винда испытывает трудности если она уже знает девайс и у него меняется формат данных. Приходится либо тереть запись из винды чтобы заставить ее сделать энумерацию заново, либо менять serial id в дескрипторе устройства.

  7. #586
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,008

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Может сделать выбор два или восемь каналов внешним пином и при этом, кроме прочего, менять serial id в дескрипторе.

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Но пока что-то не очень получается, для многоканала в звуковых устройствах винды неактивен выбор форматов данных.
    А он вообще нужен? В эксклюзивном режиме формат данных, выбранный в винде в свойствах устройства, игнорируется как я вижу.
    Максим vmaudio@mail.ru

  8. #587
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,991

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от antecom Посмотреть сообщение
    А он вообще нужен?
    Может и не нужен. Т.к. получается конфликт вывода на один I2S выход с многоканального и стерео устройств.
    Еще поколупаю. Если не получится запустить совместно - сделаю отдельный 8-канальный проект.

  9. #588
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,008

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Если не получится запустить совместно - сделаю отдельный 8-канальный проект.
    Логично. ЦАП либо многоканальный (под цифровое деление), либо двухканальный.
    Совмещение по сути и не нужно. Разве что ради универсальности прошивки.
    Максим vmaudio@mail.ru

  10. #589
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,991

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Кароче, как выяснилось, искусственный разум лучше не слушать. Никакого конфликта между числом каналов не будет, если правильно задать дескрипторы.
    Нашел решение методом "тыка". Оказалось, что в IAD дескрипторе не нужно указывать ни число каналов, ни маску каналов - все в нули.
    Тогда в потоковых дескрипторах для альтернативных функций можно задавать любое число каналов и все работает.
    На фубаре с 7,1 микшером заработали все выводы: и стандартный и эксклюзивный и васапи ивент/пуш.
    Обновил на гите, можно пробовать.

  11. #590
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,008

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    dortonyan, Алексей, снимаю шляпу!
    Проверил в Foobar, Roon, JRiver - все работает. Огромное спасибо!
    Реально крутой проект транспорта получился.
    Максим vmaudio@mail.ru

  12. #591
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,991

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ



    ---------- Сообщение добавлено 21:41 ---------- Предыдущее сообщение было 21:18 ----------

    antecom, Максим, а вы многоканальный вывод не проверяли? Потому как я с фубара принимаю только стерео вывод, с 7.1 микшера.
    А сейчас только увидел, что в св-вах звукового устройства пропали режимы для 8 каналов.

    В общем оказалось, что для работы эксклюзивного режима не хватало маски каналов в дескрипторах потоков.
    И если задать маски, то вывод начинает работать, но в звуковых устройствах почему-то пропадает список режимов для 8-канального вывода.
    Последний раз редактировалось dortonyan; 25.08.2025 в 22:15.

  13. #592
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,008

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Максим, а вы многоканальный вывод не проверяли? Потому как я с фубара принимаю только стерео вывод, с 7.1 микшера.
    Аналогично. Проигрывал стереофайл через 7.1 микшер. В этом режиме многоканальный вывод работает с Foobar, Roon, JRiver. Для меня это главное, т.к. планирую использовать цифровое деление полос.
    Только что попробовал 8-ми канальный файл (сгенерированный в АА) - Roon и JRiver выводят, Foobar выдает ошибку.

    Цитата Сообщение от dortonyan Посмотреть сообщение
    в звуковых устройствах почему-то пропадает список режимов для 8-канального вывода.
    Тоже заметил. Как ни странно сейчас Roon определяет транспорт как многоканальный (предлагает варианты вывода 2.0 и 7.1), а раньше выбора не было (т.е. Roon видел транспорт только как двухканальный).
    И в HQP работает только двухканальный вывод. Многоканал не идет, ни стереофайл микшированный в 8 каналов, ни 8-ми канальный файл.
    Максим vmaudio@mail.ru

Страница 30 из 30 Первая ... 20282930

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •