Linux字符設備驅動模型之框架解說
時間:2018-09-27 來源:未知
一、軟件操作硬件設備模型
在進行嵌入式開發的過程中,在常做的事情就是驅動配置硬件設備,然后根據功能需求使用硬件設備,實現功能的邏輯。如下圖為其相互之間的關系。

如上圖所示:
驅動程序:主要作為操作和配置硬件設備,使得硬件設備能夠正常進行工作。例如,在寫點燈程序時,前提條件是從原理圖了解到LED等與CPU/MCU之間的硬件連接(使用了哪一個GPIO口),驅動程序的作用就是初始化配置GPIO口,使得GPIO口能夠進行工作,比如現在配置為推完輸出模式。GPIO能夠正常工作之后,那么就需要進行基本的操作了,即燈亮和等滅。這就是驅動程序。
應用程序:當驅動程序能夠時間基本的燈亮和燈滅,那么是需要實現跑馬燈,還是各種花樣的燈的顯示,這就由應用程序來決定了。
硬件設備能夠接受CPU/MCU通過驅動程序進行的操作,或者是能夠為CPU/MCU提供有效的數據。
二、Linux系統軟件操作硬件模型
對于Linux操作系統而言,因其系統的強大和所支持功能的完善,可支持各種設備在Linux操作系統下運行。所以設備的類型可謂繁多,如:字符設備,塊設備,網絡接口設備,USB設備,PCI設備,平臺設備,混雜設備……等等,而設備類型不同,也意味著其對應的驅動程序模型不同。即每一種類型的設備,都有其相應的驅動模型。
但總體而言,既然都是運行在Linux操作系統下的設備,所以其應當存在相應的驅動架構來進行驅動設備。如下圖:

如上圖,對于Linux操作系統而言,用戶空間的應用程序和內核空間的驅動程序,有著千絲萬縷的關系,但卻又相互獨立。他們通過文件的方式進行相互之間的通信。而驅動程序則是依賴于Linux內核的驅動架構進行編寫的程序,為用戶空間的應用程序提供相應的接口通道。而設備操作程序則是在Linux內核驅動架構下進行與設備直接交互的程序代碼,比如配置初始化CPU私有外設,初始化硬件設備,對硬件設備進行基本操作等等,總之目的是讓硬件設備能夠正常的工作。
那么在Linux系統中編寫內核驅動,其驅動模型是怎樣的呢??

如上圖:
初始化內核驅動:依賴于Linux內核的驅動模型,建立所需要操作的設備驅動并進行相應的操作。如下圖:

實現設備操作:根據硬件設備的型號、功能特性等,實現驅動硬件設備正常工作,能夠進行基本的操作,比如讀取設備數據或者向設備寫數據等。
注銷設備驅動:在Linux系統中,會存在設備熱拔插或者用戶不想使用相應設備的應用場景,那么可以將相應的設備驅動在內核空間注銷,將不能使用相應的設備驅動。
三、Linux字符設備驅動模型
對于Linux內核驅動而言,任何一種設備驅動模型都會用Linux內核中的一種結構來進行描述。
對于字符設備確定而言,在Linux內核中使用struct cdev結構來描述。其結構原型如下:

對于Linux內核給出的描述設備的結構,其結構成員并不是都是由程序員使用的,有些結構成員由內核內部使用,有些結構成員有程序員使用。比如以上struct cdev結構中,由程序員使用的成員為unsigned int count; 、dev_t dev;和const struct file_operations *ops;。
【unsigned int count;】:其表示設備的數目/數量,在同一個系統中,可能存在多個相同的設備,那么不需要每一個設備就為其提供一個驅動,而是統一提供同一個驅動,只需要在驅動中識別出是操作哪一個設備即可。Count結構成員的作用就是記錄這一個驅動中存在多少個設備。

【dev_t dev;】:表示這個設備的設備號,在Linux操作系統中,通過設備號的方式來進行區分不同是設備。
【const struct file_operations *ops;】:設備驅動操作的函數集/方法集。這個方法集為上層應用程序提供相應的接口通道。實現用戶空間的操作函數與內核空間的操作實現一一映射關系。
四、Linux操作系統中硬件的操作方式有句話叫做“對于Linux而言,一切皆文件”,所以對于在用戶空間的應用程序而言,在面向硬件設備的操作時,也是通過文件的方式進行操作。操作相應的設備文件節點,就等同于操作了其設備文件節點對應的硬件設備。
硬件設備相關的設備文件節點存放于/dev目錄下。如下圖:

如上圖所示,/dev目錄下的文件節點均為對應的硬件設備的設備文件。例如:ttyS0設備文件為PC臺式機默認的9針串口設備節點。所以對相應設備文件節點的讀寫操作即是對其所對應的硬件進行讀寫操作。

