0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析Zephyr应用的代码结构中的自定义驱动

智芯原动ICETech 来源:HalfCoder 作者:lgl88911 2021-08-18 09:08 次阅读

本篇是《《Zephyr应用的代码结构》》系列的终篇和下面两篇文章一起可以构建出一个有app独立管理的zephyr项目

Zephyr应用的代码结构--West提货单: zephyr和zephyr外部项目纳入到应用代码目录管理

Zephyr应用的代码结构--自定义开发板: 将自定义board纳入到应用代码目录管理

除了上面两个场景外,我们的硬件可能也有新的驱动需求,而该驱动不被Zephyr支持,如果不想将驱动放入Zephyr中,就需要将驱动纳入到应用代码目录。

Zephyr驱动的添加可以分为3个级别:

有驱动API抽象,有设备树绑定:只用添加驱动代码

有驱动API抽象,无设备树绑定:添加设备树绑定文件和驱动代码

无驱动API抽象,无设备树绑定:添加抽象API头文件,添加设备树绑定文件,添加驱动代码

驱动代码目录

驱动代码目录添加

在app/目录下添加drivers目录,如下

app

├── drivers

│ └── zephyr

│ ├── CMakeLists.txt

│ ├── Kconfig

│ └── sensor

│ ├── CMakeLists.txt

│ ├── Kconfig

│ └── rotary_encoder

├── CMakeLists.txt

├── Kconfig

├── rotary_encoder.c

└── rotary_encoder.h

在drivers/zephyr下的将要添加的驱动类型分类,例如我需要添加传感器类型的驱动,就增加一个sensor文件夹

zephyr/CMakeLists.txt中指定该文件夹, 如果有其它驱动类型的文件夹也加入到该文件中

1

add_subdirectory(sensor)

zephyr/Kconfig包含各个驱动类型文件夹的Kconfig

1

rsource “sensor/Kconfig”

zephyr/sensor/CMakeLists.txt中指定要使用的驱动文件夹,例如这里要指定选择编码器

1

add_subdirectory_ifdef(CONFIG_ROTARY_ENCODER rotary_encoder)

zephyr/sensor/Kconfig包含该类型下各个驱动的Kconfig

1

rsource “rotary_encoder/Kconfig”

zephyr/sensor/rotary_encoder/CMakeLists.txt指定驱动的源代码

zephyr_include_directories(。)

zephyr_library()

zephyr_library_sources(rotary_encoder.c)

zephyr/sensor/rotary_encoder/Kconfig则是该驱动代码rotary_encoder.c要使用的配置选项

menuconfig ROTARY_ENCODER

bool “Rotary Encoder Sensor”

depends on GPIO

help

Enable driver for Rotary encoder sensors.

if ROTARY_ENCODER

config ROTARY_ENCODER_THREAD_PRIORITY

int “Thread priority”

default 10

help

Priority of thread used by the driver to handle interrupts.

config ROTARY_ENCODER_THREAD_STACK_SIZE

int “Thread stack size”

default 1024

help

Stack size of thread used by the driver to handle interrupts.

驱动代码由rotary_encoder.c和rotary_encoder.h组成,不是本文说明重点,如何实现驱动可以参考Zephyr驱动实现方式

指定使用驱动目录

Zephyr建议将外部目录的驱动作为module添加,在app/CMakeLists.txt中添加下面内容,构建时就会编译app/drivers

