【Linux】驱动的基本架构和编译

news2024/11/17 14:18:04

驱动源码

/*
 *  Silicon Integrated Co., Ltd haptic sih688x haptic driver file
 *
 *  Copyright (c) 2021 kugua <daokuan.zhu@si-in.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation
 */

#include <linux/init.h>  //包含宏定义的头文件
#include <linux/module.h>   //包含初始化加载模块的头文件

static int __init haptics_init(void)
{
	//内核层只能使用printk,不能使用printf
    	printk(KERN_EMERG "[ KERN_EMERG ]  Haptics Init\n"); //输出等级为0
    	printk("[ default ]  Haptics Init\n");
    	return 0;
}

static void __exit haptics_exit(void)
{
	printk(KERN_EMERG "[ KERN_EMERG ]  Haptics Exit\n"); //输出等级为0
	printk("[ default ]   Haptics Exit\n");
}

module_init(haptics_init);//驱动入口
module_exit(haptics_exit);//驱动出口

MODULE_AUTHOR("<daokuan.zhug@si-in.com>");//声明作者信息
MODULE_DESCRIPTION("Haptic Driver V1.0.0"); //对这个模块作一个简单的描述
MODULE_LICENSE("GPL v2");//声明开源许可证
			 // "GPL" 是指明 这是GNU General Public License的任意版本
                         // “GPL v2” 是指明 这仅声明为GPL的第二版本
  • linux驱动基本框架就是包含入口函数和出口函数,加载驱动时会运行入口函数,卸载驱动时会运行出口函数。
  • 入口函数的作用是加载驱动时做一些初始化工作,比如注册设备、申请设备号、生成设备节点等,上文代码中这些都还没有实现。
  • 出口函数的作用是卸载驱动时做一些善后操作,比如注销设备、注销设备号、注销类等。
  • 在内核态下的打印函数是“printk”函数。KERN_EMERG是打印优先级,这里采用了最高优先级。

一般情况下,驱动源码会放在kernel/drivers,里面会有很多文件夹存放不同的驱动代码,我们自己的驱动需要新建一个目录。

在这里插入图片描述

Kconfig文件

这个文件时用来对内核进行配置的,当执行make arch=ARM64 menuconfig指令的时候,这个文件就被解析。该文件和源码文件在同一目录下,文件内容可如下:

menu "haptics driver"

config HAPTICS
tristate "haptics driver"
help
  just a simplest driver.
default y

endmenu
#endmenu后一定要加空行
  • 第一行内容表示菜单名
  • 第二行内容config HAPTICS,在执行配置的时候,将会生成一个变量 CONFIG_HAPTICS,而这个变量,将会在编译的时候,被 Makefile 引用。
  • 第三行内容tristate声明选项的类型,"haptics driver"声明选项的名称
  • 第四行内容表示帮助信息
  • 第五行的 default y ,就表示把 CONFIG_HAPTICS 的值设置成 y,从而让这个驱动被编译到内核中。
  • 第六行是结束菜单
  • 第七行是需要加的空行

其中第三行内容的选项支持tristatebool

tristate支持三个选项:

  • < >不编译
  • <*>编译到内核
  • 编译成模块

bool支持两个选项:

  • < >不编译
  • <*>编译到内核

这个在菜单配置时我们会碰到。

现在,haptics驱动中的KConfig配置文件已经准备好了,但是还需要这个配置文件登记到 Linux内核的整体配置文件中。也就是把它登记到kernel/drivers/Kconfig 文件的末尾:

source "drivers/haptics/Kconfig"

endmenu // 加在这一句的上面

然后在kernel目录下执行make ARCH=arm64 menuconfig命令,

在这里插入图片描述

在这里插入图片描述

我们可以看到haptics driver前面显示的是星号*,这表示:该驱动将会编译进内核。我们可以按下空格键切换标记。M标记意思是编译成驱动模块。

我们暂时先选择星号编译进内核,其他的选项后续再介绍。最后选择save即可。

有一点需要注意的,如果Kconfig是在Windows系统上编辑的然后放在开发服务器中,我们会发现报警了

zhudk@vm1:/expand/zhudk/rk3588_9tripod/x3588_linux_20220620/kernel$ make ARCH=arm64 menuconfig
'rivers/haptics/Kconfig:1:warning: ignoring unsupported character '
'rivers/haptics/Kconfig:2:warning: ignoring unsupported character '
'rivers/haptics/Kconfig:3:warning: ignoring unsupported character '
'rivers/haptics/Kconfig:5:warning: ignoring unsupported character '
'rivers/haptics/Kconfig:6:warning: ignoring unsupported character '

