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

Linux 驱动总线中的 ACPI 设备匹配机制是怎么回事儿?【最大特点是设备的自动发现和热插拔性能良好】

Linux 驱动总线中的 ACPI 设备匹配机制概述

在 Linux 内核中,ACPI(Advanced Configuration and Power Interface,高级配置与电源管理接口)提供了一种标准化的方法来描述硬件,并支持设备自动发现和电源管理。
在驱动总线(如 PCI、I2C、SPI、Platform 等)中,ACPI 匹配主要用于 在不依赖设备树(Device Tree)的情况下自动匹配设备和驱动

一个具体的示例

下面是SPI总线驱动的一个实例:spidev.c,相关代码路径和截图如下:

\Linux-4.9.88\drivers\spi\spi.c
在这里插入图片描述
\Linux-4.9.88\drivers\spi\spidev.c
在这里插入图片描述
\Linux-4.9.88\drivers\spi\spidev.c
在这里插入图片描述


1. ACPI 匹配的基本原理

在 ACPI 系统中,每个设备由 ACPI 名称空间(ACPI Namespace) 描述,ACPI 表(如 DSDT)中包含 Device 结构,定义了该设备的 硬件 ID(HID)和 兼容 ID(CID)。

示例:ACPI DSDT 表中的设备定义

Device (I2C1)
{
    Name (_HID, "INTC1000")  // 硬件 ID
    Name (_CID, "INTC1001")  // 兼容 ID(可选)
    Name (_UID, 1)           // 唯一 ID
    Name (_CRS, ResourceTemplate() {
        I2cSerialBus(0x50, ControllerInitiated, 400000,
                     AddressingMode7Bit, "\\_SB.I2C1", 0x00, ResourceConsumer)
    })
}
  • _HID(Hardware ID):用于设备驱动匹配,例如 "INTC1000"
  • _CID(Compatible ID):用于向后兼容性匹配,例如 "INTC1001"
  • _CRS(Current Resource Settings):描述 I2C 地址、SPI 片选、IRQ 号等资源信息。

当 Linux 内核启动时,它会解析 ACPI 表,并创建相应的设备节点。


2. Linux 内核中的 ACPI 匹配

在 Linux 设备驱动程序中,可以通过 acpi_match_table 进行 ACPI 设备匹配。

示例 1:Platform 设备 ACPI 匹配

static const struct acpi_device_id my_acpi_ids[] = {
    { "INTC1000", 0 },  // 匹配 ACPI DSDT 表中的 _HID
    { "INTC1001", 0 },  // 匹配 ACPI DSDT 表中的 _CID
    { }
};
MODULE_DEVICE_TABLE(acpi, my_acpi_ids);

static struct platform_driver my_platform_driver = {
    .driver = {
        .name = "my_platform_device",
        .acpi_match_table = ACPI_PTR(my_acpi_ids),  // ACPI 设备匹配表
    },
    .probe = my_probe,
    .remove = my_remove,
};
  • my_acpi_ids[]:定义了 ACPI 设备匹配表,包含 HIDCID
  • MODULE_DEVICE_TABLE(acpi, my_acpi_ids);:将匹配表导出到内核设备表,modinfo 可查看 ACPI 兼容 ID。
  • acpi_match_table = ACPI_PTR(my_acpi_ids);:告诉内核该驱动支持 ACPI 设备匹配。

示例 2:I2C 设备 ACPI 匹配

对于 I2C 设备:

static const struct acpi_device_id my_i2c_acpi_ids[] = {
    { "INTC2000", 0 },  // ACPI DSDT _HID
    { }
};
MODULE_DEVICE_TABLE(acpi, my_i2c_acpi_ids);

