向Linux内核添加驱动的步骤详解

news2024/11/15 21:44:10

1、获取驱动源码

(1)驱动源码一般都是从设备厂商处获取;
(2)设备厂商给的驱动源码大体上是没有问题的,能加载但是效果不一定好,需要根据自己的板子进行适配;

2、驱动在内核中的两种形式

(1)直接编译进内核:内核启动时自动加载,无须在启动脚步中用insmod加载驱动。坏处是默认加载,没法使之不加载,不灵活,适合一些必须加载的驱动;
(2)单独编译成ko文件:需要内核启动后,用insmod命令手动加载驱动,好处是十分灵活,可以根据需要去选择是否加载驱动;
(3)在驱动调试阶段,推荐使用ko文件的方式比较方便;
(4)想深入连接驱动加载机制,参考博客:《内核加载驱动机制详解(module_init & module_exit)》;

3、添加驱动的步骤

(1)将驱动代码放到内核源码中合适路径下。内核源码是十分复杂的,源码都按照功能进行了分类,要按照分类来选择驱动代码存放的位置,不要破坏内核源码的结构,便于后期维护;
(2)将驱动源码添加到Makefile中,使之能被编译链接;
(3)在Kbuild体系中添加驱动代码的选项,也就是在"make menuconfig"中能对驱动代码进行配置;
(4)分别测试直接编译进内核和单独编译成ko文件,两种方式是否都能正常工作;

4、添加gslx680驱动为例

4.1、确认驱动源码

root@Ubunut220401:gslx680# tree
.
├── gsl_point_id
├── gslX680.c
├── gslX680.h
└── Makefile

0 directories, 4 files

(1)驱动源码包含三个文件:gslX680.c、gslX680.h、和gsl_point_id,其中gsl_point_id是编译好的二进制文件,厂商对这部分代码不开源;有的驱动源码全部是.c文件.h文件,这里的gsl_point_id文件可以看做是一个提前编译好的.o文件;
(2)此驱动源码涉及三个文件,文件数量不算多,直接添加到内核中也可以,但是为了演示多个文件的驱动代码(放一堆散文件在内核里不方便维护),这里将驱动代码以文件夹的方式添加;

4.2、确定gslx680驱动源码添加的位置

kernel/drivers/input/touchscreen/gslx680

(1)gslx680是触摸屏芯片,属于输入型外设;
(2)外设的驱动都放在内核的drivers目录中,里面已经为 触摸屏驱动源码专门创建了目录input/touchscreen;

4.3、在Makefile中添加驱动源码

4.3.1、修改drivers/input/touchscreen层的Makefile

obj-$(CONFIG_TOUCHSCREEN_FILTER)        += ts_filter_chain.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_GROUP)  += ts_filter_group.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_MEDIAN) += ts_filter_median.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_MEAN)   += ts_filter_mean.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_LINEAR) += ts_filter_linear.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_ZOOM)    += ts_filter_zoom.o
obj-$(CONFIG_TOUCHSCREEN_FT5X06)                         += ft5x06_touch.o

# 新增下面的脚本
obj-y         += gslx680/

(1)我们是在touchscreen目录里添加了gslx680文件夹,上面添加脚本的作用:当编译内核时会进到gslx680文件夹里进行编译;
(2)不清楚这句脚本具体含义的参考博客:《项目通用Makefile的编写(包含Makefile.build文件分析)》;

4.3.2、gslx680的源码中添加Makefile脚本

obj-$(CONFIG_TOUCHSCREEN_GSLX680)  += gslx680_TS.o
gslx680_TS-objs += gslX680.o gsl_point_id

(1)CONFIG_TOUCHSCREEN_GSLX680:这个宏觉得是否编译gslx680驱动源码,以及是编译进内核还是单独编译成ko文件;
(2)上面就是通用的编译驱动的Makefile,不熟悉可参考博客:《编译驱动的Makefile详解》;

4.4、在Kbuild体系中添加配置项

