Linux下将驱动编译进内核

news2024/11/23 15:47:16

在开发的过程中,一般都是将驱动编译成模块,然后将其发送到开发板加载驱动进行功能验证,驱动的功能验证没有问题后就可以将其编译进内核了。本文将介绍如何把上一篇文章Linux下设备树、pinctrl和gpio子系统、LED灯驱动实验中的LED驱动编译到内核。
首先在Linux内核的/drivers/目录下创建一个文件夹,用来存放自定义的驱动文件,我这里新建的文件夹是/mydrivers,其绝对路径是/…/…/drivers/,然后将要编译进内核的c代码(这里以uart_led.c为例)拷贝到/mydrivers文件夹下。
在/mydrivers文件夹下创建一个名为Kconfig的文件,在Kconfig文件中键入如下内容。

config UART_LED
    tristate "uart_led"  
    help
This module will be compiled into kernel and light the uart led.

UART_LED和Makefile中引用的要保持一致,Makefile中会在前面加上CONFIG_。
tristate可以把驱动编译成3种状态,即编译进内核、不编译进内核、编译成模块。如果是bool关键字,则不能编译成模块。
help是帮助信息,下面的一句话就是帮助信息的内容。
同样地,在/mydrivers文件夹下创建一个名为Makefile的文件,在Makefile文件中键入如下内容。

obj-$(CONFIG_UART_LED)+=uart_led.o

UART_LED要和Kconfig中的保持一致,uart_led.o这里的名字和.c文件的命名要一致。
接下来进入到上一级目录,也就是/drivers/目录下,打开Kconfig文件,在里面添加下面的代码。

source "drivers/mydrivers/Kconfig"

上面的代码表示把自己创建的Kconfig文件链接到内核中已经有的,指明了Kconfig的路径,这样内核就可以一层一层的编译到我们自己创建的。
打开/drivers/目录下的Makefile文件,在里面添加下面的代码。

obj-y += mydrivers/

这里添加的是自定义文件夹的名字,不要少了最后的“/”,表示把这个文件夹编译进内核。
当然也可以将.c文件拷贝到/drivers/下的某个文件夹中,比如字符文件夹/char目录下,然后就不用再新建Kconfig和Makefile文件,直接在/char下的Kconfig和Makefile文件中追加内容就可以了。
在这里插入图片描述
不过还是建议自己新建一个文件夹,将自行新建的文件放到里面,这样就能确保尽可能少的改动Linux内核的原有文件。
以上这些工作完成以后,在Linux内核第一级目录下使用make menuconfig命令打开图形化界面进行相关配置。
在这里插入图片描述
前面括号里是星号的表示要编译进内核,括号为空的表示不编译进内核,括号为M的表示编译为模块。
移动到“Device Drivers —>”选项后按回车,进入下面的界面。
在这里插入图片描述
新加的这个驱动就出现在第一个位置,选中uart_led这一项按“Y”键将其选中,前面括号里出现了星号,表示要编译进内核。
按“?”打开帮助,其描述如下,这些内容就是在Kconfig文件中描述的信息。
在这里插入图片描述
退出当前界面,移动到最下面一栏,选择Save保存,弹出下面的界面,选择OK。
在这里插入图片描述
在Linux内核第一级目录下使用ls -a命令就可以看到所有文件,包括隐藏文件,这里的.config文件就是隐藏文件,如下图所示。
在这里插入图片描述
打开该文件,使用下面的命令查找我们刚才添加的设备驱动有没有保存在该文件中。

/CONFIG_UART_LED

如下图,新添加的这个设备=y就说明成功将这个驱动添加到内核中了。
在这里插入图片描述
确定设备添加到内核中后就使用下面的命令编译出内核镜像文件zImage。

make zImage -j16

