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

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

    关注

    12

    文章

    1824

    浏览量

    85169
  • API
    API
    +关注

    关注

    2

    文章

    1483

    浏览量

    61797
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68324

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

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

收藏 人收藏

    评论

    相关推荐

    创建自定义的基于闪存的引导加载程序(BSL)

    电子发烧友网站提供《创建自定义的基于闪存的引导加载程序(BSL).pdf》资料免费下载
    发表于 09-19 10:50 0次下载
    创建<b class='flag-5'>自定义</b>的基于闪存的引导加载程序(BSL)

    如何创建TestStand自定义步骤

    在之前的课程简单地介绍过TestStand自带的一些步骤类型,如测试、消息弹窗、赋值、标签等等,这些简单的步骤从TestStand的插入选版中就可以添加到序列。那么在使用如果碰到需要实现更加灵活、复杂的功能,使用自带的一些
    的头像 发表于 09-11 14:46 865次阅读
    如何创建TestStand<b class='flag-5'>自定义</b>步骤

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划。
    的头像 发表于 08-15 11:49 545次阅读
    EtherCAT运动控制器PT/PVT实现用户<b class='flag-5'>自定义</b>轨迹规划

    NVIDIA NeMo加速并简化自定义模型开发

    如果企业希望充分发挥出 AI 的力量,就需要根据其行业需求量身定制的自定义模型。
    的头像 发表于 07-26 11:17 680次阅读
    NVIDIA NeMo加速并简化<b class='flag-5'>自定义</b>模型开发

    Chrome移动版支持自定义菜单栏功能

    在先前版本,用户通过点击浏览器右上角的三个点按钮即可调出包含各类图标与操作的菜单。而此次更新后,Chrome新增了“自定义菜单”选项,允许用户自主控制该区域的展示内容。
    的头像 发表于 05-27 15:00 728次阅读

    stm32cubemx如何自定义lwip平台?

    有人知道stm32cubemx,如何自定义lwip平台。(默认只
    发表于 05-22 07:50

    HarmonyOS开发案例:【 自定义弹窗】

    基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗
    的头像 发表于 05-16 18:18 1276次阅读
    HarmonyOS开发案例:【 <b class='flag-5'>自定义</b>弹窗】

    TSMaster 自定义 LIN 调度表编程指导

    LIN(LocalInterconnectNetwork)协议调度表是用于LIN总线通信中的消息调度的一种机制,我们收到越来越多来自不同用户希望能够通过接口实现自定义LIN调度表的需求。所以在
    的头像 发表于 05-11 08:21 601次阅读
    TSMaster <b class='flag-5'>自定义</b> LIN 调度表编程指导

    HarmonyOS开发案例:【UIAbility和自定义组件生命周期】

    本文档主要描述了应用运行过程UIAbility和自定义组件的生命周期。对于UIAbility,描述了Create、Foreground、Background、Destroy四种生命周期。对于页面
    的头像 发表于 05-10 15:31 1173次阅读
    HarmonyOS开发案例:【UIAbility和<b class='flag-5'>自定义</b>组件生命周期】

    HarmonyOS实战开发-深度探索与打造个性化自定义组件

    今天分享一下 什么是自定义组件?及其自定义组件的实战。 做过前端或者android开发的都知道自定义组件,鸿蒙显示在界面上的UI都称为组件,小打一个按钮,再到一个列表。 鸿蒙提供的组
    发表于 05-08 16:30

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

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

    鸿蒙ArkUI实例:【自定义组件】

    组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 `Text` 、 `Button` 等,也可以是自定义组件,本节笔者简单介绍一下自定义组件的语法规范。
    的头像 发表于 04-08 10:17 601次阅读

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

    RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验
    的头像 发表于 02-20 14:10 633次阅读
    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 2773次阅读
    基于YOLOv8实现<b class='flag-5'>自定义</b>姿态评估模型训练

    博途用户自定义库的使用

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