Zynq裝置樹教程(一)

2021-08-19 20:15:02 字數 2364 閱讀 9500

此教程的目的

本教程是針對xilinx』 zynq-7000 epp裝置(乙個整合了fpga的arm cotex-a9)寫的,但其中的概念適用於所有使用了裝置樹的linux核心。本文使用xillinux發行版為例,該發行版執行於zedboard硬體上。

裝置樹有什麼好處

設想一下:bootloader剛剛將linux核心複製到記憶體中,然後跳到核心的入口點,,[1],,。此時核心就像執行在處理器上的乙個裸機程式。需要配置處理器,設定虛擬記憶體,向控制台列印一些資訊。但是這些事情如何完成?所有的這些操作都要通過寫暫存器來實現,但linux核心如何知道這些暫存器的位址?如何知道當前有多少個cpu核可以使用?有多少記憶體可以訪問?

最直接的辦法就是在核心**裡為指定平台寫好這些**,由核心配置引數決定哪些平台**將被啟用。當一切都固定不變時這種方法還不錯,比如在x86處理器上內部的暫存器,或是bios的訪問。但對於變化量來說, 比如pci/pcie外設,就需要核心明確了解這些變化的細節。

arm架構已經變成了linux社群的乙個在麻煩:即使處理器使用相同的編譯器和函式,但具體到某一種晶元,它就有自己的暫存器位址和不同的配置方式。不僅如此,每種板子都有自己的外設。結果造成核心中有大量的標頭檔案、補丁和特殊的配置引數,它們的一種組合就對應於一款晶元的一種特殊板型。總之,這造成了大量醜陋和不可維護的**。

另外,每個編譯出來的核心bin檔案都是為某一款晶元的某一種板子,有點像為市場上某一款pc主機板編譯核心。所以很希望為所有arm處理器編譯核心時,讓核心能以某種方式識別硬體,然後使用正確的驅動,就像一台pc一樣。

怎麼實現呢?在pc上,暫存器初始化是硬編碼的,其他的資訊由bios提供。所以當有另一塊軟體提供這些資訊時,硬體自動檢測也很容易。arm處理器沒有bios,linux核心只能靠自己了。

解決方案是裝置樹device tree, 也稱作open firmware(of)或flattened device tree(fdt)。本質上是乙個位元組碼格式的資料結構,其中包含資訊在核心啟動時非常有用。bootloader在跳到核心入口點之前將這一塊資料複製到ram中的已知位址。

裝置樹的嚴格的規範,卻沒有規定哪些內容可以放置其中以及放置的位置。核心可以搜尋裝置樹中的任意路徑和引數。程式設計師來決定哪些配置作為引數放進裝置樹里,以及放置在什麼地方。

對於我們大多數人來說,我們用裝置樹來向核心描述對硬體的新增或刪除操作,作為響應,核心就可以載入或解除安裝相應的驅動。硬體的特殊資訊也可以通過裝置樹來向核心傳達。

編譯裝置樹

裝置樹有三種形式:

* 文字檔案 (.dts) - 源

二進位制物件 (.dtb) - 目標碼

linux系統中/proc/device-tree目錄 - 除錯和逆向資訊

啟用/proc/device-tree目錄需要開啟配置config_proc_devicetree:

device drivers --->

device tree and open firmware support --->

[*] support for device tree in /proc

對於裝置樹,我們一般的使用流程是:編輯dts檔案,然後用乙個工具將其編譯成dtb檔案,這個工具就在linux核心原始碼scripts/dtc/目錄下。

但是下文的描述都使用核心原碼中的dtc工具。

裝置樹的語法在這裡描述。注意這種語言並不作任何執行操作,不像xml,這只是一種組織資料的語法。一些架構有自動產生裝置樹的工具,來自於xps專案。但目前對於zynq epp平台還沒有此工具。

dts編譯為dtb:

$ scripts/dtc/dtc -i dts -o dtb -o /path/to/my-tree.dtb /path/to/my-tree.dts

這樣就建立了my-tree.dtb二進位制檔案。dtc是主機上的乙個程式。如果核心沒有編譯過,則先需要編譯好dts編譯器:配置核心,也可以複製乙份已有的配置檔案到核心根目錄下的.config。如下:

$ make arch=arm digilent_zed_defconfig

生成dts編譯器:

$ make arch=arm scripts

dtc也可以從乙個dtb檔案或/proc/device-tree檔案系統反編譯。例如從dtb反編譯:

$ scripts/dtc/dtc -i dtb -o dts -o /path/to/fromdtb.dts /path/to/booted_with_this.dtb

生成的dts檔案仍然可以被用來生成dtb。但最好還是使用最初的dts檔案,因為一些參考標籤在反編譯的dts檔案中顯示為數字。

從執行中的核心生成dts檔案:

需要先source,然後從petalinux安裝檔案中找到注釋

[1] 切入點,entry point

Zynq裝置樹教程(三)

定義外設 可能你讀本文是為了給你的裝置寫乙個linux驅動,在這方面要推薦著名的 linux device driver 但是在寫乙個裝置驅動之前,允許我分享寫linux驅動的第一誡 永遠不要為linux寫裝置驅動。更好的辦法是找乙個維護狀態良好的類似功能的裝置驅動,然後修改它。這不僅僅意味著更容易...

生成zynq 跟我制訂乙份zynq開發步驟

學習zynq,並非一朝一夕之事,欲速則不達,在學習zynq之前,首先做好堅持下去的決心,其次制定乙份適合自己的zynq開發計畫,本期幫大家制定乙份zynq的開發計畫。zynq開發,主要包括兩部分 裸機使用和在arm上搭載linux系統。首先是裸機使用,裸機使用可分為三個階段。1 第一階段 熟悉viv...

認識裝置樹(一) 概述

3 認識裝置樹 如何去描述裝置這一定是裝置驅動需要考慮的重要問題。早先,linux中arm架構使用原始檔中的巨集 結構等去描述裝置,不過現在已全面轉向裝置樹。使用文本來描述裝置,肉眼可見的方便。本文就是本人學習裝置樹的筆記,即是對自己學習的知識做個總結和整理,也為方便後來人。在微控制器程式設計中,通...