static struct i2c_driver my_i2c_driver = {
    .driver = {
        .name = "my_i2c_device",
        .acpi_match_table = ACPI_PTR(my_i2c_acpi_ids),
    },
    .probe = my_i2c_probe,
    .remove = my_i2c_remove,
};
  • 当 ACPI DSDT 中定义的 _HID = “INTC2000”` 时,驱动会自动匹配这个 I2C 设备。

3. ACPI 设备匹配 vs. 设备树(Device Tree)

匹配方式ACPI设备树(DT)
主要用于x86、部分 ARM64ARM、RISC-V
设备描述DSDT 表(BIOS/UEFI 提供).dts 文件
设备发现固件自动发现由内核解析设备树
匹配方式.acpi_match_table.of_match_table
资源分配_CRS 方法提供reginterrupts
热插拔支持良好(动态枚举)有限
  • x86 设备(如笔记本、工控机)通常使用 ACPI 设备匹配
  • ARM 设备(如树莓派、嵌入式系统)主要使用设备树

4. ACPI 设备调试

查看已识别的 ACPI 设备

ls /sys/bus/acpi/devices/
ls /sys/bus/acpi/devices/INTC1000/

查看 ACPI 设备的匹配驱动

ls /sys/bus/platform/devices/

查看 ACPI 设备信息

cat /sys/bus/acpi/devices/INTC1000/status
cat /sys/bus/acpi/devices/INTC1000/path

使用 dmesg 检查 ACPI 设备注册

dmesg | grep ACPI

5. MODULE_DEVICE_TABLE(acpi, ...) 的作用

在驱动程序中:

MODULE_DEVICE_TABLE(acpi, my_acpi_ids);
  • 作用:将 ACPI 设备匹配表导出到 内核的设备表,供 modinfo 查询。
  • 查看匹配信息
    modinfo my_driver.ko
    
    可能会输出:
    alias: acpi*:INTC1000:*
    alias: acpi*:INTC1001:*
    

如果省略 MODULE_DEVICE_TABLE(acpi, my_acpi_ids);,驱动仍能匹配 ACPI 设备,但 modinfo 不会显示匹配信息,可能会影响 自动模块加载


总结

  • ACPI 匹配用于 x86 设备(部分 ARM64 也支持),是设备自动发现的重要机制。
  • 通过 _HID_CID 进行设备匹配acpi_match_table 在驱动中用于 ACPI 设备匹配。
  • 相比设备树,ACPI 设备匹配更适用于动态设备(如 PCI、USB、I2C、SPI)。
  • MODULE_DEVICE_TABLE(acpi, my_acpi_ids);modinfo 识别 ACPI 匹配信息,有助于自动加载驱动。

相关文章:

  • vue 组件开发
  • C++运动控制卡开发实践指南
  • 【pm2运行ts的终极解决方案】使用pm2+ tsx 运行 TypeScript 文件指南
  • 3.25-3 request断言
  • 代码随想录算法训练营第二十天 | 字符串 | 反转字符串、替换空格、翻转字符串里的单词(很多基础方法)和左旋转字符串
  • Windows下docker使用教程
  • 【C++特殊类的设计】
  • 和鲸科技执行总裁殷自强受邀主讲华中附属同济医院大模型应用通识首期课程
  • 美摄科技开启智能汽车车内互动及娱乐解决方案2.0
  • 音乐webpack(通杀webpack-1)
  • 解决在客户端本地无法访问服务器http方式访问麦克风与摄像头的问题
  • Linux如何判断磁盘是否已分区?
  • 基于yolov11的中空圆柱形缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • (C语言)静态通讯录(正式版)(C语言小项目)
  • HTML5 Geolocation(地理定位)学习笔记
  • 数字化转型1061丨某著名企业新零售云业务中台总体解决方案(文末有下载方式)
  • springboot使用阿里限流框架-sentinel
  • 数据结构之双链表
  • day17 周末两天偷懒没更新,今天炼丹加学习,完结STL常用容器部分
  • 揭秘大数据 | 13、大数据的五大问题 之 数据科学
  • 政府网站手机版建设方案/深圳百度seo代理
  • 网站制作开发/对seo的理解
  • 微信网站建设多少钱/seo案例分析
  • 微网站建设公司哪家好/谷歌优化培训
  • CSS3网站开发/湖北seo整站优化
  • 微网站开发系统/上海网站关键词排名