内核裁剪与驱动编译

news2024/12/30 3:29:08

linux设备驱动以内核模块的形式出现,编写linux内核模块编程是学习linux设备驱动的先决条件。

在编译linux内核之前要先配置linux内核。每个板子都有其对应的默认配置文件,这些默认配置文件保存在arch/arm/configs 目录中。比如xilinx_zynq_defconfig作为zynq所使用的默认配置文件。

编译驱动有两种方法
第一种方法:linux 提供了这样的机制,这种机制被称为模块(Module)。将驱动代码编译成.ko 驱动模块,然后在linux系统下使用insmod或modprobe命令加载驱动模块之后进行测试;驱动开发工程师将驱动代码编译成.ko驱动模块可以很方便的进行驱动调试,所以在驱动调试阶段一般都选择将其编译为模块,这样修改驱动以后只需要编译一下驱动代码即可,不需要编译整个linux源代码;模块本身不被编译入内核映像,从而控制了内核的大小。模块一旦被加载,它就和内核中的其他部分完全一样。

1,编写Makefile文件,KDIR写入内核源目录

 KDIR=/home/geyuxi/Desktop/zynq_linux/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.14-xilinx-v2018.3+git999-r0/linux-xlnx-4.14-xilinx-v2018.3+git999

PWD := $(shell pwd)
CC 	= $(CROSS_COMPILE)gcc
ARCH =arm
MAKE =make
obj-m:=gt9xx.o
 
 
modules:
 
	$(MAKE) -C $(KDIR) ARCH=$(ARCH) CROSS_COMPLE=$(CROSS_COMPILE) M=$(PWD) modules
 
clean:
 
	make -C $(KDIR) ARCH=$(ARCH) CROSS_COMPLE=$(CROSS_COMPILE) M=$(PWD) clean

2,导入交叉编译器并设置环境变量

export  CROSS_COMPILE=arm-linux-gnueabihf-

3,执行make,生成.ko文件

4,使用驱动文件,执行insmod *.ko。卸载驱动文件,执行rmmod *.ko


第二种方法:直接把驱动编译到内核中
为建立对模块的感性认识,编译驱动为内核模块。

 1,修改Makefile

会看到很多 obj-$(CONFIG_TOUCHSCREEN_GT9XX) += goodix_gt9xx.o这种代码,是加入驱动代码到内核编译。CONFIG_XXX变量可以取3个不同的值:y、m、n;所以将$(CONFIG_XXX)替换之后也就是定义了三个变量 obj-y、obj-m、obj-n。obj-y 变量中所有的 xxxx.o 所对应的 xxxx.c 文件都会被编译进内核镜像;当在内核源码目录执行“make modules”编译内核模块的时候,obj-m 变量中所有的 xxxx.o 文件对应的 xxxx.c 源文件会被编译成.ko 驱动模块文件;而 obj-n 变量中所有的 xxxx.o 文件对应的 xxxx.c 源文件既不会编译进内核镜像文件,也不会编译成驱动模块。所以由此可以知道 CONFIG_XXX 好比是一个“选择器”,你可以选择将源文件编译进内核中,也可以选择编译成一个.ko 驱动模块文件,也可以不编译。

# SPDX-License-Identifier: GPL-2.0
# Makefile for the touchscreen drivers.
# Each configuration option enables a list of files.
wm97xx-ts-y := wm97xx-core.o


obj-$(CONFIG_TOUCHSCREEN_W90X900)	+= w90p910_ts.o
obj-$(CONFIG_TOUCHSCREEN_SX8654)	+= sx8654.o
obj-$(CONFIG_TOUCHSCREEN_TPS6507X)	+= tps6507x-ts.o
obj-$(CONFIG_TOUCHSCREEN_ZET6223)	+= zet6223.o
obj-$(CONFIG_TOUCHSCREEN_ZFORCE)	+= zforce_ts.o
obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50)	+= colibri-vf50-ts.o
obj-$(CONFIG_TOUCHSCREEN_ROHM_BU21023)	+= rohm_bu21023.o
obj-$(CONFIG_TOUCHSCREEN_GT9XX)		+= goodix_gt9xx.o

2,修改Kconfig

打开内核源码drivers每个目录下的Kconfig文件进行增改。

(1)config ASYNCNOTI是 CONFIG_ASYNCNOTI变量的配置项,用于配CONFIG_ASYNCNOTI变量的值是 y、m 还是 n。

