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

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

On 7/8/2022 at 6:32 PM, repstosw said:

Есть ли шанс увеличить скорость записи на карту?

Наверно вы используете посекторную запись. Если использовать блочную запись, то скорость гораздо больше. Например на том же f1c в программе usb mass storage у меня скорость записи на карту памяти по usb получилась 6МБайт/сек (при этом я не пользую dma и нужно еще приплюсовать расходы на чтение данных из usb).

On 7/8/2022 at 4:32 PM, sasamy said:

в ядре есть драйвер но там DI используется как отдельный блок mem2mem - берёт входной буфер из памяти и складывает в другой буфер в памяти

https://elixir.bootlin.com/linux/latest/source/drivers/media/platform/sunxi/sun8i-di

У Allwinner есть два варианта деинтерлейсеров. Тот, на который вы даете ссылку, входит в состав h3-процессора. В f1c этот блок другой. Кстати интересно, какой имеется в t113.

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


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

On 7/9/2022 at 3:12 AM, mantech said:

Какой объем записывается за это время?

 

150 - 200 kB - 1 пожатый фрейм.

 

 

On 7/9/2022 at 4:36 AM, Ozelot said:

В f1c этот блок другой. Кстати интересно, какой имеется в t113.

 

Не тот, что в F1C. Проверил: в DI_CTRL_REG 31-бит сброса не скидывается в 0.

 

А на F1C де-интерлейсер заработал?

  

В Tina Linux - куча версий дров под де-интерлейсер,  какой из них для sun8iw20 - неизвестно: в коде нет дефайнов, явно указывающих на модель чипа.

 

\Tina T113\tina-t113\lichee\linux-5.4\drivers\char\sunxi-di\

 

Изменено пользователем repstosw

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


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

В общем, для allwinner есть всего 3 модели де-интерлейсеров:

 

1) как в F1C

2) sun8i

3) DI300 (в H616)

 

Так как 1) и 3) не сбрасывается бит сброса на T113-s3, предположил что там всё-таки 2).

 

Стал смотреть код и даже его перенёс, но нифига не запускается.

 

Мало того, мне непонятна вообще логика работы де-интерлейсера - куча адресов - что, куда?

 

Вот здесь:

 

deinterlace_write(dev, DEINTERLACE_TILE_FLAG0,
				  ctx->flag1_buf_dma);

deinterlace_write(dev, DEINTERLACE_TILE_FLAG1,
				  ctx->flag2_buf_dma);

addr = vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0);

addr = vb2_dma_contig_plane_dma_addr(&ctx->prev->vb2_buf, 0);

 

Пробовал им задавать один буфер, который даёт камера - на выходе без изменений. Безжизненно совсем - статус не обновляется: как был 0 так и остался.

В буфера ничего не пишет.

 

Клоки разрешил:

 

 DI_BGR_REG&=~(1<<16);  //assert reset

 DI_CLK_REG|=(1UL<<31)|(4-1); //clock on, PLL_PERI(2x), M=2

 DI_BGR_REG|=1;         //pass gate

 DI_BGR_REG|=(1<<16);   //de-assert reset

 

Потом вызвал  deinterlace_init  и deinterlace_device_run

 

Кто-нибудь может пояснить как работает этот де-интерлейсер и что нужно записывать в вышеупомянутые адреса?

https://elixir.bootlin.com/linux/latest/source/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c

 

Изменено пользователем repstosw

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


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

On 7/9/2022 at 3:28 PM, repstosw said:

А на F1C де-интерлейсер заработал?

Даже не пытался запускать. Все еще надеюсь где нибудь подсмотреть :)

Вообще, по личному опыту, делать полный интерлейсный кадр - это глупость. В случае mjpeg нужно захватывать полукадрами, а уже в компьютере делать постобработку, используя нормальный фильтр деинтерлейса. В состав ffmpeg и avisynth входит замечательный фильтр yadif, который в процессе деинтерлейса формирует полные кадры с правильной частотой (для pal - 50Гц, ntsc - 60Гц).

Когда то давно делал видеорегистратор в котором полукадры с выхода видеодекодера ak8856 сжимались в jpeg при помощи чипа ssd1928 и сохранялись как mjpeg-файл. А вся остальная обработка делалась в ПК, как описано выше...

В allwinner-овских чипах есть возможность аппаратного сжатия видео в h264, для него на вход нужно подать нормальные полные кадры без гребенки. Только в этом случае будет достигнуто наилучшее качество при заданной степени сжатия. С этим и связано появление деинтерлейс модуля  .

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


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

On 7/9/2022 at 8:50 PM, Ozelot said:

В allwinner-овских чипах есть возможность аппаратного сжатия видео в h264, для него на вход нужно подать нормальные полные кадры без гребенки. Только в этом случае будет достигнуто наилучшее качество при заданной степени сжатия. С этим и связано появление деинтерлейс модуля 

стандарт h264 поддерживает кодирование черезстрочного видео, в общем случае всё это необязательно, правда неизвестно поддерживает ли VE такое кодирование. DI в подобных SoC  скорей для отображения такого видео на LCD с прогрессивной разверткой - до сих пор в HDTV широко используется 1080i

On 7/9/2022 at 6:54 PM, repstosw said:
ctx->flag1_buf_dma

flag1_buf_dma и flag2_buf_dma - какие-то вспомогательные буферы, выделяются один раз при старте и освобождаются при остановке

On 7/9/2022 at 6:54 PM, repstosw said:
addr = vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0);

возвращает DMA адрес нолевого плана видеобуфера, напомню у nv12 два плана соотвественно с индексами 0 и 1

 

On 7/9/2022 at 6:54 PM, repstosw said:
addr = vb2_dma_contig_plane_dma_addr(&ctx->prev->vb2_buf, 0);

то же самое для видеобуфера предыдущего кадра  - для детектироавния движения недостаточно данных текущего кадра

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


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

Удалось запустить де-интерлейсер (DI) на T113-s3! :sun_bespectacled:

Оказалась версия DI110 : регистр со смещением +0xC от базы в младших 12 битах возвращает версию: 0x110.  Если запретить тактирование, этот регистр  вернёт 0.

 

Итого, всего 4 версии де-интерлейсеров:

 

drv_div1xx - DI110 (читается версия, статус-регистр обновляется, заработал)

 

drv_div2x - lowlevel_v1x (как sun8i-di, не заработал) и lowlevel_v2x (похож на DI110 - статус-регистр обновлялся, остальное мёртвое - не заработал).

 

drv_div3x - lowlevel_v3x - это DI300, сразу отсеял (в даташите на H616 явно говорится что там DI300)

    

Играюсь с настройками, там несколько режимов.

 

	FB_ARG.field_order=1;                 //1:top field first 0:bottom field first
	FB_ARG.output_mode=0;                 //0: 1-frame 1: 2-frame
	FB_ARG.di_mode=0;                     //0:motion adaptive mode  1:inter field interpolation mode

 

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

 

На дисплей выводится выходной буфер де-интерлейсера. На вход де-интерлейсеру подаются пара кадров с камеры.

 

Из четырёх вариантов, методом проб, попробовал 3 варианта: 2 облом + 1 успех..

Изменено пользователем repstosw

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


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

On 7/10/2022 at 9:54 AM, repstosw said:

Оказалась версия DI110 : регистр со смещением +0xC от базы в младших 12 битах возвращает версию: 0x110.  Если запретить тактирование, этот регистр  вернёт 0.

drv_div1xx - DI110 (читается версия, статус-регистр обновляется, заработал)

Можно ссылку, где про эту версию почитать?

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


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

On 7/10/2022 at 5:31 PM, Ozelot said:

Можно ссылку, где про эту версию почитать?

 

Это в Tina Linux SDK для T113-s3:

 

On 7/9/2022 at 10:28 PM, repstosw said:

\Tina T113\tina-t113\lichee\linux-5.4\drivers\char\sunxi-di\

 

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


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

Буфера слева-направо: без де-интерлейсера, с де-интерлейсером, вспомогательный буфер (детектор движения?). Картинки лучше увеличить (на превью они замыленые).

 

 

interlace.thumb.jpg.9524e3057348e0fe7ad583c82604eaac.jpgde-interlace.thumb.jpg.23b74f640e1282455f1307d0008f4ac4.jpgmotion.jpg.257bbdb3b9076699091dccc349603f6d.jpg

 

Изменено пользователем repstosw

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


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

Переделал демку для f1c из поста: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=157083&page=24#comment-1807637

Раньше преобразование тайлов в линейный вид и преобразование цветового пространства делал программно, на что уходило 24mS. Теперь задаю в DEBE слой в YUV-формате и делаю для него только детайлизацию, преобразование цвета делается аппаратно. В итоге на это теперь уходит 9mS. Декодирование jpeg 800*600 добавляет 3mS. Суммарно 12mS на декодирование одного фрейма.

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


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

Сделал замеры производительности де-интерлейсера(DI) на чипе T113-s3. Частота DI 600 МГц. Кадры 720x576 YUV420(NV12) - 1,5 байта на точку.

 

 В режиме "motion adaptive" 4,736 мс + требуется вспомогательный буфер (без него DI затыкается)

 

 В режиме "inter field interpolation" 3,764 мс, вспомогательный буфер не требуется.

 

