默认配置

默认配置
boards/arm/nucleo_f401re/
├── nucleo_f401re.dts          ← 板卡设备树主入口
├── nucleo_f401re_defconfig    ← 默认 Kconfig 配置
├── board.cmake                ← CMake 构建入口

overlay

1.新增加驱动需要修改对应板的设备树文件,通常选择以 .overlay 的形式增加或修改设备树节点Overlay的路径:
———boards/<架构>/<板级名称>/
———或者sample/xxx/boards

2.Overlay加载优先级(从高到低)
———显式指定文件最高优先级‌
通过CMake变量 DTC_OVERLAY_FILE 显式指定的文件(如 -DDTC_OVERLAY_FILE="file1.overlay;file2.overlay"),按声明顺序加载,后声明者覆盖先声明者

———自动扫描路径优先级‌(未显式指定时)
构建系统按顺序加载以下路径的文件,‌后加载者覆盖先加载者‌:

———第一级‌:socs/<SOC型号>.overlay(如 socs/nrf52840.overlay)
———第二级‌:boards/<板卡名>.overlay(如 boards/nrf52840dk.overlay)
———第三级‌:应用根目录的 app.overlay
———示例:boards/nrf52840dk.overlay 可覆盖 socs/nrf52840.overlay 的配置。


3.‌硬件修订版覆盖‌
若存在板卡修订版(如 nrf52840dk_v2),则 boards/<板卡名>_<修订版>.overlay 会覆盖基础板级文件(boards/<板卡名>.overlay

4.示例

&i2c1 {status = "okay";fake_eeprom: eeprom@77 {compatible = "fake-eeprom";reg = <0x77>;size = <1024>;pagesize = <16>;address-width = <8>;timeout = <5>;buffer_size = <4096>;/* read-only; */};
};

yaml

1.对于 .yaml 文件,其他内容主要是指定该设备树节点下的所有属性的约束条件,如指定类型,是否必须定义等
YAML绑定文件‌必须‌位于名为 dts/bindings/ 的目录中,但该目录的具体父路径可以是:
———Zephyr基础目录(zephyr/dts/bindings/)
———应用层目录(如 sample/xxx/dts/bindings/)
———自定义模块目录(${ZEPHYR_MODULE_DIR}/dts/bindings/)

2.覆盖情况:
构建系统会自动扫描所有匹配 dts/bindings/ 的路径‌;当应用层绑定文件与基础或模块路径文件同名时,仅使用应用层文件进行节点验证与宏生成

3.示例

# Copyright (c) 2021 BrainCo Inc.
# SPDX-License-Identifier: Apache-2.0description: nucleo-g474re, fake-eepromcompatible: "fake-eeprom"include: [base.yaml, i2c-device.yaml]properties:size:type: intrequired: truedescription: Total EEPROM size in bytespagesize:type: intrequired: truedescription: EEPROM page size in bytesaddress-width:type: intrequired: truedescription: EEPROM address width in bitstimeout:type: intrequired: truedescription: EEPROM write cycle timeout in millisecondsread-only:type: booleanrequired: falsedescription: Disable writes to the EEPROMbuffer_size:type: intrequired: truedescription: EEPROM BUFFER

dts设备匹配驱动

获取设备

static const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(temp_sensor)); //设备树节点的label属性
const struct device *const dev = DEVICE_DT_GET(DT_ALIAS(eeprom0)); //设备树节点的别名,如果有的话可以用这个

驱动匹配设备树节点

#define DT_DRV_COMPAT vendor_temp_sensor //需与设备树compatible中的逗号等非字母的特殊字符,替换为下划线

driver通过dts创建设备对象

