本文由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者。
1、添加SoC硬件相关头文件
添加路径D:\intelFPGA\17.1\embedded\ip\altera\hps\altera_hps\hwlib\include
添加路径D:\intelFPGA\17.1\embedded\ip\altera\hps\altera_hps\hwlib\include\soc_cv_av
2、指定硬件平台
修改D:\intelFPGA\17.1\embedded\ip\altera\hps\altera_hps\hwlib\include下的hwlib.h文件,在第54行加上下面一句话:
#define soc_cv_av
该句话的意思是指定我们的开发平台为Cyclone V SoC平台或者Arriv V SoC平台。如果不加这句话,编译时会报以下错误:
In file included from ../led.c:2:0:
D:\intelFPGA\17.1\embedded\ip\altera\hps\altera_hps\hwlib\include/hwlib.h:56:2: error: #error You must define soc_cv_av or soc_a10 before compiling with HwLibs
#error You must define soc_cv_av or soc_a10 before compiling with HwLibs
^
make: *** [subdir.mk:23: led.o] Error 1
3、映射自定义IP到用户空间
将FPGA侧逻辑的寄存器挂载到Linux用户空间,以LED为例
[code=Cpp] int ret;
void *virtual_base;
int fd;
int i;
//将LED的寄存器地址段映射到Linux系统的用户空间,以便我们能够在Linux系统能够直接操作他们
// 打开MMU
if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
printf( "ERROR: could not open \"/dev/mem\"...\n" );
return( 1 );
}
//映射得到外部总线在Linux用户空间
virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );
if( virtual_base == MAP_FAILED ) {
printf( "ERROR: mmap() failed...\n" );
close( fd );
return(1);
}
//得到LED的寄存器基地址虚拟地址
h2p_lw_led_addr=virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + LED_PIO_BASE ) & ( unsigned long)( HW_REGS_MASK ) );
[/code]
4、程序中用到的几个宏定义
暂时不清楚什么意思,应该是HPS硬件部分在MMU上的映射信息。
#define HW_REGS_BASE ( ALT_STM_OFST )
#define HW_REGS_SPAN ( 0x04000000 )
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )
|