В целом получилось 3 обработчика прерываний: TVD, DI и TCON_LCD:

 

В конце захвата кадра TVD - прерывание по завершению захвата очередного кадра: своп входного буфера (TVD/DI) + запускается DI.

В конце де-интерлейса кадра DI - прерывание по завершению операции: своп выходного буфера(DI/TCON_LCD) + выставляется флаг готовности для TCON_LCD

В обработчике прерывания TCON_LCD: своп отображаемого выходного буфера  + флаг готовности для записи JPEG-кодера (в программе).

 

Для входных кадров DI применил тройную буферизацию:

 

кадр 0 - захват TVD, кадры 1,2 - на вход DI

кадр 1 - захват TVD, кадры 2,0 - на вход DI

кадр 2 - захват TVD, кадры 0,1 - на вход DI

... и т.д.

  

Для выходных  кадров DI достаточно двойной буферизации:

 

кадр 0 - на выход DI, кадр 1 - отображается на LCD_TCON

кадр 1 - на выход DI, кадр 0 - отображается на LCD_TCON

... и т.д.

 

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

 

Анимация при захвате видео с камеры - плавная, без рывков, рваностей и дрожаний.

 

 

On 7/11/2022 at 3:05 PM, Ozelot said:

Теперь задаю в DEBE слой в YUV-формате и делаю для него только детайлизацию, преобразование цвета делается аппаратно. В итоге на это теперь уходит 9mS.

  

А чего декодер не настроили на прямой формат? Или в F1C нельзя? С прямым форматом детайлизация не нужна.

Изменено пользователем repstosw

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


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

Запустил аудио-кодек в T113-s3 на воспроизведение звука. :sun_bespectacled: Программная модель отличается от V3s:

 

1. Нет регистров ADDA, обращение к которым велось через "узкое бутылочное горлышко"

2. Некоторые регистры имеют другие оффсеты от базы

3. Появились новые биты в регистрах

4. Появились новые регистры

 

Кодек сразу не заработал, пришлось смотреть как сделано в Линуксе (sun8iw20-codec.h / sun8iw20-codec.c). Там очень огромный инит, взял из него только то, что нужно.

По дефолту кодек тактируется от PLL_AUDIO0, а у него кривая частота, перекинул тактирование на PLL_AUDIO1 и поделил на 25, чтобы получить ровно 24,576 МГц. Хотя можно было перенастроить PLL, но мне лень. :blush:

 

Проверил пока кодек в режимах:

 

1). Debug mode: выдача синусоиды

2). PIO-режим: процессор ручками кладёт в кодек семплы (FIFO буфер у кодека - на 128 семплов, также как и у V3s)

3). PIO+IRQ -режим с прерыванием: в обработчике прерывания кладём семплы и ждем следующего прерывания

 

Понятное дело, что режимы 2) и 3) мало-полезны для практического применения: нужен DMA.   И вообще странно: кодек не имеет своего DMA, как это сделано в других узлах: TVD, DI, VE, LCD,...

 

Помню, звуковая карта Cmedia CMI8738 и то - могла работать в режиме Bus Master: задаешь карте адрес откуда  и сколько брать, частоту дискретизации, число каналов, формат данных и направление - и она захватывает шины.  А в олвиннерах надо Generic DMA прикручивать.

 

4-й режим: DMA+IRQ (DRQ) будет доступен, когда освою DMA у T113-s3.

Изменено пользователем repstosw

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


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

Dma (dmac) с кодеком можете посмотреть  у меня. Звук я не пытался получить но обмен заработал

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


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

Удалось заставить работать DMA с аудио-кодеком. :dance4:

 

Модель DMA у T113-s3 таже самая, что и в V3s, но есть отличия:

 

 - оффсеты некоторых регистров относительно базового адреса изменены

- изменён порядок следования бит в конфигурации (дескриптор)

- в 2 раза увеличено общее число каналов DMA

 

Один из подводных камней DMA: после инициализации кодека, а затем DMA, передача DMA не хотела начинаться.

Нужно было после запуска DMA произвести запись в регистр AC_DAC_FIFOC.  В V3s такого не было: передача начиналась сразу после запуска DMA.

 

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

 

Изменено пользователем repstosw

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


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

Но. Похоже старшие номера каналов щостурюпны толтко dsp  ядру.  Dmac   более чем 7 не позволяет...

Зы. У меня начинает работать само после разрешения.

... добавился адрес тотко что разработанного дескоиптора - крайне полезная фирма.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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