小言_互联网的博客

Linux——Linux驱动之Makefile编译总结(编译器路径设置、编译流程分析、编译试验测试)

552人阅读  评论(0)

目录

0 引言

1 编译器路径设置

2 Makefile编译文件

3 Linux内核编译流程分析

4 编译试验测试

5 小结


0 引言

在之前的Linux最简驱动的实现中简要的写了一个Makefile文件,本博文对Makefile编译中涉及的编译器路径设置,Makefile编译文件,内核编译流程等进行系统的总结,最后会有简单的测试试验。

1 编译器路径设置

获取Linux源码后,一般需要自己设置一下编译器的路径,在源码目录下的Makefile文件中,设置CROSS_COMPILE变量,这个变量的值就是编译器的路径,编译的时候也是根据这个路径去找编译器的。我们在之前的搭建嵌入Linux开发环境博文中,也提到过安装交叉编译器,我们这里设置的变量值就是和安装的位置对应的。

2 Makefile编译文件

1)强制编译

强制编译就是,源码开发者强制要求编译进内核的文件。我们看下drivers目录下的Makefile文件,注意:

  • obj-y   += gpio/表示强制编译gpio目录下的

2)配置编译

配置编译,是驱动开发人员可以通过配置选择编译,演示如上,就不赘述了,注意:

  • obj-$(CONFIG_PCI) 表示定义了CONFIG_PCI宏变量的话就会编译

3)依赖编译

依赖编译,是指一个驱动的编译是需要另外其他驱动的支持,这部分不需要写额外的编译脚本,只需要在Kconfig中配置即可,如显卡驱动VIDEO_JPEG_V2X中需要MEDIA_SUPPORT等驱动,那么编译VIDEO_JPEG_V2X时就需要把依赖的驱动选择上。

3 Linux内核编译流程分析

我们前面讲了make menuconfig命令、Menuconfig、Kconfig、.config文件、Makefile文件、make命令、源码、编译工具等,这么多的名词,现在是不是还有想糊涂?他们之间的关系又是什么样的呢?大体上分以下几步:

1)make menuconfig命令:执行后在Menuconfig可视化界面配置宏定义,scripts工具分析各级目录的Kconfig配置文件,其中也有源码内的Kconfig,共同形成了Menuconfig的各级目录;

2)开发人员根据需要进行宏变量的配置,是否进行编译,然后生成.config文件;

3)再通过make命令,调用makefile,生成二进制的镜像文件。

4 编译试验测试

测试下将LED驱动不编译进内核,因为用的开发板原来已经直接将LED驱动编译进去了,这里演示如何将LED驱动不编译进内核。

1)打开内核目录下的.config文件,查看当前LED驱动是已经被编译进去的,CONFIG_LEDS_CTL=y。

2)查看drivers/char目录下的Kconfig,可以看到已经加了LED驱动在menuconfig界面能显示的目录,默认是配置编译状态。

3)make menuconfig进入配置界面,取消LED驱动的编译配置。

4)编译生成二进制镜像文件zImage

5)连接开发板,先查看LED的驱动,目前是有的:

6)OTG烧录镜像文件,可以回顾之前的博客,这里没有之前那么复杂,因为其他的uboot和文件系统不动,只烧写zImage即可。

 

【小插曲1】几天不用SSH了,一连接就出现这问题,开始以为虚拟机出问题了,最后重启的电脑才OK的~~

  • service ssh status 查看状态,都正常
  • service ssh restart  重启也不行

【小插曲2】:很久不刷开发板了,结果OTG刷的时候,发现电脑无法识别Android设备,没有驱动了,最后使用驱动精灵安装的,这个方法比较好用:

  • 先安装驱动精灵;
  • 插好串口线和OTG线;
  • 超级终端控制开发板进入uboot模式;
  • 驱动精灵检测,识别未安装的驱动,安装即可。

5 小结

本博文总结了Makefile编译路径设置、编译流程分析和编译的在开发板试验测试,嵌入式开发就是个不断练习的过程,开发中我们会遇到各种各样的问题,能精准定位、快速解决,你就已经具备了不错的能力基础了,加油!

 

作于202105261150,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!


转载:https://blog.csdn.net/w464960660/article/details/117262425
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场