为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:
之后通过sysfs手动绑定:static const struct spi_device_id xxx_spi_id[] = { {"my_xxx_spi", 0}, // 自定义设备标识名 {}, }; MODULE_DEVICE_TABLE(spi, xxx_spi_id);- 找到SPI设备的sysfs路径,比如
/sys/bus/spi/devices/spi0.0/ - 写入驱动名到
driver_override:echo XXXSPI_DRV_NAME > /sys/bus/spi/devices/spi0.0/driver_override - 绑定驱动:
echo spi0.0 > /sys/bus/spi/drivers/XXXSPI_DRV_NAME/bind
- 找到SPI设备的sysfs路径,比如
2. 给x86_64内核启用Device Tree支持
Ubuntu 20.04默认内核确实禁用了DT,得重新编译内核打开相关配置:
- 安装编译依赖:
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev - 拉取当前内核源码:
apt source linux-image-$(uname -r) cd linux-$(uname -r | cut -d'-' -f1) - 复制现有内核配置:
cp /boot/config-$(uname -r) .config - 进入配置菜单开启DT:
make menuconfig- 找到
Device Drivers -> Generic Driver Options,勾选Support for device tree - 确保你的xxx SPI驱动被设为模块或内置
- 找到
- 编译并安装:
make -j$(nproc) sudo make modules_install sudo make install - 重启后,把设备的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
相关产品推荐
相关产品推荐

