EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——+ app_vip_demo_video_audio部分代码解读
, @0 C$ P& u2 k: J5 [7 t$ w7 e刚刚学习SOC不久。这几天在DE1-SoC上编译和运行了友晶提供的一些sample,初步学习了一些相关代码,把自己的理解写下来,希望各位大侠不吝赐教。
+ d4 X4 j, u! ? Z/ A3 t
- f6 n. e9 T9 K1 ]1 e0 x" m5 ?9 P$ [5 O
1. 硬件(HPS-FPGA)架构在Qsys中连接h2f_ axi_master(而不是h2f_lw_axi_master)到sdram,作为数据输出的FIFO
- c/ n: W7 ]4 ]3 h+ W2 L( _同时也连接到alt_vip_vfr_0,读出进行图像处理。
: a$ U# T2 E# C8 }经过alt_vip_mix_0进行处理后,最后通过alt_vip_itc_0 alt_vip_itc_0_clocked_video_vid_data输出到VGA接口进行显示。
_# y' x. W9 } 2. HPS侧软件/ K0 R, {0 P6 r+ k1 E4 m
7 f& e0 ]. O$ b. q: b
打开内存设备 main.c if( ( fd = open("/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) { printf("ERROR: could not open \"/dev/mem\"...\n" ); return( 1 ); }
# x+ Z. W7 h$ L' _" h R
: [/ ~0 m6 v/ t- Y7 k( w# x然后进行地址映射 axi_virtual_base=mmap(NULL,HW_FPGA_AXI_SPAN,(PROT_READ|PROT_WRITE),MAP_SHARED, fd,ALT_AXI_FPGASLVS_OFST ); ) d& H3 [* E" D3 k" e0 e
! m5 |* g) R$ m, t; c0 z$ o/ o2 c
通过H2F bridge 映射到连接frame buffer h2p_vip_frame_reader0_addr=virtual_base + ( ( unsigned long )(ALT_LWFPGASLVS_OFST + ALT_VIP_VFR_0_BASE ) & ( unsigned long)( HW_REGS_MASK) );
; G0 h; ^3 j/ k5 x6 h; v3 S# n( d$ }( b0 N4 Q2 L& L
其中ALT_VIP_VFR_0_BASE 对应于Qsys中定义的地址 hps_0.h(80):#define ALT_VIP_VFR_0_BASE 0x100
8 o0 ]5 \& t A
3 w. X. W R8 y7 { A把h2p_memory_add映射到FPGA侧的SDRAM(0x0000_0000 -0x03ff_ffff) h2p_memory_addr=axi_virtual_base + ((unsigned long)(DEMO_VGA_FRAME0_ADDR)& (unsigned long)(HW_FPGA_AXI_MASK));
$ t! p- M" } Y" j7 D5 u: F8 [5 |
* M" C! f0 |. B1 R; I; F配置Frame buffer的位置,图像大小 VIP_FR_Config(VIDEO_WIDTH, VIDEO_HEIGHT); 把frame0/frame1映射到h2p_memory_addr上: thread_data0.frame0=(volatile unsigned long *)((char*)h2p_memory_addr+FR0_FRAME0_ OFFSET); thread_data0.frame1=(volatile unsigned long *)((char*)h2p_memory_addr +FR0_FRAME1_ OFFSET);
" J! ^' _7 B$ S9 S H) i5 u$ @6 q0 M8 o
创建mpg_decode_thread线程 ret0=pthread_create(&id0,NULL,(void *)mpg_decode_thread,&thread_data0); ' Z& t/ T3 w% A& U# S4 J
1 @8 f% ~. J) N0 g在mpg_decode_thread函数中,解码后的RGB数据轮流写入frame0和frame1 void mpg_decode_thread(void *ptr) { … mpg_decode(mpgfile,data->ID, data->frame0,data->frame1); fclose(mpgfile); … } : m1 I3 m* j6 r: L: R, [
在mpg_decode函数中,使用mEMCpy将解码后的数据写入frame0和frame1,即直接写入FPGA侧的SDRAM: void mpg_decode (FILE * mpgfile, const int ID, volatile unsignedlong *frame0,volatile unsigned long *frame1) { … if (nActiveFrame == 0x00) memcpy((void *)frame0, (void *)pFrame_xRGB, nFrameSize); else memcpy((void *)frame1, (void *)pFrame_xRGB, nFrameSize); … } C4 r6 l& X' Q% A
|