威视锐ZYNQ开发板-ZingSK-CMOS视频采集与HDMI显示

2020-02-28 18:32发布

一、概述
ZingSK开发套件采用核心板加底板的方式,方便用户使用自定义的低成本的底板. ZingSK配套的底板也拥有丰富的接口, ZingSK外观如图1.





图1



本实例主要使用底板上高清多媒体接口HDMI和扩展接口,扩展接口将CMOS模块的视频接入,并通过软硬件协同设计的方法来实现CMOS视频的采集和HDMI的显示.CMOS芯片将采集到的视频输入到ZYNQ PL部分,通过Xilinx提供的VideoIn_to_AXIStream的IP将数据转为AXI Stream的流格式,为保证传输速度,使用VDMA的IP将视频流数据转为MemoryMap的形式,通过PS与PL的HP高速接口DMA到外部的DDR3中;当需要显示时,Logicvc会从DDR3会取数据并以HDMI的时序送出,视频数据会显示在HDMI显示器上.

整体框图如图2所示.







图2



实例程序主要由两部分组成,硬件平台的搭建和嵌入式软件部分.

硬件平台的搭建,主要是PL部分,如添加视频输入输出IP, {MOD}空间转化的IP和VDMA以及控制IO等,还有PS部分,如配置DDR3,程序固化方式(SD卡, NAND Flash, SPI Flash),调试接口串口的配置以及IIC控制器的配置.

嵌入式软件,主要分为FSBL部分和Linux下的驱动和应用程序;FSBL主要完成IIC控制器的初始化,并配置HDMI芯片和CMOS输入芯片;Linux下完成各部分的驱动程序。

二、快速启动
HDMI显示可通过以下几步来完成测试.

1. 准备工作,

a. 带HDMI接口的显示器一台;

b. 6V-3A电源;

c. ZingSK开发套件;

2. 将ZingSK的启动模式调成TF卡模式,如下图;



图 2-1

3. 开发板连接6 V电源(JP1),不要打开电源。



图 2-2



4. 将包含了例程所需二进制文件的TF闪存卡,插入到Zing SK开发板的TF卡插槽内。



图 2-3



5. 用USB Type-A -USB Mini-B 电缆连接开发板UART与电脑。



图 2-4



6. 将CMOS摄像头和HDMI连接线连接到下图标识位置。









图2-5

7. 使用“设备管理器”,以确定COM端口。 打开一个串口调试程序,配置为115200/8/n/1/n。



图 2-6





图 2-7



8. 打开电源开关(SP1) ,开发板上电运行。



图 2-8



9. 在串口调试工具的窗口将会显示Linux的引导过程。







图 2-9



10. 约半分钟左右,将自动运行测试例程,HDMI显示器将会有图像输出



图 2-10



三、硬件平台搭建
嵌入式平台的主要分为PS和PL两部分配置.

使用XPS,配置ZYNQ的处理器PS部分,外设中选择下图.



图3-1

选择UART0为了输出调试信息,选择IIC0是使用该控制器来配置HDMI输出芯片SiI9134;IIC1用来配置CMOS相关参数。它们都使用了EMIO的方法来配置HDMI和CMOS。

其它都为默认配置,根据板卡实际的DDR3芯片,配置DDR3控制器,作为程序的内存空间;如图7



图3-2



PL部分主要是添加必要的IP来完成CMOS的采集和HDMI的输出.使用到的IP如下图.



图3-3



四、嵌入式软件设计
1.FSBL部分设计
软件主要分为两部分,FSBL与Linux下的程序;FSBL主要完成ZYNQ平台的启动,内存的初始化,IO的中断初始化,以及CMOS与HDMI的配置。其中,CMOS的配置通过IIC1来配置,HDMI接口通过IIC0来配置。具体如下:

FSBL中IIC的主要C程序如下,具体函数请参阅官方手册;

IIC的控制,

//初始化IIC控制器

XIicPs_LookupConfig(…);

XIicPs_CfgInitialize(…);

//设置IIC时钟频率

XIicPs_SetSClk(…);

//发送数据

iic_writex(… );

IIC0配置HDMI,需要查阅SiI9134的手册,需要将用到的寄存器全部配置,整理的配置数据如下;

SiI9134有两个寄存器,需要分别配置;

对于0x72为基址的寄存器,数据如下,前8位为寄存器地址,后16位为配置数据;

{0x05, 0x00, 0x01}, // soft reset

{0x05, 0x00, 0x00}, //

{0x08, 0x00, 0xfd} // enable hs/vs



对于0x7a为基址的寄存器数据下,

{0x2f, 0x00, 0x21}, HDMI mode

