i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

news2024/9/22 5:27:15

一、概述

Linux 内核编译流程如下:

1、配置 Linux 内核。

2、编译 Linux 内核。

说明:进入 Linux 内核源码,使用 make help 参看相关配置。

二、make menuconfig 工作原理

1、menuconfig 它本身是一个软件,只提供图形界面配置的一些逻辑,并不负责提供内容。

2、menuconfig 是内核源码树的各目录下的 kconfig 提供的。

3、menuconfig 中所有选中配置项的相关值会保存到配置文件中(默认配置文件为 .config)。

4、在编译内核时,Makefile 根据相关配置项选择需要编译的源码。

三、Kconfig 语法

参考文档:Documentation/kbuild/kconfig-language.txt

Linux 驱动开发 六十五:《kconfig-language.txt》翻译_lqonlylove的博客-CSDN博客

四、Linux 内核中 Kconfig 分析

1、顶层 Kconfig 内容

#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"

config SRCARCH
	string
	option env="SRCARCH"

source "arch/$SRCARCH/Kconfig"
  • mainmenu标题栏
  • config:定义配置项
    • string数据类型
    • env:导入 Kconfig环境变量
  • source:读取的配置文件位置。
    在这里插入图片描述

2、arch/arm/Kconfig 内容

……
source "init/Kconfig" # 包含配置文件

source "kernel/Kconfig.freezer"

menu "System Type" # 定义配置菜单栏

config MMU	# 在 System Type 下定义配置项
	bool "MMU-based Paged Memory Management Support"
	default y
	help
	  Select if you want MMU-based virtualised addressing space
	  support by paged memory management. If unsure, say 'Y'.

#
# The "ARM system type" choice list is ordered alphabetically by option
# text.  Please add new entries in the option alphabetic order.
#
choice
	prompt "ARM system type"
	default ARCH_VERSATILE if !MMU
	default ARCH_MULTIPLATFORM if MMU

config ARCH_MULTIPLATFORM
	bool "Allow multiple platforms to be selected"
	depends on MMU
	select ARCH_WANT_OPTIONAL_GPIOLIB
	select ARM_HAS_SG_CHAIN
	select ARM_PATCH_PHYS_VIRT
	select AUTO_ZRELADDR
	select CLKSRC_OF
	select COMMON_CLK
	select GENERIC_CLOCKEVENTS
	select MIGHT_HAVE_PCI
	select MULTI_IRQ_HANDLER
	select SPARSE_IRQ
	select USE_OF

……

config ARCH_VERSATILE
	bool "ARM Ltd. Versatile family"
	select ARCH_WANT_OPTIONAL_GPIOLIB
	select ARM_AMBA
	select ARM_TIMER_SP804
	select ARM_VIC
	select CLKDEV_LOOKUP
	select GENERIC_CLOCKEVENTS
	select HAVE_MACH_CLKDEV
	select ICST
	select PLAT_VERSATILE
	select PLAT_VERSATILE_CLOCK
	select PLAT_VERSATILE_SCHED_CLOCK
	select VERSATILE_FPGA_IRQ
	help
	  This enables support for ARM Ltd Versatile board.
	  
……

menu "Multiple platform selection"
	depends on ARCH_MULTIPLATFORM	# Multiple platform selection 依赖 ARCH_MULTIPLATFORM 配置项

comment "CPU Core family selection"

……

#
# This is sorted alphabetically by mach-* pathname.  However, plat-*
# Kconfigs may be included either alphabetically (according to the
# plat- suffix) or along side the corresponding mach-* source.
#
source "arch/arm/mach-mvebu/Kconfig"
……

menu "Bus support"
……
menu "Kernel Features"

menu "CPU Power Management"

source "drivers/cpufreq/Kconfig"

source "drivers/cpuidle/Kconfig"

endmenu

menu "Floating point emulation"

comment "At least one emulation must be selected"

endmenu
……

menu "Userspace binary formats"

source "fs/Kconfig.binfmt"

endmenu

menu "Power management options"

source "kernel/power/Kconfig"

endmenu

source "net/Kconfig"

source "drivers/Kconfig"

source "drivers/firmware/Kconfig"

source "fs/Kconfig"

source "arch/arm/Kconfig.debug"

source "security/Kconfig"