#define INST_DT_FAKE_EEPROM(inst) DT_INST(inst, fake_eeprom)
#define FAKE_EEPROM_DEVICE(inst) static const struct eeprom_config eeprom_config_##inst = { .i2c = I2C_DT_SPEC_INST_GET(inst), .addr_width = DT_PROP(INST_DT_FAKE_EEPROM(inst), address_width), .readonly = DT_PROP(INST_DT_FAKE_EEPROM(inst), read_only), .timeout = DT_PROP(INST_DT_FAKE_EEPROM(inst), timeout), .size = DT_PROP(INST_DT_FAKE_EEPROM(inst), size), }; static uint8_t eeprom_buffer_##inst[DT_PROP(INST_DT_FAKE_EEPROM(inst), buffer_size)]; static struct eeprom_data eeprom_data_##inst = { .buffer = eeprom_buffer_##inst, .state = false, }; DEVICE_DT_INST_DEFINE(inst, &eeprom_init, NULL, &eeprom_data_##inst, &eeprom_config_##inst, POST_KERNEL, 10, &eeprom_api);
DT_INST_FOREACH_STATUS_OKAY(FAKE_EEPROM_DEVICE)

非dts匹配

driver创建设备对象

DEVICE_DEFINE(my_driver_0, "my_driver", my_driver_init, NULL, NULL, NULL, POST_KERNEL, 0, &api);

app获取设备

const struct device *dev = device_get_binding("my_driver");

设备驱动读写函数流程

通过I2C_DT_SPEC_INST_GET从设备树解析出i2c_dt_spec,并且也填充了i2c_dt_spec的bus成员,也即i2c总线,调用总线的api就可以操作i2c控制器的寄存器们,来完成读写工作;spi_dt_spec,gpio_dt_spec同理

struct s11059_dev_config {struct i2c_dt_spec bus;uint8_t gain;int64_t integration_time; /* integration period (unit: us) */
};#define S11059_INST(inst)                                                                          \static struct s11059_data s11059_data_##inst;                                              \static const struct s11059_dev_config s11059_config_##inst = {                             \.bus = I2C_DT_SPEC_INST_GET(inst),                                                 \.gain = DT_INST_PROP(inst, high_gain),                                             \.integration_time = DT_INST_PROP(inst, integration_time)};                         \SENSOR_DEVICE_DT_INST_DEFINE(inst, s11059_init, NULL, &s11059_data_##inst,                 \&s11059_config_##inst, POST_KERNEL,                           \CONFIG_SENSOR_INIT_PRIORITY, &s11059_driver_api);DT_INST_FOREACH_STATUS_OKAY(S11059_INST)static int s11059_control_write(const struct device *dev, uint8_t control)
{const struct s11059_dev_config *cfg = dev->config;const uint8_t opcode[] = {S11059_REG_ADDR_CONTROL, control};return i2c_write_dt(&cfg->bus, opcode, sizeof(opcode));
}static inline int i2c_write_dt(const struct i2c_dt_spec *spec,const uint8_t *buf, uint32_t num_bytes)
{return i2c_write(spec->bus, buf, num_bytes, spec->addr);
}static inline int i2c_write(const struct device *dev, const uint8_t *buf,uint32_t num_bytes, uint16_t addr)
{struct i2c_msg msg;msg.buf = (uint8_t *)buf;msg.len = num_bytes;msg.flags = I2C_MSG_WRITE | I2C_MSG_STOP;return i2c_transfer(dev, &msg, 1, addr);
}__syscall int i2c_transfer(const struct device *dev,struct i2c_msg *msgs, uint8_t num_msgs,uint16_t addr);static inline int z_impl_i2c_transfer(const struct device *dev,struct i2c_msg *msgs, uint8_t num_msgs,uint16_t addr)
{const struct i2c_driver_api *api =(const struct i2c_driver_api *)dev->api;if (!num_msgs) {return 0;}if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {msgs[num_msgs - 1].flags |= I2C_MSG_STOP;}int res =  api->transfer(dev, msgs, num_msgs, addr);i2c_xfer_stats(dev, msgs, num_msgs);if (IS_ENABLED(CONFIG_I2C_DUMP_MESSAGES)) {i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, true);}return res;
}

主机驱动读写api