这是因为在Windows和Linux系统中,存在换行符的差异。这个小问题可以自行解决。

Makefile文件

Makefile文件是make工具的脚本,也是和源码放在同一目录下,其内容只有一行。

obj-$(CONFIG_HAPTICS) += haptics.o
  • CONFIG_HAPTICS可以看做一个变量,在编译的时候,这个变量的值可能是:y, n 或者 m。
  • 在刚才的 Kconfig 参数配置中,CONFIG_HAPTICS被设置为 y,于是这句话就被翻译成: obj-y += haptics,表示把 haptics驱动编译进内核。

现在,haptics驱动程序的Makefile已经创建好了,我们还要让linux内核的编译框架知道这个文件才行。在文件kernel/drivers/Makefile 中的末尾,添加如下内容:

obj-$(CONFIG_HAPTICS)           += haptics/

编译进内核

在这里插入图片描述

现在,整个准备工作已经做好了,只需编译即可。因为本篇教程是基于ARM开发板的,所以使用开发板中SDK的编译脚本进行内核编译。

./build.sh kernel

然后将编译的镜像文件烧录至开发板中,关于编译烧录等可参考【rk3588】环境搭建及系统编译_rk3588 arm64-CSDN博客。在启动日志中,我们可以看到如下信息:

在这里插入图片描述

这个正好是我们在驱动入口函数中的打印信息,所以也证明了我们的驱动程序编译进内核并且正常运行了。

编译为驱动模块

上文我们介绍的是将驱动编译进内核,如果需要编译为驱动模块,直接在Kconfig文件中将default y修改为default m。然后执行

./build.sh modules

表示编译内核模块,也仅仅编译设置为模块的驱动,然后会在驱动目录下生成haptics.ko文件。这个文件需要我们手动安装卸载,但首先得发送到开发板上。

在这里插入图片描述

总结

驱动的编译分为两种方式:

编译进内核:

  • Kconfig文件中配置为default y
  • 执行./build.sh kernel指令进行编译
  • 上述指令是编译整个内核,编译后将镜像文件烧录至开发板,驱动会自动加载

编译为模块:

  • Kconfig文件中配置为default m
  • 执行./build.sh modules指令进行编译
  • 上述指令是编译驱动模块,编译结果只有.ko文件,需要上传至开发板手动加载(开发板提前烧录好不含驱动的镜像)

这两种方式具体使用哪一个呢,需要视具体情况。但是好像可以不需要使用界面配置,还是直接修改配置文件比较方便。

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

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

相关文章

python基础库

文章目录 1.研究目的2.platform库介绍3.代码4.结果展示 1.研究目的 最近项目中需要利用python获取计算机硬件的一些基本信息,查阅资料,.于是写下这篇简短的博客,有问题烦请提出,谢谢-_- 2.platform库介绍 platform 库是 Python 的一个内置库&#xff0c;可以让我们轻松地获取…

京东面试:RR隔离mysql如何实现?什么情况RR不能解决幻读?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈&#xff1a;mysql 事务隔离的底层原理&#xff1…

Cilium + ebpf 系列文章- (七)Cilium-BGP-自定义定时器-ebgp多跳-优雅重启-MD5加密-传播团体字

一、自定义定时器 这里指的是自定义: Keepalive Interval: 缺省值为30秒。Keepalive用于维护邻居关系&#xff0c;如果在协商的保持时间内没有收到Keepalive消息&#xff0c;则BGP将断开邻居连接。 Hold Time:缺省值是Keepalive时间的3倍&#xff0c;即90秒。这是BGP在关闭连…

spark计算引擎-架构和应用

一Spark 定义&#xff1a;Spark 是一个开源的分布式计算系统&#xff0c;它提供了一个快速且通用的集群计算平台。Spark 被设计用来处理大规模数据集&#xff0c;并且支持多种数据处理任务&#xff0c;包括批处理、交互式查询、机器学习、图形处理和流处理。 核心架构&#x…

c++九月27日

1.顺序表 #ifndef ARRAYLIST_H #define ARRAYLIST_H#include <iostream> #include <stdexcept>template <typename T> class ArrayList { private:T* data; // 存储数据的数组int capacity; // 数组容量int size; // 当前元素数量publ…

【linux】基础IO(下)

8. 理解文件系统 8.1. 认识硬件 --- 磁盘 唯一的机械设备&#xff0c;也是一个外设 注意&#xff1a; 磁头是一面一个&#xff0c;磁头和盘面不接触在软件设计上&#xff0c;设计者会有意识地将相关数据放在一起一般来说&#xff0c;运动越少&#xff0c;效率越高&#xff1…