source "crypto/Kconfig"
if CRYPTO
source "arch/arm/crypto/Kconfig"
endif

source "lib/Kconfig"

source "arch/arm/kvm/Kconfig"
  • source:包含一个配置文件;
  • menu:定义一个菜单项;
  • choice:定义一个选项组;
  • config:定义一个配置项;
  • comment:定义一个注释;

3、其他配置文件

五、测试

1、添加菜单

为了方便测试,在顶层 Kconfig 下添加一个 bool 配置项,配置项内容如下:

menu "onlylove test"

endmenu

在这里插入图片描述

2、添加 bool 类型配置

menu "onlylove test"

config ONLYLOVE_TEST
	bool "onlylove test Management Support"

endmenu

在这里插入图片描述

3、添加 tristate 类型配置

menu "onlylove test"

config ONLYLOVE_TEST
	tristate "onlylove test Management Support"

endmenu

在这里插入图片描述

4、添加 string 类型配置

menu "onlylove test"

config ONLYLOVE_TEST
	string "onlylove test Management Support"

endmenu

在这里插入图片描述

5、添加 hex 类型配置

menu "onlylove test"

config ONLYLOVE_TEST
	hex "onlylove test Management Support"

endmenu

在这里插入图片描述

6、添加 int 类型值

menu "onlylove test"

config ONLYLOVE_TEST
	int "onlylove test Management Support"

endmenu

在这里插入图片描述

7、查看配置是否生效

1、添加菜单和配置项

menu "onlylove test"

config ONLYLOVE_TEST
	tristate "onlylove test Management Support"

endmenu

2、查看旧配置文件

onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ cat .config | grep ONLYLOVE_TEST
# CONFIG_ONLYLOVE_TEST is not set
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$

3、选中 onlylove test Management Support 配置项
在这里插入图片描述
4、查看新配置文件

onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ cat .config | grep ONLYLOVE_TEST
CONFIG_ONLYLOVE_TEST=m
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$

六、向 Linux 内核中添加自己编写驱动

1、确定驱动所属类型

  • ICM-20608 属于 SPI 设备。

2、找到对应Kconfig文件

onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ pwd
/home/onlylove/my/linux/linux-imx-4.1.15/drivers/spi
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ ls -l Kconfig 
-rw-rw-r-- 1 onlylove onlylove 20563 May 24  2019 Kconfig
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$

3、添加驱动文件

onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ pwd
/home/onlylove/my/linux/linux-imx-4.1.15/drivers/spi
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ ls -l spi-icm2068.c
ls: cannot access 'spi-icm2068.c': No such file or directory
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$  cp -f ~/my/imx6ull_drive/13_icm20608_spi/spi-icm2068.c ./
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ ls -l spi-icm2068.c
-rw-rw-r-- 1 onlylove onlylove 12758 Nov 13 00:25 spi-icm2068.c
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$

4、添加配置项

config ONLYLOVE_ICM20608
        tristate "Icm20608 Device Support"
        help
          This supports user icm20608 device.

在这里插入图片描述

onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ cat .config | grep ONLYLOVE_ICM20608
CONFIG_ONLYLOVE_ICM20608=y
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$

5、添加Makefile编译项

obj-$(CONFIG_ONLYLOVE_ICM20608)         += spi-icm2068.o

6、编译内核

onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ make -j4
scripts/kconfig/conf  --silentoldconfig Kconfig
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' is up to date.
  CHK     include/generated/bounds.h
  CHK     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  CC      drivers/spi/spi-icm2068.o
  LD      drivers/spi/built-in.o
  LD      drivers/built-in.o
  LINK    vmlinux
  LD      vmlinux.o
  MODPOST vmlinux.o
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  LD      init/built-in.o
  KSYM    .tmp_kallsyms1.o
  KSYM    .tmp_kallsyms2.o
  LD      vmlinux
  SORTEX  vmlinux
  SYSMAP  System.map
  OBJCOPY arch/arm/boot/Image
  Building modules, stage 2.
  MODPOST 27 modules
  Kernel: arch/arm/boot/Image is ready
  LZO     arch/arm/boot/compressed/piggy.lzo
  AS      arch/arm/boot/compressed/piggy.lzo.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ 

日志 CC drivers/spi/spi-icm2068.o 表示 spi-icm2068 驱动编译成功。

