Linux platform驱动与设备树怎么写?嵌入式Linux面试

浏览量:4
时间: 2026-09-18 09:05:15
一句话答案

platform 驱动分两部分:驱动代码(platform_driver 结构,probe/remove)和设备树(dts 描述硬件资源);设备树里 compatible 字符串匹配驱动,probe 里做初始化;新内核几乎都用设备树代替静态 board 文件。

本文概述

platform 驱动是 Linux 设备模型核心,面试常考:设备树是什么、compatible 怎么匹配、probe 什么时候调、resource 怎么获取。回答要讲清驱动和设备分离。

核心要点

  • platform 驱动把驱动代码和设备信息分离:驱动 .c,设备描述在 dts

  • 设备树 dts 描述地址、中断、时钟、GPIO,compatible 字符串匹配驱动

  • probe() 在设备和驱动匹配成功时调用,做初始化

  • platform_get_resource() 获取寄存器地址和中断号

  • 新内核(3.x 后)都用设备树,不再写 static board device

终端显示 Linux platform driver 代码和设备树 dts 文件,开发板连接调试器

面试官:新内核为什么用设备树?platform 驱动怎么写?

面试官考察点

面试官看你是否写过 platform 驱动、是否理解设备树。重点听:compatible 匹配、probe、resource。

回答思路

先讲设备树为什么出现,再讲驱动结构,最后给代码骨架。

参考回答

为什么用设备树。早期内核把硬件信息写在 board 文件(.c),每款板都要改内核代码。设备树把硬件描述从内核代码分离:

  • 同一份内核支持多款板;

  • 硬件改动改 dts 就行,不用改驱动代码;

  • ARM 新平台几乎都用设备树。

设备树怎么描述。在 .dts 文件里:

mydevice@10000000 {
  compatible = "fanyi,mydevice-v1";
  reg = <0x10000000 0x1000>;
  interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
  clocks = <&clk_uart>;
};

驱动怎么匹配。驱动里 of_match_table 列 compatible 字符串,和 dts 匹配上就调 probe:

static const struct of_device_id my_of_match[] = {
  { .compatible = "fanyi,mydevice-v1" },
  {}
};

static struct platform_driver my_driver = {
  .probe = my_probe,
  .remove = my_remove,
  .driver = {
    .name = "mydevice",
    .of_match_table = my_of_match,
  },
};
module_platform_driver(my_driver);

probe 里做什么。

  1. platform_get_resource() 获取寄存器地址和中断;

  2. devm_ioremap_resource() 映射寄存器;

  3. devm_request_irq() 注册中断;

  4. init 字符设备/proc/sysfs;

  5. 初始化硬件。

probe 调用时机。内核启动时解析 dts,设备和驱动匹配成功就调 probe。先看 dts 里 compatible 和驱动里 of_match_table 对不对。

三种驱动模型对比。

模型适用设备信息
platform内存映射设备、SOC 外设dts 描述寄存器/中断
i2c_clientI2C 设备i2c_board_info 或 dts
spi_driverSPI 设备dts 描述片选和速率

常见问题。

  • probe 没调:compatible 拼写错、dts 没编进 dtb、驱动没加载;

  • 用 devm_ 函数:自动释放资源,不用手动 cleanup;

  • alias 和 status:dts 里 status = "okay" 才启用。

面试官可能追问

追问 1:compatible 为什么用 "fanyi,xxx" 格式?
厂商,设备名,版本。厂商前缀避免冲突,内核要求 vendor 前缀。
追问 2:dts 和 dtb 区别?
dts 是文本源,dtb 是编译后的二进制。内核启动时解析 dtb。
追问 3:probe 里为什么用 devm_?
devm_ 资源自动管理,设备移除时自动释放,不用写 remove 里 cleanup。
追问 4:platform_device 和 platform_driver 区别?
driver 是驱动代码(probe/remove),device 是设备信息(dts 描述)。总线把两者匹配起来。
追问 5:怎么看设备有没有匹配?
ls /sys/bus/platform/devices/ 和 drivers/,dmesg 看 probe 打印。

常见失分表达

✗ 驱动和设备信息写一起 — 新内核推荐驱动和设备分离,dts 描述设备。
✗ compatible 随便写 — 拼写不对 probe 不调。
✗ probe 里不映射寄存器 — 不 ioremap 直接访问物理地址会崩溃。

准备动作

1
写一个最小 platform 驱动+对应 dts
2
insmod 后 ls /sys/bus/platform/ 看设备
3
准备一个 probe 没调的排查案例
4
了解 device tree 语法和常用属性

核心关键词

platform驱动设备树compatibleprobeof_match_tabledts


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
Linux内核模块怎么编写与加载?嵌入式Linux面试从module_init讲到insmod

嵌入式Linux中级技术基础题本文概述内核模块(Kernel Module)是嵌入式Linux工程师的基本功,也是面试必考题。面试官想听的不是背一个hello模... 详情>>

2026-09-03 13:53:27
U-Boot启动流程与Linux启动过程怎么理解?嵌入式Linux面试从BL1讲到内核启动

嵌入式Linux中高级技术基础题本文概述启动流程是嵌入式Linux工程师的系统级基本功,面试官想听的不是背几个阶段名,而是你懂不懂从上电复位到U-Boot再到内... 详情>>

2026-09-04 15:50:56
PCB拼板怎么设计?V-CUT、邮票孔与工艺边怎么选?PCB工程师面试

一句话答案PCB 单板太小要拼板过 SMT 线:V-CUT 适合规则矩形拼板,邮票孔(桥连)适合异形板或 V-CUT 切不到的地方;工艺边留 5mm 放 MAR... 详情>>

2026-09-18 09:02:52
Linux内核中的设备驱动程序的一般编程模式是什么?

模块编程模式#include //所有模块都需要的头文件#include // init&exit相关宏MODULE_LICENSE(“GPL”);static... 详情>>

2024-03-27 15:23:15
PCB板材怎么选?FR4与高速板材Dk/Df怎么权衡?PCB工程师面试

PCB设计中高级技术基础题本文概述板材选型决定了阻抗控制、损耗、成本和可靠性,是PCB工程师从入门到进阶的分水岭。面试官想听的不是“高速就换板材”,而是你懂不懂... 详情>>

2026-09-05 09:50:38
开班信息