[linux驱动开发--零碎知识]基于linux内核6.11.0

news2024/11/4 18:35:01

linux驱动开发基础知识(待补充)

内核API文档

1. 操作集函数调用关系

在应用层的open()close()read()write()…等C函数对应驱动层的open()close()read()write()…等操作函数

2. kernel驱动操作函数集合

在 Linux 内核文件include/linux/fs.h中有个叫做 file_operations的结构体,此结构体就是 Linux 内核驱动操作函数集合

3. 应用层加载和卸载驱动

  1. 加载
    • insmod:不会自动加载驱动依赖项
    • modprobe(推荐):将所有的依赖模块都加载到内核中,默认会去/lib/modules/<kernel-version>目录中查找模块
  2. 卸载
    • rmmod(推荐)
    • modprobe -r:modprobe 命令可以卸载掉驱动模块所依赖的其他模块,前提是这些依赖模块已经没有被其他模块所使用,否则就不能使用 modprobe 来卸载驱动模块。

4. 内核调试printk消息级别

#define KERN_EMERG	KERN_SOH "0"	/* system is unusable */
#define KERN_ALERT	KERN_SOH "1"	/* action must be taken immediately */
#define KERN_CRIT	KERN_SOH "2"	/* critical conditions */
#define KERN_ERR	KERN_SOH "3"	/* error conditions */
#define KERN_WARNING	KERN_SOH "4"	/* warning conditions */
#define KERN_NOTICE	KERN_SOH "5"	/* normal but significant condition */
#define KERN_INFO	KERN_SOH "6"	/* informational */
#define KERN_DEBUG	KERN_SOH "7"	/* debug-level messages */
// 用法,不显式指定级别时,默认级别4,KERN_WARNING
printk(KERN_EMERG "gsmi: Log Shutdown Reason\n");

5. 内存物理地址访问

API文档定位

// GPIO1_DR_BASE=真实地址
#define GPIO1_DR_BASE   (0X0209C000)
// GPIO1_DR=虚拟地址
static void __iomem *GPIO1_DR;
// 申请虚拟地址
GPIO1_DR = ioremap(GPIO1_DR_BASE, 4);
// 释放虚拟地址
iounmap(GPIO1_DR);

6. .dts、.dtb、dtc和.dtsi

  1. .dts是设备树源码文件
  2. .dtb是将.dts编译以后得到的二进制文件
  3. dtc是把.dts编译成.dtb的编译工具,dtc源码在Linux内核的scripts/dtc目录下
  4. .dtsi是头文件,在.dts 设备树文件中,还可以通过#include来引用.h、.dtsi 和.dts 文件。一般.dtsi 文件用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范
    围,比如 UART、IIC 等等
  5. 编译命令:进入到linux内核源码根目录,然后make dtbs
  6. 移植内核如何添加开发板的dtb文件:从arch/结构/boot/.dts/Makefile目录往下面找子目录的Makefile,找到自己开发板送到的SOC的Makefile文件,往里面添加新增的…dts文件的名字,同时相应的目录添加…dts文件。例如:
    • 全志-A33---->arch/arm/boot/.dts/allwinner/Makefile
    • 瑞芯微-RK3588---->arch/arm64/boot/.dts/rockchip/Makefile

7. 设备树编写和使用

设备树规范文档,OF函数API文档

  1. 每片SOC/节点只有一个,多个文件的/根节点会合并
  2. 关于compatible笔记:
    • 设备节点的compatible:是为了匹配 Linux 内核中的驱动程序
    • 根节点中的compatible:描述了所使用的硬件设备名字,Linux 内核会通过根节点的compoatible属性查看是否支持此设备,如果支持的话设备就会启动 Linux 内核
  3. /中有两个特殊的子节点:aliaseschosen:
    • aliases:aliases 节点的主要功能就是定义别名
    • chosen:不是一个真实的设备,chosen 节点主要是为了 uboot 向 Linux 内核传递数据
  4. 在已有设备树上增减内容,参考文档:linux_kernel/Documentation/devicetree/bindings
  5. 设备树对应系统路径:设备树的/节点---->路径:/proc/device-tree
  6. OF 函数原型都定义在include/linux/of.h

