-
Linux 中注册的本质:将表示某种资源的结构体实例(内存对象),插入到内核维护的全局链表、树或哈希表中,并建立对象之间的逻辑关联
-
完整的 sysfs 关系图:
/sys/
├── bus/
│ └── platform/
│ ├── devices/ ← 所有平台设备(软链接到 /sys/devices)
│ │ └── xxx.yyy/
│ │ ├── driver/ ← 软链接 → 绑定的驱动
│ │ └── of_node/ ← 软链接 → 设备树节点
│ └── drivers/ ← 所有平台驱动
│ └── mydriver/
│ └── xxx.yyy ← 软链接 → 绑定的设备
│
├── devices/
│ └── platform/ ← 设备实体真正存放处
│ └── fe300000.gpio/
│
└── firmware/
└── devicetree/ ← 设备树(of节点)体现
└── base/ -
sysfs和procfs区别:-
procfs(/proc) 主要用于体现内核的运行状态、进程信息和环境参数 (如/proc/cpuinfo、/proc/interrupts、/proc/devices)。虽然你可以在/proc/devices中看到注册的字符/块设备主设备号,但它不展现总线-设备-驱动模型(LDM)的拓扑结构。 -
sysfs(/sys) 才是专门为了展现设备驱动模型 而设计的。因此,平台设备和平台驱动的组织架构完全是由sysfs来承载的。
-
-
platform_bus(虚拟总线)和usb_bus,I2C_bus,spi_bus(物理总线)的区别:
在设备树(DTS)与代码中的层级关系
在真实的嵌入式系统中,这四条总线并不是并列平铺的,而是存在明显的宿主与层级关系:
+--------------------------------------------------------+ | platform_bus | <- 虚拟大管家 +--------------------------------------------------------+ | | v v +-----------------------+ +-----------------------+ | I2C 控制器 (Platform) | | SPI 控制器 (Platform) | <- 控制器本身是平台设备 +-----------------------+ +-----------------------+ | | ====|== I2C_bus ============ |==== spi_bus ========== <- 衍生出具体的物理总线 | | v v +-----------------------+ +-----------------------+ | AP3216C 环境光传感器 | | W25Q128 Flash 存储器 | <- 真正的外设节点 | (I2C Device) | | (SPI Device) | +-----------------------+ +-----------------------+-
I2C/SPI 控制器本身属于
platform_bus: SoC 芯片内部的 I2C 控制器、SPI 控制器或者 USB 主机控制器,它们的寄存器地址是固定的,因此它们作为platform_device注册在platform_bus上。 -
控制器初始化后产生子总线 : 当 I2C 控制器的平台驱动(Platform Driver)成功运行后,它会向内核注册一条全新的
I2C_bus。此时,挂在这条 I2C 总线上的各种外置传感器芯片(如温度传感器),才属于I2C_bus的管理范畴
-
-
probe函数是如何被调用的:-
注册与匹配 :当你将
device和driver都注册到总线后,总线会比对它们的名称或设备树属性。 -
总线回调 :一旦总线发现它们两个匹配成功,总线就会去调用
driver结构体里封装的probe函数。 -
传入设备指针 :在调用
driver->probe()时,总线会把匹配成功的device结构体指针 作为参数传给probe。
-
-
调试linux驱动程序,printk写法:printk(KERN_DEBUG "%s : %s : %d hello\n", FILE, FUNCTION, LINE);
-
当使用platform_device这种方式指定设备资源时,需要在resource中指定资源,当用户程序对/dev/led0操作,是对gpio_0进行操作。如果用户程序对/dev/led0操作,变成gpio_3操作,需要更改platform_device中的resouce中的内容。同样的问题,如果是使用设备树代替platform_device,那么需要修改设备树。
嵌入式linux学习记录三
bush42026-05-30 8:31
相关推荐
通信小呆呆2 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?H__Rick2 天前
自动对焦学习-3Daisy Lee2 天前
量化学习-第1章-什么是量化金融Alsn862 天前
等待学习-学习目录:Docker 容器安全攻防YM52e2 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本小雨下雨的雨2 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本cqbzcsq2 天前
CellFlow虚拟细胞论文阅读YangYang9YangYan2 天前
2026初入职场学习数据分析的价值guslegend2 天前
理论学习:什么是 Coding Agent?自传.2 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记