当前位置: 首页 > article >正文

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

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.kler.cn/a/379172.html

相关文章:

  • Java环境下配置环境(jar包)并连接mysql数据库
  • 2024年大厂AI大模型面试题精选与答案解析
  • logrotate工具强制日志轮询
  • 一篇文章理解CSS垂直布局方法
  • 证书下行,这些高质量IT证书仍值得考
  • SpringBoot3如何读取配置文件application.properties的属性值
  • C++笔试题之实现一个定时器
  • [JAVAEE] 面试题(三) - Callable接口, ReentrantLock类, Semaphore信号量, CountDownLatch类
  • 在线教育辅助:SpringBoot试题库系统精讲
  • Android IPC机制(一)多进程模式
  • 每周算法比赛
  • qt 如何在本地进行打包
  • 【论文精读】LPT: Long-tailed prompt tuning for image classification
  • 读书笔记-《Spring技术内幕》(四)事务
  • 【亚马逊云】基于 AWS 使用CloudFormation快速部署 VMClarity 环境
  • celery在django项目中实现并发任务和定时任务
  • SOLIDWORKS 2025用户体验新功能
  • NineData云原生智能数据管理平台新功能发布|2024年10月版
  • distrobox install in ubuntu 22.04 / 在 ubuntu 22.04 上安装 distrobox (***) OK
  • qt的c++环境配置和c++基础【正点原子】嵌入式Qt5 C++开发视频
  • Stable Diffusion Web UI 1.9.4常用插件扩展-WD14-tagger
  • Spring Boot技术:校园社团信息管理的创新解决方案
  • 123.WEB渗透测试-信息收集-ARL(14)
  • 初始计算机网络
  • sqlserver、达梦、mysql的差异
  • React 组件生命周期与 Hooks 简明指南