8. 设备树绑定文档阅读笔记

路径:Documentation/devicetree/bindings/i2c/allwinner,sun6i-a31-p2wi.yaml

# allOf 指定了该设备树文件继承了 /schemas/i2c/i2c-controller.yaml 的内容
allOf:
  - $ref: /schemas/i2c/i2c-controller.yaml#

# properties 列出该设备的属性
properties:

# required 列出了必须定义的属性。这些属性在设备树中是必需的。
required:

# 👇规定除 properties 中列出的属性外,其他属性均不允许使用。避免引入意外属性。
unevaluatedProperties: false

内核代码前后缀含义汇总

  1. inline:即将函数调用替换为函数体,从而减少函数调用的开销,例如:
// 内联函数
inline int add(int a, int b) {
    return a + b;
}

int main() {
    int x = add(3, 4);  // 编译器会直接把add(3, 4)替换为3 + 4
    return 0;
}
// ------------------------------------------------------------------------------------
// 内联效果
int main() {
    int x = 3 + 4;  // 编译器直接将调用替换为3 + 4
    return 0;
}
  1. __initconst:用于只读常量,指示编译器将变量放置在一个特定的内存区域,以便在内核初始化完成后释放这些内存,从而节省内存资源。
  2. __init:用于内核初始化函数,表示这些函数仅在内核初始化阶段使用,之后会释放掉其所在的内存。

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

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

相关文章

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…

如何选择到印尼的海运代理

如何选择到印尼的海运代理 选择合适的海运代理的重要性 海运代理负责安排货物从发货地到目的地的整个运输过程&#xff0c;包括装运、清关、仓储等服务。一个可靠的海运代理能确保货物安全准时到达&#xff0c;并帮助企业节省时间和成本。 选择海运代理需考虑的主要因素 公司…

python常用的第三方库下载方法

方法一&#xff1a;打开pycharm-打开项目-点击左侧图标查看已下载的第三方库-没有下载搜索后点击install即可直接安装--安装成功后会显示在installed列表 方法二&#xff1a;打开dos窗口输入命令“pip install requests“后按回车键&#xff0c;看到successfully既安装成功&…

FFmpeg 4.3 音视频-多路H265监控录放C++开发八,使用SDLVSQT显示yuv文件 ,使用ffmpeg的AVFrame

一. AVFrame 核心回顾&#xff0c;uint8_t *data[AV_NUM_DATA_POINTERS] 和 int linesize[AV_NUM_DATA_POINTERS] AVFrame 存储的是解码后的数据&#xff0c;&#xff08;包括音频和视频&#xff09;例如&#xff1a;yuv数据&#xff0c;或者pcm数据&#xff0c;参考AVFrame结…

jenkins 构建报错 Cannot run program “sh”

原因 在 windows 操作系统 jenkins 自动化部署的时候, 由于自动化构建的命令是 shell 执行的,而默认windows 从 path 路径拿到的 shell 没有 sh.exe &#xff0c;因此报错。 解决方法 前提是已经安装过 git WINR 输入cmd 打开命令行, 然后输入where git 获取 git 的路径, …

基于Spring Boot的高校物品捐赠管理系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息处理的作用&a…

AndroidStudio通过Bundle进行数据传递

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;AndroidStudio 目录 1.新建活动 2.修改页面布局 代码&#xff1a; 效果&#xff1a; 3.新建类ResultActivity并继承AppCompatActivity 4.新建布局文件activity_result.xml 代…

测试分层:减少对全链路回归依赖的探索!

引言&#xff1a;测试分层与全链路回归的挑战 在软件开发和测试过程中&#xff0c;全链路回归测试往往是一个复杂且耗费资源的环节&#xff0c;尤其在系统庞大且模块众多的场景下&#xff0c;全链路测试的集成难度显著提高。而“测试分层”作为一种结构化的测试方法&#xff0…

【python】OpenCV—findContours(4.5)

文章目录 1、功能描述2、原理分析3、代码实现4、效果展示5、完整代码6、参考 1、功能描述 输入图片&#xff0c;计算出图片中的目标到相机间的距离 2、原理分析 用最简单的三角形相似性 已知参数&#xff0c;物体的宽度 W W W&#xff0c;物体到相机的距离 D D D&#xff0…