list(APPEND ZEPHYR_EXTRA_MODULES

${CMAKE_CURRENT_SOURCE_DIR}/drivers

设备树绑定文件目录

为了硬件上的灵活性,Zephyr引入了设备树,通过设备树绑定的方式将设备树转换为C宏来使用。Zephyr的设备树绑定文件可能不包含我们要用的硬件设备,这就需要我们自己添加。同样设备树绑定文件也可以纳入app的目录进行管理,在app目录下添加dts目录,里面放置设备树绑定文件

app

├── dts

│ └── bindings

│ └── sensor

│ └── rotary-encoder.yaml

rotary-encoder.yaml的编写和使用方法不是本文重点,详细可以参考Zephyr添加旋转编码器驱动

在app/CMakeLists.txt中添加下面内容,构建时编译设备树会查找到app/dts目录

1

list(APPEND DTS_ROOT ${CMAKE_SOURCE_DIR})

设备驱动API头文件目录

对于个人项目开发来说,设备驱动API一般是项目内使用,API抽象的普遍覆盖性并不一定要非常全,此外使用的人员也不需要大范围讨论,根据需求进行自定义就可以, 所形成的头文件放到对应的驱动目录即可,例如zephyr/sensor/rotary_encoder/rotary_encoder.h, 为了方便应用直接使用,可以在app/CMakeLists中添加

1

include_directories(drivers/zephyr/sensor/rotary_encoder/)

之后应用代码中就可以直接”#include “rotary_encoder.h”

结束语

到此为止我们通过三篇文章可以将Zephyr代码, Zephyr外部项目,自定义board, 驱动都纳入到一个app的仓库进行管理,通过一个独立的app仓库可以驱动编译所必须的代码,既方便管理,又十分精简。

如果你使用的SOC都还未被Zephyr支持,也可以将soc的移植纳入到应用目录下进行管理,这部分目前我并没有使用过无法做实例解释可以参考https://docs.zephyrproject.org/latest/application/index.html#soc-definitions进行操作。

参考

https://github.com/zephyrproject-rtos/zephyr/tree/main/samples/application_development/out_of_tree_driver

https://docs.zephyrproject.org/latest/samples/application_development/out_of_tree_driver/README.html

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    11

    文章

    1717

    浏览量

    84338
  • API
    API
    +关注

    关注

    2

    文章

    1381

    浏览量

    60988
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66739

原文标题:Zephyr应用的代码结构--自定义驱动

文章出处:【微信号:智芯原动ICETech,微信公众号:智芯原动ICETech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    HarmonyOS开发实例:【自定义Emitter】

    使用[Emitter]实现事件的订阅和发布,使用[自定义弹窗]设置广告信息。
    的头像 发表于 04-14 11:37 613次阅读
    HarmonyOS开发实例:【<b class='flag-5'>自定义</b>Emitter】

    RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验

    RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验
    的头像 发表于 02-20 14:10 176次阅读
    RK3568<b class='flag-5'>驱动</b>指南|<b class='flag-5'>驱动</b>基础进阶篇-进阶5 <b class='flag-5'>自定义</b>实现insmod命令实验

    基于YOLOv8实现自定义姿态评估模型训练

    Hello大家好,今天给大家分享一下如何基于YOLOv8姿态评估模型,实现在自定义数据集上,完成自定义姿态评估模型的训练与推理。
    的头像 发表于 12-25 11:29 1253次阅读
    基于YOLOv8实现<b class='flag-5'>自定义</b>姿态评估模型训练

    博途用户自定义库的使用

    博途官方提供了很多库,比如:基本函数库、通信库、安全库、驱动库等等,用户可以使用库中的函数/函数块来完成具体的控制任务。除了官方的库,我们也可以创建自己的库(用户自定义库)。比如,把项目
    的头像 发表于 12-25 10:08 286次阅读
    博途用户<b class='flag-5'>自定义</b>库的使用

    如何在Matlab中自定义Message

    自定义Message 当我们的 message 消息比较复杂时,通常要用到自定义的 message 消息,MATLAB 2020b以上的版本自带了ROS Toolbox Interface
    的头像 发表于 11-15 18:12 416次阅读
    如何在Matlab中<b class='flag-5'>自定义</b>Message

    Android端自定义铃声 MobPush对安卓端自定义铃声的教程

    如何为APP推送设置独特的通知铃声呢?本次带来的是MobPush对安卓端自定义铃声的教程,快来看看吧~
    的头像 发表于 10-21 15:34 811次阅读
    Android端<b class='flag-5'>自定义</b>铃声 MobPush对安卓端<b class='flag-5'>自定义</b>铃声的教程

    OpenHarmony自定义组件介绍

    一、创建自定义组件 在ArkUI,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,
    发表于 09-25 15:36

    OpenHarmony应用开发之自定义弹窗

    本文转载自《OpenHarmony应用开发之自定义弹窗》,作者:zhushangyuan_ ​ 应用场景 在应用的使用和开发,弹窗是一个很常见的场景,自定义弹窗又因为极高的自由度得以广泛应用。本文
    发表于 09-06 14:40

    labview超快自定义控件制作和普通自定义控件制作

    labview超快自定义控件制作和普通自定义控件制作
    发表于 08-21 10:32 5次下载

    教程 3:构建自定义配置文件

    教程 3:构建自定义配置文件
    发表于 07-06 18:49 0次下载
    教程 3:构建<b class='flag-5'>自定义</b>配置文件

    教程 2:自定义配置文件示例

    教程 2:自定义配置文件示例
    发表于 07-04 20:50 0次下载
    教程 2:<b class='flag-5'>自定义</b>配置文件示例

    带计时器的自定义锻炼

    电子发烧友网站提供《带计时器的自定义锻炼.zip》资料免费下载
    发表于 06-16 10:29 0次下载
    带计时器的<b class='flag-5'>自定义</b>锻炼

    PyTorch教程6.5之自定义图层

    电子发烧友网站提供《PyTorch教程6.5之自定义图层.pdf》资料免费下载
    发表于 06-05 15:17 0次下载
    PyTorch教程6.5之<b class='flag-5'>自定义</b>图层

    labview自定义控件

    labview自定义精美控件
    发表于 05-15 16:46 9次下载

    用于改进应用的自定义逻辑外设

    具有可配置自定义逻辑 (CCL) 外设。为了快速轻松地进行设置,MPLAB® 代码配置器 (MCC) 可用于为正在使用的外设设置和生成 API。
    的头像 发表于 05-06 09:51 610次阅读
    用于改进应用的<b class='flag-5'>自定义</b>逻辑外设