config TOUCHSCREEN_FT5X06
        tristate "FocalTech FT5X06 Touch Panel Controller"
        depends on I2C
        help
          This enables support for FocalTech over I2C based touchscreens.

# 新增gslx680驱动配置项
config TOUCHSCREEN_GSLX680
        tristate "GSLX680 Touch Panel Controller"
        depends on I2C
        help
          This enables support for GSLX680 over I2C based touchscreens.

在这里插入图片描述在这里插入图片描述

(1)在drivers/input/touchscreen目录下的Kconfig文件中添加上面gslx680的配置项,注意名字要和gslx680文件夹里Makefile使用的宏CONFIG_TOUCHSCREEN_GSLX680对应,不能出错;
(2)添加完成后,就可以"make menuconfig"命令来配置gslx680驱动源码;
(3)对Kbuild体系不熟悉的可参考博客:《Linux内核配置和编译原理 & menuconfig、Makefile、.config三者之间的关系》;

推荐

给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

ubuntu下编译opencv

目录 1. 下载opencv和opencv-contrib 2. 安装依赖 3. cmake 4. make 5. 安装 6. 配置opencv的路径 7. 测试 后续 1. 下载opencv和opencv-contrib https://github.com/opencv/opencv/archive/refs/tags/4.6.0.zip https://github.com/opencv/opencv_contrib/archive/re…

python两种方式实现读写航拍影像JPG图片的GPS坐标

写入坐标效果 读取坐标效果 1、写入JPG坐标数据 1.1、准备数据 gps坐标文件 图片 可以查看它的属性中目前并没有坐标信息 1.2、执行脚本 第一种方法(piexif) writegps2jpg_piexif.py import csv,os import

KubeEdge云原生边缘计算公开课04——云原生边缘计算学术研究现状与趋势

KubeEdge云原生边缘计算公开课04——云原生边缘计算学术研究现状与趋势Ding Yin & 徐飞:KubeEdge架构与技术解读1. 边缘计算的形态定义与关键挑战2. 云原生边缘计算的优势与挑战3. KubeEdge核心架构4. KubeEdge关键技术5. KubeEdge社区介绍Ding Yin & 徐飞&…

JavaSE笔记——流式编程

文章目录前言一、从外部迭代到内部迭代二、实现机制三、常用的流操作1.collect(toList())2.map3.filter4.flatMap5.max和min6.reduce四、多次调用流操作五、高阶函数总结前言 流是一系列与特定存储机制无关的元素——实际上,流并没有 “存储” 之说。利用流&#x…

火山引擎 DataTester:如何做 A/B 实验的假设检验作者:字节跳动数据平台

A/B 实验的核心统计学理论是(双样本)假设检验,是用来判断样本与样本、样本与总体的差异是由 抽样误差 引起还是 本质差别 造成的一种统计推断方法。 假设检验,顾名思义,是一种对自己做出的假设进行数据验证的过程。通…

STM32CUBEMX_SDIO和FATFS_读写SD卡

STM32CUBEMX_SDIO和FATFS_读写SD卡 简述 FATFS是一个完全免费开源,专为小型嵌入式系统设计的FAT(File Allocation Table)文件系统模块。FATFS的编写遵循ANSI C,并且完全与磁盘I/O层分开。支持FAT12/FAT16/FAT32,支持多…

Django入门

Django 中文官网:初识 Django | Django 文档 | Django (djangoproject.com) Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部…

Python 学习笔记001-发布

Python 学习笔记001-发布Python如何发布为EXE文件发给别人装X0 我的开发环境Step 1 安装PyInstaller包Step2 打包Python文件Step 3 运行Python程序Step 4 最后附上Atm.py的代码Python如何发布为EXE文件发给别人装X 0 我的开发环境 Python : 3.10 PyCharm:2022.03 社区版 Ste…

VIAVI唯亚威光纤高分辨率多模 OTDR 测试方案

