edren_baton 0 21 февраля, 2015 Опубликовано 21 февраля, 2015 · Жалоба Всем доброго времени суток! Учусь работать с модулем 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 =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 февраля, 2015 Опубликовано 21 февраля, 2015 · Жалоба Учитывая тот факт, что для формирования нормального кадра 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
edren_baton 0 21 февраля, 2015 Опубликовано 21 февраля, 2015 · Жалоба Это какая-то надстройка над Avalon-ST? При пакетной передаче длина пакета определяется SOP и EOP, зачем всё остальное? Т.е. все модули Avalon-ST Sink должны сами распознавать размер и тип пакета? Если посмотреть сигналтапом, например, соединение Frame Buffer - Alpha Blending Mixer, то состав данных будет такой как я описал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 февраля, 2015 Опубликовано 21 февраля, 2015 · Жалоба В моём случае SgDMA MM to ST используется для передачи Ethernet пакетов на TSE MAC, шина данных Avalon-ST там 8-бит, проблем с длиной отправляемых пакетов не наблюдал (может быть всё же надо учитывать empty, если шина отлична от 8-бит?). Такой параметр, как тип Avalon ST пакета, отсутствует. С приведёнными ядрами не работал, видимо, это реализация какого-то протокола поверх Avalon-ST. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
edren_baton 0 22 февраля, 2015 Опубликовано 22 февраля, 2015 (изменено) · Жалоба По поводу Mixera. Так как в этом блоке нет изначально заданных размеров отдельных потоков, то перед основным пакетом с данными надо все-таки отправлять Control Packet. Попробовал в качестве эксперимента подключить сгдма к Clocked Video Output и к Video Sync Generator (между sgdma и блоком вывода еще avalon-st fifo). За основу брал рабочий проект. Так теперь блок sgdma или не заводится (открывается, но никакие данные не идут, смотрел через сигналтап) или заводится по какому-то непонятному алгоритму. В чем разница между подключениями к миксеру и синк генератору? Изменено 22 февраля, 2015 пользователем edren_baton Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
edren_baton 0 22 февраля, 2015 Опубликовано 22 февраля, 2015 · Жалоба Итак, разобрался я что у меня не работало - не объявил где лежат дескрипторы на 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
edren_baton 0 23 февраля, 2015 Опубликовано 23 февраля, 2015 · Жалоба По ходу освоения SGDMA возникают все новые вопросы =) Подцепил к своему проекту SGDMA ST-MM для записи видео в память. Есть желание сделать аналог Alpha Blending Mixer, а именно: задан некоторый буфер в sdram, который выполняет роль фона (размер 1000х1000). Через SGDMA ST-MM приходит видео поток (размер кадра 200х200) и его нужно разместить в левом верхнем углу. Как лучше сделать: - для каждой строки делать отдельный дескриптор с указанием размера транзакции и нужного начального адреса? - или создать новый малый буфер внутри первого с соответствующим переназначением адресов? Если второй вариант предпочтительнее, прошу немного пояснить синтаксис такого задания, ибо с указателями пока еще путаюсь =( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться