尝试了很多裸跑下的功能测试,发现对于网口通信还是在linux系统下,流程控制更加方便,于是有了linux第一个应用程序:点亮LED.
1、硬件设置
新建工程,添加gpio如下所示:
找到分配的物理地址,如下所示:
添加管教约束xdc
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[1]}]
set_property PACKAGE_PIN R14 [get_ports {GPIO_tri_o[0]}]
set_property PACKAGE_PIN P14 [get_ports {GPIO_tri_o[1]}]
set_property PACKAGE_PIN N16 [get_ports {gpio_rtl_tri_o[0]}]
set_property PACKAGE_PIN M14 [get_ports {gpio_rtl_tri_o[1]}]
生成bit文件。
2、cpp文件编写
一般的教程是在设备树里找到相关GPIO的设备号,然后对其进行读写。而我这里的思路是,在linux下对GPIO的物理基地址进行映射,获得操作系统可以操作的虚拟地址。这样在后面的数据处理中都可以只需要对地址操作就行。
源码如下所示:
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "unistd.h"
#include <fcntl.h>
#include <ctype.h>
#include <sys/mman.h>
#include <math.h>
int fd1 = 0; //虚拟地址的句柄
int *baseaddr = NULL; //数据命令空间对应的虚拟地址。eaddr
int MAP_SIZE = 64 * 4;
int DEBUG_REG_ADDR = 0x41200000; //物理空间地址。
int main(int argc, char *argv[])
{
int i;
int offset = 0; //0x80;
fd1 = open("/dev/mem", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd1 < 0)
{
printf("err open \r\n");
return 0;
}
baseaddr = (int *)mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, DEBUG_REG_ADDR);
if (baseaddr == MAP_FAILED)
{
printf(" mmap err\r\n");
return 0;
}
while (1)
{
baseaddr[0] = 0xf;
usleep(1000000);
printf("0 open \r\n");
baseaddr[0] = 0x0;
usleep(1000000);
printf("1 open \r\n");
}
}
3、生成执行文件
要在线调试需要基于GDB,配置复杂,目前还没有实现,所以这里使用shell完成编译。
首先将本地计算机和P2开发板通过网线连接,设置本地IP和192.168.2.99处于同一网段。
在计算机中输入\192.168.2.99\xilinx 进入板卡中共享文件夹,新建文件夹led,然后将cpp文件复制到路径下.
通过putty进入系统,如下所示:
通过su,进入root权限,密码为xilinx.
cd led文件夹输入:
gcc test1.cpp –o test1
4、运行
下载bit文件,然后运行test1,led灯在闪烁,表明程序在运行,并打印信息如下所示