温馨提示×

linux驱动如何迁移

小樊
60
2026-10-06 13:39:46
栏目: 智能运维

“Linux 驱动迁移”通常指把一个内核版本/平台/架构下的驱动代码,移植或适配到另一个内核版本或硬件平台。下面按常见迁移场景 + 实操步骤 + 注意事项来说明。


一、常见驱动迁移场景

  1. 内核版本升级迁移

    • 如 3.10 → 5.10
    • 接口变化大,最常见
  2. 架构/平台迁移

    • x86 → ARM
    • ARM32 → ARM64
  3. 芯片平台迁移

    • 不同 SoC(如 imx6 → imx8)
    • 不同厂商 BSP
  4. 源码树内外迁移

    • 树内驱动(in-tree)→ 树外驱动(out-of-tree)
    • 或反过来

二、驱动迁移通用流程

1. 明确迁移目标

  • 目标内核版本
  • 目标架构(arm / arm64 / x86)
  • 是否使用 Device Tree
  • 是否必须保持接口兼容

2. 准备源码与环境

# 目标内核源码
git clone https://github.com/torvalds/linux
cd linux
make defconfig
make menuconfig
  • 确认目标内核已可编译
  • 确认交叉编译工具链(如 ARM)

3. 拷贝驱动代码

通常位置:

drivers/
  ├── char/
  ├── net/
  ├── usb/
  ├── platform/

示例:

cp old_driver.c linux/drivers/char/

4. 修改 Kconfig / Makefile

Makefile

obj-$(CONFIG_MY_DRIVER) += my_driver.o

Kconfig

config MY_DRIVER
    tristate "My driver support"
    help
      This is a migrated driver.

5. 解决 API 差异(最关键)

常见变化点

(1) 头文件变化

#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>

(2) 设备模型变化

旧:

struct device_driver

新:

struct platform_driver

probe 示例:

static int my_probe(struct platform_device *pdev)

(3) Device Tree 适配(ARM 必改)

旧(板级代码):

platform_device_register(&my_dev);

新(DTS):

mydev: mydev@0 {
    compatible = "vendor,mydev";
    reg = <0x1000 0x100>;
};

驱动中:

.of_match_table = of_match_ptr(my_of_match),

(4) 中断接口

旧:

request_irq()

新(推荐):

devm_request_irq()

(5) 内存/IO 接口

旧:

ioremap()

新:

devm_ioremap_resource()

6. 编译驱动

make modules

或单独:

make M=drivers/char modules

7. 加载测试

insmod my_driver.ko
dmesg | tail
ls /dev/

三、典型问题排查

问题 原因
编译失败 API 已移除
probe 不执行 DTS 不匹配
设备节点无 class/device 未创建
内核崩溃 内存/中断错误

四、迁移建议(实战经验)

✅ 优先参考 目标内核中类似驱动
✅ 使用 git log 查看接口变更
✅ 尽量使用 devm_* 接口
✅ 避免在驱动中写死硬件地址


五、如果你能提供更具体信息

我可以给你更针对性的迁移方案,例如:

  • 具体内核版本(如 4.19 → 6.1)
  • 驱动类型(字符/块/网络/USB)
  • 是否用 DTS
  • 报错日志

你可以直接贴:

“我从 3.10 移植一个 SPI 驱动到 5.10,报错 XXX”

0 踩