vue单点登录异步执行请求https://xxx.com获取并处理数据

一、请求一个加密地址获取access_token再拼接字符串再次请求 接口返回数据 异步执行请求该地址获取数据并处理 二、请求代码第二步使用 access_token 获取 auth_key // 第二步&#xff1a;使用 access_token 获取 auth_keyconst access_token tokenData.access_token;const …

什么是NAND Flash?

什么是NAND Flash? NAND闪存是一种非易失性存储器技术&#xff0c;它彻底改变了数字时代的数据存储。它是闪存的一种形式&#xff0c;这意味着它可以被电擦除和重新编程。NAND闪存以NAND&#xff08;NOT-AND&#xff09;逻辑门命名&#xff0c;该逻辑门用于其基本架构。术语“…

服务运营 | 竞价风暴:在线广告交易的实时拍卖与定价艺术

编者按&#xff1a; 在广告交易领域&#xff0c;尤其是谷歌等平台的广告交易中&#xff0c;每一次广告展示——即向特定浏览者展示广告的机会——都是由出版商&#xff08;publisher&#xff09;&#xff0c;例如《纽约时报》网站&#xff0c;通过实时拍卖的方式出售给广告商。…

中航通用飞机社招入职笔试:SHL题库综合能力性格问卷题型分析、高分攻略

中航通用飞机有限责任公司是中国航空工业集团有限公司旗下的大型国有企业&#xff0c;专注于通用航空产品的研制、通航运营与服务、航空零部件制造等业务。公司注册资本133.66亿元人民币&#xff0c;总资产约667亿元&#xff0c;员工人数超过16000人。产品线丰富&#xff0c;包…

8.使用 VSCode 过程中的英语积累 - Help 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

C# 用Timer控件简单写一个倒计时60s功能

先放界面上一个Label和一个Timer控件&#xff0c;Label用来展示倒计时秒数 添加事件 设置属性&#xff0c;设置每隔一秒执行一次 放代码&#xff1a; //设置时间控件开始运行&#xff0c;具体放在哪里看具体需求 this.timer1.Start();//定义一个全局变量表示秒数 int time…

【手机直连卫星】除了华为Mate 60 Pro,支持卫星通信的手机还有哪些款

2023年底&#xff0c;华为推出的Mate 60 Pro手机&#xff0c;开创了智能手机卫星通信的新纪元。它支持卫星电话通话和短信功能&#xff0c;让用户即使在偏远山野或深海之上也能保持与外界的联系。这一技术的加入&#xff0c;无疑为户外探险者和遥远地区的工作者提供了难以估量的…

影院管理革新:小徐的Spring Boot应用

第二章开发技术介绍 2.1相关技术 小徐影城管理系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它…

港科夜闻 | 香港科大颁授荣誉大学院士予五位杰出人士

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大颁授荣誉大学院士予五位杰出人士。香港科大9月24日向五位杰出人士颁授荣誉大学院士&#xff0c;他们分别为包弼德教授、简吴秋玉女士、高秉强教授、吴永顺先生及容永祺博士(按姓氏英文字母排序)。荣誉大学院士颁…

数据结构——对顺序线性表的操作

大家好啊&#xff0c;今天给大家分享一下对于顺序线性表的相关操作&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦…

一步步带你Linux内核编译与安装

Linux内核编译与安装 安装流程 #mermaid-svg-0PfY2uowOUJaN2Ov {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-icon{fill:#552222;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-text{fill:#5522…

高级算法设计与分析 学习笔记7 数据结构扩充

OS tree 数据统计树 本体是红黑树&#xff0c;除了自己的数字外还要记录自己这颗子树有几个节点。 这种特性可以让使用者迅速找到自己要找的第i个数。 往左走&#xff0c;给的那个数字就是排名&#xff0c;但是往右边走的话&#xff0c;那就的先加上当前的排名&#xff08;也就…

宠物空气净化器希喂和352哪个好用?两大爆火机型哪款吸毛、除臭效果比较好?

猫毛、狗毛、鹦鹉毛&#xff0c;总之只要家里养着有带毛的宠物&#xff0c;毛就会出现在各种地方&#xff0c;床上、沙发上、衣服上、水杯里...根本躲不开。而且&#xff0c;除了肉眼可见的&#xff0c;呼吸时、说话时&#xff0c;不经意间还会吃到毛毛。这些毛毛飘在空气里时&…