-j参数是为了加快编译的速度,zImage编译完成后如下图所示。
在这里插入图片描述
镜像编译完成后在新建的/drivers/目录下就多了下面的两个.o文件。
在这里插入图片描述
将/arch/arm/boot/zImage发送到tftp文件夹里,然后启动开发板,查看开机打印信息如下图所示。
在这里插入图片描述
这些信息和加载驱动模块时打印的消息是一样的,如下图所示。
在这里插入图片描述
/dev/目录下也有一个名为/gpioled的文件。
在这里插入图片描述
再看一下开发板的物理表现,在内核启动的过程中,这个LED就被点亮了,如下图所示。
在这里插入图片描述
这就说明驱动编译进内核成功了!LED的亮灭也可以通过文章Linux下设备树、pinctrl和gpio子系统、LED灯驱动实验中的测试代码编译出的文件控制。


本文参考文章:
通俗易懂:把驱动编译进内核

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

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

相关文章

[题] 前缀和 (含输入输出的耗时对比)

题目 前缀和 题解 前缀和模板 太简单了就多加了点东西:对比cin cout和scanf printf的耗时对比 代码 #include <iostream> using namespace std; const int N 100010; int n, m; int a[N], s[N]; int main(){scanf("%d%d", &n, &m);//原数组 for (in…

CentOS 挂载新磁盘以及磁盘扩容操作教程

1.搭载新加磁盘 # 查看磁盘 fdisk -l #新盘&#xff08;/dev/sdb&#xff09;创建分区 #虚拟机 fdisk /dev/sdb #阿里云 fdisk /dev/vdb #创建/dev/sdb1为新的PV&#xff08;物理卷&#xff09; 【创建物理卷命令】 #虚拟机 pvcreate /dev/sdb1 #阿里云 pvcreate /dev/vdb1 查…

Air001 ADC内部输入通道温度传感器读取

Air001 ADC内部输入通道温度传感器读取 &#x1f4cb;Air001 内部集成的温度传感器说明 &#x1f58d;温度传感器产生一个随温度线性变化的电压。温度传感器在内部被连接到ADC内部的输入通道上&#xff0c;用于将传感器的输出转换成数字数值。 &#x1f4d3;Air001模拟/ 数字转…

CANdb++数据库操作

CANdb数据库操作 创建工程结构文件夹新建数据库&总线描述节点设置节点创建配置Message属性信号设置节点收发信号 环境变量配置一致性检验数据库工程XVehicle.dbc导入工程文件总结 创建工程结构文件夹 在文件夹X-Vehicle-1下&#xff0c;建立工程目录文件夹CANdb&#xff0…

优雅而高效的JavaScript——模板字面量

&#x1f928;博主&#xff1a;小猫娃来啦 &#x1f928;文章核心&#xff1a;优雅而高效的JavaScript——模板字面量 文章目录 什么是模板字面量使用模板字面量插入变量处理多文本模板字面量的高级应用标签模板字量自定义模板字面量函数 常见应用场景拼接字符串HTML模板SQL查询…

【LeetCode热题100】--347.前K个高频元素

347.前K个高频元素 方法&#xff1a;堆 首先遍历整个数组&#xff0c;并使用哈希表记录每个数字出现的次数&#xff0c;并形成一个「出现次数数组」。找出原数组的前 k 个高频元素&#xff0c;就相当于找出「出现次数数组」的前 k 大的值 利用堆的思想&#xff1a;建立一个小…

tomcat多实例部署jenkins

tomcat多实例部署jenkins 文章目录 tomcat多实例部署jenkins1.简介&#xff1a;2.优缺点&#xff1a;3.工作原理&#xff1a;4.工作流程&#xff1a;5.tomcat多实例部署jenkins流程5.1.环境说明5.2.部署前准备工作5.3.多实例部署tomcat5.4.部署jenkins5.5.创建一个jenkins项目5…

乐高Studio打开Solidworks零件/装配体 (sw另存obj文件)

solidworks 2020 Lego studio / part designer 截至2023-10-13&#x1f382;最新版 文章目录 操作步骤1&#xff09; solidworks 开启 ScanTo3D 功能2&#xff09; 零件 / 装配体 保存至stl格式文件3&#xff09; 以SanTo3D网格文件方式打开stl4&#xff09; 将打开的stl另存为…