7、驱动测试

1、Linux 启动日志

在这里插入图片描述
以上日志可以确定 icm20608 驱动加载成功。icm20608 设备 ID 读取成功。

2、app程序调用icm20608驱动

# ls
icm20608_app
# ls -l /dev/icm20608
crw-rw----    1 root     root       10,  62 Jan  1 00:00 /dev/icm20608
#
# ./icm20608_app /dev/icm20608
data[0] = 6 data[1] = 13 data[2] = 0 data[3] = 43 data[4] = 6 data[5] = 2067

原始值:
gx = 6, gy = 13, gz = 0
ax = 43, ay = 6, az = 2067
temp = 1715
实际值:act gx = 0.37°/S, act gy = 0.79°/S, act gz = 0.00°/S
act ax = 0.02g, act ay = 0.00g, act az = 1.01g
act temp = 30.17°C
data[0] = 7 data[1] = 13 data[2] = 0 data[3] = 39 data[4] = 8 data[5] = 2063

原始值:
gx = 7, gy = 13, gz = 0
ax = 39, ay = 8, az = 2063
temp = 1708
实际值:act gx = 0.43°/S, act gy = 0.79°/S, act gz = 0.00°/S
act ax = 0.02g, act ay = 0.00g, act az = 1.01g
act temp = 30.15°C
data[0] = 8 data[1] = 12 data[2] = -1 data[3] = 43 data[4] = 11 data[5] = 2067

原始值:
gx = 8, gy = 12, gz = -1
ax = 43, ay = 11, az = 2067
temp = 1711
实际值:act gx = 0.49°/S, act gy = 0.73°/S, act gz = -0.06°/S
act ax = 0.02g, act ay = 0.01g, act az = 1.01g
act temp = 30.16°C
^C
#

数据读取成功。

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

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

相关文章

Android App 秒开实践方案~

一、背景 启动速度可以说是一个 APP 的门面,对用户体验至关重要。随着业务不断增加,需要初始化的任务也越来越多,如果放任不管,启动时长会逐步增加,为此雪球客户端针对应用启动时长做了大量优化工作。本文从应用启动基…

[读论文] Monocular 3D Object Reconstruction with GAN inversion (ECCV2022)

概述 项目主页:https://www.mmlab-ntu.com/project/meshinversion/ 方法名称:MeshInversion 输入:单目图像 (in the wild,有背景的,没有抠图的) 输出:textured 3D mesh key challen…

【metaRTC学习】metaRTC的demo运行说明(一)

metaRTC的github的地址为:GitHub - metartc/metaRTC: A cross-platform WebRTC SDK 其作者杨高峰的博客为:metaRTC的博客_CSDN博客-metaRTC,解决方案领域博主 其博客对其自己的demo的运行说明不够详细,刚入门的会一脸懵,本文对其…

Netty(二)- NIO三大组件之Buffer

文章目录一、Buffer 基本介绍二、Buffer 类及其子类三、Buffer 的使用四、关于Buffer 的注意事项和细节1. put和get的数据类型应该相同2. 可以将一个普通 Buffer 转成只读 Buffer3. 可以使用MappedByteBuffer让文件直接在内存中修改4. 可以通过 Buffer 数组完成读写操作&#x…

富文本编辑器 ck-editor5 的使用

最近在项目中需要用到富文本编辑器,据说ck-editor5很不错,于是就使用它了,不过在期间也遇到了很多问题,这里记录下。 一、引入ck-editor5 文档地址:Predefined builds - CKEditor 5 Documentation 这里有个坑&#…

YOLOv2-yolo9000-batter,faster,stronger 论文精度

参考大佬:同济子豪兄 YOLOv2-yolo9000 yolo9000-batter,faster,stronger Introduction 我们提出了一种新的方法来利用大量的图像分类数据,来扩大当前检测系统的范围。我们的方法使用目标分类的分层视图,允许我们将不同的数据集组合在一起…

个人需求1:代码提交这块的做法

老早之前的代码提交的步骤,真的是很繁琐在这里提交代码,现在和大家分析一下我当初的心得。 1.首先黄老师建立了一个jira号,记得把功能背景/方案说明/测试范围提前了解,问起来的时候也能回答,如下图1: 15324就是我本次的jira号,每次开发前先建立jira号,这…

