返回首页

Zephyr 设备驱动学习笔记

概述

Zephyr 的设备驱动模型强调三件事:


1. 驱动模型的基本结构

1.1 常见组成

1.2 常见宏


2. 设备树在驱动里的作用

驱动开发时,设备树通常提供:

如果你写自定义驱动,第一步往往不是写寄存器读写,而是先把 binding、overlay 和 DT_* 宏链路跑通。


3. 一个最小驱动通常包含什么

3.1 头文件

#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/kernel.h>

如果是 I2C / SPI / 传感器类,还会加:

#include <zephyr/drivers/i2c.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/drivers/sensor.h>

3.2 配置和运行时数据

struct my_dev_config {
    struct i2c_dt_spec bus;
};

struct my_dev_data {
    uint16_t cached_value;
};

3.3 初始化

static int my_dev_init(const struct device *dev)
{
    const struct my_dev_config *cfg = dev->config;

    if (!device_is_ready(cfg->bus.bus)) {
        return -ENODEV;
    }

    return 0;
}

4. 最常见的三类驱动路径

4.1 总线外设驱动

典型例子:

重点在:

4.2 子系统驱动

典型例子:

重点在:

4.3 板级 / SoC 驱动

这类更靠近底层,通常会涉及:


5. 驱动学习时应优先看什么

5.1 先看 Zephyr sample

5.2 再看现成驱动

例如:

5.3 最后再写自己的 binding

如果一开始就跳到自定义 binding,往往会把问题混在一起,不容易定位。


6. 常见误区


参考入口