You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为x86_64 PC适配Device Tree风格驱动的方案咨询

在x86_64 Ubuntu 20.04上使用仅支持Device Tree的SPI驱动的可行方案

1. 修改驱动代码,添加非DT匹配逻辑

你贴的驱动代码里已经有id_table字段,但大概率xxx_spi_id是空的(毕竟原驱动只做DT探测)。可以补全这个ID表,或者添加ACPI匹配表,让驱动能通过x86平台常用的方式匹配:

  • 如果你的SPI设备在x86上有ACPI节点,给驱动加上acpi_match_table:
    static const struct acpi_device_id xxx_spi_acpi_match[] = {
        {"ACPI_DEV_NAME", 0}, // 替换成设备实际的ACPI名称
        {},
    };
    MODULE_DEVICE_TABLE(acpi, xxx_spi_acpi_match);
    
    static struct spi_driver xxx_spi_driver = {
            .driver = {
                    .name   = XXXSPI_DRV_NAME,
                    .of_match_table = xxx_spi_of_match,
                    .acpi_match_table = xxx_spi_acpi_match, // 新增该行
            },
            .id_table = xxx_spi_id,
            .probe    = xxx_spi_probe,
            .remove   = xxx_spi_remove,
    };
    
  • 要是没有ACPI节点,直接补全xxx_spi_id:
    static const struct spi_device_id xxx_spi_id[] = {
        {"my_xxx_spi", 0}, // 自定义设备标识名
        {},
    };
    MODULE_DEVICE_TABLE(spi, xxx_spi_id);
    
    之后通过sysfs手动绑定:
    1. 找到SPI设备的sysfs路径,比如/sys/bus/spi/devices/spi0.0/
    2. 写入驱动名到driver_override:echo XXXSPI_DRV_NAME > /sys/bus/spi/devices/spi0.0/driver_override
    3. 绑定驱动:echo spi0.0 > /sys/bus/spi/drivers/XXXSPI_DRV_NAME/bind

2. 给x86_64内核启用Device Tree支持

Ubuntu 20.04默认内核确实禁用了DT,得重新编译内核打开相关配置:

  1. 安装编译依赖:
    sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev
    
  2. 拉取当前内核源码:
    apt source linux-image-$(uname -r)
    cd linux-$(uname -r | cut -d'-' -f1)
    
  3. 复制现有内核配置:
    cp /boot/config-$(uname -r) .config
    
  4. 进入配置菜单开启DT:
    make menuconfig
    
    • 找到Device Drivers -> Generic Driver Options,勾选Support for device tree
    • 确保你的xxx SPI驱动被设为模块或内置
  5. 编译并安装:
    make -j$(nproc)
    sudo make modules_install
    sudo make install
    
  6. 重启后,把设备的DT overlay放到/lib/firmware/,然后通过sysfs加载:echo xxx_device.dtbo > /sys/kernel/config/device-tree/overlays/my_overlay/path

3. 临时绑定(应急测试用)

要是不想改代码也不想编译内核,试试直接通过sysfs绑定驱动和设备,前提是你能找到SPI设备的sysfs节点:

# 假设设备是spi0.0,驱动名是XXXSPI_DRV_NAME
echo spi0.0 > /sys/bus/spi/drivers/XXXSPI_DRV_NAME/bind

不过这种方式重启后会失效,仅适合临时验证驱动功能。

注意:修改驱动后要重新编译模块替换原文件;编译内核前记得备份系统,避免内核启动失败。

内容的提问来源于stack exchange,提问作者Robber Pen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:17:34