jmeter基础01-3_环境准备-Linux系统安装jdk

Step1. 查看系统类型 打开终端&#xff0c;命令行输入uname -a&#xff0c;显示所有系统信息&#xff0c;包括内核名称、主机名、内核版本等。 如果输出是x86_64&#xff0c;则系统为64位。如果输出是i686 或i386&#xff0c;则系统为32位。 Step2. 官网下载安装包 https://www…

获取JSON对象的时候,值会自动带上双引号

问题&#xff1a;当使用下方代码&#xff0c;获取JsonNode对象的时候&#xff0c;从该对象中通过键获取的值会自动带上双引号。 JsonNode jsonNode new ObjectMapper().readTree("JSON字符串"); 注意&#xff1a;以上方法是获得的JsonNode对象&#xff0c;不是JSO…

大气污染监测系统方案:智慧环保监测的“千里眼“

​ 作为星创易联的一名工程师,我有幸参与了某市环保局的大气污染监测系统项目。该市地处我国中部地区,近年来工业发展迅速,大气污染问题日益突出。为加强环境管理,政府决定构建一套覆盖全市的大气污染在线监测系统,实时掌握各区域的空气质量状况。 我们公司凭借在物联网领域的…

leetcode-88-合并两个有序数组

题解&#xff1a; 解法一&#xff1a;从后向前同时遍历两个数组&#xff0c;因为nums1后面是0&#xff0c;从后遍历节省空间。 1、定义三个指针&#xff0c;分别为&#xff1a;len1m-1指向nums1的最后一个非0数字&#xff1b;len2n-1指向nums2的最后一个数字&#xff1b;len3…

百度文心智能体:巧用汉字笔画生成与汉字搜索插件,打造一个学习汉字的教育类智能体

这篇文章&#xff0c;主要介绍如何巧用汉字笔画生成与汉字搜索插件&#xff0c;打造一个学习汉字的教育类智能体。 目录 一、教育类智能体 1.1、智能体演示 1.2、智能体插件 1.3、智能体prompt &#xff08;1&#xff09;角色和目标 &#xff08;2&#xff09;思考路径 …

MySQL rand()函数、rand(n)、生成不重复随机数

文章目录 一、rand()与rand(n)二、rand()使用示例2.1、rand()与order by/group by使用随机排序分组2.2、round()与rand()的组合使用2.3、rand与ceiling的组合使用2.4、rand与floor组合使用2.5、rand与md5组合使用 三、总结3.1、rand()与rand(n)的区别 有时候我们想要生成一个唯…

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 文章目录 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC1. 介绍 二. 参考文献 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 如何在 Ubuntu 22.04 上安装和配置 VNChttps://hub.docker.c…

ubuntu22-安装vscode-配置shell命令环境-mac安装

文章目录 1.安装vscode2.修改语言为中文3.配置bash调试环境3.1.安装插件3.2.添加配置文件 4.调试bash4.1.新建tmp.sh文件4.2.运行启动 5.mac安装6.mac卸载 1.安装vscode 从官网下载安装包Code_1.93.1-1726079302_amd64.deb。 在ubuntu系统中&#xff0c;安装包所在目录打开命令…

MongoDB 8.0.3版本安装教程

MongoDB 8.0.3版本安装教程 一、下载安装 1.进入官网 2.选择社区版 3.点击下载 4.下载完成后点击安装 5.同意协议&#xff0c;下一步 6.选择第二个Custon&#xff0c;自定义安装 7.选择安装路径 &#xff01;记住安装路径 8.默认&#xff0c;下一步 9.取…

编程八种语言谁是最受市场青睐的?

你听说过"编程语言江湖"吗?在这个瞬息万变的IT世界里&#xff0c;各种编程语言就像武林高手&#xff0c;各展绝技&#xff0c;争夺"武林盟主"的宝座。 1. JavaScript/TypeScript: 江湖新贵的崛起江湖中有一句老话:"十年磨一剑&#xff0c;霜刃未曾试…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西&#xff0c;其中TableGen占了一部分&#xff0c;所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客&#xff0c;学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…