热门标签 | 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 加入到内核中。即可达到编译的目的。


推荐阅读
  • 这个报错出现在userDao里面,sessionfactory没有注入。解决办法:spring整合Hibernate使用test测试时要把spring.xml和spring-hib ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 华为交换机VLAN间通信配置指南
    本文详细介绍了如何在华为交换机上配置VLAN间的通信,包括VLAN的创建、VLAN接口的配置以及Trunk和Access端口的设置。通过具体步骤指导读者完成网络配置,确保不同VLAN之间的设备能够互相访问。 ... [详细]
  • 本文讨论了在处理分页数据时常见的低级错误,并提供了优化后的代码示例,以减少重复代码并提高可读性和维护性。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • 本文介绍了JSP的基本概念、常用标签及其功能,并通过示例详细说明了如何在JSP页面中使用Java代码。 ... [详细]
  • 本文主要解决了在编译CM10.2时出现的关于Samsung Exynos 4 HDMI HAL库中SecHdmiV4L2Utils.cpp文件的编译错误。 ... [详细]
  • 本教程旨在指导开发者如何在Android应用中通过ViewPager组件实现图片轮播功能,适用于初学者和有一定经验的开发者,帮助提升应用的视觉吸引力。 ... [详细]
  • 本文提供了一个Android应用中用于抓取网页信息并下载图片的示例代码。通过该代码,开发者可以轻松实现从指定URL获取网页内容及其中的图片资源。 ... [详细]
  • 本文将指导你如何通过自定义配置,使 Windows Terminal 中的 PowerShell 7 更加高效且美观。我们将移除默认的广告和提示符,设置快捷键,并添加实用的别名和功能。 ... [详细]
  • 深入解析 Zend Guard 4 功能与配置
    本文旨在通过图文并茂的方式详细介绍 Zend Guard 4 的核心功能及其配置方法,特别适合英文阅读能力有限的技术人员。文中不仅提供了详细的步骤说明,还附带了实际操作中的注意事项,帮助读者更好地理解和应用这一工具。 ... [详细]
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社区 版权所有