热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux驱动移植之Makefile&Kconfig&defconfig的关系

向Linux系统中添加外设时,首先第一步即将外设的驱动代码porting,除了直接将外设的驱动源码放在相应目录,还需要编译进kernel,就需要使用到Makefile&Kconfig。

向Linux系统中添加外设时,首先第一步即将外设的驱动代码porting,除了直接将外设的驱动源码放在相应目录,还需要编译进kernel,就需要使用到Makefile &Kconfig。

以Led灯的驱动为例

1、一般将驱动文件保存在路径:Kernel/drivers/leds/leds-qpnp.c

如图所示:


2、在相同路径下存在Makefile和Kconfig文件(路径:Kernel/drivers/leds/)

Makefile和Kconfig存在系统中的多个子目录中,

xxx_defconfig:在android编译时生成.config文件,系统默认配置文件,里面全是CONFIG_XXXX构成

Kconfig:定义配置项(对xxx_defconfig文件中的配置进行定义)

.config:对配置项进行赋值(由xxx_defconfig文件在android编译时生成)

Makefile:建立配置项的生成法则

Linux的build系统就是通过Makefile将外设的驱动编译进kernel image;涉及到关键的一句makefile命令如下

obj-$( CONFIG_LEDS_QPNP ) += leds-qpnp.o;如果CONFIG_LEDS_QPNP )配置成y,则根据依赖关系生成目标文件leds-qpnp.o(添加新的驱动都可以照抄 obj-$( CONFIG_XXX ) += XX驱动源码文件名XX.o)

(具体的makefile 语法后续遇到再探讨,在/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。)


再看下同路径下的Kconfig文件,注意这里对应的项一定叫config LEDS_QPNP,与xxx_defconfig文件中的CONFIG_LEDS_QPNP 相对应。


Kconfig语法(kconfig的语法,在内核的开发文档中有详细的介绍,具体可以参看\Documentation\kbuild\kconfig-language.txt)
 menu/endmenu     生成一个菜单,以endmenu结束
 menuconfig       定义一个配置选项,在这个选项下面还有一个子菜单
 config           定义一个配置选项
 choice/endchoice 定义一个选择项

 source           调用子目录下的Kconfig,生成一个子菜单

 菜单属性:
 bool     y/n: 
 tristate y/n/M: M表示编译成模块

 string
 hex

 int

 配置选项之间的依赖关系:
 depend on:某选项依赖于另外一个选项生成
 select   :反向依赖关系,该选项选中时,同时选中select后面定义的那一项
 requie
 默认值: default(默认y/n/m等值)
 输入提示:prompt
 帮助信息:help

3、defconfig文件

在Makefile、Kconfig文件中添加了相关的编译命令还差最后一步就将外设的驱动移植进kernel,最后一步就是

修改 XXX_defconfig文件,将配置项打开。路径如下:Kernel/arch/arm64/configs


(第523行)

一般在/arm/configs/xxxxxx_defconfig目录下的文件是系统默认配置,android编译的时候会将这个文件生成.config文件,

当您编译内核时,将会读取.config文档,当发现CONFIG_LEDS_QPNP=y,系统在调用/driver/leds下的makefile 时,将会把 leds-qpnp.o 加入到内核中。即可达到编译的目的。


推荐阅读
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • DHCP三层交换机设置方式全局模式和接口模式设置方式和命令resetsave回车输入yreboot输入n输入y重启后就恢复默认设置了默认用户名密码adminAdmin@huawei ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文深入探讨了在Android应用开发中常见的相机连接故障问题,特别是在RK3288平台和Android 6.0系统上。通过分析具体案例,本文提供了详细的解决方案和应对策略,旨在帮助开发者有效解决相机连接问题,提升应用的稳定性和用户体验。 ... [详细]
  • 本文详细解析了神州数码DCRS5980交换机的基础配置流程和技术要点。首先,通过进入配置模式(`enable`),设置主机名(`hostname 5980`),并创建VLAN,逐步介绍了设备的初始设置步骤。此外,还涵盖了端口配置、IP地址分配及安全设置等关键环节,为用户提供了全面的配置指导。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 如何提高工程编译速度
    点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~     文章首发  公众号——Pou光明公众号还在维护,大家莫慌~LinuxQt平台为例测试编译 ... [详细]
  • MySQL 数据操作:增、删、查、改全面解析
    MySQL 数据操作:增、删、查、改全面解析 ... [详细]
  • CentOS 7上安装配置salt-api
    环境:CentOS7,已配置网络yum源安装salt-apisudoyuminstallsalt-api安装CherryPypipinstallChe ... [详细]
  • 在Android源码环境下编译系统App使用第三方jar包的方法(备忘)
    1将要使用的jar包放入App的根目录,即Android.mk所在目录2按如下方式编写Android.mk文件(########之间的行用于编译和使用jar包)LOCAL_PATH:$(ca ... [详细]
author-avatar
吟伶逸慧喜靖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有