手把手教你创建Linux设备驱动和应用程序

手把手教你创建Linux设备驱动和应用程序,第1张

通过前面两篇文章我们不仅创建的自定义IP模块还移植了Linux *** 作系统,今天这篇文章的内容是将这两部分联系起来,其实我们创建的myLed IP相对于Linux *** 作系统可以是它的一个底层设备,因为PS总线为myLed IP分配了寻址地址,这样我们就可以创建myLed IP模块的硬件驱动,然后搭建应用程序,实现软硬件协同设计。

当然开始之前还需要大家了解一下Linux驱动的基础知识,以及Makefile的用法。

步骤一:设置工作目录,创建Makefile

手把手教你创建Linux设备驱动和应用程序,手把手教你创建Linux设备驱动和应用程序,第2张


手把手教你创建Linux设备驱动和应用程序,连载三:创建Linux设备驱动和应用程序,第3张

 

我们先建立drivers的工作目录,并在此目录下编写好Makefile文件(如上图)。Makefile文件定义了编译规则,只需要使用make命令就可以实现整个工程的自动化编译。

步骤二:编写myLed模块驱动源文件

我们的要求是当这个模块加载后会在linux的/proc/目录创建一个可 *** 作的文件myled,通过向这个文件写入数据可以控制zybo板卡上led灯的亮灭状态(根据myLed IP功能逻辑相关)。

编写好的驱动程序myled.c链接:

步骤三:编译驱动程序,生成驱动模块

手把手教你创建Linux设备驱动和应用程序,连载三:创建Linux设备驱动和应用程序,第4张

 

直接使用make命令即可,但是注意make命令之前确保已经配置了交叉编译环境。生成的myLed.ko文件就是我们需要的驱动模块。

步骤四:修改设备树文件

手把手教你创建Linux设备驱动和应用程序,手把手教你创建Linux设备驱动和应用程序,第5张

 

从上图我们可以看到myLed模块的寻址空间为0x43c30000—0x43c3FFFF,因此我们要在设备数源码文件中加入这个设备节点。
 

手把手教你创建Linux设备驱动和应用程序,连载三:创建Linux设备驱动和应用程序,第6张

 

源码修改完成后我们要重新编译生成devicetree.dtb文件

步骤五:测试驱动模块

我们将驱动模块myLed.ko文件和修改后的devicetree.dtb文件拷贝到SD卡,重新让zybo以SD卡模式启动。

手把手教你创建Linux设备驱动和应用程序,连载三:创建Linux设备驱动和应用程序,第7张

 

通过insmod和rmmod命令我们可以加载和卸载驱动模块,加载myled.ko模块后我们可以看到在/proc/目录下可以看到myled文件,并且支持数据的读写 *** 作,说明驱动程序一切正常。

步骤六:创建应用程序led_blink.c

手把手教你创建Linux设备驱动和应用程序,连载三:创建Linux设备驱动和应用程序,第8张

 

在目录内创建user_app文件夹,然后创建led_blink.c程序。这个应用程序通过向/proc/myled文件分别写入0x0F和0x00数据实现四个Led灯的亮灭,达到闪烁的效果。

步骤七:编译应用程序

手把手教你创建Linux设备驱动和应用程序,连载三:创建Linux设备驱动和应用程序,第9张

 

编译方式我们同样采用Makefile方式,编译规则如上图所示,修改makefile

通过make命令生成了可执行应用程序led_blink。

步骤八:功能测试

我们需要将上一步中生成的led_blink拷贝到SD卡,然后zybo重新上电以SD卡模式启动
 

手把手教你创建Linux设备驱动和应用程序,连载三:创建Linux设备驱动和应用程序,第10张

 

启动完毕后我们手动挂载SD卡到/mnt/目录下,然后通过insmod myled.ko命令安装驱动模块,最后执行我们的应用程序(./led_blink),我们会看到zybo板卡上的四个led灯的闪烁状态。

至此zybo全栈开发入门教程也告一段落,Zynq开发方式不同于传统的FPGA或者ARM开发,它将两者友好的进行了结合,实现了软硬件协同设计。当然在实际的项目中工程量比较大也是需要进行任务分工的,本系列入门教程只是让大家对zynq全面的开发模式具有了一个了解,当然更深入的内容还需要各位亲自动手来体会。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2542088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-05
下一篇 2022-08-05

发表评论

登录后才能评论

评论列表(0条)

保存