Zynq-7000学习笔记(十)——Linux下通过UIO配置FAST corner寄存器

 Zynq-7000学习笔记(十)——Linux下通过UIO配置FAST corner寄存器

PC平台:WINDOWS 10 64位 + 虚拟机Ubuntu 14.04

Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4

开发板:Zed Board

USB摄像头:罗技 C270(720P)

Linux源码:2016_R1

Linaro文件系统:linaro-vivid-developer-20150618-705.tar.gz

在zynq平台上做开发,肯定避免不了在linux下对有AXI Lite接口的IP进行寄存器的配置,UIO是一个很方便的方法,不管你有多少个IP,都可以搞定;原理很简单,就是物理地址的映射,把IP的AXI Lite寄存器基地址映射出来,就可以对所有的寄存器进行操作了;通过HLS综合出来的IP,如果使用了AXI Lite接口,会自动生成相应的驱动代码,包括standalone和linux的驱动,直接拿来用就好了,这里说的驱动并不是指linux底层的设备驱动,而是UIO用户端的驱动;前面我已经在standalone模式下验证了FAST corner,当时只是一张预先准备好的图片,因为环境有限,在PL端还没接摄像头,无法实时地采集到图像,而现在经过一段时间的准备,可以先在linux下就把USB摄像头采集的图像进行验证了。

一、配置linux,支持UIO

 Zynq-7000学习笔记(十)——Linux下通过UIO配置FAST corner寄存器

二、修改Env.txt,启动参数增加:uio_pdrv_genirq.of_id="generic-uio"

三、修改设备书,把FAST corner加上去,
hls_fast_corner {
compatible = "generic-uio";
reg = < 0x43c00000 0x10000>;
};

四、FAST corner的linux驱动代码如下,在HLS的项目目录下可以找到
// ==============================================================
// File generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2015.4
// Copyright (C) 2015 Xilinx Inc. All rights reserved.
//
// ==============================================================

#ifdef __linux__

/***************************** Include Files *********************************/
#include "xhls_fast_corner.h"

/***************** Macros (Inline Functions) Definitions *********************/
#define MAX_UIO_PATH_SIZE 256
#define MAX_UIO_NAME_SIZE 64
#define MAX_UIO_MAPS 5
#define UIO_INVALID_ADDR 0

/**************************** Type Definitions ******************************/
typedef struct {
u32 addr;
u32 size;
} XHls_fast_corner_uio_map;

typedef struct {
int uio_fd;
int uio_num;
char name[ MAX_UIO_NAME_SIZE ];
char version[ MAX_UIO_NAME_SIZE ];
XHls_fast_corner_uio_map maps[ MAX_UIO_MAPS ];
} XHls_fast_corner_uio_info;

/***************** Variable Definitions **************************************/
static XHls_fast_corner_uio_info uio_info;

