реклама на сайте
подробности

 
 
> Размер транзакции в SGDMA Altera
edren_baton
сообщение Feb 21 2015, 14:21
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 13-10-08
Пользователь №: 40 915



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

Учусь работать с модулем 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 =)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 15:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.0238 секунд с 7
ELECTRONIX ©2004-2016