VIAVI Solutions 高分辨率多模 OTDR 测试方案设计用于飞机、宇宙飞船、潜艇和舰船中部署的超短多模光纤的特性分析和故障定位 高分辨率多模 OTDR 测试方案是业界紧凑、轻巧的便携装置。它的用户界面经过专门设计,简化了 OTDR 测试和结果读取。 特点 紧凑、轻巧、现…

Oracle --- 视图 索引 语法结构

目录 视图 概念 优点 创建视图 查看视图 ​修改视图 删除视图 索引 概念 分类 普通索引 唯一索引 复合索引 反向键索引 位图索引 存储函数 概念 语法结构 视图 概念 视图 是一种数据库对象,是从 一个或者多个 数据表或视图中导出的 虚表。 视图所…

C#,图像二值化(07)——全局阈值的迭代算法及其源代码

1、 全局阈值的迭代算法 图像阈值分割---迭代算法 (1) 为全局阈值选择一个初始估计值T(图像的平均灰度)。 (2) 用T分割图像。产生两组像素:G1有灰度值大于T的像素组成,G2有小于等于T像素组成。 (3) 计算G1和G2像素的平均灰度值m1和m2; (4) …

机器学习笔记之Sigmoid信念网络(二)醒眠算法

机器学习笔记之Sigmoid信念网络——醒眠算法引言回顾Sigmoid\text{Sigmoid}Sigmoid信念网络的模型表示Sigmoid\text{Sigmoid}Sigmoid信念网络——对数似然梯度求解过程中的问题醒眠算法基于平均场假设变分推断求解后验概率平均场理论求解后验的弊端醒眠算法引言 上一节介绍了对…

jsp+servlet+mysql实现的在线图书商城源码附带论文开题报告及视频指导教程

今天给大家演示的是一款由jspservletmysql实现的在线图书商城系统,主要分为前台后后台管理员功能,前台用户可以浏览查看各类图书信息,可自定义搜索,注册登录后可以将书添加到购物车,购物车中的商品可以提交订单&#x…

【复习笔记】JavaWeb实验重点代码

JavaWeb实验重点代码笔记 一、课上练习题目汇总(部分) 题目一 基础HTML、CSS和JavaScript 1.1 问题要求 页面上有下拉菜单、文本框、跳转按钮并排放置,当下拉菜单选中某个具体网站名称时,文本框出现其对应的链接地址&#xff0…

Linux环境下vs code中Markdown与PlantUML联合工作

PlantUML是一个可以让你快速编写UML图的组件。 在线服务器 https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写…

零膨胀泊松回归案例分析

零膨胀泊松回归分析 计数研究模型中,常用泊松回归模型,但泊松回归模型理论上是要求平均值与标准差相等,如果不满足,则可使用负二项回归模型 在实际研究中,会出现一种情况即因变量为计数变量,并且该变量包…

Lua闭包和Upvalue上值

一、lua中的作用域 在Lua语言中声明的变量默认是全局变量,声明局部变量需要使用local关键字,和其他语言相比这有点特殊。 -- 全局变量 a 10function func()b 100 -- 仍然是全局变量local c 20 -- func的局部变量 end func()print(a b) -- 输出…

终极.NET混淆器丨.NET Reactor产品介绍

无与伦比的 .NET 代码保护系统,可完全阻止任何人反编译您的代码。 产品优势 01、混淆技术 .NET Reactor通过向 .NET 程序集添加不同的保护层来防止逆向工程。除了标准的混淆技术之外,它还包括NecroBit、虚拟化、x86代码生成或防篡改等特殊功能。NET Re…

xilinx srio ip学习笔记之初识srio

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 xilinx srio ip学习笔记之初识srio前言IP 设置总结前言 因为工作原因,需要对rapidio 的协议进行了解,在xilinx的IP核中,是对应着Serial R…

这支隐藏“球队”,颠覆消费品「赛场」

【潮汐商业评论/原创】 大好的黄金周末,Fred约了几个朋友来家里看球。按照他的计划,周五准备下班后,他赶紧得去一趟附近的大型超市扫货,买一批零食酒水招待朋友。没想到的是,好不容易等到快下班了,领导通知…