static DEVICE_API(i2c, nxp_ii2c_driver_api) = {.configure = nxp_ii2c_configure,.transfer = nxp_ii2c_transfer,
#ifdef CONFIG_I2C_CALLBACK.transfer_cb = nxp_ii2c_transfer_cb,
#endif
#ifdef CONFIG_I2C_RTIO.iodev_submit = i2c_iodev_submit_fallback,
#endif
};

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88442.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88442.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88442.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql字段没有索引,通过where x = 3 for update是使用什么级别的锁

没有索引时&#xff0c;FOR UPDATE 会锁住整个表 现在&#xff0c;你正在一本一本地翻看所有书&#xff0c;寻找“维修中”的书&#xff0c;并且你对管理员说&#xff1a;“在我清点和修改完之前&#xff0c;别人不能动这些书&#xff0c;也不能往这个范围里加新书&#xff01;…

TCP-与-UDP-协议详解:原理、区别与应用场景全解析

TCP 与 UDP 协议详解&#xff1a;原理、区别与应用场景全解析 在日常使用网络的过程中&#xff0c;我们经常听到 TCP 和 UDP 这两个词。你打开网页、发送消息、观看视频&#xff0c;背后都在使用 TCP 或 UDP 进行数据传输。那么这两个协议到底是怎么工作的&#xff1f;它们之间…

GitHub信息收集

目录 简介 一、入门搜索技巧 1. 基本关键词搜索 2. 文件类型限定搜索 3. 用户/组织定向搜索 二、精准定位技巧 1. 组合搜索条件 2. 排除干扰结果 3. 路径限定搜索 三、防御建议 四、法律与道德提醒 简介 GitHub作为全球最大的代码托管平台&#xff0c;存储着数十亿…

由 DB_FILES 参数导致的 dg 服务器无法同步问题

由 DB_FILES 参数导致的 dg 服务器无法同步问题 用户反映&#xff0c;dg 服务器数据从昨晚&#xff08;7月8日&#xff09;开始停止同步。 连接服务器发现没有 mrp 进程&#xff0c;并且 OPEN_MODE 参数也不正确。具体情况如下所示&#xff1a; SQL> select process, status…

Go语言泛型-泛型对代码结构的优化

在Go语言中,Go泛型-泛型对代码结构的优化部分主要探讨了泛型如何帮助我们优化代码结构、减少重复代码,并提高代码的可维护性、可读性和复用性。以下是详细内容: 一、引言 Go 1.18 引入了泛型,极大地提高了语言的灵活性。泛型使得我们可以编写更加通用、可复用且类型安全的…

【1-快速上手】

文章目录前言简介什么是 Konva&#xff1f;安装 Konva概述它是如何工作的&#xff1f;基本形状样式事件拖放滤镜动画选择器序列化与反序列化性能前言 结合项目实际业务需求&#xff0c;在 Fabric、Konva 等图形化框架中&#xff0c;我选择了性能表现好的 Konva。首先去学习官方…

【LeetCode】209. 长度最小的子数组(前缀和 + 二分)

【LeetCode】209. 长度最小的子数组&#xff08;前缀和 二分&#xff09;题目描述前缀和二分优化前缀和总结二分总结题目描述 题目链接&#xff1a;【LeetCode】209. 长度最小的子数组&#xff08;前缀和 二分&#xff09; 给定一个含有 n 个整数的数组和一个整数 target。…

文件系统----底层架构

当我们谈到文件系统的时候&#xff0c;最重要的点在于&#xff1a;文件的内容与属性是如何存储在磁盘中的&#xff1f;以及操作系统是如何精准定位到这些文件内容的&#xff1f;在谈及文件的内核前&#xff0c;我们先来了解一下储存文件的硬件-----硬盘一.理解硬件首先我们来看…

小程序开发平台,自主开发小程序源码系统,多端适配,带完整的部署教程

温馨提示&#xff1a;文末有资源获取方式全开源与自主开发源码完全开放&#xff1a;开发者可自由修改前端界面、后端逻辑及数据库结构&#xff0c;支持深度定制&#xff08;如调整用户端交互流程、商家端管理功能等&#xff09;。技术栈透明&#xff1a;基于主流技术&#xff0…

stp拓扑变化分类

