Linux内核编程(八) 添加自定义目录驱动菜单 (Kconfig文件使用)

本文目录

  • 一、Linux 内核驱动目录
  • 二、自定义驱动的Kconfig编写
    • ●示例:在 drivers 菜单添加一个自己驱动的子菜单。
  • 三、自写驱动的Makefile编写
  • 四、总结

  

   一个Linux内核源码,其中包含了很多驱动程序,对应不同的功能。我们在编译内核时。如果将所有的驱动程序都编译进镜像文件中时,该镜像文件会占的内存很大。然而在公司企业中通常会使内核镜像占用内存空间尽可能的小,如裁剪掉不常用的功能,保留使用的功能即可。这时就需要菜单文件来进行选择裁剪。在linux中我们常用make menuconfig来进行图形化的方式来选择功能裁剪。完成裁剪后会生成.config文件来保存选择的配置信息。对于64位的arm架构,可以使用make menuconfig ARCH=arm64,32位的arm使用make menuconfig ARCH=arm
   源码树目录下一般都会有两个文件:Kconfig 和 Makefile。分布在各目录下的 Kconfig 构成了一个分布式的内核配置数据库,每个 Kconfig 分别描述了所属目录源文件相关的内核配置菜单。在内核配置 make menuconfig(或 xconfig 等)时,从 Kconfig 中读出配置菜单,用户配置完后保存到 .config (在顶层目录下生成) 中。 在内核编译时,主 Makefile 调用这个 .config ,就知道了用户对内核的配置情况。

在这里插入图片描述

一、Linux 内核驱动目录

   对于一个内核驱动程序,通常我们使用文件目录的形式在区分各个驱动程序。即不同的驱动程序对应不同的文件目录。定义目录位置:在内核源码的dirvers目录下。
  在dirvers目录下,包含Kconfig、Makefile、各类驱动程序目录。Kconfig 分别描述了所属目录源文件相关的内核配置菜单。 Makefile 为管理工程代码文件,决定哪些文件被编译,如何被编译,如何链接。每个驱动程序目录又包含其c文件、Kconfig、以及Makefile文件。
在这里插入图片描述
在这里插入图片描述

drivers目录下的Kconfig内容如下,这里包含了其目录下的各个驱动程序目录里的Kconfig文件。用于配置菜单。

在这里插入图片描述

二、自定义驱动的Kconfig编写

   Kconfig 就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改 Kconfig 来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的 Makefile。因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个):Kconfig、Makefile。要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

   一般一个 Kconfig 文件表示的就是一个菜单,一个菜单由多个菜单项组成,其格式如下:

menu "Device Drivers"//具体的子项菜单
config 自定义宏名1类型 "选项描述(菜单里显示的内容,提示字符串,用给人看的)"default n  //默认状态help帮助信息..........config 自定义宏名2类型 "选项描述(菜单里显示的内容,提示字符串,用给人看的)"default y  //默认状态help帮助信息..........endmenu

在这里插入图片描述

●示例:在 drivers 菜单添加一个自己驱动的子菜单。

(1)在drivers目录下新建自己驱动的文件夹:mkdir qjl

(2)进入自己驱动的文件夹,创建Kconfig文件。
在这里插入图片描述

(3)编写Kconfig文件。

menu "QJL_dirver"config QJL_KEYbool "qjl_key_driver"default y    //默认值helpthis is a key_dirver, user is qjl.config QJL_LEDbool "qjl_led_dirver"default n   //默认值helpthis is a led_dirver, user is qjl.config QJL_LED1tristate "led1_driver"  //添加了编译为模块的形式。depends on QJL_LED   //如果QJL_LED被选上,该选项才会出现。(依赖于QJL_LED )helpthis is a led1_dirver, user is qjl.endmenu

(4)在dirver目录下的Kconfig添加自定义子菜单的Kconfig路径。
在这里插入图片描述

(5)在源码主Makefile下配置菜单。使用:make meunconfig配置,配置完成后保存退出,生成.config配置文件。
在这里插入图片描述

(6)查看.config配置文件内容。

注意:y为编译进内核、n为不编译进内核、m为编译为模块。
在这里插入图片描述

三、自写驱动的Makefile编写

   章节二中我们已经配置好哪些驱动编译进内核,哪些驱动编译为模块。本章的Makefile 使用 .config 文件的宏来裁剪 C 代码,决定哪些 C 代码被编译。我们使用.config文件中的宏定义来编写Makefile文件,这里obj-y表示编译进内核,obj-m表示编译为模块。

