内核裁剪与驱动编译

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帮助信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

暗黑版GPT流窜暗网 降低犯罪门槛

随着AIGC应用的普及&#xff0c;不法分子利用AI技术犯罪的手段越来越高明&#xff0c;欺骗、敲诈、勒索也开始与人工智能沾边。 近期&#xff0c;专为网络犯罪设计的“暗黑版GPT”持续浮出水面&#xff0c;它们不仅没有任何道德界限&#xff0c;更没有使用门槛&#xff0c;没有…

英特尔发布雷电3接口:竟和USB Type-C统一了 - 全文

在过去的一年里&#xff0c;外部连接通信线的世界里发生了很多时。在这段时间&#xff0c;USB先后发布了10Gbps “超高速”USB3.1以及新的USB Type-C连接器&#xff0c;这是一种新式的可正反插的接口&#xff0c;将成为未来十年乃至更长时间上的行业标准。同时随着USB备用模式功…

centos自动同步北京时间

1、安装ntpdate服务 yum -y install ntpdate 2、加入自动任务计划 查找ntpdate的路径&#xff1a; which ntpdate 复制这个路径。 编辑自动任务计划并加入ntpdate&#xff1a; crontab -e # 每小时第30分钟同步AD域控时间 30 * * * * /usr/sbin/ntpdate -u 192.168.2.8 > …

qt在vs中编译出现link2001时,不会生成moc文件了

现象&#xff1a; 解决方法&#xff1a; 在对应头文件-属性-配置属性-常规-项类型-改为Qt Meta-Object Compiler (moc) 即可。 有时候不知道啥原因头文件类型变成普通C头文件

游戏行业实战案例 4 :在线时长分析

【面试题】某游戏数据后台设有「登录日志」和「登出日志」两张表。 「登录日志」记录各玩家的登录时间和登录时的角色等级。 「登出日志」记录各玩家的登出时间和登出时的角色等级。 其中&#xff0c;「角色id」字段唯一识别玩家。 游戏开服前两天&#xff08; 2022-08-13 至 …

享元模式 Flyweight Pattern 《游戏编程模式》学习笔记

如果我们要存储一个树一样的数据结构&#xff0c;直觉来说我们会这么写 但是实际上我们会发现&#xff0c;哪怕森林里有千千万万的树&#xff0c;它们大多数长得一模一样。 它们使用了相同的网格和纹理。 这意味着这些树的实例的大部分字段是一样的。 那么我们就可以将树共…

一、Kubernetes介绍与集群架构

Kubernetes介绍与集群架构 一、认识容器编排工具 docker machine 主要用于准备docker host现已弃用建议使用docker desktop docker compose Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose&#xff0c;您可以使用 YAML 文件来配置应用程序的服务。…

Java List(列表)

List 是一个有序、可重复的集合&#xff0c;集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素&#xff0c;可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引&#xff0c;第一个添加到 List 集合中的元素的索引为 0&#xff…

Centos7单机部署ElasticSearch

Centos7单机部署ElasticSearch 引言 Elasticsearch是一种广泛使用的开源搜索引擎&#xff0c;专门为分布式环境设计&#xff0c;但也可以在单机上运行。它使存储、搜索和分析大量数据变得更加容易和高效。此教程将引导你通过在Centos7上单机部署Elasticsearch&#xff0c;涵盖…

Android google admob Timeout for show call succeed 问题解决

项目场景&#xff1a; 项目中需要接入 google admob sdk 实现广告商业化 问题描述 在接入Institial ad 时&#xff0c;onAdLoaded 成功回调&#xff0c;但是onAdFailedToShowFullScreenContent 也回调了错误信息 “Timeout for show call succeed.” InterstitialAd.load(act…

Vue数组变更方法和替换方法

一、可以引起UI界面变化 Vue 将被侦听的数组的变更方法进行了包裹&#xff0c;所以它们也将会触发视图更新。这些被包裹过的方法包括&#xff1a; push()pop()shift()unshift()splice()sort()reverse() 以上七个数组都会改变原数组&#xff0c;下面来分别讲解它们的区别&…

【2023年11月第四版教材】《第2章-信息技术发展(合集篇)》

《第2章-信息技术发展&#xff08;第一部分&#xff09;》 章节说明1 计算机软硬件2 计算机网络2.1 网络的作用范围2.2 OSI模型2.3 广域网协议2.4 网络协议2.5 TCP/IP2.6 软件定义网络&#xff08;SDN&#xff09;2.7 第五代移动通信技术 3 存储和数据库3.1 存储系统架构3.2 存…

Android Studio实现滑动图片验证码

源代码链接 效果&#xff1a; MainActivity package com.example.slidingpattern;import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.Moti…

P1194 买礼物(最小生成树)(内附封面)

买礼物 题目描述 又到了一年一度的明明生日了&#xff0c;明明想要买 B B B 样东西&#xff0c;巧的是&#xff0c;这 B B B 样东西价格都是 A A A 元。 但是&#xff0c;商店老板说最近有促销活动&#xff0c;也就是&#xff1a; 如果你买了第 I I I 样东西&#xff0…

简单程度与自负是否相关?探索STM32的学习价值

事实上&#xff0c;无论STM32是否简单并不重要&#xff0c;更重要的是我们能通过学习STM32获得什么。通过STM32&#xff0c;我们可以学习到许多知识&#xff1a;如果我们制作一个键盘或鼠标&#xff0c;我们可以学习USB协议。如果我们制作一个联网设备&#xff0c;我们需要学习…

【css】css中使用变量var

CSS 变量可以有全局或局部作用域。 全局变量可以在整个文档中进行访问/使用&#xff0c;而局部变量只能在声明它的选择器内部使用。 如需创建具有全局作用域的变量&#xff0c;请在 :root 选择器中声明它。 :root 选择器匹配文档的根元素。 如需创建具有局部作用域的变量&am…

Python编程——谈谈函数的定义、调用与传入参数

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、理解函数 二、函数的定义 1、语法 2、定义一个…

BUUCTF题目Web部分wp(持续更新)

[极客大挑战 2019]EasySQL1【sql注入】 靶机启动后&#xff0c;填写username和password&#xff0c;登录的地址为http://url.to.target/check.php?usernameadmin&passwordpassword&#xff0c;注意post过去空格变成了加号。 http://url.to.target/ http://url.to.target/…

Java实战:高效提取PDF文件指定坐标的文本内容

前言 临时接到一个紧急需要处理的事项。业务侧一个同事有几千个PDF文件需要整理&#xff1a;需要从文件中的指定位置获取对应的编号和地址。 要的急&#xff0c;工作量大。所以就问到技术部有没有好的解决方案。 问技术的话就只能写个demo跑下了。 解决办法 1. 研究下PDF文档…

嗅探抓包工具,解决线上偶现问题来不及抓包的情况阅读目录

目录 背景 实现思路 具体实现 Python 抓包 总结 资料获取方法 背景 测试群里经常看到客户端的同学反馈发现了偶现Bug&#xff0c;但是来不及抓包&#xff0c;最后不了了之&#xff0c;最近出现得比较频繁&#xff0c;所以写个小脚本解决这个问题。 实现思路 之前写过一个…