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

浏览量:348
时间: 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
试解释建立交叉开发平台的必要性?

嵌入式系统的硬件一般有很大的局限性,或者处理器频率很低,或者存储空间很小,或者没有键盘、鼠标设备,所以一般不可能在这种嵌入式目标硬件平台上直接编 译构建L... 详情>>

2024-03-27 11:36:50
Linux设备树怎么写?节点和属性怎么定义?compatible怎么匹配驱动?嵌入式Linux面试

一句话答案设备树 DTS 描述硬件:节点(node)表示设备,属性(property)描述参数;根节点 / 下有 cpu、memory、bus 等;compat... 详情>>

2026-09-24 09:23:50
STM32 DMA怎么配置与使用?外设到内存搬运怎么做?嵌入式面试从配置讲到实战

嵌入式单片机中级技术基础题本文概述DMA是STM32减轻CPU负担的核心外设,也是嵌入式面试的常考题。面试官想听的不是“DMA就是直接内存访问”,而是你懂不懂D... 详情>>

2026-09-07 10:38:34
STM32的USART串口怎么配置与波特率怎么计算

分类:嵌入式单片机 经验级别:初级-中级 难度:中等偏易 题型:技术论述题本文概述STM32的USART串口是嵌入式开发中最基础也最常用的外设之一,配置流程可以... 详情>>

2026-08-20 09:58:30
PCB串扰怎么产生与怎么抑制

分类:EMC电磁兼容 经验级别:中级 难度:中等 题型:技术原理题+设计应用题本文概述PCB串扰是相邻走线之间通过电场和磁场耦合产生的信号干扰,是高速PCB设计... 详情>>

2026-08-19 09:55:54
开班信息