/************************** Function Implementation *************************/
static int line_from_file(char* filename, char* linebuf) {
char* s;
int i;
FILE* fp = fopen(filename, "r");
if (!fp) return -1;
s = fgets(linebuf, MAX_UIO_NAME_SIZE, fp);
fclose(fp);
if (!s) return -2;
for (i=0; (*s)&&(iuio_num);
return line_from_file(file, info->name);
}

static int uio_info_read_version(XHls_fast_corner_uio_info* info) {
char file[ MAX_UIO_PATH_SIZE ];
sprintf(file, "/sys/class/uio/uio%d/version", info->uio_num);
return line_from_file(file, info->version);
}

static int uio_info_read_map_addr(XHls_fast_corner_uio_info* info, int n) {
int ret;
char file[ MAX_UIO_PATH_SIZE ];
info->maps[n].addr = UIO_INVALID_ADDR;
sprintf(file, "/sys/class/uio/uio%d/maps/map%d/addr", info->uio_num, n);
FILE* fp = fopen(file, "r");
if (!fp) return -1;
ret = fscanf(fp, "0x%x", &info->maps[n].addr);
fclose(fp);
if (ret < 0) return -2;
return 0;
}

static int uio_info_read_map_size(XHls_fast_corner_uio_info* info, int n) {
int ret;
char file[ MAX_UIO_PATH_SIZE ];
sprintf(file, "/sys/class/uio/uio%d/maps/map%d/size", info->uio_num, n);
FILE* fp = fopen(file, "r");
if (!fp) return -1;
ret = fscanf(fp, "0x%x", &info->maps[n].size);
fclose(fp);
if (ret < 0) return -2;
return 0;
}

int XHls_fast_corner_Initialize(XHls_fast_corner *InstancePtr, const char* InstanceName) {
XHls_fast_corner_uio_info *InfoPtr = &uio_info;
struct dirent **namelist;
int i, n;
char* s;
char file[ MAX_UIO_PATH_SIZE ];
char name[ MAX_UIO_NAME_SIZE ];
int flag = 0;

assert(InstancePtr != NULL);

n = scandir("/sys/class/uio", &namelist, 0, alphasort);
if (n < 0) return XST_DEVICE_NOT_FOUND;
for (i = 0; i < n; i++) {
strcpy(file, "/sys/class/uio/");
strcat(file, namelist[i]->d_name);
strcat(file, "/name");
if ((line_from_file(file, name) == 0) && (strcmp(name, InstanceName) == 0)) {
flag = 1;
s = namelist[i]->d_name;
s += 3; // "uio"
InfoPtr->uio_num = atoi(s);
break;
}
}
if (flag == 0) return XST_DEVICE_NOT_FOUND;

用户喜欢...

使用随时可用的硬件和软件开始机器学习

对于开发人员来说,机器学习(ML)硬件和软件的进步有望将这些复杂的方法带入物联网(IoT)边缘设备。然而,随着这一研究领域的发展,开发人员可以轻松地发现自己沉浸在这些技术背后的...


使用FPGA通过机器学习构建高性能嵌入式视觉应用

本文将介绍ML处理的要求以及FPGA解决许多性能问题的原因。然后,它将介绍一个合适的基于FPGA的ML平台以及如何使用它。...


使用 FPGA 构建具有机器学习能力的高性能嵌入式视觉应用

随着摄像头和其他设备产生的数据在快速增长,促使人们运用机器学习从汽车、安防和其他应用产生的影像中提取更多有用的信息。专用器件有望在嵌入式视觉应用中实现高性能机器学习 (ML...


在机器学习的应用上,软件工程师和FPGA真的有着难以逾越的鸿沟吗?

人工智能和机器学习正在渗透所有的行业。随着人工智能算法的成熟,支持这些算法的硬件平台也日趋成熟。目前,这些硬件平台包括 ASIC,CPU,GPU以及 FPGA 。在 Plunify,尽管我们的强项是F...


成为一名机器学习算法工程师,需要具备哪些技能?

成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能力,这些能力中的每一项掌握起来都需要足够的努力和经验。而要成为一名合格的机器学习算法工程...


Zynq学习笔记——HLS FAST corner导出keypoints(二)

PC平台:WINDOWS 10 64位 Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4 开发板:ZedBoard 摄像头:OV5640 上一步导出HLS IP后,修改原来的硬件工程,其实升级一下hls_fast_corner IP就可以了,我这次用的不是...


STM32之TFT-LCD液晶学习

TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT)...


Zynq学习笔记——HLS FAST corner导出keypoints(一)

PC平台:WINDOWS 10 64位 Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4 开发板:ZedBoard 之前参照XAPP1167文档,使用HLS Video函数库里的FASTX跑了一下例子,当时的例子是直接把keypoint以mask方式画在了原始视...


Zynq学习笔记——一个简单的HDMI显示例子

本文介绍一个简单的HDMI显示例子: 硬件工程 效果 源码链接: 密码:kljs...


Xilinx Zynq ZC702学习总结

Xilinx zynq zc702开发: 一、zynq开发整个生态系统搭建: 1.基础资料获取: https://github.com/Xilinx/ (包括:交叉编译工具,linux kernel源码,u-boot源码, device-tree源码, qemu, gdb等等) (提供 了几乎所...


Vivado 学习笔记 (五)编写IP核并通过AXI协议与ARM通信

参考资料:xilinx大学计划 实验平台:PYNQ开发板 最近发现了一块好玩的板子,PYNQ 这块板子最大的特点就是可以将所写的IP核封装成Python库的形式,然后通过在板载的xlinux系统下用户可以选择...


Zynq学习笔记——EMIO方式模拟I2C时序对ADV7511进行读写

创建硬件工程,很简单,PS接出两个EMIO和一个74.25M时钟 管脚约束 # ADV7511 I2C_SCL set_property PACKAGE_PIN AA18 [get_ports {gpio_0_tri_io[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}] # ADV7511 I2C_SDA s...


FPGA深度学习应用再加速,深鉴科技发布基于Xilinx 的多场景人工智能服务方案

2017年10月24日,中国AI创业公司深鉴科技在北京举行盛大的2017新品发布会,面向如火如荼的AI应用集中推出五款基于赛灵思全可编程技术的自主研发的智能产品与深鉴深度学习开发软件DNNDK,强...


Vivado HLS学习笔记(四)利用FPGA进行简单的图像处理

参考资料:xilinx大学计划 实验平台:ZYBO开发板 本次实验要做的是一个基于FPGA的简单图像处理程序, 共实现两个功能: 1.输出一个灰度图像的直方图。 2.将一个曝光不足的图像进行处理,使...


GPIO Product Guide笔记(Xilinx)

GPIO是通用并行IO接口的简称。他将总线信号转化为IO设备要求的信号类型,实现地址译码输出数据,锁定输入数据缓冲的功能。GPIO控制器的基本结构如图1所示。 总线接口模块实现地址译码,...


Zynq学习笔记——EMIO方式模拟SCCB时序进行读写操作

一、SCCB介绍 SCCB是OmniVision Serial Camera Control Bus的简称,即OV公司的串行摄像机控制总线。OV公司定义的SCCB是一个3线结构,但是,为了缩减Sensor的pin封装,SCCB大多采用2线方式。 开始传输数据...