嵌入式linux学习记录三

  1. Linux 中注册的本质:将表示某种资源的结构体实例(内存对象),插入到内核维护的全局链表、树或哈希表中,并建立对象之间的逻辑关联

  2. 完整的 sysfs 关系图:
    /sys/
    ├── bus/
    │ └── platform/
    │ ├── devices/ ← 所有平台设备(软链接到 /sys/devices)
    │ │ └── xxx.yyy/
    │ │ ├── driver/ ← 软链接 → 绑定的驱动
    │ │ └── of_node/ ← 软链接 → 设备树节点
    │ └── drivers/ ← 所有平台驱动
    │ └── mydriver/
    │ └── xxx.yyy ← 软链接 → 绑定的设备
    │
    ├── devices/
    │ └── platform/ ← 设备实体真正存放处
    │ └── fe300000.gpio/
    │
    └── firmware/
    └── devicetree/ ← 设备树(of节点)体现
    └── base/

  3. sysfs 和 procfs区别:

    1. procfs (/proc) 主要用于体现内核的运行状态、进程信息和环境参数 (如 /proc/cpuinfo、/proc/interrupts、/proc/devices)。虽然你可以在 /proc/devices 中看到注册的字符/块设备主设备号,但它不展现总线-设备-驱动模型(LDM)的拓扑结构。

    2. sysfs (/sys) 才是专门为了展现设备驱动模型 而设计的。因此,平台设备和平台驱动的组织架构完全是由 sysfs 来承载的。

  4. 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)          |
    +-----------------------+         +-----------------------+
    1. I2C/SPI 控制器本身属于 platform_bus : SoC 芯片内部的 I2C 控制器、SPI 控制器或者 USB 主机控制器,它们的寄存器地址是固定的,因此它们作为 platform_device 注册在 platform_bus 上。

    2. 控制器初始化后产生子总线 : 当 I2C 控制器的平台驱动(Platform Driver)成功运行后,它会向内核注册一条全新的 I2C_bus 。此时,挂在这条 I2C 总线上的各种外置传感器芯片(如温度传感器),才属于 I2C_bus 的管理范畴

  5. probe 函数是如何被调用的:

    1. 注册与匹配 :当你将 device 和 driver 都注册到总线后,总线会比对它们的名称或设备树属性。

    2. 总线回调 :一旦总线发现它们两个匹配成功,总线就会去调用 driver 结构体里封装的 probe 函数。

    3. 传入设备指针 :在调用 driver->probe() 时,总线会把匹配成功的 device 结构体指针 作为参数传给 probe。

  6. 调试linux驱动程序,printk写法:printk(KERN_DEBUG "%s : %s : %d hello\n", FILE, FUNCTION, LINE);

  7. 当使用platform_device这种方式指定设备资源时,需要在resource中指定资源,当用户程序对/dev/led0操作,是对gpio_0进行操作。如果用户程序对/dev/led0操作,变成gpio_3操作,需要更改platform_device中的resouce中的内容。同样的问题,如果是使用设备树代替platform_device,那么需要修改设备树。

相关推荐
\光辉岁月/8 小时前
1.mybatis学习-基础
学习·mybatis
へ蟲児.9 小时前
2026三大自带完整体系的英语学习App深度测评:哪款更适合儿童启蒙?
学习
苦猿的大模型日记9 小时前
Day64|从0学习 Claude Code(十四):MCP,给 Agent 装个工具插座
学习
m4Rk_10 小时前
【论文阅读】Agent 记忆机制(82):ReasoningBank——从成功与失败经验中沉淀可复用的推理记忆
论文阅读·人工智能·学习·开源·github
旖旎夜光11 小时前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控
凉、介11 小时前
深入理解 ARM SCP Firmware 的 Event 与 Notification 机制
学习·scp·嵌入式·arm
minglie111 小时前
几何变换群矩阵表示与埃尔朗根纲领
学习
dadaobusi11 小时前
学习: ARM SMMU stream id
arm开发·学习
FelixZhang02812 小时前
量化求真10|回测通过以后,策略就能上场吗?
人工智能·python·深度学习·学习·机器学习·金融·lstm
Vcaker12 小时前
Linux学习33-HPA动态扩缩容及k8s调度策略
linux·运维·学习