上次搭好了硬件平台,后面立马开始了软件方面的调试。
因为以前做的都是些用HDL做过显示,比如VGA,以及最近用FPGA做的LVDS屏的显示。其工作原理的就是讲数据写入到显存(DRAM)中,然后再按照行场模式或者是使能DE模式读出DRAM中的数据,按照屏的显示时序,发送给屏完成显示。
具体的功能框图如下:
ZYNQ作为整个系统的控制核心,提供HDMI的显示数据,以及时读写显存的控制,以及DDC的数据产生。PL部分主要是ADV7511的控制,还有将24bit的RGB数据转换为16bit的YCBCR422的数据发送给ADV7511
EDK中的数据到显存的函数如下:
#define img_length 2073600 //1920*1080
void ddr_video_wr(u32 write_addr){
u32 n;
u32 dcnt;
dcnt = 0;
xil_printf("DDR write start:nr");
for (n=0; n< img_length; n++){
Xil_Out32((write_addr+(dcnt*4)),write_data); // RGB
dcnt = dcnt + 1;
}
Xil_DCacheFlush();
xil_printf("DDR write: completed (total %d)nr", dcnt);
}
说明:write_data的数据位十六进制的RGB数据的组合。整个一幅图片的RGB值的大小为1920*1080的数据。
因为此时没有存取数据的地方,所以测试的图片显示的时候,将write_data 设定为固定值,让全篇显示红色的背景。
当时的设想是从SD卡中国读取过数据,毕竟以前用HDL语言做过读取SD的数据,实际上就是把他单过flah来操作。
于是在zynq_fsbl/src/下看到了关于SD卡两个文件,sd.c以及sd.h
在SD.C中看到了能使用的3个函数,如下:
1.InitSD(char *filename) 功能是读取sd中的指定的文件
2. u32 SDAccess( u32 SourceAddress,u32 DestinationAddress,u32 LengthWords); 功能就是讲原地的数据,复制一定长度的数据到目的地址。算作读数据。
3.void ReleaseSD(void); 功能就是算作释放掉SD卡操作完成。
于是就想用来试试看,新建了一个功能,当然还是用14.2.
程序如下:
#include <stdio.h>
#include "platform.h"
#include "sd.h"
#include "xbasic_types.h"
void xil_printf( const char *ctrl1, ...);
int main(){
u32 data;
init_platform();
InitSD(“123.bin”);
xil_printf("@@read 123.bin success!@@@");
cleanup_platform();
return(0);
};
功能就是读取SD卡文件中的123.bin的文件。记过一编译就开始缺少文件,然后我就在电脑里找啊找,找了7.8文件的.h
到目前为止还剩下ff.h下的integer.h还没找到。
我想既然能从SD卡boot启动,应该可以自己操作SD卡,可是遇到这文件找不到,一切都没辙了。上次AET提醒过14.2容易少静态库,这次编译的时候特地选上所有standalone。