zynq如何将c语言的初始化序列抓出来,转成寄存器读写?(用ILA) - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
step1: 核心思想,在总线上加一个ILA,通过ILA抓寄存器读写过程
step2: ILA捕捉,对于寄存器写,只需要保留这几个信号。注意Wready通常是一个脉冲宽度
step3:将ILA波形右键导出csv表格
删除不必要的信号,只保留这几个。把名字改一下。按Wready=1做个筛选,由于Wready=1的宽度通常只有一个周期,因此非常适合做筛选。 写个excel表达式,直接转化为寄存器读写。
效果演示,用纯寄存器:一把就把原子的sd_hdmi例程用纯寄存器驱动出来了
void init()
{
//配置VDMA
Xil_Out32(0x43000000,0x4);
Xil_Out32(0x43000000,0x10002);
Xil_Out32(0x43000054,0x1680);
Xil_Out32(0x43000058,0x1680);
Xil_Out32(0x4300005c,0x1100000);
Xil_Out32(0x43000000,0x14002);
Xil_Out32(0x43000000,0x14003);
Xil_Out32(0x43000050,0x438);
usleep(1000);
//初始化Display controller
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,0x400041);
Xil_Out32(0x43c1000c,0x0000069a);
Xil_Out32(0x43c10010,0x0);
Xil_Out32(0x43c10014,0x000020c4);
Xil_Out32(0x43c10018,0xcfafa401);
Xil_Out32(0x43c1001c,0x00a300ff);
Xil_Out32(0x43c10000,0x0);
Xil_Out32(0x43c10000,0x1);
usleep(1000);
//设置VideoMode
Xil_Out32(0x43c00000,0x2);
Xil_Out32(0x43c0006c,0x0000007f);
Xil_Out32(0x43c00070,0x898);
Xil_Out32(0x43c00074,0x4650465);
Xil_Out32(0x43c00060,0x4380780);
Xil_Out32(0x43c00094,0x4380000);
Xil_Out32(0x43c00078,0x080407d8);
Xil_Out32(0x43c00080,0x0440043b);
Xil_Out32(0x43c0008c,0x0440043b);
Xil_Out32(0x43c00068,0x2);
Xil_Out32(0x43c0007c,0x7800780);
Xil_Out32(0x43c00084,0x07d807d8);
Xil_Out32(0x43c00088,0x7800780);
Xil_Out32(0x43c00090,0x07d807d8);
Xil_Out32(0x43c0007c,0x7800780);
Xil_Out32(0x43c00084,0x07d807d8);
Xil_Out32(0x43c00088,0x7800780);
Xil_Out32(0x43c00090,0x07d807d8);
Xil_Out32(0x43c00000,0x03f7ef02);
Xil_Out32(0x43c00000,0x03f7ef06);
usleep(1000);
}
int main(void)
{
xil_printf("HDMI Display 1920*1080 \r\n");
sleep(10);
//设置video参数,分辨率:1920*1080
vd_mode = VMODE_1920x1080;
//配置VDMA
// run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
// frame_buffer_addr,0, 0,ONLY_READ);
//初始化Display controller
// DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
//设置VideoMode
// DisplaySetMode(&dispCtrl, &vd_mode);
// DisplayStart(&dispCtrl);
init();
//读取SD卡图片并显示
load_sd_bmp((u8*)frame_buffer_addr);
return 0;
}
可以看到,用一个纯寄存器读写的init函数,取代了3个复杂的函数。一把就把hdmi屏幕驱动成功了。
使用ILA的Capture Control功能,可以更为高效的捕获(可以捕获低频信号)
这个勾选上。强烈推荐,每次都把这个勾选上!
- 设置ILA,Capture Mode设置为BASIC。注意这里的窗口是指待捕获的sample数量,显然我们配置的寄存器数量一般是几十个,因此这里不需要设置太大。根据我们的实际情况,寄存器配置数量大约在32-64之间,因此这里配置为64。
- 设置Capture信号,这里选择wready信号,因为wready信号默认宽度是一个脉冲,可以用来精准且不重复的捕获AXI4的写数据。注意,Trigger可以不用设置。
- 烧录程序,可见捕获了44个sample。由于没有达到64,因此这里还没有结束。我们点击停止按钮,主动让他结束。
注意,中间那个wready一个低电平的位置,那是trigger position的位置(16)。 可见,现在捕获到足够样本,结束了。我们将数据右键导出为csv,然后在csv中做个处理。 一次就把完整的配置表抽出来了。
注意,excel表的公式如下
="Xil_Out32(0x"&B2&",0x"&C2&");"