本篇是《《Zephyr應用的代碼結(jié)構(gòu)》》系列的終篇和下面兩篇文章一起可以構(gòu)建出一個有app獨立管理的zephyr項目
Zephyr應用的代碼結(jié)構(gòu)--West提貨單: zephyr和zephyr外部項目納入到應用代碼目錄管理
Zephyr應用的代碼結(jié)構(gòu)--自定義開發(fā)板: 將自定義board納入到應用代碼目錄管理
除了上面兩個場景外,我們的硬件可能也有新的驅(qū)動需求,而該驅(qū)動不被Zephyr支持,如果不想將驅(qū)動放入Zephyr中,就需要將驅(qū)動納入到應用代碼目錄。
Zephyr驅(qū)動的添加可以分為3個級別:
有驅(qū)動API抽象,有設(shè)備樹綁定:只用添加驅(qū)動代碼
有驅(qū)動API抽象,無設(shè)備樹綁定:添加設(shè)備樹綁定文件和驅(qū)動代碼
無驅(qū)動API抽象,無設(shè)備樹綁定:添加抽象API頭文件,添加設(shè)備樹綁定文件,添加驅(qū)動代碼
驅(qū)動代碼目錄
驅(qū)動代碼目錄添加
在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下的將要添加的驅(qū)動類型分類,例如我需要添加傳感器類型的驅(qū)動,就增加一個sensor文件夾
zephyr/CMakeLists.txt中指定該文件夾, 如果有其它驅(qū)動類型的文件夾也加入到該文件中
1
zephyr/Kconfig包含各個驅(qū)動類型文件夾的Kconfig
1
rsource “sensor/Kconfig”
zephyr/sensor/CMakeLists.txt中指定要使用的驅(qū)動文件夾,例如這里要指定選擇編碼器
1
add_subdirectory_ifdef(CONFIG_ROTARY_ENCODER rotary_encoder)
zephyr/sensor/Kconfig包含該類型下各個驅(qū)動的Kconfig
1
rsource “rotary_encoder/Kconfig”
zephyr/sensor/rotary_encoder/CMakeLists.txt指定驅(qū)動的源代碼
zephyr_include_directories(。)
zephyr_library()
zephyr_library_sources(rotary_encoder.c)
zephyr/sensor/rotary_encoder/Kconfig則是該驅(qū)動代碼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.
驅(qū)動代碼由rotary_encoder.c和rotary_encoder.h組成,不是本文說明重點,如何實現(xiàn)驅(qū)動可以參考Zephyr驅(qū)動實現(xiàn)方式
指定使用驅(qū)動目錄
Zephyr建議將外部目錄的驅(qū)動作為module添加,在app/CMakeLists.txt中添加下面內(nèi)容,構(gòu)建時就會編譯app/drivers
list(APPEND ZEPHYR_EXTRA_MODULES
${CMAKE_CURRENT_SOURCE_DIR}/drivers
)
設(shè)備樹綁定文件目錄
為了硬件上的靈活性,Zephyr引入了設(shè)備樹,通過設(shè)備樹綁定的方式將設(shè)備樹轉(zhuǎn)換為C宏來使用。Zephyr的設(shè)備樹綁定文件可能不包含我們要用的硬件設(shè)備,這就需要我們自己添加。同樣設(shè)備樹綁定文件也可以納入app的目錄進行管理,在app目錄下添加dts目錄,里面放置設(shè)備樹綁定文件
app
├── dts
│ └── bindings
│ └── sensor
│ └── rotary-encoder.yaml
rotary-encoder.yaml的編寫和使用方法不是本文重點,詳細可以參考Zephyr添加旋轉(zhuǎn)編碼器驅(qū)動
在app/CMakeLists.txt中添加下面內(nèi)容,構(gòu)建時編譯設(shè)備樹會查找到app/dts目錄
1
list(APPEND DTS_ROOT ${CMAKE_SOURCE_DIR})
設(shè)備驅(qū)動API頭文件目錄
對于個人項目開發(fā)來說,設(shè)備驅(qū)動API一般是項目內(nèi)使用,API抽象的普遍覆蓋性并不一定要非常全,此外使用的人員也不需要大范圍討論,根據(jù)需求進行自定義就可以, 所形成的頭文件放到對應的驅(qū)動目錄即可,例如zephyr/sensor/rotary_encoder/rotary_encoder.h, 為了方便應用直接使用,可以在app/CMakeLists中添加
1
include_directories(drivers/zephyr/sensor/rotary_encoder/)
之后應用代碼中就可以直接”#include “rotary_encoder.h”
結(jié)束語
到此為止我們通過三篇文章可以將Zephyr代碼, Zephyr外部項目,自定義board, 驅(qū)動都納入到一個app的倉庫進行管理,通過一個獨立的app倉庫可以驅(qū)動編譯所必須的代碼,既方便管理,又十分精簡。
如果你使用的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
-
驅(qū)動
+關(guān)注
關(guān)注
12文章
1852瀏覽量
85675 -
API
+關(guān)注
關(guān)注
2文章
1513瀏覽量
62437 -
代碼
+關(guān)注
關(guān)注
30文章
4830瀏覽量
69110
原文標題:Zephyr應用的代碼結(jié)構(gòu)--自定義驅(qū)動
文章出處:【微信號:智芯原動ICETech,微信公眾號:智芯原動ICETech】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
如何快速創(chuàng)建用戶自定義Board和App工程
![如何快速創(chuàng)建用戶<b class='flag-5'>自定義</b>Board和App工程](https://file.elecfans.com/web2/M00/37/D7/pYYBAGI9l9uAOwALAAAmFmqVYdg094.png)
Altium Designer 15.0自定義元件設(shè)計
![Altium Designer 15.0<b class='flag-5'>自定義</b>元件設(shè)計](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
think-cell:自定義think-cell(四)
![think-cell:<b class='flag-5'>自定義</b>think-cell(四)](https://file1.elecfans.com/web3/M00/05/B8/wKgZPGeEfMmANJETAAAVy8_tFjA502.jpg)
think-cell;自定義think-cell(一)
![think-cell;<b class='flag-5'>自定義</b>think-cell(一)](https://file1.elecfans.com/web3/M00/05/35/wKgZPGd98hCANIyfAAA-8kRrUjY536.png)
創(chuàng)建自定義的基于閃存的引導加載程序(BSL)
![創(chuàng)建<b class='flag-5'>自定義</b>的基于閃存的引導加載程序(BSL)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何創(chuàng)建TestStand自定義步驟
![如何創(chuàng)建TestStand<b class='flag-5'>自定義</b>步驟](https://file1.elecfans.com/web2/M00/06/F1/wKgaombhPM-AAWEWAAFEpI97JhM466.jpg)
HarmonyOS開發(fā)案例:【 自定義彈窗】
![HarmonyOS開發(fā)案例:【 <b class='flag-5'>自定義</b>彈窗】](https://file1.elecfans.com/web2/M00/DB/A2/wKgZomYrohiANIVrAC1lCoegR9s642.jpg)
TSMaster 自定義 LIN 調(diào)度表編程指導
![TSMaster <b class='flag-5'>自定義</b> LIN 調(diào)度表編程指導](https://file.elecfans.com/web2/M00/40/07/pYYBAGJrUk2AaMaTAAAQONQtdzo461.jpg)
HarmonyOS開發(fā)案例:【UIAbility和自定義組件生命周期】
![HarmonyOS開發(fā)案例:【UIAbility和<b class='flag-5'>自定義</b>組件生命周期】](https://file1.elecfans.com/web2/M00/C8/E9/wKgaomYX896ABxHEAADUhWgAb6k167.jpg)
HarmonyOS實戰(zhàn)開發(fā)-深度探索與打造個性化自定義組件
鴻蒙ArkUI實例:【自定義組件】
RK3568驅(qū)動指南|驅(qū)動基礎(chǔ)進階篇-進階5 自定義實現(xiàn)insmod命令實驗
![RK3568<b class='flag-5'>驅(qū)動</b>指南|<b class='flag-5'>驅(qū)動</b>基礎(chǔ)進階篇-進階5 <b class='flag-5'>自定義</b>實現(xiàn)insmod命令實驗](https://file1.elecfans.com/web2/M00/C0/47/wKgZomXUQkaATvAlAADOvBJc2Tw686.png)
評論