在linux下使用自己的hls生成的 ip
上一部分我们讲述了如何通过裸机调用自己的hls ip
但是我们通常更为常见的一种场景是 在linux下使用我们自己制作的ip,例如我们自己创作了一个浮点数计算加速的ip,那么我们在linux下的其他复杂应用如何调用这个ip呢?
在上一部分的sdk中我们看到了sdk自动生成的bsp部分中包含一个xled_ctrl_linux.c的文件,那么这个文件是不是可以有助于我们在linux下使用hls的ip核呢,答案是right,接下来将讲述过程
这里说句题外话,sdk生成的bsp是适用于裸机或freertos的,并不能完整的直接拷贝到linux端使用。其编译工具链也是-none-eabi-
接下来入正题
我们查看xled_ctrl_linux.c的源代码可以很容易的看到其是基于uio进行设计的,其实这也很好理解,这样可以最大限度的减小开发耦合,其实如果想自己去做这部分驱动也很简单,在下面的一张vivado的图中可以看到物理地址,只要对这部分地址进行映射操作,就可以很容易的写出来自己的驱动了,其实sdk的uio驱动也是做了这部分工作,这里不赘述了。
* 1 创建自己的petalinux工程,在设备树文件中添加uio的地址区间
然后执行编译,上板启动
其实到这里如果有过内核驱动开发的同学,应该已经知道怎么做了
我们创建的一个自己的app目录,将sdk生成的bsp文件拷贝过来,如下
zw@zw-pc:~/swap/explore/hls/led_project/app/bsp$ ls
Makefile ps7_cortexa9_0 system.mss
然后进入ps7_cortexa9_0/libsrc/led_ctrl_v1_0/src/目录,将原来的makefile注释掉,然后添加自己的makefile,内容如下,执行make,注意下路径,为了偷懒,我这里直接写了绝对路径。。。
CC = arm-linux-gnueabihf-gcc
ROOT_DIR := $(shell pwd)
LDFLAGS =
LIB = ${ROOT_DIR}/libxled.a
INC = /home/zw/swap/explore/hls/led_project/app/bsp/ps7_cortexa9_0/include
OBJS = ${ROOT_DIR}/xled_ctrl_linux.o \
${ROOT_DIR}/xled_ctrl.o
all:${LIB}
${ROOT_DIR}/xled_ctrl_linux.o: ${ROOT_DIR}/xled_ctrl_linux.c
${CC} -c $< -o $@ ${CFLAGS} -I${INC} ${LDFLAGS}
${ROOT_DIR}/xled_ctrl.o: ${ROOT_DIR}/xled_ctrl.c
${CC} -c $< -o $@ ${CFLAGS} -I${INC} ${LDFLAGS}
${LIB}: ${OBJS}
rm -f $@
${AR} crs ${LIB} ${OBJS}
clean:
rm $(LIB)
rm ${ROOT_DIR}/*.o
这样属于这个led的lib库就生成了
然后编写我们自己的app和对应的makefile
test_led.c
#include "stdio.h"
#include "xled_ctrl.h"
#include "xparameters.h"
int main(int argc, char *argv[])
{
XLed_ctrl ledctrl;
printf("test in . \n");
if (XST_SUCCESS != XLed_ctrl_Initialize(&ledctrl, "led_ctrl"))
{
printf("led init error . \n");
return 1;
}
XLed_ctrl_Set_high_cnt(&ledctrl, 50000000);
XLed_ctrl_Set_total_cnt(&ledctrl, 100000000);
printf("test out . \n");
return 0;
}
makefile
export ROOT_DIR := $(shell pwd)
export SRC_DIR := $(ROOT_DIR)/src
export BSP_DIR := $(ROOT_DIR)/bsp
export CC = arm-linux-gnueabihf-gcc
COMMON_CFLAG_OPTION := -rdynamic -O2 -Wall -Wno-pointer-to-int-cast\
-Wno-incompatible-pointer-types -Wno-pointer-sign\
-Wno-missing-braces -Wno-format
export CFLAGS += -I$(BSP_DIR)/ps7_cortexa9_0/include
export DFLAGS := -lpthread -lm -lcrypt -ldl -lrt\
-L$(BSP_DIR)/ps7_cortexa9_0/lib/ -lxled
OBJS := test_led.o
TARGET := test_led
.PHONY : all objs clean
all : $(TARGET)
objs :$(OBJS)
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(DFLAGS)
clean :
rm *.o -rf
执行make,导入到板子上,执行应用,发现led呈闪烁状态,证明确实驱动起来了