{0x3e, 0x00, 0x03}, // CEA-861D InfoFrame

{0x40, 0x00, 0x82}, //

{0x41, 0x00, 0x02},

{0x42, 0x00, 0x0d},

{0x43, 0x00, 0xe7},// checksum

{0x44, 0x00, 0x10},//rgb

{0x45, 0x00, 0x68},

{0x46, 0x00, 0x00},

{0x47, 0x00, 0x00},

{0x3d, 0x00, 0x07} //nomal mode



IIC1配置CMOS的具体配置参数如下,

{0x20,0xc0,0x00},// Mirror Row and Columns

{0x09,0x03,0x37},// Exposure

{0x05,0x00,0x00},// H_Blanking  //

{0x06,0x00,0x19},// V_Blanking

{0x0A,0x80,0x00},// change latch

{0x2B,0x00,0x0b},// Green 1 Gain

{0x2C,0x00,0x0f},// Blue Gain

{0x2D,0x00,0x0f},// Red Gain

{0x2E,0x00,0x0b},// Green 2 Gain

{0x10,0x00,0x51},// set up PLL power on

PLL_m_Factor<<8+PLL_n_Divider-----------18 //96M

{0x11,0x19,0x04}, // 25M

{0x12,0x00,0x04},// PLL_p1_Divider

{0x10,0x00,0x53},// set USE PLL

{0x98,0x00,0x00},// disble calibration

{0x01,0x03,0xe8},// set start row

{0x02,0x03,0xe8},// set start column

{0x03,0x03,0xbf},

{0x04,0x06,0x3F},

{0x22,0x00,0x01},// set row mode in bin mode

{0x23,0x00,0x01},// set column mode  in bin mode

{0x49,0x00,0xA8},// row black target //49s

{0x0B,0x00,0x01} //   RESTART(U)



2.LINUX部分
开发环境:Windows7-32位、VMware 9.0 + Ubuntu 12.04、arm- xilinx- linux-gnueabi交叉编译环境

嵌入式Linux: zynq_base_trd_14.3(基于ZingSK修改)



LED例程运行需要一系列二进制文件如下表所示:



文件名
描述



BOOT.BIN
由EDK bootgen工具创建,包含 FSBL (First Stage Boot Loader), FPGA bit-stream, U-Boot(基于zynq_base_trd_14.3构建)

uImage
Linux kernel(基于zynq_base_trd_14.3内核编译)

devicetree.dtb
Device Tree Blob

uramdisk.image.gz
根文件系统

init.sh
运行应用程序

cmos_hdmi.elf
测试程序


表1-1

1)、Device Tree修改部分:

修改显示模式为1080P:



xylon-video-params {

pixel-data-invert = <0>;

pixel-clock-active-high = <1>;

pixel-component-format = "ARGB";

pixel-component-layer = <0>,<1>;

active-layer = <0>;

videomode = "1920x1080";

……





2)、应用程序流程:





应用代码片段:

VDMA设置,CMOS->VDMA->DDR:

if ((fd_vdma = open("/dev/xvdma", O_RDWR)) < 0)

{

printf("Cannot open device node xvdma ");

// exit(1);

}



xvdma_dev.device_id = vdma_id;



if (ioctl(fd_vdma, XVDMA_GET_DEV_INFO, &xvdma_dev) < 0)

{

printf("%s: Failed to get info for device id:%d", __func__, vdma_id);

}



if(vdma_direction == DMA_DEV_TO_MEM) // frome device to memory

{// rx

chan_cfg.chan = xvdma_dev.rx_chan;

buf_info.chan = xvdma_dev.rx_chan;

buf_info.mem_type = DMA_DEV_TO_MEM;

}

else // from memory to devie

{

chan_cfg.chan = xvdma_dev.tx_chan;

buf_info.chan = xvdma_dev.tx_chan;

buf_info.mem_type = DMA_MEM_TO_DEV;

}

…….



配置CMOS摄像头API:

void setup_cmos_camera(int cmd, int value)

{

int fd;

fd = open ("/dev/mt9p031",O_RDWR);

if (fd < 0) {

perror("open");

//exit(-1);

}

printf (" /dev/mt9p031 opened, fd=%d ",fd);

if(ioctl(fd, cmd, &value) < 0)

perror("ioctl");



close(fd);

}







五、实例小结
本实例主要利用ZYNQ的逻辑部分去完成视频的采集显示,利用ZYNQ

的PS部分运行Linux操作系统,从而完成复杂的控制与人机界面工作.

运行操作系统后,可以实现复杂的界面程序,并可方便的使用鼠标键盘,网络等接口,体现出ZYNQ的另一优势.


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。