目录如下:
在这里插入图片描述

该目录的Makefile内容如下:

obj-$(CONFIG_QJL_KEY)     +=key_dirver.o
obj-$(CONFIG_QJL_LED1)    +=led1_dirver.o

●重要:编写完成子目录下的Makefile后,需要在dirver目录下的Makefile中添加子目录路径。这样做的目的是为了在编译时会找到子目录中的Makefile文件,从而使用顶层Makefile进行编译。
在这里插入图片描述

四、总结

本文学习了如何添加自定义驱动菜单,步骤如下:

  1. 在dirver目录下新建自己的驱动文件夹,该文件夹包含Kconfig、Makefile以及自己的驱动程序文件。
  2. 编写Kconfig和Makefile文件。按如上内容编写。
  3. 将自己目录下的Kconfig文件路径添加至上层目录的Kconfig下。
  4. 将自己目录路径添加至上层目录的Makefile下。
  5. 在源码顶层Makefile目录下,使用make menuconfig ARCH=arm64进行配置的选择,最后保存并生成.config文件。
  6. 使用make进行源码编译。如果编译64位的arm芯片,则使用make ARCH=arm64,32位使用make ARCH=arm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3248216.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《TF2.x强化学习手册》P59-P65-SARSA-Q-learning

文章目录 实现SARSA算法和对应的强化学习智能体前期准备实现步骤工作原理初始化算法流程 构建基于Q学习的智能体前期准备实现步骤工作原理SARSA 算法的收敛性:SARSA 适合在线学习和真实系统:Q 学习算法的适用性: 实现SARSA算法和对应的强化学…

linux|多线程(一)

主要介绍了为什么要有线程 和线程的调用 和简单的对线程进行封装。 背景知识 a.重谈地址空间 我们知道物理内存的最小单元大小是4kB 物理内存是4G那么这样的单元友1M个 操作系统先描述再组织struct page[1M] 对于32位数据字长的机器,页表有2^32条也就是4G条&#…

随笔一、泰山派RK3566开发板调试串口波特率修改

摘要:立创泰山派RK3566开发板默认调试串口波特率是1500000bps,一般串口助手工具没有此波特率,为适应各种调试环境需要,打算修改调试串口波特率为115200bps 需要修改三个部分 1. uboot引导部分 修改tspi_linux_sdk/u-boot/config…

python数据可视化(10)——绘制地图图表

课程学习来源:b站up:【蚂蚁学python】 【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接:【链接】】 python:3.12.3 所有库都使用最新版。 Python绘制中国地图和城市图表 from pyech…

CSS技巧专栏:一日一例 7 - 纯CSS实现炫光边框按钮特效

CSS技巧专栏:一日一例 7 - 纯CSS实现炫光边框按钮特效 本例效果图 案例分析 相信你可能已经在网络见过类似这样的流光的按钮,在羡慕别人做的按钮这么酷的时候,你有没有扒一下它的源代码的冲动?或者你当时有点冲动,却…

[第一期]带日期时间的LED滚动广告屏美化

效果图&#xff1a; 源代码&#xff1a; <style type"text/css">.studytextgzbox {background: #F9F9F9; border: 1px solid #999999;margin: 1px;text-align:center; float: left;line-height: 28px;height: 28px;overflow: hidden;width: 236px; }.hulik…

最新电子书|使用Anybus网关,轻松实现工业设备互联

无论何时&#xff0c;确保多网络连接 工业网关的关键角色 工业网关&#xff0c;又称为协议网关、协议转换器或协议翻译器&#xff0c;是实现工业设备互联的最简捷方法。作为信息的翻译器&#xff0c;它们使得不同工业协议的设备、机器、系统或网络能够无缝交换数据&#xff0c…

数据架构新篇章:存算一体与存算分离的协同演进

数据架构新篇章&#xff1a;存算一体与存算分离的协同演进 前言被误解的存算分离存算一体的概念存算一体的过往存算一体的演进 存算分离的定义存算分离的过往存算分离的演进 存算一体和分离示例总结 前言 降本增效大环境下&#xff0c;存算分离架构如火如荼&#xff0c;Why&am…

【STC89C51单片机】定时器中断系统

