linux dts overlay

設備樹 Overlay(Device Tree Overlays, DTO),它在嵌入式Linux系統(尤其是基于ARM的設備,比如樹莓派、NanoPi等)中非常常見。它主要用于動態修改設備樹,以適配硬件的變化或擴展外設支持。


1. 設備樹 (Device Tree) 基礎

  • 設備樹是Linux內核用來描述硬件的一個數據結構(通常是 .dts 源文件,編譯成 .dtb 二進制文件)。
  • 它告訴內核“硬件是什么”,“有什么設備”,以及“設備如何連接”的信息。
  • 這樣,內核就不需要硬編碼特定硬件,增強了移植性。

2. 設備樹 Overlay(DTO)是什么?

  • Overlay 就是對設備樹的“增量補丁”,它定義了一段額外的設備樹節點,能夠在運行時或者啟動時“疊加”到主設備樹上。
  • 目的:實現設備樹的動態擴展,比如給板子添加新的外設(GPIO擴展板、攝像頭模塊、觸摸屏等),而不用修改主設備樹文件。
  • Overlay通常是一個獨立的 .dtbo 文件(編譯后的Overlay),由主設備樹加載時或內核模塊加載時合并。

3. 使用場景

典型場景:

  • 外設模塊動態添加
    比如你的主板沒有集成攝像頭,需要外接攝像頭模塊,就可以用Overlay來描述攝像頭設備節點和相關GPIO、中斷配置。

  • GPIO復用和引腳配置
    一塊板子多個設備共用引腳,Overlay能配置引腳復用,打開或關閉某些設備接口。

  • 設備樹不方便修改的環境
    有些固件或內核只能加載固定的主設備樹,Overlay給了動態配置的能力。


