Всем доброго времени суток!
Учусь работать с модулем 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 =)