本篇文章來學習嵌入式Linux驅動程序開發中的第一步——點亮led。
驅動程序開發的步驟主要分為以下幾個部分:
根據原理圖確定相關引腳;
查看芯片手冊(以我的板子來說就是三星平臺EXYNOS4412系列);
編寫驅動程序;
編寫用于測試的應用程序;
以上的驅動程序開發過程,不僅僅只是在Linux中,在所有的嵌入式軟件開發中,也基本都是遵循這套流程。
特別說明:第一個步驟和第二個步驟我將直接跳過(查看原理圖和芯片手冊),因為這兩者取決于我們的硬件平臺,大家可以根據具體的應用進行修改即可。重點放在第三個步驟和第四個步驟,也就是編寫驅動程序和測試程序。
下面進行詳細的講解
編寫驅動程序
(1)確認led所連接的引腳,led1、led2分別連接的引腳為EXYNOS4_GPD0(0)和EXYNOS4_GPD0(1),此處的EXYNOS4_GPD0(0)是一個宏,該宏是IO引腳的結構描述,兩個led定義為一個數組的代碼如下:
(2)寫使用到的兩個gpio申請,且申請成功之后將他們配置為輸出模式,同時保持默認高電平,根據原理圖可知當低電平時led打開,所以開機led默認關閉,代碼如下:
(3)對應上一步,寫釋放申請的gpio,代碼如下:
(4)寫led設備與文件操作相關的函數(在本例中主要是open()函數和ioctl()函數等),代碼如下:
open函數和release函數
ioctl函數
然后將實現的文件操作函數填充到file_operations結構體中,如下:
由于在本例中不使用read()、write()和llseek()等函數,所以可以不用寫這些文件操作函數的具體實現。
(5)寫模塊入口函數和模塊出口函數,代碼如下:
在模塊入口函數中,主要完成注冊設備、設備初始化、將設備注冊到系統、創建設備節點以及申請gpio并初始化。
模塊入口函數——前半部分
模塊入口函數——后半部分
在模塊出口函數中,主要完成一些釋放工作,例如注銷設備、注銷設備節點、釋放gpio等。
模塊出口函數
最后修飾入口函數和出口函數,以及模塊的許可證聲明即可:
編寫用于測試的應用程序
代碼如下:
實現的效果為:運行測試程序,輸入可執行文件名,并輸入兩個控制參數,第一個參數決定控制哪一個led,第二個參數決定是點亮led還是關閉led,如果輸入參數個數不等于3時不能控制點燈。
在文章結束部分作一些總結:
對宏定義EXYNOS4_GPL2(0)的操作實際上就是對4412芯片管腳寄存器的操作;
上層程序員(包括驅動工程師)不用關心物理地址和虛擬地址具體是多少,只需要對一組宏定義操作,就是對4412內部寄存器操作;
關于led管腳的申請、賦值以及配置所使用到的主要函數為: GPIO申請函數和賦值函數gpio_request – gpio_set_value()、三星平臺的GPIO配置函數s3c_gpio_cfgpin()、GPIO配置輸出模式的宏變量S3C_GPIO_OUTPUT。
通過對普通GPIO的操作,大家可以了解到,學習驅動的過程中,很大一部分時間實際上是用于熟悉庫函數的使用。其實無論什么驅動都沒有想象的那么難,一般性的方法都是先了解和掌握和對應驅動相關的庫函數。
最后在掌握驅動庫函數的基礎上,掌握Linux架構,驅動自然很容易寫出來或者很容易就移植成功,希望此篇文章可以幫助讀者初步進入嵌入式Linux設備驅動的世界。
-
led
+關注
關注
242文章
23347瀏覽量
662495 -
Linux
+關注
關注
87文章
11342瀏覽量
210170 -
驅動程序
+關注
關注
19文章
848瀏覽量
48165
發布評論請先 登錄
相關推薦
評論