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

 
 
> AXI VDMA & VideoInToAXI4-Stream
AntLip
сообщение Feb 27 2018, 11:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 26-10-17
Из: Беларусь
Пользователь №: 99 927



Доброго времени суток, Уважаемые форумчане!
Помогите разобраться с некоторыми вопросами:
1. Нужно ли настраивать (инициализировать) ядро Video In To AXI4-Stream или оно само передает информацию без предварительных настроек.
2. Как лучше (основной критерий простота, наверное) инициализировать VDMA (при помощи описанной Programming Sequence в документации или брать код в examples API-функций)
3. Я пробовал вставить примеры, а именно функцию
Код
int run_triple_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize,int vsize, int buf_base_addr, int number_frame_count,int enable_frm_cnt_intr);

для инициализации, но данные в память не идут (смотрю по вкладке Memory в режиме Debug)
инициализация по документации
Код
void InitializeVDMA(){
    u32        RegVal;
    //reset AXI DMA
    RegVal    = 0x04;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, RegVal);
        //wait reset
    while(RegVal & (1 << 2))
    {
        RegVal    = Xil_In32(XPAR_AXI_VDMA_0_BASEADDR + 0x30);
    }
        //Инициализируем AXI DMA
    RegVal    = Xil_In32(XPAR_AXI_VDMA_0_BASEADDR + 0x30);
    RegVal    = RegVal | 0x1001;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, RegVal);
    RegVal    = Xil_In32(XPAR_AXI_VDMA_0_BASEADDR + 0x30);
        xil_printf("AXI DMA control register value: %x\n\r", RegVal);
    RegVal    = Xil_In32(XPAR_AXI_VDMA_0_BASEADDR + 0x34);
        xil_printf("AXI DMA status register value: %x\n\r", RegVal);
        //Set start  address
    RegVal    = 0x000000;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, RegVal);
        //Set Frame Delay ???????
    RegVal    = 0x0000000;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, RegVal);
        //Set Horizontal Size 640
    RegVal    = 0x280;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, RegVal);
        //Set Vertical Size 480
    RegVal    = 0x1e0;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, RegVal);
}

Документацию читал, но пока плохо её понимаю.
Буду рад пояснениям, ссылкам, направлениям на цель
Пример инициализации и работы брал из Adam Taylor's chronicles(part 119)

Сообщение отредактировал AntLip - Feb 27 2018, 13:45
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ilyaprok
сообщение Mar 4 2018, 19:33
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-10-17
Пользователь №: 99 964



Если еще актуально
1) не нужно, главное правильно для вашей камеры определить настройки ядра, и подключить сигналы шины vid_io_in согласно документации на это ядро и документации на камеру. Также не забыть притянуть сигналы vid_io_in_ce, aclken, axis_enable к "1".
2) я напрямую с регистрами работал:
Код
    //Сбрасываем ядро AXI VDMA
    RegVal    = 0x04;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, RegVal);
    RegVal    = 0;
    //Дожидаемся окончания сброса ядра
    while(RegVal & (1 << 2))
    {
        RegVal    = Xil_In32(XPAR_AXI_VDMA_0_BASEADDR + 0x30);
    }
    //Сбрасываем флаг прерывания
    RegVal            = Xil_In32(XPAR_AXI_VDMA_0_BASEADDR + 0x34);
    RegVal            = RegVal | 0x1000;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x34, RegVal);

    //Инициализируем AXI VDMA
    RegVal    = Xil_In32(XPAR_AXI_VDMA_3_BASEADDR + 0x30);
    RegVal    = RegVal | 0x108B;
    Xil_Out32(XPAR_AXI_VDMA_3_BASEADDR + 0x30, RegVal);

    // VDMA Interrupt Init
    status = XScuGic_Connect(IntrC, XPAR_FABRIC_AXI_VDMA_0_S2MM_INTROUT_INTR, (Xil_InterruptHandler)DMA_TransferEnd_Handler, NULL);
    if (status != XST_SUCCESS)
    {
        return XST_FAILURE;
    }
    XScuGic_SetPriorityTriggerType(IntrC, XPAR_FABRIC_AXI_VDMA_0_S2MM_INTROUT_INTR, 0, 3);
    XScuGic_Enable(IntrC, XPAR_FABRIC_AXI_VDMA_0_S2MM_INTROUT_INTR);

        //адрес первого кадра
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, ptrBufFrame);
        //адрес второго кадра
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+4, ptrBufFrame+752*480);
        //адрес третьего кадра
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+8, ptrBufFrame+2*752*480);
        //параметры кадра
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, 752);
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 752);
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 480);

