Top.Mail.Ru
? ?
Image

strijar, posts by tag: linux - LiveJournal

Лучше быть белым волком, чем серым человеком

Entries by tag: linux

В пятницу организовали корпоратив...
Image
Imagestrijar
...с выездом и ночевкой, но я не поехал. Поэтому день был не рабочий и решил добить Lora модуль для RNS-Gate. До этого исследовал вопрос по софту и оказалось, что все довольно грустно. Lora модули почему-то не ставят на одноплатники с Linux. Все проекты это или Arduino или что нибудь подобное на базе ESP32. Все что удалось найти это LoRaRF-Python и sx1262. Первый как можно догадаться на Python, второй на Си. Мне ближе Си - начал с него. Не заработал. Вообще никак. Регистры вроде пишет и читает, но ни приема и передачи нет. Беглый взгляд показал, что он работает через IRQ пин на DIO1 - а он почему-то не шевелиться.

Поковырял и перешел к Python библиотеке. С ней все сильно лучше. Если не указывать DIO1 пин - она опрашивает состояние IRQ из регистра и может работать без пина. И реально работает: прием и передача есть. "Ну к удавам, так к удавам", тем более что Reticulum написан на Python и правильно было бы сделать SPI Lora интерфейс прямо внутри него. Накидал тестовый скрипт и начал проверять. У RNS есть особенность - его интерфейсы должны уметь отправлять пакеты не менее 500 байт. У Lora ограничение 255. Штатный RNode (это Lora + ESP32 и работает через USB) обходит это, разбивая пакет и потом собирая его на другой стороне. Т.е. при отправке например 300 байт улетает 2 пакета с минимальным временем между ними. Так вот, оказалось Python библиотека не успевает поймать второй пакет. Потому что она работает в режиме Single RX, а нужен Continuous RX и вот в этом режиме она не принимает вообще ничего.

Убил на все это почти пол дня и решил таки делать свою реализацию на Си. Взял Python версию и на тестовом скрипте проверил какой минимум из функций нужен чтобы работал прием и передача. Начал с передачи - переписал Python функции на C и к вечеру передача завелась.

За субботу дописал прием и начал разбираться с Continious RX. К обеду воскресенья добил. Передаю через RNode большой пакет, и принимаю у себя два подряд - все успевает!

В итоге базовый функционал для работы с SPI модулями sx1261/1262/1268 получился всего на 700 строк кода

Осталось реализовать RNode протокол что-бы Reticulum думал что общается со своей обычной "нодой". Это уже просто. Благо что буквально на днях для работы RNode через WiFi автор добавил возможность подключения RNode через TCP (было только через serial)

Вдохновился докладом с прошедшего...
Image
Imagestrijar
...FPGA Systems 2024.2. Там коллеги рассказывали как они на Zynq запускали две ОС сразу - одну на ARM вторую на "жидком" MicroBlaze. Мне в принципе второй Linux не нужен, но идея засела. Появилась мысль сделать сопроцессор для не очень быстрого DSP, но который был бы компактным. И потом меня осенило, что у меня сейчас FFT + DMA довольно много площади на FPGA отжирает, а используются они не на полную мощь (поток там всего 125кГц) и решил попробовать заменить их одним MicroBlaze. Тем более, что MB позволяет вливать в него данные сразу через AXI-Stream шину. Накидал черновой вариант и попробовал собрать для 7010. И оно влезло!

Поэтому взял текущий проект для 7020 и "сбоку" прикрутил MicroBlaze. Сначала думал зацепить его прямо на DDR через AXI и кэши, но потом отказался в пользу двух-портовых BRAM (меньше ресурсов FPGA и латентность 1 такт). Всего 2 блока BRAM отдельно для инструкций и отдельно для данных. Одним портом смотрят через LMB в MicroBlaze, вторым портом мапятся через AXI напрямую в адресное пространство ARM. И один регистр для управления резетом. Получилось красота - прямо из своего приложения в Линуксе заливаешь по определеному адресу прошивку для MicroBlaze - дергаешь reset бит в регистре и оно полетело. Кусок data секции так-же доступен в реал-тайме, можно читать и писать не останавливая сопроцессор.

Теперь надо проверить прожует ли он FFT-2048 на 125кГц и можно будет перетаскивать куски туда. Если будет запас по производительности туда же уйдет демодулятор с модулятором. Они вообще ерунду занимают, но зато уйдет еще один здоровый DMA.
Tags: , ,

Начали приходить письма, типа...
Image
Imagestrijar
..."Я заказал плату для #TRXBrass и буду его собирать. Где можно пообщаться про это?". Пришлось создать чат в Телеграме, ну и народ понемногу стал прибывать. Даже 3 европейца появилось. Вот сегодня Radek Haša из Чехословакии закончил сборку основной платы:

Radek.jpeg

