“Linux 驱动迁移”通常指把一个内核版本/平台/架构下的驱动代码,移植或适配到另一个内核版本或硬件平台。下面按常见迁移场景 + 实操步骤 + 注意事项来说明。
内核版本升级迁移
架构/平台迁移
芯片平台迁移
源码树内外迁移
# 目标内核源码
git clone https://github.com/torvalds/linux
cd linux
make defconfig
make menuconfig
通常位置:
drivers/
├── char/
├── net/
├── usb/
├── platform/
示例:
cp old_driver.c linux/drivers/char/
Makefile
obj-$(CONFIG_MY_DRIVER) += my_driver.o
Kconfig
config MY_DRIVER
tristate "My driver support"
help
This is a migrated driver.
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
旧:
#include <asm/uaccess.h>
新:
#include <linux/uaccess.h>
旧:
struct device_driver
新:
struct platform_driver
probe 示例:
static int my_probe(struct platform_device *pdev)
旧(板级代码):
platform_device_register(&my_dev);
新(DTS):
mydev: mydev@0 {
compatible = "vendor,mydev";
reg = <0x1000 0x100>;
};
驱动中:
.of_match_table = of_match_ptr(my_of_match),
旧:
request_irq()
新(推荐):
devm_request_irq()
旧:
ioremap()
新:
devm_ioremap_resource()
make modules
或单独:
make M=drivers/char modules
insmod my_driver.ko
dmesg | tail
ls /dev/
| 问题 | 原因 |
|---|---|
| 编译失败 | API 已移除 |
| probe 不执行 | DTS 不匹配 |
| 设备节点无 | class/device 未创建 |
| 内核崩溃 | 内存/中断错误 |
✅ 优先参考 目标内核中类似驱动
✅ 使用 git log 查看接口变更
✅ 尽量使用 devm_* 接口
✅ 避免在驱动中写死硬件地址
我可以给你更针对性的迁移方案,例如:
你可以直接贴:
“我从 3.10 移植一个 SPI 驱动到 5.10,报错 XXX”