找回密码
 注册
关于网站域名变更的通知
查看: 425|回复: 1
打印 上一主题 下一主题

转——+ app_vip_demo_video_audio部分代码解读 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-11 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
转——+ app_vip_demo_video_audio部分代码解读
  H( K7 Y6 C- S4 n3 X
刚刚学习SOC不久。这几天在DE1-SoC上编译和运行了友晶提供的一些sample,初步学习了一些相关代码,把自己的理解写下来,希望各位大侠不吝赐教。, |  q4 R' n# S( B- \' u' W! H6 `' f
% E  y  @7 X* N: H

4 W( E  v8 \0 }+ x$ Z$ Q1.    硬件(HPS-FPGA)架构
Qsys中连接h2f_ axi_master(而不是h2f_lw_axi_master)到sdram,作为数据输出的FIFO

) v1 B- `1 I! ]& S4 \, [( W0 ~
同时也连接到alt_vip_vfr_0,读出进行图像处理。

2 S+ @& B; V. A8 T
经过alt_vip_mix_0进行处理后,最后通过alt_vip_itc_0 alt_vip_itc_0_clocked_video_vid_data输出到VGA接口进行显示。
( f% L+ Y6 S' r5 x. k# ^" ?/ V9 E
2.    HPS侧软件* A# |6 ]% E4 C3 w; e
) `8 l9 ^  x3 K9 b
打开内存设备
main.c
    if( ( fd = open("/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
             printf("ERROR: could not open \"/dev/mem\"...\n" );
             return( 1 );
    }

8 p$ W# l  W8 E# ?4 j$ g4 B( `! t, ^
然后进行地址映射
axi_virtual_base=mmap(NULL,HW_FPGA_AXI_SPAN,(PROT_READ|PROT_WRITE),MAP_SHARED,   fd,ALT_AXI_FPGASLVS_OFST );      
+ c" f! y) y2 g- |' `
; ]$ P$ W1 f9 c- ^) ?, x4 ]; R" o
通过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) );
# \+ ~+ x1 e% _  j8 o5 V- a
, I5 K4 v# B# `! k
其中ALT_VIP_VFR_0_BASE 对应于Qsys中定义的地址
hps_0.h(80):#define ALT_VIP_VFR_0_BASE 0x100
2 w3 F8 c, f) B8 d" q

5 Q& O; v4 N" x" t. i$ u: o7 Y
h2p_memory_add映射到FPGA侧的SDRAM0x0000_0000 -0x03ff_ffff
h2p_memory_addr=axi_virtual_base
+ ((unsigned long)(DEMO_VGA_FRAME0_ADDR)& (unsigned long)(HW_FPGA_AXI_MASK));

& v' _2 q4 @( B7 ?7 T* A1 n
, n& R. @% Z; w4 }; i8 X6 h( @' L
配置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);
3 j7 A% L$ Q3 n' s& |4 T; {: E

( ~7 F) L8 N+ W2 x) V
创建mpg_decode_thread线程
ret0=pthread_create(&id0,NULL,(void *)mpg_decode_thread,&thread_data0);
) z% w- s7 S) ?9 Q4 p+ G

) U6 e& D6 z1 i: H3 x9 l6 a
在mpg_decode_thread函数中,解码后的RGB数据轮流写入frame0和frame1
void mpg_decode_thread(void *ptr)
{
    …
    mpg_decode(mpgfile,data->ID, data->frame0,data->frame1);
    fclose(mpgfile);
}
4 Q, ~. [: \  x* s  Z0 _6 F$ q( H
mpg_decode函数中,使用mEMCpy将解码后的数据写入frame0frame1,即直接写入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);
    …
}
/ P0 k) g0 I+ F' C( f- {$ G! Y" k
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-31 10:57 , Processed in 0.120117 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表