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

驱动源码

/**  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,不能使用printfprintk(KERN_EMERG "[ KERN_EMERG ]  Haptics Init\n"); //输出等级为0printk("[ default ]  Haptics Init\n");return 0;
}static void __exit haptics_exit(void)
{printk(KERN_EMERG "[ KERN_EMERG ]  Haptics Exit\n"); //输出等级为0printk("[ 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"
helpjust a simplest driver.
default yendmenu
#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文件,需要上传至开发板手动加载(开发板提前烧录好不含驱动的镜像)

行编译

  • 上述指令是编译整个内核,编译后将镜像文件烧录至开发板,驱动会自动加载

编译为模块:

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

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

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

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

相关文章

css实现自定义静态进度条-vue2

实现如图所示 html&#xff1a; <div class"progress-container"><div class"progress-box left" :style"leftStyle"><div class"progress-value-top left">总中标电量</div><div class"progress-val…

前端请求音频返回pcm流进行播放

业务场景是chat回答&#xff0c;点击播放则会将回答内容进行请求&#xff0c;返回音频数据流进行播放 实现方案&#xff0c;因为后端返回的是流式接口&#xff0c;但是流式接口我去截取后用自己完成的流式播放器方法进行播放会存在杂音&#xff0c;但是短句接口返回速度尚可&a…

composer环境变量(phpstudy集成环境)无法使用问题

composer 不是内部或外部命令,也不是可运行的程序 或批处理文件。 按下WinR组合键打开“运行”&#xff0c;输入sysdm.cpl 回车&#xff0c;打开“系统属性”并切换至“高级”选项卡&#xff0c;点击“环境变量”进行配置 配置完后点击确定&#xff0c;重新打开命令行&#x…

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

康养为松,智能为鹤:华为全屋智能画出的松鹤长春图

在道家文化中&#xff0c;喜欢将松与鹤并举&#xff0c;以其长寿与仙逸表达对老年人的美好祝愿。松鹤延年、松龄鹤寿等成语皆出于此。松鹤长春图&#xff0c;也成为国画当中的经久不衰的题材。 当我们迎来老龄化时代&#xff0c;“松鹤长春”则成为了整个社会的共同期待。 根据…

【初阶数据结构】排序——插入排序

目录 前言直接插入排序希尔排序 前言 排序&#xff1a;所谓排序就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。排序算法&#xff0c;就是如何使得记录按照要求排列的方法。   例如&#xff1a;买东西时会根据销量或价…

java并发编程笔记 之 线程和进程

文章目录 前言线程线程优先级和时间片创建多线程及运行线程的状态 进程查看进程的命令进程的通信方式 线程和进程的区别从关系上疑问集锦 前言 并发 1、并发是指在同一时间段内&#xff0c;计算机系统能够处理多个任务的能力。 2、在并发编程中&#xff0c;我们可以理解为多个…

代码随想录算法训练营第三十九天 | 198.打家劫舍 ,213.打家劫舍II,337.打家劫舍III

第三十九天打卡&#xff0c;今天解决打家劫舍系列问题&#xff0c;树形dp比较难。 198.打家劫舍 题目链接 解题过程 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 要么不偷这一间&#xff0c;那就是前面那间…

毕业设计选题:基于ssm+vue+uniapp的校园失物招领小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

大瓜-CSP-J/S2024第一轮认证题目涉嫌泄露。竞赛公平能否维护?

2024年全国信息学奥赛&#xff08;CSP-J/S&#xff09;泄题事件在竞赛界掀起了巨大的波澜。这场赛事本应是全国最具公信力的编程竞赛之一&#xff0c;但部分题目在考试前已被某些培训机构押中&#xff0c;这一泄题行为不仅让考生与家长感到愤怒&#xff0c;也让公众对奥赛的公平…

scp 命令:在两台主机间远程传输文件

一、命令简介 ​scp​ 命令使用 SSH ​加密的方式在本地主机和远程主机之间复制文件。 ‍ 二、命令参数 格式 scp [选项] 发送方主机和目录 接收方主机和目录注意&#xff1a;左边是发送方&#xff0c;右边是接收方。固定格式。 示例 #示例1 scp ~/test.txt soulio172.1…

豆包MarsCode体验

这个AI助手贴合做题者的思路&#xff0c;可以实时对代码进行分析&#xff0c;提出纠错、优化、规范性意见&#xff0c;非常好用。

基于数据挖掘的航空客户满意度分析预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 航空公司致力于提供多样化的服务以满足乘客需求&#xff0c;包括但不限于提供免费无线网络、免费食物饮品、提供网上预约服务、飞机出口位置、座椅舒适度、卫生状况等&#xff0c;并希望以此提升乘…

构造者模式多种实现方式

构造者模式 ​ 构造者模式建议将对象构造代码从产品类中抽取出来&#xff0c; 并将其放在一个名为构造者的独立对象中 ​ 构建者模式也是用来创建对象&#xff0c;但是相对于工厂模式来说&#xff0c;建造者模式适用于构建复杂对象&#xff0c;而工厂模式适用于创建对象的封装…

asp.net core日志与异常处理小结

asp.net core的webApplicationBuilder中自带了一个日志组件,无需手动注册服务就能直接在控制器中构造注入&#xff0c;本文主要介绍了net core日志与异常处理小结&#xff0c;需要的朋友可以参考下 ILogger简单使用 asp.net core的webApplicationBuilder中自带了一个日志组件…

网络安全-长亭雷池waf的sql绕过,安全狗绕过(5种绕过3+2)

目录 一、环境 二、讲解 三、绕过前思路整理 3.1 思路 3.1.1 入门思路 0x00截断filename 3.1.2 双写上传描述行(差异绕过&#xff09;【成功】 3.1.3双写整个 part 开头部分 3.1.4 构造假的 part 部分 1【成功】 3.1.5 构造假的 part 部分2【成功】 3.1.6 两个 bounda…

闲盒支持的组网方式和注意事项

1. 直连光猫拨号​ 通过光猫拨号&#xff0c;设备直连光猫的设备&#xff0c;需要对光猫开启UPNP并关闭DMZ 如果只接一个盒子&#xff0c;建议直接针对盒子IP开dmz。 2. 直连路由器​ 通过路由器拨号&#xff0c;设备直连路由器的设备&#xff0c;需要对路由器开启UPNP并关闭…

Sql Developer日期显示格式设置

默认时间格式显示 设置时间格式&#xff1a;工具->首选项->数据库->NLS->日期格式: DD-MON-RR 修改为: YYYY-MM-DD HH24:MI:SS 设置完格式显示&#xff1a;

【Java数据结构】 ---对象的比较

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 上图中&#xff0c;线性表、堆…

【嵌入式linux开发】SPI设备文件操作BMI088传感器

【嵌入式linux开发】SPI设备文件操作BMI088传感器 前言一、数据手册浅读二、代码 前言 在本篇博客中&#xff0c;将从BMI088传感器的数据手册出发&#xff0c;简单了解之后&#xff0c;展示如何通过SPI设备文件与传感器进行通信。除了使用linux文件设备操作spi接口&#xff0c…