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

Размер транзакции в SGDMA Altera

Всем доброго времени суток!

 

Учусь работать с модулем SGDMA MM-ST. Для начала просто вывожу квадрат инфы из памяти.

 

Учитывая тот факт, что для формирования нормального кадра Avalon-ST необходимо перед кадром с информацией сначала отправить пакет Contol Packet, а потом в кадре с информацией первый байт выставить в 0, т.е:

 

SOP -> Control Packet -> EOP -> SOP -> 1s_byte = 0 + Frame_data -> EOP

 

для реализации пытаюсь в SGDMA сформировать три транзакции:

1. Control Packet

2. Один байт = 0

3. Сам кадр

 

Инициализация и запуск SGDMA (часть)

void init_and_start_framebuffer(alt_sgdma_dev *dma)
{
    // frame buffer A
    alt_u8* buff;
    alt_u16 size;
    int i;

    for(i = 0; i < 3; ++i) {

    switch ( i ) {
            case 0:
                size = 0xa;
                buff = (alt_u8*)frameBufferA;
                break;
            case 1:
                size = 0x1;
                buff = (alt_u8*)frameBufferA + 0x10;
                break;
            case 2:
                size = 0x6400;
                buff = (alt_u8*)frameBufferA + 0x8 + 0x10;
                break;
        }

        alt_avalon_sgdma_construct_mem_to_stream_desc(
                                                        &dmaDescA[i],
                                                        (i<3) ? (&dmaDescA[i+1]) : &dmaDescEND,
                                                        (alt_u32*)buff,
                                                        size,
                                                        0,
                                                        i==0 | i==1, // sop
                                                        i==0 | i==2, // eop
                                                        0);

    }

 

Байты для первых двух транзакций.

int main()
{
    IOWR(frameBufferA, 0, 0x0a00000f);
    IOWR(frameBufferA+1, 0, 0x0a000000);
    IOWR(frameBufferA+2, 0, 0x00000200);
    IOWR(frameBufferA+3, 0, 0x00000000);

 

В первой транзакции (для Control Packet) ее размер (size) получается задать произвольно с кратностью 1 байт. Проблема заключается в том, что во второй транзакции не получается задать ее размер = 1 байту. Если задать size меньше 4, то считывается всегда 4 байта, если больше 4, то 8 байт и т.д.

 

В текущей ситуации кадр формируется нормально, но первые три байта кадра оказываются равными нулю (т.к. в начале второй транзакции считывается 0х00000000).

 

Подскажите, пожалуйста, как мне сформировать этот 0 в начале кадра? Или, может быть, я изобретаю велосипед и есть модуль, который можно поставить после SGDMA?

 

P.S. Про существование Clocked Video Output, Frame Reader и Frame Buffer в курсе, работал с ними, нужен именно SGDMA =)

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


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

Учитывая тот факт, что для формирования нормального кадра Avalon-ST необходимо перед кадром с информацией сначала отправить пакет Contol Packet, а потом в кадре с информацией первый байт выставить в 0, т.е:

 

SOP -> Control Packet -> EOP -> SOP -> 1s_byte = 0 + Frame_data -> EOP

 

для реализации пытаюсь в SGDMA сформировать три транзакции:

1. Control Packet

2. Один байт = 0

3. Сам кадр

Это какая-то надстройка над Avalon-ST? При пакетной передаче длина пакета определяется SOP и EOP, зачем всё остальное?

 

В первой транзакции (для Control Packet) ее размер (size) получается задать произвольно с кратностью 1 байт. Проблема заключается в том, что во второй транзакции не получается задать ее размер = 1 байту. Если задать size меньше 4, то считывается всегда 4 байта, если больше 4, то 8 байт и т.д.

А какой размер шины данных в Вашем Avalon-ST? Может быть необходимо учитывать сигнал empty?

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


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

Это какая-то надстройка над Avalon-ST? При пакетной передаче длина пакета определяется SOP и EOP, зачем всё остальное?

 

Т.е. все модули Avalon-ST Sink должны сами распознавать размер и тип пакета?

 

Если посмотреть сигналтапом, например, соединение Frame Buffer - Alpha Blending Mixer, то состав данных будет такой как я описал.

 

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


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

В моём случае SgDMA MM to ST используется для передачи Ethernet пакетов на TSE MAC, шина данных Avalon-ST там 8-бит, проблем с длиной отправляемых пакетов не наблюдал (может быть всё же надо учитывать empty, если шина отлична от 8-бит?). Такой параметр, как тип Avalon ST пакета, отсутствует.

С приведёнными ядрами не работал, видимо, это реализация какого-то протокола поверх Avalon-ST.

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


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

По поводу Mixera. Так как в этом блоке нет изначально заданных размеров отдельных потоков, то перед основным пакетом с данными надо все-таки отправлять Control Packet.

 

Попробовал в качестве эксперимента подключить сгдма к Clocked Video Output и к Video Sync Generator (между sgdma и блоком вывода еще avalon-st fifo).

За основу брал рабочий проект.

Так теперь блок sgdma или не заводится (открывается, но никакие данные не идут, смотрел через сигналтап) или заводится по какому-то непонятному алгоритму.

В чем разница между подключениями к миксеру и синк генератору?

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

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


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

Итак, разобрался я что у меня не работало - не объявил где лежат дескрипторы на SGDMA.

 

Привожу рабочий вариант кода в надежде на то, что кому-то он поможет разобраться и не совершать моих ошибок. Догадываюсь, что он ни разу не оптимизирован (кое-что можно вынести в отдельную функцию), зато работает ))) Если кто-то из форумчан сделает его "по уму" - будет здорово.

 