Код
#define BUF_NUMBER_FRAME   3
uint8_t ptrBufFrame[752*480*BUF_NUMBER_FRAME]__attribute__((aligned(32)));
void DMA_TransferEnd_Handler(void)
{
    u32        RegValue;
    //Сбрасываем флаг прерывания
    RegValue            = Xil_In32(XPAR_AXI_VDMA_0_BASEADDR + 0x34);
    RegValue            = RegValue | 0x1000;
    Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x34, RegValue);

       Xil_DCacheFlushRange(((uint32_t)ptrBufFrame + cntFrame*360960), 752*480);
       cntFrame = (cntFrame + 1)%BUF_NUMBER_FRAME;
       //делаем с кадром что-то
    cntIntrDMA++;

}

3) попробуйте в Vivado вставить debug ядро и посмотреть что есть на шинах данных между Video In To AXI4-Stream и VDMA.
Похожую тему можно посмотреть тут:
https://electronix.ru/forum/index.php?showtopic=144296
Но не знаю как делают люди, но у меня проблема с доступом к памяти кадра, так как после получения свежего кадра, процессор читая память на самом деле прочитает данные из кэша, в котором будет мусор либо старые данные, чтобы освежить кэш, нужно использовать функции Xil_DCacheFlushRange либо Xil_DCacheInvalidateRange. В чем разница кстати не понял. однако это занимает время, поэтому свежий кадр можно получить спустя некоторое время (у меня для области 360960 байт - 11 мс). Либо использовать массив для записи в некешируемой области памяти, но тогда с частым обращением к массиву могут быть ощутимы задержки.
Короче я так и не понял как решить вопрос с кешем и DMA, как правильно с ними работать, может знатоки ответят?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AntLip   AXI VDMA & VideoInToAXI4-Stream   Feb 27 2018, 11:50
- - ilyaprok   Вообщем если интересно, то проблема с чтением проц...   Mar 4 2018, 21:07
- - AntLip   2 ilyaprok Да, все еще актуально. , Спасибо большо...   Mar 5 2018, 08:26
- - AntLip   Доброго дня! Подскажите пожалуйста, правильно ...   Mar 7 2018, 12:25
|- - ilyaprok   ЦитатаПосле того как я задал значение VSIZE начина...   Mar 7 2018, 20:17
- - AntLip   ЦитатаУ меня были проблемы на хардварном уровне, н...   Mar 12 2018, 08:06
|- - ilyaprok   Цитата(AntLip @ Mar 12 2018, 13:06) У мен...   Mar 13 2018, 17:47
- - AntLip   Я смотрел это видео, я только не понял как он рабо...   Mar 14 2018, 07:22
|- - ilyaprok   Цитата(AntLip @ Mar 14 2018, 12:22) Я смо...   Mar 14 2018, 18:17
- - AntLip   Спасибо за ответы. Я наконец разобрался с ila (по ...   Mar 16 2018, 10:55
|- - ilyaprok   Цитата(AntLip @ Mar 16 2018, 15:55) Тепер...   Mar 17 2018, 04:59
- - AntLip   Цитатанадо вместо XPAR_AXI_VDMA_3_BASEADDR юзать X...   Mar 19 2018, 07:33
- - AntLip   Посидел я над документацией ядер, над vivado, ila ...   Mar 21 2018, 15:02
|- - ilyaprok   Цитата(AntLip @ Mar 21 2018, 20:02) Ну,со...   Mar 21 2018, 17:10
- - AntLip   А, до меня, кажется, дошло. Спасибо   Mar 23 2018, 07:52
- - AntLip   Вот, у меня получилось. Данные преодолели vdma,...   Mar 29 2018, 14:52
- - AntLip   Что-то я не пойму в чем ошибся дальше. 1. На выхо...   Apr 3 2018, 07:16
- - AntLip   А с памятью все ровно творится что-то неладное, за...   Apr 5 2018, 07:35
- - AntLip   Я нашел ошибку, дело было в неправильных синхросиг...   Apr 9 2018, 06:42
- - AntLip   Может кто-нибудь может подсказать как правильно вы...   Apr 9 2018, 09:20


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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 12:28
Рейтинг@Mail.ru


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