4. Overlay 如何使用?

  • 制作Overlay文件

    1. 編寫 .dts 文件,繼承主設備樹的內容,只寫你想“覆蓋/新增”的部分。
    2. 使用設備樹編譯器(dtc)編譯成 .dtbo 文件。
  • 加載Overlay

    • 在啟動時加載(很多板子在bootloader配置文件中支持Overlay加載,比如 config.txt 里的 dtoverlay=
    • 運行時加載(通過configfs接口,動態插入Overlay)

舉例(樹莓派):

# /boot/config.txt
dtoverlay=your-overlay-name

5. Overlay 和 Initramfs、systemd 對比

特性設備樹 Overlayinitramfssystemd
作用動態修改硬件描述,加載新硬件節點早期用戶空間臨時根文件系統加載Linux啟動初始化系統及服務管理
關注層面硬件抽象層系統啟動早期階段用戶空間環境系統服務管理及并發啟動
運行時機啟動階段或運行時內核設備樹修改內核啟動時掛載,用于系統啟動內核啟動后啟動管理服務
主要功能硬件描述擴展、配置引腳、設備綁定提供最初的文件系統環境啟動服務、管理依賴、日志、資源等
適用場景硬件變動、模塊化硬件設計內核啟動時根文件系統不可用場景系統服務啟動和管理
是否直接涉及硬件
動態修改硬件描述能力支持,動態加載/卸載Overlay不支持不支持

6. 簡單總結

  • 設備樹 Overlay:專注于硬件描述和配置,特別適合動態加載硬件節點。
  • initramfs:內核啟動的第一個用戶空間,負責掛載根文件系統和初始化環境。
  • systemd:現代Linux系統的初始化和服務管理器,負責啟動和維護系統服務。

7. 你實際使用設備樹Overlay時要注意

  • 設備樹版本兼容性
  • Overlay文件的正確編譯
  • 確保Overlay描述的硬件節點匹配實際硬件
  • 確保bootloader或內核支持Overlay機制
  • 運行時加載Overlay需內核開啟CONFIG_OF_OVERLAY支持

很好,你正在使用的是 NanoPi NEO Core 這類基于 Allwinner H3 SoC 的板子,跑的是 Armbian,這類系統通常是 Debian 或 Ubuntu 的輕量定制版本,廣泛用于嵌入式設備和 DIY 項目。


? 背景確認

你的平臺:

  • 硬件:NanoPi NEO Core(基于 Allwinner H3)
  • 系統:Armbian(可能基于 Debian/Ubuntu)
  • 用途:可能用于音頻服務(你提到 Navidrome)或其他嵌入式用途
  • 需求:動態控制硬件(如 I2C、SPI、UART、GPIO、LED、外接模塊等)

📌 在 Armbian 上使用設備樹 Overlay(DTO)

Armbian 提供 標準化支持 DTO 的機制,適用于大多數基于 mainline kernel 的 Allwinner 平臺。


📘 Armbian Overlay 使用方法

1. 查看當前啟用的 Overlays

armbian-config

進入 → SystemHardware → 你可以通過界面啟用常見的設備樹 Overlays(I2C, SPI, UART, PWM, etc)

或手動查看:

cat /boot/armbianEnv.txt

你可能會看到類似:

overlays=spi-spidev i2c0 uart1
param_spidev_spi_bus=0

2. 啟用已有 Overlay

編輯 /boot/armbianEnv.txt

sudo nano /boot/armbianEnv.txt

添加或修改:

overlays=spi-spidev i2c0 uart1

保存后重啟:

sudo reboot

你可以用 dmesg | grep spils /dev/spidev* 來確認是否生效。


3. Overlay 文件存放位置

Armbian 默認加載 /boot/dtb/overlay/ 中的 .dtbo 文件。你也可以:

ls /boot/dtb/allwinner/overlay/

4. 自定義 Overlay 示例

舉個例子:你要啟用一個額外的 LED 燈連接到 GPIO PH7

創建文件:my-led-overlay.dts

/dts-v1/;
/plugin/;&{/} {fragment@0 {target-path = "/";__overlay__ {my_led: gpio-leds {compatible = "gpio-leds";status_led {label = "status_led";gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>;  // PH7 = port 7, pin 7default-state = "on";};};};};
};

然后編譯:

dtc -@ -I dts -O dtb -o my-led-overlay.dtbo my-led-overlay.dts

拷貝到 overlay 文件夾:

sudo cp my-led-overlay.dtbo /boot/dtb/allwinner/overlay/

修改 /boot/armbianEnv.txt 添加:

user_overlays=my-led-overlay

保存并重啟:

sudo reboot

🧠 Overlay 與 systemd/initramfs 區別(再次歸納)

項目設備樹 Overlay (DTO)initramfssystemd
含義動態疊加修改設備樹(硬件配置)臨時根文件系統(啟動用)啟動初始化系統管理器
使用時機啟動時或運行時加載啟動時使用內核啟動后立即運行
作用層面硬件層(GPIO/I2C/UART等)用戶空間臨時運行環境管理服務、守護進程、掛載等
是否與硬件直接相關? 是? 否? 否

🧪 常用場景舉例(在你設備上)

目標使用方式
啟用 SPIoverlays=spi-spidev
啟用 UARToverlays=uart1 uart2
自定義 LED GPIO自寫 DTO + user_overlays
音頻模塊支持(I2S DAC)DTO + 手動加載驅動
外接 OLED 屏(I2C)overlays=i2c0 + dto 添加地址和驅動綁定

🔧 小貼士

  • dtc -I fs /proc/device-tree 可以查看當前設備樹的實際內容
  • 確保 CONFIG_OF_OVERLAY=y 在內核中開啟(Armbian默認是開的)
  • 你可以使用 fdtput 工具直接修改 .dtb 文件(高級用法)

如果你遇到的問題是:

  • DTO加載無效 ? 看 /boot/armbianEnv.txt 里拼寫是否正確
  • 驅動不生效 ? 用 dmesglsmodmodinfo 等調試
  • 不知道引腳編號 ? 查找對應的 sunxi pin map(Allwinner特有)

你想在 NanoPi NEO Core(Armbian) 上通過 I2C 接 OLED 顯示屏(SSD1306 控制器),下面是完整詳解,包括:

  • ? 硬件連接
  • ? 內核模塊/驅動配置
  • ? 設備樹 Overlay 編寫與使用
  • ? 軟件層顯示內容(Python 示例)

? 1. 硬件接線(基于 I2C)

OLED LabelNanoPi NEO PinNotes
VCC3.3V / 5VOLED 供電
GNDGND地線
SDAI2C0_SDA (Pin 3, GPIO PA11)數據線
SCLI2C0_SCL (Pin 5, GPIO PA12)時鐘線

確認你接在了 I2C0(默認引出)的 SDA/SCL 上。


? 2. 啟用 I2C0 接口(Armbian Overlay)

編輯 /boot/armbianEnv.txt

overlays=i2c0

保存后重啟:

sudo reboot

確認 /dev/i2c-0 是否出現:

ls /dev/i2c*

還可以確認 OLED 是否連上(地址通常為 0x3c):

sudo apt install -y i2c-tools
sudo i2cdetect -y 0

看到類似:

     0 1 2 3 4 5 6 7 8 9 a b c d e f
00:          -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- 3c
...

? 3. 添加設備樹 Overlay(掛載 SSD1306)

Armbian 自帶的 overlay 目錄通常 沒有直接包含 SSD1306 的 overlay。所以我們需要自定義:

?? 創建文件 ssd1306-i2c.dts

/dts-v1/;
/plugin/;/ {compatible = "allwinner,sun8i-h3";fragment@0 {target-path = "/";__overlay__ {i2c@01c2ac00 {status = "okay";ssd1306: ssd1306@3c {compatible = "solomon,ssd1306fb-i2c";reg = <0x3c>;pinctrl-names = "default";reset-gpios = <0>; /* if no reset pin */width = <128>;height = <64>;page-offset = <0>;seg-remap;com-invdir;contrast = <127>;};};};};
};

說明:

  • 如果你接的是 128x32 OLED,請將 height = <32>
  • 若有 reset 引腳可設置為 <&pio X Y GPIO_ACTIVE_LOW>,比如 <&pio 0 6 0> 是 PA6。

🛠? 編譯 & 安裝

dtc -@ -I dts -O dtb -o ssd1306-i2c.dtbo ssd1306-i2c.dts
sudo cp ssd1306-i2c.dtbo /boot/dtb/allwinner/overlay/

修改 /boot/armbianEnv.txt 添加:

user_overlays=ssd1306-i2c

然后重啟:

sudo reboot

? 4. 驅動檢查

確認驅動模塊是否加載:

lsmod | grep ssd1306

如果沒有:

sudo modprobe ssd1306

也可以添加到 /etc/modules 里讓其開機加載:

echo ssd1306 | sudo tee -a /etc/modules

? 5. 顯示內容(Python)

安裝 Python 庫

sudo apt install python3-pip
pip3 install luma.oled

示例 Python 腳本

from luma.core.interface.serial import i2c
from luma.oled.device import ssd1306
from PIL import ImageDraw, ImageFont, Imageserial = i2c(port=0, address=0x3C)
device = ssd1306(serial)draw = ImageDraw.Draw(Image.new("1", device.size))
font = ImageFont.load_default()
draw.text((0, 0), "Hello NanoPi!", font=font, fill=255)device.display(draw.im)

? 6. 常見問題排查

問題原因
/dev/i2c-0 不存在overlay 沒啟用 i2c0
i2cdetect 無響應或空線路錯誤 / 接線問題
OLED 無反應地址錯誤(0x3c vs 0x3d),接錯線,驅動未加載
無法加載驅動沒有開啟內核模塊 CONFIG_FB_SSD1306
Python 報錯未裝 luma.oled 或設備沒有正確掛載

? 小結

你只需要:

  1. 確保 I2C 通了 → overlays=i2c0
  2. 加載自定義 Overlay → ssd1306@3c
  3. 加載驅動 → ssd1306fb(內核驅動或 Python 用戶空間庫)
  4. 選定顯示方式 → 控制臺 framebuffer 或 Python 圖形庫

很好!你想通過 framebuffer 控制 SSD1306 OLED(I2C 接口),這樣你可以直接使用命令行工具、C 程序或 Shell 腳本將圖像、文字顯示到屏幕上,而不需要 Python 庫。


🧩 目標實現:

讓 SSD1306 顯示屏出現在 /dev/fb1,通過 catfbidd 等 framebuffer 工具控制它顯示內容。


? 1. 檢查內核模塊

確保內核已包含以下模塊(Armbian 通常自帶):

lsmod | grep ssd1306

如果沒有,手動加載:

sudo modprobe ssd1306
sudo modprobe ssd1306fb

?? 如果提示模塊不存在,可能你需要啟用模塊支持并重新編譯內核(我可指導你做)。


? 2. 設備樹 Overlay(帶 framebuffer 綁定)

使用下面的 .dts 文件創建 overlay,掛載 SSD1306,并啟用 framebuffer 輸出。

?? 文件:ssd1306-fb-i2c.dts

/dts-v1/;
/plugin/;/ {compatible = "allwinner,sun8i-h3";fragment@0 {target = <&i2c0>;__overlay__ {status = "okay";ssd1306fb: ssd1306fb@3c {compatible = "solomon,ssd1306fb-i2c";reg = <0x3c>;width = <128>;height = <64>;page-offset = <0>;seg-remap;com-invdir;contrast = <127>;rotate = <0>;};};};
};

? 3. 編譯并啟用 overlay

dtc -@ -I dts -O dtb -o ssd1306-fb-i2c.dtbo ssd1306-fb-i2c.dts
sudo cp ssd1306-fb-i2c.dtbo /boot/dtb/overlay/

編輯 /boot/armbianEnv.txt,添加:

user_overlays=ssd1306-fb-i2c

保存后重啟:

sudo reboot

? 4. 驗證 framebuffer

重啟后檢查:

ls /dev/fb*

你應該看到 /dev/fb1(主 framebuffer 通常是 fb0)

確認信息:

cat /sys/class/graphics/fb1/name

應返回:ssd1306fb

查看分辨率:

cat /sys/class/graphics/fb1/virtual_size

? 5. 使用 framebuffer 工具顯示內容

🖼? 顯示圖片(需安裝 fbi 工具)

sudo apt install fbi
sudo fbi -d /dev/fb1 -T 1 --noverbose -a your-image.png

注意:

  • 圖片必須為 單色位圖(1bit bmp/png),大小 128×64。
  • 你也可以用 imagemagick 轉圖:
convert input.png -resize 128x64\! -monochrome out.bmp

🧪 輸出簡單圖像(命令行寫 framebuffer)

sudo bash -c 'dd if=/dev/zero of=/dev/fb1 bs=1024 count=1'

這會清空屏幕。

你可以寫一個程序像素級控制 /dev/fb1,例如寫字符、畫圖。


? 6. 示例:C 程序寫 framebuffer

#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {int fb = open("/dev/fb1", O_RDWR);if (fb < 0) return 1;// 簡單填充圖案char buffer[1024]; // 128 x 64 = 1024 bits = 128 bytes x 8 linesmemset(buffer, 0xAA, sizeof(buffer)); // 交錯黑白條紋write(fb, buffer, sizeof(buffer));close(fb);return 0;
}

? 小結

步驟動作
1??確保 OLED 連到 I2C(地址 0x3c)
2??使用 ssd1306fb-i2c overlay
3??檢查 /dev/fb1 是否出現
4??fbidd、程序操作 framebuffer 顯示內容

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88713.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88713.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88713.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArkUI-X的聲明式語法轉換過程

以下是ArkUI-X聲明式語法轉換過程的詳細解析&#xff0c;結合其核心設計原理與實現機制&#xff1a; ?一、基礎語法轉換規則 組件聲明轉換 傳統命令式組件創建&#xff08;如Android XMLJava&#xff09;轉換為ArkUI-X的Component結構&#xff1a; // 命令式&#xff08;A…

Docker 入門教程(一):從概念到第一個容器

文章目錄 &#x1f433; Docker 入門教程&#xff08;一&#xff09;&#xff1a;從概念到第一個容器1. Docker 是什么&#xff1f;2. Docker 的核心概念3. 安裝 Docker4. 運行你的第一個 Docker 容器 &#x1f433; Docker 入門教程&#xff08;一&#xff09;&#xff1a;從概…

如何在 Vue 應用中嵌入 ONLYOFFICE 編輯器

以下是僅包含 純前端集成 ONLYOFFICE 文檔編輯器到 Vue.js 項目 的完整代碼與說明&#xff0c;無需重新創建項目&#xff0c;可直接集成到現有 Vue 項目中&#xff1a; Vue.js 集成 ONLYOFFICE 文檔編輯器&#xff08;純前端實現&#xff09; 后端需要部署到服務器&#xff0c…

Cursor 1.0 炸裂功能:在后臺運行多個Agent,釋放雙手

Cursor 1.0 版本更新了用于代碼審查的 BugBot、對內存、一鍵式 MCP 設置、Jupyter 支持以及 Background Agent 的正式發布。 今天這篇文章主要介紹 Background Agent 的使用教程。 文章目錄 1. Background Agent 的基本概念2. 后臺 Agent 的使用方法3. 讓后臺 Agent 創造一個簡…

MLX LM - 在Apple芯片上運行大語言模型的Python工具包

文章目錄 一、關于MLX LM1、項目概覽2、相關鏈接資源3、功能特性 二、安裝配置三、使用指南1、快速開始2、Python API3、量化模型&#xff0c;上傳HF4、流式生成采樣 5、命令行6、長提示詞與生成 四、支持模型大模型 一、關于MLX LM 1、項目概覽 MLX LM是一個Python工具包&am…

【git學習】學習目標及課程安排

Git 是一款非常強大的版本控制工具&#xff0c;掌握它對編程和團隊協作都有巨大幫助。 &#x1f3af;學習目標&#xff08;適合個人與團隊使用&#xff09; 理解 Git 和版本控制的基本概念 熟練使用 Git 進行代碼提交、分支管理、合并與沖突解決 掌握遠程倉庫協作流程&#x…

HDFS(Hadoop分布式文件系統)總結

文章目錄 一、HDFS概述1. 定義與定位2. 核心特點 二、HDFS架構核心組件1. NameNode&#xff08;名稱節點&#xff09;2. DataNode&#xff08;數據節點&#xff09;3. Client&#xff08;客戶端&#xff09;4. Secondary NameNode&#xff08;輔助名稱節點&#xff09; 三、數據…

破局與融合:破解開發與供應鏈安全的業務場景難題

數字化轉型下的安全新范式與融合挑戰 在數字化浪潮的席卷下&#xff0c;企業正全面擁抱云計算、微服務、容器化和開源技術。這種轉型在極大提升業務敏捷性的同時&#xff0c;也帶來了全新的安全挑戰&#xff1a;傳統網絡邊界消融&#xff0c;攻擊面急劇擴大&#xff0c;“開發安…

Centos7 安裝部署Git、創建倉庫

概述 Git版本控制&#xff0c;大家都不會陌生&#xff0c;實踐訴求是從零部署本地Git服務&#xff0c;在執行推送遠程分支代碼時&#xff0c;用Git服務自帶的hooks觸發同步代碼文件&#xff0c;從而做到自動同步代碼&#xff0c;實現自動更新&#xff0c;操作環境centos7.9,Gi…

【Redis原理】Redis數據結構底層原理

目錄 一、SDS 二、IntSet&#xff08;整數集合&#xff09; 三、雙向鏈表 四、壓縮列表 五、字典&#xff08;哈希表&#xff09; 七、跳表 八、QuickList 九、RedisObject 一、SDS Redis 是用 C語言實現的&#xff0c;但是它沒有直接使用C 語言的 char* 字符數組來實現…

C#.NET HttpClient 使用教程

簡介 HttpClient 是 .NET 中用于發送 HTTP 請求和接收 HTTP 響應的現代化 API&#xff0c;它取代了過時的 WebClient 和 HttpWebRequest 類。 HttpClient 是 .NET Framework 4.5 和 .NET Core/.NET 5 中提供的、基于消息處理管道&#xff08;message handler pipeline&#…

Nginx常用安全配置指南

Nginx是一個輕量級的&#xff0c;高性能的Web服務器以及反向代理和郵箱代理服務器。它運行在UNIX、GNU、linux、BSD、Mac OS X、Solaris和Windows各種版本。根據調查統計數據顯示&#xff0c;當前全球超過6%的網站使用Nginx Web服務器來管理Web網站應用。 為了保證基于Nginx的…

【UniApp 日期選擇器實現與樣式優化實踐】

UniApp 日期選擇器實現與樣式優化實踐 發布時間&#xff1a;2025/6/26 前言 在移動端應用開發中&#xff0c;日期選擇器是一個常見且重要的交互組件。本文將分享我們在 UniApp 項目中實現自定義日期選擇器的經驗&#xff0c;特別是在樣式優化過程中遇到的問題及解決方案。通過…

推薦系統的視頻特征-視頻關鍵幀特征提取與向量生成

&#x1f4cc; 總體流程概覽 視頻文件 (.mp4)↓ 關鍵幀抽取&#xff08;FFmpeg / SceneDetect&#xff09;↓ 幀圖像&#xff08;.jpg&#xff09;↓ 圖像模型提取特征&#xff08;CLIP / CNN / ViT&#xff09;↓ 多幀聚合成視頻向量&#xff08;均值池化等&#xff09;↓ 向…

Apache SeaTunnel Flink引擎執行流程源碼分析

目錄 1. 任務啟動入口 2. 任務執行命令類:FlinkTaskExecuteCommand 3. FlinkExecution的創建與初始化 3.1 核心組件初始化 3.2 關鍵對象說明 4. 任務執行:FlinkExecution.execute() 5. Source處理流程 5.1 插件初始化 5.2 數據流生成 6. Transform處理流程 6.1 插…

Vue 3 + Element Plus 實現「動態表單組件」詳解教程

? Vue 3 Element Plus 實現「動態表單組件」詳解教程 &#x1f4cc; 適用場景&#xff1a;表單字段根據配置動態生成&#xff0c;支持校驗、提交、自定義組件、復雜布局等。 &#x1f9e9; 技術棧&#xff1a;Vue 3 TypeScript Element Plus &#x1f527; 核心特性&#x…

本地部署開源時間跟蹤工具 Kimai 并實現外部訪問( Windows 版本)

Kimai 是一款開源的時間跟蹤工具&#xff0c;它易于使用&#xff0c;并提供了強大的報告功能&#xff0c;在個人和團隊記錄工作時間、項目時間和活動時間等之后可以幫助用戶了解他們是如何花費時間的&#xff0c;從而提高生產力和效率。本文將詳細介紹如何在 Windows 系統本地部…

系統分析師案例知識點

目錄 1 必做題1.1 狀態機圖1.2 活動圖1.3 統一軟件開發過程RUP 2 需求分析2.1 數據流圖DFD2.2 ER圖2.3 狀態轉換圖STD2.4 數據字典2.5 流程圖2.6 需求評審2.7 設計類2.8 FAST分析2.9 常見的關系類 3 嵌入式3.1 容器技術3.2 虛擬機技術3.3 虛擬機和容器的不同點 4 數據庫4.1 NoS…

多相機人臉掃描設備如何助力高效打造數字教育孿生體?

在教育數字化轉型浪潮中&#xff0c;數字孿生體作為現實教育場景的虛擬映射&#xff0c;正成為智慧教育發展的關鍵技術支點。傳統教育模式面臨師資資源分布不均、個性化教學難以覆蓋、跨時空教學場景受限等痛點&#xff0c;而數字孿生體通過構建高仿真虛擬教育主體&#xff08;…

用 EXCEL/WPS 實現聚類分析:賦能智能客服場景的最佳實踐

聚類分析作為無監督學習的核心技術&#xff0c;能在客服數據中發現隱藏的用戶群體或問題模式。盡管 Excel/WPS 并非專業統計軟件&#xff0c;但巧妙利用其內置功能&#xff0c;也能實現基礎的聚類分析&#xff0c;為中小型客服團隊提供快速洞察。以下介紹具體方法及智能客服場景…