本文檔概述了利用Linux開發板為 Linux 內核開發驅動程序的基礎知識,并簡單介紹了如何配置和操作 Linux 驅動程序開發板。
一 開發背景
驅動是什么?
驅動程序是駐留在內核中的一段軟件,它促進主機設備和外圍設備之間的交互。這些外圍設備可以像鼠標或鍵盤一樣普通。我們為我們的產品編寫驅動程序軟件以便于和各種類型的主機設備進行通信。
Linux內核是什么?
Linux內核是構成Linux操作系統的核心代碼。 常見的基于 Linux 內核構建的高級操作系統 (HLOS) 有 Ubuntu、Android 和 Yocto。一個計算機系統是一個硬件和軟件的共生體,它們互相依賴,不可分割。計算機的硬件,含有外圍設備、處理器、內存、硬盤和其他的電子設備組成計算機的發動機。但是沒有軟件來操作和控制它,自身是不能工作的。完成這個控制工作的軟件就稱為操作系統,在Linux的術語中被稱為“內核”,也可以稱為“核心”。Linux內核的主要模塊(或組件)分以下幾個部分:存儲管理、CPU和進程管理、文件系統、設備管理和驅動、網絡通信,以及系統的初始化(引導)、系統調用等。內核的開發由維護人員來監督,維護者擁有內核各個部分的開發權,任何添加到內核各自部分的代碼都必須發送給他們。 這個通過維護者向內核提交代碼的過程稱為上游。
二 環境搭建
1. 軟件環境的搭建
強烈建議使用專用的 Linux 機器來進行驅動程序的開發。 除了 Windows PC 之外,使用 Linux 機器或使用 Linux 機器作為主計算機是驅動程序開發的理想配置。不建議在 Windows 中運行 Linux 虛擬機,除非用戶具有設置和維護虛擬機的背景,否則可能會出現兼容性和存儲的問題。
2. 硬件設備的連接
圖1. Linux驅動開發過程中硬件設備的連接示意圖
硬件設備的連接較為簡單,其中,Linux機器通過USB to OTG和USB to TTL的轉接線相連,Linux開發板通過I2C總線和I2S總線與目標設備相連以完成驅動的開發。USB to TTL模塊的作用就是把通信電平轉換到Linux主機和Linux開發板都能識別的電平進行通信。
3. Linux操作系統中的常用工具
Gedit
Gedit 是一個基于 GUI 的文本編輯器,具有軟件開發的一些基本功能。 Gedit 可以用作純文本編輯器,也可以把它用來當成是一個集成開發環境 (IDE), 它會根據不同的語言高亮顯現關鍵字和標識符。
Picocom
Picocom 是一個常見的串口調試工具,可以在 Linux 終端窗口中運行。利用Picocom可以通過串口通信協議與 Linux開發板進行通信和操作。
Nano
Nano 是一個基于命令行的文本編輯器。 Nano 提供最基礎的文本編輯功能,用于在終端內進行編輯。 在 Ubuntu 中,Nano 是默認的命令行文本編輯器。
三 Linux驅動開發
1. 概述
圖2. Linux驅動開發流程及主要開發文件
針對Linux驅動的開發,有3大類型的文件是必不可少的,其中一部分就是最基礎的驅動文件(The driver files),驅動文件中包含了驅動本身的文件后綴為.C的源代碼和.H的頭文件,以及Kconfig文件和Makefile文件,其中,Kconfig文件的作用是當我們編譯Linux內核時,我們會發現有的模塊被編譯進了內核,有的只是生成了一個個模塊。因此,我們如何讓內核發現我們編寫的模塊呢?這就需要在Kconfig文件中進行定義說明。至于如何生成模塊,那么就需要利用Makefile文件告訴編譯器,怎么編譯生成這個模塊。另一個部分就是我們的設備樹文件(Devicetree files),所以什么是設備樹文件呢?其實在沒有設備樹文件以前,我們需要將Linux開發板的信息硬編碼到內核的.C源文件中。不同開發板的硬件配置不一樣,因此內核中存在大量的板級配置源碼,從而會造成代碼冗余。因此針對這個現象,我們可以用設備樹的方法將板級配
置信息獨立的存放到.dts/.dtsi文件中。此時,針對不同的開發板,只需要配置相應的.dts/.dtsi文件即可,這樣可以避免大量重復的編碼工作,但是如果更換Linux開發板那么就需要更換相對應的設備樹文件進行配置。最后一部分我們需要的文件就是作為參考文檔的說明文檔(Reference documentation),這個參考文檔中會對如何配置設備樹文件做出定義,是我們編寫設備樹文件時必須參考的說明文檔。驅動文件(The driver files)經過編譯會生成名為zImage的鏡像編譯文件,設備樹文件(Devicetree files)經過編譯會生成文件后綴為.dtb的二進制文件,在成功的通過編譯得到這兩個文件后,我們就可以將這兩個文件燒錄到我們的Linux開發板中,這就是我們Linux驅動開發的原理過程。
2. 開發驅動源代碼、Makefile和Kconfig文件
要開始開發驅動程序源代碼、Makefile 和 Kconfig 文件,用戶必須導航到內核中驅動程序所在的目錄。 進入該目錄后,創建一個適當的源代碼文件并打開現有的 Kconfig 和 Makefile 文件。在 Kconfig 文件中,開發人員需要為設備驅動程序創建一個條目,這個條目向內核描述了設備需要的驅動程序,并專門列出了驅動程序的依賴項。在 Makefile 文件中,開發人員同樣需要為設備驅動程序創建一個條目,該條目負責告訴編譯器需要從驅動源代碼創建哪些目標文件。雖然驅動源代碼對于所要開發的驅動程序和開發人員來說是獨一無二的,但每個驅動程序都有相似的流程。首先,設備必須在一系列模塊表中注冊。例如,of_device_idtable 用于將設備實例與設備樹文件匹配,i2c_device_idtable 用于建立 I2C 通信,acpi_device_table 用于 ACPI 系統。所有模塊表都由最終的 module_i2c_driver 表鏈接。在建立模塊表之后,驅動程序會執行probe() 函數,在此函數中,驅動程序檢查設備是否可用和可配置,如果設備可用,則為驅動程序分配資源。如果設備不可用,則函數應返回錯誤并釋放任何已分配的資源。在此之后,init() 函數將分別運行并獲取和設置可以在用戶空間中配置和讀取的屬性。
3. 開發Defconfig和Devicetree文件
Defconfig 和 Devicetree 文件特定用于開發人員用來驗證驅動程序的平臺。Defconfig 確定編譯內核時要在內核中安裝或啟用哪些模塊。開發者可以選擇手動編輯設備樹或使用 pinmux 工具生成設備樹代碼。
4. 說明文檔 / dt-bindings
說明文檔描述了如何操作和配置設備驅動程序。 此文檔應提供設備驅動程序及其驅動設備的簡要說明。 在簡要說明之后,會列出驅動程序的屬性。其中最重要的屬性即 compatible 屬性。 所有兼容的實例都列在其中。 在 compatible 屬性之后,用戶將列出所有可配置的屬性。在每個屬性中,開發人員需提供屬性的簡要說明,指導用戶如何配置該屬性。
結語
本文簡要介紹了如何利用Linux開發板為 Linux 內核開發驅動程序的原理和基礎過程,要了解更多關于Linux驅動開發相關的詳細信息,請參閱“Third Edition of Linux Device Drivers”或“The Linux Kernel Module Programming Guide”,以便更加深入地了解該主題。
審核編輯:湯梓紅
-
Linux
+關注
關注
87文章
11345瀏覽量
210385 -
主機
+關注
關注
0文章
1010瀏覽量
35306 -
開發板
+關注
關注
25文章
5121瀏覽量
98189
發布評論請先 登錄
相關推薦
評論