跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
合金电阻捷比信 · 专业器件主题站

如何在Vitis中使用UIO驱动程序框架创建简单的Linux用户应用程序

Linux嵌入式设计中最基本的任务之一就是创建用户应用程序。在此博客文章中,我们将讨论如何在Vitis中使用UIO驱动程序框架来创建简单的Linux用户应用程序。 1硬件设计这次使用ZynqUltraScale + MPSoCZCU104评估板。但是,无论使用哪种设备,都应遵循以下步骤。首先使用Vivado创建模块设计。建立ZynqUltraScalePS,并将AXIGPIO连接到ZCU104评估板上的4个LED。地址映射如下:首先,在创建XSA时使用了以下选项:2Linux镜像如果使用开发板,建议使用BSP(如果存在)。但是在此示例中,我们使用模板来创建图像。已为AXIGPIO添加了UIO驱动程序。然后创建sysroot,这是在Vitis中进行交叉编译所必需的。 petalinux-create-tproject--templatezynqMP-nzcu104_linuxcdzcu104_linuxpetalinux-config--get-hw-description =选择“ DTGSettings-(zcu104-revc)MACHINE_NAME”;依次,用genericqq和userdgenetsystem-driver替换genericIRQhandingGeneyspaceDriver,并将genericIRQhandingGeneyspaceDriver替换为generic include /“ system-conf.dtsi” / {chosen {bootargs =“ id =” id =“ id =” id =” id = 8”,然后将petalinux-config-ckernelUserspaceI / Oplatformdriver替换为genericq,并将userdgenetsystem-driver替换为genericIRQhandingGeneyspaceDriver。 ;;};};& axi_gpio_0 {compatible =“ generic-uio”;};然后,运行以下命令:petalinux-buildcdimages / linuxpetalinux-build--sdkpetalinux-package--sysroot 3创建平台不是必需的步骤,因为用户只需要在Vitis中使用sysroot。但是为了易于使用,我们可以创建一个平台,并在Vitis中使用该平台来创建Linux应用程序。首先,设置平台文件。将平台文件组织到文件夹结构中。这不是必需的步骤,但是用户需要注意BIF中的文件路径。在Bootgen中使用BIF创建可引导映像。在这里,我们仅使用占位符文件名。 mkdir-psw_comp / src / a53 / xrt / imagemkdirsw_comp / src / boot将image.ub,boot.scr和rootfs.cpio.gz文件从PetaLinuximage / linux文件夹复制到sw_comp / src / a53 / image到system.bit ,bl31.elf,uboot.elf,zynqmp_fsbl(重命名为fsbl.elf)和pmufw.elf文件从PetaLinuximage / linux文件夹复制到sw_comp / src / boot以创建BIF:the_ROM_image:{[fsbl_config] a53_x64 [bootloader] [pmufw_image] [destination_device = pl] [destination_cpu = a53-0,exception_level = el-3,trustzone] [destination_cpu = a53-0,exception_level = el-2]}将linux.bif复制到sw_comp / src / boot。现在,在Vitis中创建一个新的平台项目,如下所示:这将在zcu104_base / export中创建平台。 4在Vitis中创建Linux映像。选择“从存储库中选择平台”,单击+图标,然后浏览至您的平台。创建新的应用程序:如您在此处看到的,“应用程序设置”默认情况下使用平台中的设置。选择“ EmptyApplication”模板,因为我们将创建自己的自定义应用程序。右键单击led_test应用程序下的src文件夹,然后选择“新建”。 -> “文件”以指定其文件名(.c),然后单击“完成”。现在,您可以将以下代码复制到其中。这是一个简单的UIO示例,可用于切换LED。 #include#include#include#include#include#defineGPIO_MAP_SIZE0x10000#defineGPIO_DATA0x00#defineGPIO_TRI0x04#defineLED_NUM256#defineLED_DELAY10000000intmain(intargc,char * argv []){intfd; char * uiod ='/ dev / uio0&“; void * volatileg volatilegpintDelay; (“ AXIGPIOUIOtest”。); //在用户空间中打开UIO设备文件以允许访问该设备fd = open(uiod,O_RDWR); if(fdprintf(“ InvalidUIOdevicefile:%s。”,uiod); return-1;} // mmapGPIOdeviceintouserspace = gmap_pt,NULL 4096,PROT_WRITE,MAP_SHARED,fd,0); if(gpio_ptr == MAP_FAILED){printf(“ Mmapcallfailure。”); return-1;} // setGPIO0将在GPIO上输出//请参见pg144forref *(((volatileunsigned *)(gpio_ptr + GPIO_TRI) ))= 0x0; //切换LEDwhile(1)(inti; unsignedcharled_pin = 0x0; for(i = 0; i *((volatileunsigned *)(gpio_ptr + GPIO_DATA))= led_pin; for(Delay = 0; Delay *(( volatileunsigned *)(gpio_ptr + GPIO_DATA))= 0x0; led_pin ++;}} //从用户空间munmap取消GPIO设备的映射(gpio_ptr,4096); return0;}选择系统项目,然后单击Hammer图标,这样就可以构建可执行文件并创建启动映像5在硬件中执行上述测试,将所有映像从led_app_systemDebugsd_card复制到SD卡,启动后,将自动加载SD卡。在此处执行Run led_app.elf,如下所示:同时,您仍然应该看到板上的LED闪烁。使用Ctrl + c取消。