中断概念 中断是一种重要的硬件机制&#xff0c;用于在处理器正在执行程序时&#xff0c;能够及时响应某些外部或内部事件。中断可以临时中止当前正在执行的指令序列&#xff0c;转而去执行专门的中断服务程序&#xff08;ISR&#xff0c;Interrupt Service Routine&#xff0…

Stable Diffusion:解锁AI绘画新纪元的保姆级入门指南

在这个数字艺术日新月异的时代&#xff0c;Stable Diffusion如同一股清新的风&#xff0c;吹散了传统绘画的界限&#xff0c;让每个人都能成为创意无限的数字艺术家。作为一款基于Transformer结构的文本到图像生成模型&#xff0c;Stable Diffusion以其惊人的生成速度、细腻的画…

ubuntu22.04 配置grpc(优化官方教程)

优化了官方教程&#xff0c;2024.7.17顺利打通。 一&#xff1a;添加环境变量 打开root文件夹下的 .bashrc 文件 编辑文件&#xff1a;滚动到文件的底部&#xff0c;然后添加以下行&#xff1a; export MY_INSTALL_DIR$HOME/.local mkdir -p "$MY_INSTALL_DIR" exp…

AMEYA360:思瑞浦推出汽车级理想二极管ORing控制器TPS65R01Q

聚焦高性能模拟芯片和嵌入式处理器的半导体供应商思瑞浦3PEAK(股票代码&#xff1a;688536)发布汽车级理想二极管ORing控制器TPS65R01Q。 TPS65R01Q拥有20mV正向调节功能&#xff0c;降低系统损耗。快速反向关断(Typ&#xff1a;0.39μs)&#xff0c;在电池反向和各种汽车电气瞬…

注册安全分析报告:东方航空

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

base SAS programming学习笔记13(Array)

1.Array array-name{dimension} <elements> array-name&#xff1a;向量名称 dimension&#xff1a;向量长度&#xff0c;默认为1&#xff1b; elements:列出变量名&#xff0c;变量名要么全是数值变量或者全是字符变量 array-name和variable不能相同&#xff1b;也不能和…

人工智能实训室的核心功能有哪些?

随着人工智能技术的飞速发展&#xff0c;其在各行各业的应用日益广泛&#xff0c;对高素质、高技能的人工智能人才需求也随之增加。唯众紧跟市场趋势&#xff0c;致力于建设高标准、高质量的人工智能实训室&#xff0c;以满足职业院校及企业对人工智能技术应用型人才的培养需求…

HarmonyOS NEXT学习——@BuilderParam装饰器

初步理解&#xff0c;相当于VUE的插槽slot Builder function overBuilder() {}Component struct Child {label: string ChildBuilder customBuilder() {}Builder customChangeThisBuilder() {}BuilderParam customBuilderParam: () > void this.customBuilder; // 使用自定…

数据结构(双向链表)

链表的分类 链表的结构⾮常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 x 2 x 2&#xff09;链表结构&#xff1a; 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&#xff1a;单链表和双向带头循环链表 1.⽆头单向⾮循环链表&#xff1a…

图论(一):速概览无向图有向图图的可视化路径问题

一、图论速概览 研究图的性质和图之间的关系节点和边组成&#xff0c;节点表示对象&#xff0c;边表示对象之间的关系无向图&#xff1a;边没有方向&#xff0c;节点之间的连接是双向的。常用于描述简单的关系&#xff0c;如社交网络中的朋友关系。根据边有无权重分为无权重无…

工业控制:CANOpen(控制器局域网络)协议快速学习

文章目录 背景协议介绍CAN总线协议CANOpen协议介绍CANOpen诞生背景CANOpen的对象字典 CANOpen的服务数据对象&#xff08;SDO&#xff09; 参考附录问题CAN总线竞争原理在CAN协议中&#xff0c;帧中的ID是发送者的ID还是接收者的ID&#xff1f; 背景 目前很多CANOpen介绍的文章…

【操作系统】文件管理——文件存储空间管理(个人笔记)

学习日期&#xff1a;2024.7.17 内容摘要&#xff1a;文件存储空间管理、文件的基本操作 在上一章中&#xff0c;我们学习了文件物理结构的管理&#xff0c;重点学习了操作系统是如何实现逻辑结构到物理结构的映射&#xff0c;这显然是针对已经存储了文件的磁盘块的&#xff0…