Просит прошивку (; Чертовски приятно, что кто-то еще заинтересован в том же, что тебе интересно. А как меньше чем за год продукт который был просто в голове, обретает физическое воплощение и своих стороников.

Продолжаю добавлять Python...
Image
Imagestrijar
...вчера реализовал минимум. Создание LVGL объекта и минимальная работа со стилями. Теперь есть стартовый скрипт:

import lv
from lv_const import *

class MainScreen(lv.obj):
	def __init__(self):
		lv.obj.__init__(self)

		style = lv.style()
		style.set_bg_color(0x0040A0)

		self.add_style(style, LV_PART_MAIN)
		self.clear_flag(LV_OBJ_FLAG_SCROLLABLE)

def main():
	return MainScreen()


Теперь рутина: добивать нужные методы в эти классы и перетаскивать мои widgets (спектр и водопад)

Пролжаю осваивать DSP...
Image
Imagestrijar
...реализовал расчет канального фильтра. Сделал настройку не только полосы, но и крутизны скатов. Для CW получилось очень классно. Потом прикрутил AGC из библиотеки WDSP - пришлось минимально подправить, но все завелось и устраивает.

И вернулся к идее добавить скриптовый язык. Для конфигурации GUI и расширения функционала без пересборки приложения. Метался между Python/Micropython и Tсl. Понял, что скорей всего еще захочу интеграцию GNU Radio поэтому остановился на Python. Вчера минимально добавил - умеет вызывать функции из Python скрипта. И начал разбираться как реализовать свои типы в Python. Начал рализацию стилей для кастомизации GUI. Вроде все просто.

Длинные выходные выдались...
Image
Imagestrijar
...продуктивными. Продолжил разбираться с FPGA для Brass. Оказалось есть готовая компонента которая конвертирует AXI Stream шину и умеет сама генерировать TLAST по счетчику. И поток от FIR в FIFO побежал! Потом откатил обратно на DMA и оно заработало.
Read more...Collapse )

С DMA пока нормально так и не получается...
Image
Imagestrijar
...поэтому решил пойти легким путем и сделать через AXI Stream FIFO. И что-б вы думали? Не работает! (((: Сначала капризничал драйвер который идет в ядре от Xilinx. У него наружу через sysfs торчат управляющие регистры, так вот в них какая то ерунда на чтение. А при записи ничего не происходит. Ладно, порылся в сети, нашел на github более свежий драйвер. Регистры стали более адекватные, но read из символьного устройства ничего не возвращает. Крутил и так и сяк. Потом решил проверить через loopback - соединил ему AXIS вход на выход. Данные бегают. Да, ладно, думаю я - неужели снова проклятие TLAST? Вернул подкючение на FIR, включил в FIR генерировать TLAST по окончанию вектора... и данные пошли. Тоже как-то странно, перемежаясь с нулями и FIFO быстро вычерпывается (это надо в блокирующем режиме читать). Это мне не нравится. AXIS шина, это Stream! Ну казалось бы, есть у тебя поток, есть FIFO - ну лей ты сколько льется. Зачем опять эти фреймы? Дичь какая-то.

Видимо придется все таки переташить дизайн из Red Pitaya или писать свой AXIS FIFO без завязки на TLAST.

Еще до праздников успел...
Image
Imagestrijar
...нарисовать блок с 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 чтобы смотреть чего там внутри.
Read more...Collapse )
Короче решили с приятелем, что будем совместно писать свой драйвер на базе какого нибудь звукового. Давно у меня такая идея чтобы ADC/DAC приходил просто как звук через ALSA. Работать будет через любой DMA - это не сложно.

Разобрался со звуковой подсистемой...
Image
Imagestrijar
...на FPGA и Linux. Нужно было подключить звуковой кодек NAU88C22. С I2C без проблем, а вот на I2S есть варианты. Штатный AXI I2S от Xilinx отмел почти сразу - он не умеет одновременно rx и tx. Нужно ставить две разных "корки". Остались тот, что идет с Red Pitaya и от AnalogDevices. Документации ни на один из них нормальной нет, но на ADI I2S уже есть драйвер в Linux. Начал ковырять его. Благо, что нашел один из проектов от ADI где он используется. Изучая этот проект обнаружил, что в Zynq прямо из PS выходят 4 DMA канала в PL часть! Почему-то это совсем не распространенный способ и обычно ставят отдельную AXI-DMA "корку". Подключил на PS DMA, все прописал в DTS, добавил кое-какие драйвера в ядро. Linux звуковую увидел и в микшере каналы видно - можно крутить громкость. Но вместо звука либо писк либо какой-то хрип. Убил на это пару часов, даже осфилограф включил (; На первый взгляд все нормально. Проверил record - на нем тоже тишина. Закралось у меня тогда сомнение насчет I2S сигналов data in / data out. Перекинул их местам и оно ожило. Не очень громко, но работает. На record правда реакции на микрофон нет, хотя видно какой-то не нулевой шум.

Так что теперь Brass не только показывает, но и говорит (; Теперь самое интересное: подключение ADC и DAC.

Прикрутил кнопки и энкодеры...
Image
Imagestrijar
....ну и так по мелочи, например починил сеть (плохо работала)


Image