PYNQ2中第一个linux程序

尝试了很多裸跑下的功能测试,发现对于网口通信还是在linux系统下,流程控制更加方便,于是有了linux第一个应用程序:点亮LED.
1、硬件设置
新建工程,添加gpio如下所示:
PYNQ2中第一个linux程序_第1张图片
找到分配的物理地址,如下所示:
PYNQ2中第一个linux程序_第2张图片
添加管教约束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 
#include 
#include 
#include 

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进入系统,如下所示:
PYNQ2中第一个linux程序_第3张图片
通过su,进入root权限,密码为xilinx.
cd led文件夹输入:
gcc test1.cpp –o test1
4、运行
下载bit文件,然后运行test1,led灯在闪烁,表明程序在运行,并打印信息如下所示
PYNQ2中第一个linux程序_第4张图片

你可能感兴趣的:(PYNQ)