...нарисовать блок с ADC для #Brass. Там дел было на вечер, час поковырял прошивку от RedPitaya, разобрался как оно там устроено. Потом за пару часов не торопясь перетянул к себе в проект нужные IP Core, написал свой IP для входного XOR (у нас LTC2208 работает в random режиме данных) и успокоился. Проверять решил на праздниках.
И вот в праздники засел. Данные приходят от ADC через DDS->CIC->FIR->AXI DMA и планировал их вытаскивать в user space через драйвер ezdma. А драйвер ругается, что не может замапить SG блок. Крутил его и так и сяк, проверил включен ли SG в "корке". Плюнул, нашел еще вариант через dma-proxy, тоже довольно старый - но собралось и все буфера замапились. Но данных нет. Ладно, оторвал от DMA все - сделал loopback через FIFO и запусил dma-proxy-test. Чудо, все бегает, но данные бьются. Заподозрил на некогерентность кэша. Настроил в драйвере что "железо не умеет, давай как нибудь сам". Сработало - данные бегают, корректно, скорость отличная. Вернул подключения к ADC и... здравствуй бессоная ночь, как же я по тебе скучал! Реально ночь не спал. Экспериментально обнаружил, что DMA "корке" нужен сигнал TLAST в AXI шине. Без него не собирается вообще. До DMA поток приходит с FIR и он умеет генерировать TLAST разными способами. В одном варианте данные пошли! Но как-то странно. Запрашиваю блок 512 байт, он приходит, но данные только в самом начале стабильно 4 байта, иногда 8. Дальше до конца блока нули. Опять заподозрил некогерентность кэша. Но loopback работает! Короче, сдался и достал JTAG чтобы смотреть чего там внутри.
На заре работ с FPGA был у нас ChipScope который был жутко неудобный и кривой. Да еще и платный. Поэтому схемными анализаторами я не пользовался совсем. Теперь все сильно проще и удобней!
В общем крутил я дизайн и так и сяк. Поменял AXI DMA на ADI DMAC, но он не поддерживает SG и поэтому драйвер не работает. Вернул все на AXI DMA. Сдался - поехал проветриться на колесе (; Час покатался, вернулся. Начал читать интернет. Возникло подозрение на драйвер. Когда срабатывает TLAST драйвер не сообщает, что пришло меньше чем запрошено, а возвращает размер запрошенного блока. Он же должен обрабатывать прерывание, что буфер заполнился, почему он срабатывает только на "конец пакета" по TLAST! Инет подтвердил - в драйвере это не реализовано. Хотите заполнение буфера - генерируйте сами TLAST после нужного колличества принятых байт.
Приятель настойчиво советует корку ADI DMAC и говорит там есть SG. Но я не вижу! Оказалось они это добавили только 5 месяцев назад, а у меня версия 2019.2. Стянул новую версию - собрал своим Vivado 2019.2 - собралось. Но драйвер dma-proxy просто падает, а ezdma не может замапить SG буфера... На колу мочало - начинай сначала!
Короче решили с приятелем, что будем совместно писать свой драйвер на базе какого нибудь звукового. Давно у меня такая идея чтобы ADC/DAC приходил просто как звук через ALSA. Работать будет через любой DMA - это не сложно.