Код формирует три транзакции и выставляет SOP и EOP для каждой транзакции, т.е. получается три пакета. Отправка непрерывная.

 

#include <stdio.h>
#include "sys/alt_stdio.h"
#include "io.h"
#include "system.h"
#include "unistd.h"
#include <math.h>
#include <altera_avalon_sgdma.h>
#include <altera_avalon_sgdma_descriptor.h>
#include <altera_avalon_sgdma_regs.h>


// DMA descriptors
alt_sgdma_descriptor* dmaDescA;
alt_sgdma_descriptor* dmaDescEND;

alt_sgdma_dev *dma; //DMA device

// we locate our first framebuffer at the beginning of the SDRAM
alt_u32* frameBufferA = (alt_u32*)ONCHIP_MEMORY2_0_BASE;


void my_dma_callback(void *data)
{
    // reset the OWNED_BY_HW bit in the descriptors to reuse the chain
    int i;
    for(i = 0; i < 3;++i)
        dmaDescA[i].control |= 1<<ALTERA_AVALON_SGDMA_DESCRIPTOR_CONTROL_OWNED_BY_HW_OFST;

    // trigger another transfer all over again
    alt_avalon_sgdma_do_async_transfer((alt_sgdma_dev*)data, dmaDescA);
}



int main()
{
    dmaDescA = (alt_sgdma_descriptor*) ONCHIP_MEMORY2_BASE + 0xf00;
    dmaDescEND = (alt_sgdma_descriptor*) ONCHIP_MEMORY2_BASE;


    dma = alt_avalon_sgdma_open(SGDMA_0_NAME);


    // frame buffer
    alt_u8* buff;
    alt_u16 size;
    int i;

    for(i = 0; i < 3; ++i)
    {
    switch ( i ) {
            case 0:
                size = 0xa;
                buff = (alt_u8*)frameBufferA;
                break;
            case 1:
                size = 0x1;
                buff = (alt_u8*)frameBufferA;
                break;
            case 2:
                size = 0xff;
                buff = (alt_u8*)frameBufferA;
                break;
        }


        alt_avalon_sgdma_construct_mem_to_stream_desc(
                &dmaDescA[i],
                (i<3) ? (&dmaDescA[i+1]) : &dmaDescEND,
                (alt_u32*)buff,
                size,
                0,
                1, // sop
                1, // eop
                0);
    }



alt_avalon_sgdma_register_callback(
            dma, my_dma_callback,
            ALTERA_AVALON_SGDMA_CONTROL_IE_CHAIN_COMPLETED_MSK
            |ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK,
            (void*)dma);


    alt_avalon_sgdma_do_async_transfer(dma, dmaDescA);//start DMA transfer

;
return 0;
}

 

 

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


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

По ходу освоения SGDMA возникают все новые вопросы =)

 

Подцепил к своему проекту SGDMA ST-MM для записи видео в память.

Есть желание сделать аналог Alpha Blending Mixer, а именно:

 

задан некоторый буфер в sdram, который выполняет роль фона (размер 1000х1000). Через SGDMA ST-MM приходит видео поток (размер кадра 200х200) и его нужно разместить в левом верхнем углу.

 

Как лучше сделать:

- для каждой строки делать отдельный дескриптор с указанием размера транзакции и нужного начального адреса?

- или создать новый малый буфер внутри первого с соответствующим переназначением адресов?

 

Если второй вариант предпочтительнее, прошу немного пояснить синтаксис такого задания, ибо с указателями пока еще путаюсь =(

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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