(2)tristate表示三态,也就是可以将 CONFIG_ASYNCNOTI 变量的值设置为y、m 或者 n 中的任何一个,后边携带的字符串信息表示的是对该 config 配置项的一个描述信息。

(3)default y表示该配置项的默认值是 y,在 Kconfig 文件中添加配置项之后,当我们在内核源码目录执行“make menuconfig”的时候就可以通过图形化界面的方式对其进行配置了。

config TOUCHSCREEN_GOODIX
	tristate "Goodix I2C touchscreen"
	depends on I2C
	depends on GPIOLIB || COMPILE_TEST
	help
	  Say Y here if you have the Goodix touchscreen (such as one
	  installed in Onda v975w tablets) connected to your
	  system. It also supports 5-finger chip models, which can be
	  found on ARM tablets, like Wexler TAB7200 and MSI Primo73.

	  If unsure, say N.
	  To compile this driver as a module, choose M here: the
	  module will be called goodix.


config TOUCHSCREEN_ILI210X
	tristate "Ilitek ILI210X based touchscreen"
	depends on I2C
	help
	  Say Y here if you have a ILI210X based touchscreen
	  controller. This driver supports models ILI2102,
	  ILI2102s, ILI2103, ILI2103s and ILI2105.
	  Such kind of chipsets can be found in Amazon Kindle Fire
	  touchscreens.

	  If unsure, say N.
	  To compile this driver as a module, choose M here: the
	  module will be called ili210x.

3,menuconfig

在内核源码目录下执行命令进入到menuconfig配置界面:

make distclean // 清理整个工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig  // defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig // menuconfig

<*>尖括号里边的“*”符号表示该配置项默认是选中的,也就是配置为“y”;将光标移动到该配置条目上,分别按键盘上的“Y”、“M”、“N”键可以分别选择将该驱动编译进内核、编译成单独的驱动模块、不编译驱动源文件。将驱动编译进内核中,所以这里选“Y”即可!对于menuconfig界面中的每一个配置项,都可以查看它的help帮助信息

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

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

相关文章

图扑软件入选信通院《高质量数字化转型产品及服务全景图 (2023)》

7 月 27 日&#xff0c;由中国信通院主办的“2023 数字生态发展大会”暨中国信通院“铸基计划”年中会议在北京召开。本次大会重磅发布了《高质量数字化转型产品及服务全景图&#xff08;2023 上半年度&#xff09;》。图扑软件凭借自研 HT for Web 数字孪生可视化产品成功入选…

(C++)继承

目录 1.继承的概念及定义 1.1继承的概念 1.2继承定义 1.2.1定义格式 1.2.2继承方式和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚拟…

OSPF无法建立领居的原因有哪些(第三十五课)

1 配置OSPF 1.1 思路 1&#xff0c;配置IP地址 2&#xff0c;配置OSPF 配置进程号 route-id进入区域宣告网段 配置IP地址 R1路由表 ------------------------------------------------------------------------------ Routing Tables: Public Destinations : 10 …

【LeetCode】55. 跳跃游戏 - 贪婪算法

