天天看點

嵌入式Linux系統:基礎知識_Linux裝置驅動基礎一、裝置的分類及特點二、Linux 裝置驅動與整個軟硬體系統的關系三、編寫 Linux 裝置驅動的技術基礎四、Linux 裝置驅動的學習方法

一、裝置的分類及特點

        計算機系統的硬體主要由 CPU、存儲器和外設組成。随着 IC 制造技術的發展,目前,晶片的內建度越來越高,往往在 CPU 内部就內建了存儲器和外設擴充卡。 ARM、 PowerPC、 MIPS 等處理器都內建了 UART、 I2C 控制器、 USB 控制器、 SDRAM 控制器等,有的處理器還內建了片内 RAM 和 Flash。

        驅動針對的對象是存儲器和外設(包括 CPU 内部內建的存儲器和外設),而不是針對 CPU 核。 Linux将存儲器和外設分為 3 個基礎大類:

     字元裝置;

     塊裝置;

     網絡裝置。

        字元裝置指那些必須以串行順序依次進行通路的裝置,如觸摸屏、錄音帶驅動器、滑鼠等。塊裝置可以用任意順序進行通路,以塊為機關進行操作,如硬碟、軟驅等。字元裝置不經過系統的快速緩沖,而塊裝置經過系統的快速緩沖。但是,字元裝置和塊裝置并沒有明顯的界限,如 Flash 裝置符合塊裝置的特點,但是我們仍然可以把它作為一個字元裝置來通路。

        字元裝置和塊裝置的驅動設計呈現出很大的差異,但是對于使用者而言,他們都使用檔案系統的操作接口 open()、 close()、 read()、 write()等函數進行通路。

        在 Linux 系統中,網絡裝置面向資料包的接收和發送而設計,它并不對應于檔案系統的節點。核心與網絡裝置的通信和核心與字元裝置、塊裝置的通信方式完全不同。另外, TTY 驅動、 I2C 驅動、 USB 驅動、 PCI 驅動、 LCD 驅動等本身大體可歸納入 3 個基礎大類,但是對于這些複雜的裝置, Linux 系統還定義了獨特的驅動體系結構。

二、Linux 裝置驅動與整個軟硬體系統的關系

        如圖1 所示,除網絡裝置外,字元裝置與塊裝置都被映射到 Linux 檔案系統的檔案和目錄,通過檔案系統的系統調用接口 open()、 write()、 read()、 close()等函數即可通路字元裝置和塊裝置。所有的字元裝置和塊裝置都被統一地呈現給使用者。塊裝置比字元裝置複雜,在它上面會首先建立一個磁盤/Flash 檔案系統,如 FAT、 Ext3、 YAFFS、 JFFS 等。 FAT、 Ext3、YAFFS、 JFFS 規範了檔案和目錄在存儲媒體上的組織。

嵌入式Linux系統:基礎知識_Linux裝置驅動基礎一、裝置的分類及特點二、Linux 裝置驅動與整個軟硬體系統的關系三、編寫 Linux 裝置驅動的技術基礎四、Linux 裝置驅動的學習方法

                                                             圖1 Linux 裝置驅動與整個軟硬體系統的關系

        應用程式可以使用 Linux 的系統調用接口程式設計,也可以使用 C 庫函數,出于代碼可移植性的考慮,後者更值得推薦。C 庫函數本身也通過系統調用接口而實作,如 C 庫函數中的 fopen()、fwrite()、fread()、fclose()分别會調用作業系統 API 的 open()、 write()、 read()、 close()函數。

三、編寫 Linux 裝置驅動的技術基礎

        Linux 裝置驅動的學習是一項浩大的工程,讀者需要首先掌握以下基礎。

    編寫 Linux 裝置驅動要求工程師具有良好的硬體基礎,懂得 SRAM、 Flash、 SDRAM、磁盤的讀寫方式, UART、 I2C、 USB 等裝置的接口,輪詢、中斷、 DMA 的原理, PCI 總線的工作方式以及 CPU 的記憶體管理單元(MMU)等。

    編寫 Linux 裝置驅動要求工程師具有良好的 C 語言基礎,能靈活地運用 C 語言的結構體、指針、函數指針及記憶體動态申請和釋放等。

   編寫 Linux 裝置驅動要求工程師具有一定的 Linux 核心基礎,雖然并不要求工程師對核心各個部分有深入的研究,但至少要了解裝置驅動與核心的接口,尤其是對于塊裝置、網絡裝置、 Flash裝置、序列槽裝置等複雜裝置。

   編寫 Linux 裝置驅動要求工程師具有良好的多任務并發控制和同步的基礎,因為在裝置驅動中會大量使用自旋鎖、互斥、信号量、等待隊列等并發與同步機制。

四、Linux 裝置驅動的學習方法

        動手實踐永遠是學習任何軟體開發的最好方法,學習 Linux 裝置驅動也不例外。是以,您需要一塊可以實際練手的電路闆來構造嵌入式開發環境。