小区访客导航GIS方案

1 应用功能设计 1.1 小区地图 1.1.1 小区地图浏览 基于GIS平台,对小区地图进行渲染发布,提供可视化显示浏览地图可以选择2D地图模式,用户可以在地图上快速查询和点击选择某个小区内的建筑物、POI等信息,并查看其相关属性信息&…

【现代机器人学】学习笔记二:刚体运动

这一节内容最开始在学之前是有些不屑的,这些坐标变换的内容天天都在玩,有什么复杂的?高翔博士的14讲貌似讲这些内容只用了几页。 不过认真一读才发现自己自大肤浅了。 之前我在北大研究院的时候,有一个实验室双聘的浙农林的老师&…

每天一个面试题:ThreadLocal底层原理和实现Demo

ThreadLocal底层原理和实现Demo每天一个面试题:ThreadLocal实现ThreadLocal的DemoThreadLocal底层原理为什么ThreadLocalMap的key设计为弱引用今天开始一个新专栏:每天一个面试题系列 也没有拿到令人心动的offer,看来自己学习方式和能力还是差…

fastapi_No.25_获取配置项

文章目录方式1:隐藏在环境变量中配置环境变量Windows中配置环境变量Linux中配置环境变量在代码中获取环境变量方式2:隐藏在配置文件中装包在代码中获取配置文件内容在之前的代码中,像数据库连接信息等敏感信息,都直接写在代码中&a…

每日一题 —— 882. 细分图中的可到达节点

882. 细分图中的可到达节点 给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。 图用由边组成的二维数组 edgesedgesedges 表示&…

182:vue+openlayers 使用d3实现地图区块呈现不同颜色的效果

第182个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载解析geojson文件,同时利用d3的颜色功能,使得美国每个州呈现出不同的颜色区块,方便识别。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,…

UNIX环境高级编程_文件IO_文件描述符

这篇文章记录文件描述符,下一篇文章记录文件描述表。 1 文件描述符 先说说什么是文件IO。文件的IO就是文件的输入输出,也就是文件的读写。读和写是以CPU为参考的,从CPU向文件中写入数据,就是写操作;从文件中读取数据…

Aviation turbofan starting model

Aviation turbofan starting model 涡扇发动机(Turbofan)即涡轮风扇发动机,来源于涡轮喷气发动机,主要是为了解决涡轮喷气发动机耗油率过高的问题。其结构特点是流过风扇的空气一部分进入压气机(内涵道),一部分进入由压气机外部通道(外涵道)流过,这部分气流不经过燃烧…

01 - Linux系统概要(再论计算机系统)

---- 整理自狄泰软件唐佐林老师课程 1. 再论计算机系统 计算机系统由躯体和灵魂两部分组成 – 躯体:构成计算机系统的电子设备(硬件) – 灵魂:指挥躯体完成动作的指令序列(软件) 躯体核心:中央…

2022-12-05 优化el-tree懒加载选人树

今后就都拼抵抗力了嗷 需求描述 此处有一棵懒加载树(可选人),右侧展示已选中的人。且父子关联,可以通过选中一个部门勾选所有子节点。问题是,选中父节点,当子节点未加载时,是获取不到勾选的子…

Redis配置、持久化以及相命令

Redis 什么是Redis Redis(远程字典服务器)是一个开源的、使用C语言编写的NoSQL数据库 Redis 基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。 Redis服务…

新来的性能测试工程师工资25K,看了他做的性能测试,那才真叫牛

一直深耕于互联网行业的测试工作,前期测试主要以项目为主,也就是 一个人负责2-3个项目 的测试工作,当然包括项目上功能、自动化和性能等一切测试工作。 我有几个朋友也在互联网大厂工作,从他们当中了解到其实真正的互联网大厂&…

【前端CSS】网站都变成灰色了,它是怎么实现的?(含源代码解析)

目录:网站都变成灰色了,它是怎么实现的?一、前言二、如何实现的三、代码的理解3.1 CSS3 filter(滤镜) 属性3.2 定义和使用3.2.1 CSS动画演示3.2.2 JS语法演示3.3 浏览器支持3.4 CSS 语法3.5 Filter 函数四、实例展示4.1 模糊实例4.2 Brightne…