向linux内核添加驱动的步骤详解(代码片段)

正在起飞的蜗牛 正在起飞的蜗牛     2023-02-20     361

关键词:

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等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转

添加自己的驱动程序到linux内核(详解)

背景:  移植4g模块的时候,看到文档中有添加驱动到内核的步骤,于是趁着这个机会,展开有关的学习。 Target   :hi3531dLinux     :Linux-3.18 步骤在自己喜欢的位置创建一个目录(前提是这个目录下面存... 查看详情

linux内核编译步骤及配置详解(代码片段)

...3,RING0级别最高,这样linux用户代码运行在RING3下,内核运行在RING0,这样系统本身就得到了充分的保护用户空间(用户模式)转到内核空间(系统模式)方法:·系统调用·硬件中断linuxkernel体系结构:虚拟文件系统VFS:VFS(... 查看详情

linux内核的块设备驱动框架详解(代码片段)

1、块设备和字符设备的差异(1)块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位。大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作;(2)块设备对于I/O请求有对应的缓冲区&#x... 查看详情

linux内核移植入门(代码片段)

文章目录基本概念内核源码目录结构内核配置主目录Makefile各子目录Makefile如何配置内核?1.配置仓库选取2.交叉编译器的修改3.体系结构体的选择4.修改配置文件内核编译编译结果:几种linux内核文件的区别开发板上U-Boot启动linux内核... 查看详情

linux设备树语法详解(代码片段)

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。引入了设备树之后,驱动代... 查看详情

学习笔记——《linux设备驱动程序(第三版)》linux设备模型:内核添加删除设备驱动程序(代码片段)

文章目录1.前言2.准备工作2.1.概念2.2.具体总线、设备、驱动结构体说明2.3.注册总线3.添加设备3.1.STEP1——发现设备并创建设备结构structXXX_dev3.2.STEP2——初始化设备结构3.3.STEP3——注册设备4.删除设备5.添加驱动程序6.删除驱动程... 查看详情

linux设备驱动spi详解3-控制器驱动(代码片段)

整个SPI驱动架构可以分为协议驱动、通用接口层和控制器驱动三大部分。其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:(1)申请必要的硬件资源,例如中断,DMA... 查看详情

linux---信号详解(代码片段)

...目标进程发送信号总结保存信号阻塞信号信号相关概念在内核中的表示sigset_t信号操作函数sigprocmask 查看详情

linux驱动开发笔记:基于ubuntu的helloworld驱动源码编写makefile编写以及驱动编译加载流程测试(代码片段)

...装虚拟机的过程请自行搜索查找完成。  步骤二:获取内核版本号  获取内核版本号是为了确认内核版本号一致。sudocat/proc/version  步骤三:校准编译器版本  前面获取了内核的编译器版本是gcc7.3.0,但是本机是gcc7.5,... 查看详情

向 linux 内核 3.8.8 添加系统调用

】向linux内核3.8.8添加系统调用【英文标题】:Addingsystemcalltolinuxkernel3.8.8【发布时间】:2013-04-2502:07:44【问题描述】:我正在尝试在linux内核版本3.8.8中编写自己的系统调用。我在互联网上搜索,有步骤如何做到这一点。特别是这... 查看详情

新唐nuc980使用记录:向内核添加usb无线网卡驱动(基于rtl8188eus)(代码片段)

...较常用且重要的功能了,这篇文章将介绍在NUC980中向内核添加USB无线网卡驱动(基于RTL8188EUS)。这篇文章中内容均在下面的开发板上进行测试:《新唐NUC980使用记录:自制开发板(基于NUC980DK 查看详情

linux驱动安卓充电芯片bq24735调试详解(代码片段)

...外部ILIM引脚来减缓PWM调制速度以减小充电电流。二、Linux内核充电架构要想理解bq24735驱动,必须首先理解Android供电系统框架,最重要的知识点是powersupply。1.Android供电系统框架​​powersupply(以下简称psy)是Linux中从供电驱... 查看详情

openwrt添加rtl8139驱动

...:步骤1:拷贝驱动代码将需要添加的驱动代码拷贝到linux内核driver对应的文件夹下。/openwrt/openwrt-hiwooya/build_dir/target-mipsel_24kec+dsp_uClibc-0、9、33、2/linux-ramips_mt7688/linux-3、18、29/drivers/net/usb。步骤2:修改Makefile在driver对应的文件夹... 查看详情

linux内核移植初探(代码片段)

内核移植的梯度:初级:根据芯片公司的参考配置,编译开发板内核并了解执行过程中极:添加内核驱动的方式方法高级:修改或添加BSP包linux内核特性:可移植性强、支持的硬件平台广泛;超强的网络功能;多任务多用户系统... 查看详情

虚拟字符设备驱动开发(代码片段)

目录字符设备驱动简介内核驱动操作函数集合字符设备驱动开发步骤驱动模块的加载和卸载字符设备注册与注销实现设备的具体操作函数添加LICENSE和作者信息Linux设备号设备号的组成设备号的分配chrdevbase字符设备驱动开发实验... 查看详情

virtio前端驱动详解

...模式以及原理,今天就从前端驱动的角度描述下目前Linux内核代码中的virtIO驱动是如何配合后端进行工作的。注:本节代码参考Linux内核3.11.1代码virtIO驱动从架构上来讲可以分为两部分,一个是其作为PCI设备本身的驱动,此驱动... 查看详情

android进阶——binderipc详解之学习binderipc前应该掌握的相关常识(代码片段)

...程的内存空间和进程隔离二、Linux系统内存的用户空间和内核空间1、用户空间(UserSpace)2、内核空间(KernelSpace)三、LinuxIPC原理1、内核态和用户态2、IPC步骤四、内核模块和驱动五、Binder1、BinderIPC概述2、Binder的... 查看详情

linux内核线程kernelthread详解--linux进程的管理与调度(代码片段)

内核线程为什么需要内核线程Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的。内核线程就是内核的分身,... 查看详情