销毁二叉树

同样是利用递归的方法——后序遍历 void TreeDestroy(BTNode* root) {if (root NULL){return 0;}TreeDestroy(root->left);TreeDestroy(root->right);free(root);}

React18入门(第四篇)——React中的4种CSS使用方式,CSS Module、CSS-in-Js详解

文章目录 一、普通方式使用CSS1.1 元素内联 style1.2 引入 CSS 文件1.3 类名插件 -- Classnames1.4 注意事项 二、CSS Module2.1 普通 CSS 的问题2.2 CSS Module 的特点2.3 简单使用 三、使用 sass3.1 sass 简介3.2 使用 四、CSS-in-JS4.1 CSS-in-JS 简介4.2 CSS-in-JS 常用工具…

计算机网络 实验七 NAT 和 DHCP 实验

实验目的&#xff1a; 1. 掌握NAT技术的基本原理&#xff0c;熟悉NAT基本配置。 2. 掌握DHCP协议的基本原理&#xff0c;熟悉配置DHCP服务器和中继。 实验过程分析&#xff1a; Nat基本配置 分别写出实验步骤中3&#xff09;、4&#xff09;、6&#xff09;的连通性情况&…

怎样学习C#上位机编程?

怎样学习C#上位机编程&#xff1f; 00001. 掌握C#编程和.NET框架基础。 00002. 学WinForm应用开发&#xff0c;了解控件使用和事件编程。 00003. 熟悉基本数据结构和算法&#xff0c;如链表、栈、队列。 00004. 理解串口通信协议和方法&#xff0c;用于与硬件交互。 00005…

SLAM从入门到精通(数据回放工具之rosbag)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了hector-slam、gmapping slam两种slam方法。当时我们操作的时候&#xff0c;是通过手动操作的方法来建图的。但是这里面可能存在一个…

统信UOS 1060系统新增备份

原文链接&#xff1a;统信UOS 1060系统新增备份 hello&#xff0c;大家好啊&#xff0c;今天给大家带来关于统信UOS 1060系统备份还原的系列内容的第二篇文章&#xff0c;系统新增备份&#xff0c;我们可以将系统新增备份到u盘中&#xff0c;后面需要的话&#xff0c;可以进行还…

Raven2靶机渗透

1. 信息收集 1.1 主机探测 sudo arp-scan -l1.2 端口扫描 nmap -p- -A 192.168.16.185开放了80端口&#xff0c;尝试登录网址查看信息&#xff0c;通过浏览器插件找出指纹 1.3 目录扫描 访问登录界面&#xff0c;发现remember Me怀疑是shiro界面 登录/vendor/界面&#xff0…

springboot中如何进行测试用例数据的随机设定

测试用例数据设定 测试用例数据通常采用随机值进行测试&#xff0c;使用SpringBoot提供的随机数为其赋值 1.在application.yml中设置随机值 testcast:book:id: ${random.int} # 随机整数id2: ${random.int(10)} # 10以内随机数type: ${random.int(10,20)} # …

谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)rust解法

有一个5*5的网格&#xff0c;其中恰好有一个格子是空的&#xff0c;其他格子各有一个字母。一共有4种指令&#xff1a;A, B, L, R&#xff0c;分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列&#xff08;以数字0结束&#xff09;&#xff0c;输出指…

模板进阶和反向迭代器

文章目录 模板非类型模板参数模板特化函数模板特化类模板特化 模板分离编译 反向迭代器 模板 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c…

黑龙江省人口与社会经济数据集(2015-2016年)

摘要 a. 数据内容&#xff08;数据文件/表名称&#xff0c;包含的观测指标内容&#xff09; 黑龙江省人口与社会经济数据集&#xff08;2015-2016年&#xff09;反映了黑龙江省社会经济、人口和劳动力、农业生产、金融、旅游、卫生、教育、社会保障等情况&#xff0c;包含年末…