Max Age 20sHellotime 2sForward delay 153、拓扑改变需要多长时间1&#xff09;根桥故障&#xff1a;需要50秒&#xff08;Max age2个forwarding delay&#xff09;2&#xff09;非直连链路&#xff1a;非直连故障在稳定的STP网络&#xff0c;非根桥会定期收到来自根桥的BPDU报…

一、深度学习——神经网络

一、神经网络 1.神经网络定义&#xff1a;人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c;是一种模仿生物神经网络结构和功能的计算模型。人脑可以看作是一个生物神经网络&#xff0c;由…

【牛客算法】 小红的奇偶抽取

文章目录 一、题目介绍1.1 题目描述1.2 输入描述1.3 输出描述1.4 示例二、解题思路2.1 核心算法设计2.2 性能优化关键2.3 算法流程图三、解法实现3.1 解法一:字符串分离法3.1.1 初级版本分析3.2 解法二:数学逐位构建法(推荐)3.2.1 优化版本分析四、总结与拓展4.1 关键优化技…

Maven 继承:构建高效项目结构的利器

一、引言 Maven 是一个强大的项目管理工具&#xff0c;它通过标准化的项目结构和依赖管理极大地简化了 Java 项目的开发流程。在 Maven 中&#xff0c;继承是一种非常有用的功能&#xff0c;它允许我们创建一个父项目&#xff0c;其他子项目可以继承这个父项目的配置信息&#…

Mysql组合索引的update在多种情况下的间隙锁的范围(简单来说)

简单来说&#xff0c;当 UPDATE 语句的 WHERE 条件使用了组合索引&#xff0c;并且需要锁定不存在的“间隙”来防止幻读时&#xff0c;就会产生间隙锁。间隙锁的范围取决于 WHERE 条件如何利用组合索引&#xff0c;以及数据库的隔离级别。 我们用图书馆的例子。比如&#xff1a…

什么是Apache Ignite的affinity(亲和性)

在 Apache Ignite 中&#xff0c; affinity&#xff08;亲和性&#xff09; 是一种用于控制数据分布和查询性能的重要机制。它允许开发者指定数据如何在集群中的节点之间分布&#xff0c;从而优化数据访问和查询效率。以下是关于 affinity 的详细解释&#xff1a;数据亲和性&a…

youtube图论

dfs排序lifo & fifo存储方式邻接矩阵dijstra处理过的保存/更新&#xff0c;意味着一个节点避免了重复访问bfs dfs

借助ssh实现web服务的安全验证

背景 公有云服务器 http 服务 80端口&#xff0c;想做到安全访问无须HTTPS 客户端证书方便、快捷、安全 SSH 隧道 本地代理 使用 SSH 隧道将 HTTP 服务“隐藏”在 SSH 之后&#xff1a; # 客户端建立隧道&#xff08;将本地 8080 转发到服务器的 80 端口&#xff09; ssh…

状态机在前端开发中的艺术:从理论到框架级实践

文章目录一 状态机&#xff1a;复杂逻辑的终结者1.1 什么是状态机&#xff1f;1.2 为何前端需要状态机&#xff1f;二 状态机核心概念深度解析2.1 有限状态机&#xff08;FSM&#xff09;与分层状态机&#xff08;HSM&#xff09;2.2 状态机的数学表示三 前端开发中的状态机实战…

把word中表格转成excle文件

把word中表格转成excle文件 from docx import Document from openpyxl import Workbook from pathlib import Path# 打开 Word 文档 document Document(./weather_report.docx) tables document.tables# 输出文件路径 output_file Path(./weather_report.xlsx)# 如果文件已存…

运维打铁: 阿里云 ECS 实例的高效运维与管理

文章目录思维导图正文内容一、实例基础管理1. 实例创建2. 实例配置调整3. 实例停止与启动二、性能监控与优化1. 系统性能指标监控2. 磁盘 I/O 优化3. 网络优化三、安全防护1. 防火墙设置2. 账号安全管理3. 数据备份与恢复四、自动化运维1. 脚本自动化2. 使用云助手五、成本优化…