// DFX_filter_test.c
// 2021/08/08 by marsee
// 2021/08/09 : Stop the operation of DMA2axis IP on the video side and restart it.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "xil_io.h"
#include "xparameters.h"
#include "xvflip_dma_write.h"
#include "xdma2axis.h"
#include "xthrough_axis.h"
#include "xlap_filter_axis_hw.h"
#include "xsobel_filter_axis_hw.h"
#define CAMERA_DATA_DMA_ADDR 0x10000000
#define HORIZONTAL_PIXELS 800
#define VERTICAL_LINES 600
#define XLAP_FILTER_AXIS_BASEADDR 0x40000000
#define XSOBEL_FILTER_AXIS_BASEADDR 0x40000000
int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr);
void cam_i2c_init(volatile uint32_t *ov5642_axi_iic) {
ov5642_axi_iic[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
ov5642_axi_iic[64] = 0x1; // enable i2c
}
void cam_i2x_write_sync(void) {
// unsigned c;
// c = *cam_i2c_rx_fifo;
// while ((c & 0x84) != 0x80)
// c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
usleep(1000);
}
void cam_i2c_write(volatile uint32_t *ov5642_axi_iic, uint32_t device_addr, uint32_t write_addr, uint32_t write_data){
ov5642_axi_iic[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
ov5642_axi_iic[66] = (write_addr >> 8) & 0xff; // address upper byte
ov5642_axi_iic[66] = write_addr & 0xff; // address lower byte
ov5642_axi_iic[66] = 0x200 | (write_data & 0xff); // data
cam_i2x_write_sync();
}
int main(){
XVflip_dma_write XVfilp_dma_write_ap;
XDma2axis XDma2axis_ap;
XThrough_axis XTh_axis_ap;
int inbyte_in;
XVflip_dma_write_Initialize(&XVfilp_dma_write_ap, 0);
XDma2axis_Initialize(&XDma2axis_ap, 0);
XThrough_axis_Initialize(&XTh_axis_ap, 0);
XVflip_dma_write_Set_fb0_V(&XVfilp_dma_write_ap, (u32)CAMERA_DATA_DMA_ADDR);
XVflip_dma_write_Set_fb1_V(&XVfilp_dma_write_ap, (u32)CAMERA_DATA_DMA_ADDR);
XVflip_dma_write_Set_fb2_V(&XVfilp_dma_write_ap, (u32)CAMERA_DATA_DMA_ADDR);
XDma2axis_Set_x_size(&XDma2axis_ap, HORIZONTAL_PIXELS);
XDma2axis_Set_y_size(&XDma2axis_ap, VERTICAL_LINES);
XDma2axis_Set_in_V(&XDma2axis_ap, (u32)CAMERA_DATA_DMA_ADDR);
XThrough_axis_Set_x_size(&XTh_axis_ap, (u32)HORIZONTAL_PIXELS);
XThrough_axis_Set_y_size(&XTh_axis_ap, (u32)VERTICAL_LINES);
// vflip_dma_write start
XVflip_dma_write_Start(&XVfilp_dma_write_ap);
XVflip_dma_write_EnableAutoRestart(&XVfilp_dma_write_ap);
// CMOS Camera initialize, ov5642
cam_i2c_init((volatile uint32_t *)XPAR_AXI_IIC_0_BASEADDR);
cam_reg_set((volatile uint32_t *)(XPAR_AXI_IIC_0_BASEADDR), (uint32_t)0x78); // OV5642 register set
Xil_Out32(XPAR_MT9D111_INF_AXIS_0_BASEADDR, CAMERA_DATA_DMA_ADDR); // ov5642 AXI4-Stream Start
Xil_Out32((XPAR_MT9D111_INF_AXIS_0_BASEADDR+4), 0);
// bitmap_disp_cont_axis start
Xil_Out32(XPAR_BITMAP_DISP_CONT_AXIS_0_BASEADDR, CAMERA_DATA_DMA_ADDR); // dummy address, start
// through_axis start
XThrough_axis_Start(&XTh_axis_ap);
XThrough_axis_EnableAutoRestart(&XTh_axis_ap);
// DMA2axis start
XDma2axis_Start(&XDma2axis_ap);
XDma2axis_EnableAutoRestart(&XDma2axis_ap);
printf("Press the key.");
fflush(stdout);
inbyte_in = inbyte();
printf("\n"); fflush(stdout);
// Display Stopped
XDma2axis_DisableAutoRestart(&XDma2axis_ap);
while(XDma2axis_IsIdle(&XDma2axis_ap)==0);
Xil_Out32(XPAR_DFX_DECOUPLER_0_BASEADDR, 1); // 1: Turn decoupling on
printf("Download the partial bit file of the Laplacian filter and press the key.");
fflush(stdout);
inbyte_in = inbyte();
printf("\n"); fflush(stdout);
Xil_Out32(XPAR_DFX_DECOUPLER_0_BASEADDR, 0); // 0: Turn decoupling off
// laplacian filter start
Xil_Out32(XLAP_FILTER_AXIS_BASEADDR+XLAP_FILTER_AXIS_CONTROL_ADDR_ROW_DATA, (u32)VERTICAL_LINES);
Xil_Out32(XLAP_FILTER_AXIS_BASEADDR+XLAP_FILTER_AXIS_CONTROL_ADDR_COL_DATA, (u32)HORIZONTAL_PIXELS);
Xil_Out32(XLAP_FILTER_AXIS_BASEADDR, (u32)0x81);
// DMA2axis resumes
XDma2axis_Start(&XDma2axis_ap);
XDma2axis_EnableAutoRestart(&XDma2axis_ap);
printf("Press the key.");
fflush(stdout);
inbyte_in = inbyte();
printf("\n"); fflush(stdout);
// Display Stopped
XDma2axis_DisableAutoRestart(&XDma2axis_ap);
while(XDma2axis_IsIdle(&XDma2axis_ap)==0);
Xil_Out32(XPAR_DFX_DECOUPLER_0_BASEADDR, 1); // 1: Turn decoupling on
printf("Download the partial bit file of the Sobel filter and press the key.");
fflush(stdout);
inbyte_in = inbyte();
printf("\n"); fflush(stdout);
Xil_Out32(XPAR_DFX_DECOUPLER_0_BASEADDR, 0); // 0: Turn decoupling off
// sobel filter start
Xil_Out32(XSOBEL_FILTER_AXIS_BASEADDR+XSOBEL_FILTER_AXIS_CONTROL_ADDR_ROW_DATA, (u32)VERTICAL_LINES);
Xil_Out32(XSOBEL_FILTER_AXIS_BASEADDR+XSOBEL_FILTER_AXIS_CONTROL_ADDR_COL_DATA, (u32)HORIZONTAL_PIXELS);
Xil_Out32(XSOBEL_FILTER_AXIS_BASEADDR, (u32)0x81);
// DMA2axis resumes
XDma2axis_Start(&XDma2axis_ap);
XDma2axis_EnableAutoRestart(&XDma2axis_ap);
return(0);
}
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 | - | - | - | - |