原子的OV5640_LCD例程,纯寄存器点亮 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
- 由于原子的例程,有用GPIO读屏的ID的函数,因此抓到的AXI读写要多一些。一共有58个。用Capture模式抓
- 输出结果导出为csv表,注意其中有的Wdata的数据是0x1e0,这种导入到csv后,被识别成浮点的1E0,也就是1,导致我们的寄存器配置错误。需要手动把它改过来。这个错误很隐蔽,不容易发现。
- 例程:disp_25_ov5640_lcd
//****************************************Copyright (c)***********************************//
//原子哥在线教学平台:www.yuanzige.com
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//关注微信公众平台微信号:"正点原子",免费获取ZYNQ & FPGA & STM32 & LINUX资料。
//版权所有,盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name: main.c
// Last modified Date: 2019/07/01 15:59:46
// Last Version: V1.0
// Descriptions: OV5640摄像头驱动LCD示例
//----------------------------------------------------------------------------------------
// Created by: 正点原子
// Created date: 2019/07/01 15:59:52
// Version: V1.0
// Descriptions: The original version
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//
/***************************** Include Files *********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xgpio.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "display_ctrl/display_ctrl.h"
#include "vdma_api/vdma_api.h"
#include "emio_sccb_cfg/emio_sccb_cfg.h"
#include "ov5640/ov5640_init.h"
//宏定义
#define BYTES_PIXEL 3 //像素字节数,RGB888占3个字节
#define FRAME_BUFFER_NUM 3 //帧缓存个数3
#define DYNCLK_BASEADDR XPAR_AXI_DYNCLK_0_BASEADDR //动态时钟基地址
#define VDMA_ID XPAR_AXIVDMA_0_DEVICE_ID //VDMA器件ID
#define DISP_VTC_ID XPAR_VTC_0_DEVICE_ID //VTC器件ID
//PL端 AXI GPIO 0(lcd_id)器件 ID
#define AXI_GPIO_0_ID XPAR_AXI_GPIO_0_DEVICE_ID
//使用AXI GPIO(lcd_id)通道1
#define AXI_GPIO_0_CHANEL 1
//全局变量
//frame buffer的起始地址
unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR
+ 0x1000000);
XAxiVdma vdma;
DisplayCtrl dispCtrl;
XGpio axi_gpio_inst; //PL端 AXI GPIO 驱动实例
VideoMode vd_mode;
unsigned int lcd_id;
void init()
{
//GPIO
Xil_Out32(0x41200004,0x7);
Xil_Out32(0x41200004,0x0);
//VDMA
Xil_Out32(0x43000000,0x4);
Xil_Out32(0x43000030,0x4);
Xil_Out32(0x43000030,0x0001008a);
Xil_Out32(0x430000a4,0x960);
Xil_Out32(0x430000a8,0x960);
Xil_Out32(0x430000ac,0x1100000);
Xil_Out32(0x430000b0,0x1219400);
Xil_Out32(0x430000b4,0x1332800);
Xil_Out32(0x43000000,0x0001008a);
Xil_Out32(0x43000054,0x960);
Xil_Out32(0x43000058,0x960);
Xil_Out32(0x4300005c,0x1100000);
Xil_Out32(0x43000060,0x1219400);
Xil_Out32(0x43000064,0x1332800);
Xil_Out32(0x43000030,0x0001408a);
Xil_Out32(0x43000000,0x0001408a);
Xil_Out32(0x43000030,0x0001408b);
Xil_Out32(0x430000a0,0x1e0);
Xil_Out32(0x43000000,0x0001408b);
Xil_Out32(0x43000050,0x1e0);
//dynClk
Xil_Out32(0x43c10008,0x800083);
Xil_Out32(0x43c1000c,0x800411);
Xil_Out32(0x43c10010,0x0);
Xil_Out32(0x43c10014,0x82);
Xil_Out32(0x43c10018,0xd2cfa401);
Xil_Out32(0x43c1001c,0x006300ff);
Xil_Out32(0x43c10000,0x1);
usleep(1000);
Xil_Out32(0x43c10008,0x800083);
Xil_Out32(0x43c1000c,0x800411);
Xil_Out32(0x43c10010,0x0);
Xil_Out32(0x43c10014,0x82);
Xil_Out32(0x43c10018,0xd2cfa401);
Xil_Out32(0x43c1001c,0x006300ff);
Xil_Out32(0x43c10000,0x0);
Xil_Out32(0x43c10000,0x1);
usleep(1000);
//v_tc
Xil_Out32(0x43c00000,0x2);
Xil_Out32(0x43c0006c,0x70);
Xil_Out32(0x43c00070,0x421);
Xil_Out32(0x43c00074,0x01fa01fa);
Xil_Out32(0x43c00060,0x01e00320);
Xil_Out32(0x43c00094,0x1e0);
Xil_Out32(0x43c00078,0x03c80348);
Xil_Out32(0x43c00080,0x01e301e0);
Xil_Out32(0x43c0008c,0x01e301e0);
Xil_Out32(0x43c00068,0x2);
Xil_Out32(0x43c0007c,0x3200320);
Xil_Out32(0x43c00084,0x3480348);
Xil_Out32(0x43c00088,0x3200320);
Xil_Out32(0x43c00090,0x3480348);
Xil_Out32(0x43c0007c,0x3200320);
Xil_Out32(0x43c00084,0x3480348);
Xil_Out32(0x43c00088,0x3200320);
Xil_Out32(0x43c00090,0x3480348);
Xil_Out32(0x43c00000,0x03f7ef02);
Xil_Out32(0x43c00000,0x03f7ef06);
}
int main(void)
{
u32 status;
u16 cmos_h_pixel; //ov5640 DVP 输出水平像素点数
u16 cmos_v_pixel; //ov5640 DVP 输出垂直像素点数
u16 total_h_pixel; //ov5640 水平总像素大小
u16 total_v_pixel; //ov5640 垂直总像素大小
XGpio_Initialize(&axi_gpio_inst,AXI_GPIO_0_ID); //GPIO初始化
XGpio_SetDataDirection(&axi_gpio_inst,AXI_GPIO_0_CHANEL,0x07); //设置AXI GPIO为输入
lcd_id = LTDC_PanelID_Read(&axi_gpio_inst,AXI_GPIO_0_CHANEL); //获取LCD的ID
XGpio_SetDataDirection(&axi_gpio_inst,AXI_GPIO_0_CHANEL,0x00); //设置AXI GPIO为输出
xil_printf("LCD ID: %x\r\n",lcd_id);
//根据获取的LCD的ID号来进行ov5640显示分辨率参数的选择
switch(lcd_id){
case 0x4342 : //4.3寸屏,480*272分辨率
cmos_h_pixel = 480;
cmos_v_pixel = 272;
total_h_pixel = 1800;
total_v_pixel = 1000;
break;
case 0x4384 : //4.3寸屏,800*480分辨率
cmos_h_pixel = 800;
cmos_v_pixel = 480;
total_h_pixel = 1800;
total_v_pixel = 1000;
break;
case 0x7084 : //7寸屏,800*480分辨率
cmos_h_pixel = 800;
cmos_v_pixel = 480;
total_h_pixel = 1800;
total_v_pixel = 1000;
break;
case 0x7016 : //7寸屏,1024*600分辨率
cmos_h_pixel = 1024;
cmos_v_pixel = 600;
total_h_pixel = 2200;
total_v_pixel = 1000;
break;
case 0x1018 : //10.1寸屏,1280*800分辨率
cmos_h_pixel = 1280;
cmos_v_pixel = 800;
total_h_pixel = 2570;
total_v_pixel = 980;
break;
default :
cmos_h_pixel = 480;
cmos_v_pixel = 272;
total_h_pixel = 1800;
total_v_pixel = 1000;
break;
}
emio_init(); //初始化EMIO
status = ov5640_init( cmos_h_pixel, //初始化ov5640
cmos_v_pixel,
total_h_pixel,
total_v_pixel);
if(status == 0)
xil_printf("OV5640 detected successful!\r\n");
else
xil_printf("OV5640 detected failed!\r\n");
//根据获取的LCD的ID号来进行video参数的选择
switch(lcd_id){
case 0x4342 : vd_mode = VMODE_480x272; break; //4.3寸屏,480*272分辨率
case 0x4384 : vd_mode = VMODE_800x480; break; //4.3寸屏,800*480分辨率
case 0x7084 : vd_mode = VMODE_800x480; break; //7寸屏,800*480分辨率
case 0x7016 : vd_mode = VMODE_1024x600; break; //7寸屏,1024*600分辨率
case 0x1018 : vd_mode = VMODE_1280x800; break; //10.1寸屏,1280*800分辨率
default : vd_mode = VMODE_800x480; break;
}
if(0){
//配置VDMA
run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
frame_buffer_addr,0,0,BOTH);
//初始化Display controller
DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
//设置VideoMode
DisplaySetMode(&dispCtrl, &vd_mode);
DisplayStart(&dispCtrl);
}
if(1){
init();
}
return 0;
}