目录标题 2023-8-10 16:27:05 55. 跳跃游戏 2023-8-10 16:27:05 class Solution {public boolean canJump(int[] nums) {int n nums.length;int arrivalLocation 0;for (int i 0; i < n; i) {if (i < arrivalLocation) {arrivalLocation Math.max(arrivalLocation,…

matplotlib 笔记 注释annotate

在图中的特定位置添加文本注释、箭头和连接线&#xff0c;以便更清晰地解释图形中的数据或信息 主要参数 text文本内容xy箭头指向的目标点的坐标xytext注释文本的坐标arrowprops 一个字典&#xff0c;指定注释箭头的属性&#xff0c;如颜色、箭头样式等 没有arrowprops的时候…

CentOS7安装MySQL8(RPM方式)

第一步&#xff1a;解压 tar -xvf mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar -C /usr/local/java/mysql 第二步&#xff1a;按顺序安装rpm包 # rpm -ivh mysql-community-common-8.0.34-1.el7.x86_64.rpm# rpm -ivh mysql-community-client-plugins-8.0.34-1.el7.x86_64.rpm…

layui 集成 ztree异步加载

首先&#xff0c;layui环境搭建&#xff0c;ztree环境引入 ztree的js和css都要引入&#xff0c;我这里暂时用的是core包> 静态&#xff0c;一句话就够了 <!-- 左侧菜单树形组件 --><div class"layui-col-md3"><div class"layui-footer "…

Leetcode 977. 有序数组的平方

题目&#xff1a; Leetcode 977. 有序数组的平方 描述&#xff1a; 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序 思路&#xff1a; 双指针法 数组其实是有序的&#xff0c; 只不过负数平方之…

Gradio入门,并搭个鸡兔同笼问题小应用,附源码(MindOpt)

应用链接&#xff1a; https://979427749bc9ceec34.gradio.live 是公开访问链接&#xff0c;3天有效。在modelscope中的创空间怎么长期发布我还在研究。后面补上。 应用图如下&#xff0c;源代码见正文。 知道Gradio AI大模型快速生成应用的工具&#xff0c; 在Huggingface …

使用 Docker 部署 canal 服务实现MySQL和ES实时同步

参考 ClientAdapter: Canal的Adapter配置项目 Sync ES&#xff1a;Canal的Adapter中ES同步的配置项 使用 Docker 部署 canal 服务 docker canal-server canal-adapter mysql Canal&#xff08;基于Docker同步mysql数据到elasticsearch&#xff09; Canal部署过程中的错误 0. 环…

dns的负载分配是什么

DNS 负载分配是使用 DNS 系统对传入的网络流量进行分配的一种技术。这可以是基于多种策略来分配的&#xff0c;从简单的轮询到更复杂的基于地理位置或服务器健康状况的分配。下面是 DNS 负载分配的几种常见形式&#xff1a; 轮询&#xff08;Round Robin&#xff09;&#xff1…

【LeetCode】102. 二叉树的层序遍历、107. 二叉树的层序遍历 II

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 102. 二叉树的层序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节…

详解双向带头循环链表

今天给大家分享的数据结构中的链表的双向带头循环链表结构&#xff01;听到这个链表大家可能心中一颤&#xff0c;其实他就是个纸老虎&#xff0c;看着比较难搞&#xff0c;实际上非常简单易懂&#xff0c;创建该结构链表的大佬可谓是真的牛&#xff0c;因为该结构比起单链表要…

Java课题笔记~ HTTP协议(请求和响应)

Servlet最主要的作用就是处理客户端请求&#xff0c;并向客户端做出响应。为此&#xff0c;针对Servlet的每次请求&#xff0c;Web服务器在调用service()方法之前&#xff0c;都会创建两个对象 分别是HttpServletRequest和HttpServletResponse。 其中HttpServletRequest用于封…

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…

SpringBoot笔记:SpringBoot 集成 Dataway 多数据源配置(二)

文章目录 前言核心代码和配置yml 配置注入多数据源常用Spi实现swagger 配置自定义 Udf指定数据源进行查询 前言 之前简单介绍了一下 Dataway 使用&#xff0c;本文继续介绍一下它的多数据源配置和使用。 核心代码和配置 yml 配置 # springboot多环境配置 #端口&#xff0c;…

SpringBoot中间件使用之EventBus、Metric、CommandLineRunner

1、EventBus 使用EventBus 事件总线的方式可以实现消息的发布/订阅功能&#xff0c;EventBus是一个轻量级的消息服务组件&#xff0c;适用于Android和Java。 // 1.注册事件通过 EventBus.getDefault().register(); // 2.发布事件 EventBus.getDefault().post(“事件内容”); …

【HarmonyOS】Java如何引用外部jar包

【关键字】 Java、引用jar包​ 【写在前面】 使用API6和API7开发HarmonyOS应用时&#xff0c;因为应用中只能引用SDK中开放的功能接口&#xff0c;但是部分jdk自带的接口功能在SDK中并未封装&#xff0c;要想在工程中使用jdk开放的接口功能&#xff0c;需要将jdk中的jar包通过…

【华秋干货铺】电源PCB设计汇总

在《PCB设计丨电源设计的重要性》一文中&#xff0c;已经介绍了电源设计的总体要求&#xff0c;以及不同电路的相关布局布线等知识点&#xff0c;那么本篇内容&#xff0c;小编将以RK3588为例&#xff0c;为大家详细介绍其他支线电源的PCB设计。 电源PCB设计 VDD_CPU_BIG0/1 …

uniapp 格式化时间刚刚,几分钟前,几小时前,几天前…

效果如图&#xff1a; 根目录下新建utils文件夹&#xff0c;文件夹下新增js文件&#xff0c;文件内容&#xff1a; export const filters {dateTimeSub(data) {if (data undefined) {return;}// 传进来的data必须是日期格式&#xff0c;不能是时间戳//将字符串转换成时间格式…