Linux下将驱动编译进内核

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

config UART_LEDtristate "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.rhkb.cn/news/158078.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】9. 回文数

1 问题 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文&…

【计算机网络】IP协议详解

文章目录 一、引入 二、简单认识IP协议 2、1 IP协议基本概念 2、2 IP协议报文格式 2、3 分片与组装 2、3、1 MTU 与 MSS 2、4 网段划分 2、4、1 简单理解路由 2、4、2 IP地址 2、4、3 IP地址的划分 2、4、4 CIDR(无类别域间路由) 2、4、5 特殊的IP地址 …

Redis微服务架构

Redis微服务架构 缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去…

【Nginx32】Nginx学习:随机索引、真实IP处理与来源处理模块

Nginx学习:随机索引、真实IP处理与来源处理模块 完成了代理这个大模块的学习,我们继续其它 Nginx 中 HTTP 相关的模块学习。今天的内容都比较简单,不过最后的来源处理非常有用,可以帮我们解决外链问题。另外两个其实大家了解一下就…

Java IO流

IO 即 Input / Output ,输入输出流。IO流在Java中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。 Java IO 流的 40 多个类都是从如下 4 个 抽象类基类中派生出来的。 InputStream /Reader : 所有的输入流的基类,前者是字节…

大数据flink篇之三-flink运行环境安装(一)单机Standalone安装

一、安装包下载地址 https://archive.apache.org/dist/flink/flink-1.15.0/ 二、安装配置流程 前提基础:Centos环境(建议7以上) 安装命令: 解压:tar -zxvf flink-xxxx.tar.gz 修改配置conf/flink-conf.yaml&#xff1…

IDEA通过Docker插件部署SpringBoot项目

1、配置Docker远程连接端口 找到并编辑服务器上的docker.service文件。 vim /usr/lib/systemd/system/docker.service在下面ExecStart替换成下面的 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock2.重启docker systemctl daemon-reload s…

交叉熵Loss多分类问题实战(手写数字)

1、import所需要的torch库和包 2、加载mnist手写数字数据集,划分训练集和测试集,转化数据格式,batch_size设置为200 3、定义三层线性网络参数w,b,设置求导信息 4、初始化参数,这一步比较关键,…

强化学习(Reinforcement Learning)与策略梯度(Policy Gradient)

写在前面:本篇博文的内容来自李宏毅机器学习课程与自己的理解,同时还参考了一些其他博客(懒得放链接)。博文的内容主要用于自己学习与记录。 1 强化学习的基本框架 强化学习(Reinforcement Learning, RL)主要由智能体(Agent/Actor)、环境(Environment)、…

【学习笔记】项目进行过程中遇到有关composer的问题

composer.json内容详解 以项目中的composer.json为例,参考文档。 name:composer包名type:包的类型,project和library两种keywords:关键词,方便别人在安装时通过关键词检索(没试过,好…

《C++ Primer》练习9.52:使用栈实现四则运算

栈可以用来使用四则运算,是一个稍微有点复杂的题目,去学习了一下用栈实现四则运算的原理,用C实现了一下。首先要把常见的中缀表达式改成后缀表达式,然后通过后缀表达式计算,具体的原理可以参考这位博主的文章&#xff…

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度

抖音直播招聘报白是指进入抖音的白名单,允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台,但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示,留存联系方式更加精…

到底什么是5G-R?

近日,工信部向中国国家铁路集团有限公司(以下简称“国铁集团”)批复5G-R试验频率的消息,引起了行业内的广泛关注。 究竟什么是5G-R?为什么工信部会在此时批复5G-R的试验频率? 今天,小枣君就通过…

公司文件防泄密软件——「天锐绿盾」@德人合科技

天锐绿盾是一款企业级数据安全解决方案,主要用于保护企业的知识产权、客户资料、财务数据、技术图纸、应用系统等机密信息化数据不外泄。 PC访问地址: 🔗isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 该软件解决方案…

vue单页面应用使用 history模式路由时刷新页面404的一种可能性

原先使用的是 hash模式路由,因为要结合qiankun进行微前端改造,改成了 history模式,结果页面刷新之后没有正确渲染组件。按照一般思路检查 nginx配置 try_files $uri $uri/ /index.html;也配置上了,还是有问题。 页面异常显示 问题…

电脑重做系统---win10

电脑重做系统---win10 前言制作启动U盘材料方法打开网址下载启动盘制作工具参照官方说明进行制作使用U盘重做系统 常用软件官网地址 前言 记得最早学习装电脑还是04年左右,最为一个啥也不知道的大一傻白胖,花了几百大洋在电脑版把了个“电脑组装与维修”…

使用 KubeSkoop exporter 监测和定位容器网络抖动问题

作者:遐宇、溪恒 本文是 8 月 17 日直播的文字稿整理,文末可观看直播回放。除去文章内容外,还包括针对实际网络问题的实战环节。 容器网络抖动问题发生频率低,时间短,是网络问题中最难定位和解决的问题之一。 不仅如…

CVE-2017-15715 apache换行解析文件上传漏洞

影响范围 httpd 2.4.0~2.4.29 复现环境 vulhub/httpd/CVE-2017-15715 docker-compose 漏洞原理 在apache2的配置文件: /etc/apache2/conf-available/docker-php.conf 中,php的文件匹配以正则形式表达 ".php$"的正则匹配模式意味着以.ph…

见微知著:从企业售后技术支持看云计算发展

作者:余凯 售后业务中的细微变化 作为阿里云企业容器技术支持的一员,每天会面对全球各地企业级客户提出的关于容器的各种问题,通过这几年的技术支持的经历,逐步发现容器问题客户的一些惯性,哪些是重度用户&#xff0…

将Excel表中数据导入MySQL数据库

1、准备好Excel表: 2、数据库建表case2 字段信息与表格对应建表: 3、实现代码 import pymysql import pandas as pd import openpyxl 从excel表里读取数据后,再存入到mysql数据库。 需要安装openpyxl pip install openpyxl# 读入数据&#x…