本篇文章來學(xué)習(xí)嵌入式Linux驅(qū)動(dòng)程序開發(fā)中的第一步——點(diǎn)亮led。
驅(qū)動(dòng)程序開發(fā)的步驟主要分為以下幾個(gè)部分:
根據(jù)原理圖確定相關(guān)引腳;
查看芯片手冊(cè)(以我的板子來說就是三星平臺(tái)EXYNOS4412系列);
編寫驅(qū)動(dòng)程序;
編寫用于測(cè)試的應(yīng)用程序;
以上的驅(qū)動(dòng)程序開發(fā)過程,不僅僅只是在Linux中,在所有的嵌入式軟件開發(fā)中,也基本都是遵循這套流程。
特別說明:第一個(gè)步驟和第二個(gè)步驟我將直接跳過(查看原理圖和芯片手冊(cè)),因?yàn)檫@兩者取決于我們的硬件平臺(tái),大家可以根據(jù)具體的應(yīng)用進(jìn)行修改即可。重點(diǎn)放在第三個(gè)步驟和第四個(gè)步驟,也就是編寫驅(qū)動(dòng)程序和測(cè)試程序。
下面進(jìn)行詳細(xì)的講解
編寫驅(qū)動(dòng)程序
(1)確認(rèn)led所連接的引腳,led1、led2分別連接的引腳為EXYNOS4_GPD0(0)和EXYNOS4_GPD0(1),此處的EXYNOS4_GPD0(0)是一個(gè)宏,該宏是IO引腳的結(jié)構(gòu)描述,兩個(gè)led定義為一個(gè)數(shù)組的代碼如下:
(2)寫使用到的兩個(gè)gpio申請(qǐng),且申請(qǐng)成功之后將他們配置為輸出模式,同時(shí)保持默認(rèn)高電平,根據(jù)原理圖可知當(dāng)?shù)碗娖綍r(shí)led打開,所以開機(jī)led默認(rèn)關(guān)閉,代碼如下:
(3)對(duì)應(yīng)上一步,寫釋放申請(qǐng)的gpio,代碼如下:
(4)寫led設(shè)備與文件操作相關(guān)的函數(shù)(在本例中主要是open()函數(shù)和ioctl()函數(shù)等),代碼如下:
open函數(shù)和release函數(shù)
ioctl函數(shù)
然后將實(shí)現(xiàn)的文件操作函數(shù)填充到file_operations結(jié)構(gòu)體中,如下:
由于在本例中不使用read()、write()和llseek()等函數(shù),所以可以不用寫這些文件操作函數(shù)的具體實(shí)現(xiàn)。
(5)寫模塊入口函數(shù)和模塊出口函數(shù),代碼如下:
在模塊入口函數(shù)中,主要完成注冊(cè)設(shè)備、設(shè)備初始化、將設(shè)備注冊(cè)到系統(tǒng)、創(chuàng)建設(shè)備節(jié)點(diǎn)以及申請(qǐng)gpio并初始化。
模塊入口函數(shù)——前半部分
模塊入口函數(shù)——后半部分
在模塊出口函數(shù)中,主要完成一些釋放工作,例如注銷設(shè)備、注銷設(shè)備節(jié)點(diǎn)、釋放gpio等。
模塊出口函數(shù)
最后修飾入口函數(shù)和出口函數(shù),以及模塊的許可證聲明即可:
編寫用于測(cè)試的應(yīng)用程序
代碼如下:
實(shí)現(xiàn)的效果為:運(yùn)行測(cè)試程序,輸入可執(zhí)行文件名,并輸入兩個(gè)控制參數(shù),第一個(gè)參數(shù)決定控制哪一個(gè)led,第二個(gè)參數(shù)決定是點(diǎn)亮led還是關(guān)閉led,如果輸入?yún)?shù)個(gè)數(shù)不等于3時(shí)不能控制點(diǎn)燈。
在文章結(jié)束部分作一些總結(jié):
對(duì)宏定義EXYNOS4_GPL2(0)的操作實(shí)際上就是對(duì)4412芯片管腳寄存器的操作;
上層程序員(包括驅(qū)動(dòng)工程師)不用關(guān)心物理地址和虛擬地址具體是多少,只需要對(duì)一組宏定義操作,就是對(duì)4412內(nèi)部寄存器操作;
關(guān)于led管腳的申請(qǐng)、賦值以及配置所使用到的主要函數(shù)為: GPIO申請(qǐng)函數(shù)和賦值函數(shù)gpio_request – gpio_set_value()、三星平臺(tái)的GPIO配置函數(shù)s3c_gpio_cfgpin()、GPIO配置輸出模式的宏變量S3C_GPIO_OUTPUT。
通過對(duì)普通GPIO的操作,大家可以了解到,學(xué)習(xí)驅(qū)動(dòng)的過程中,很大一部分時(shí)間實(shí)際上是用于熟悉庫函數(shù)的使用。其實(shí)無論什么驅(qū)動(dòng)都沒有想象的那么難,一般性的方法都是先了解和掌握和對(duì)應(yīng)驅(qū)動(dòng)相關(guān)的庫函數(shù)。
最后在掌握驅(qū)動(dòng)庫函數(shù)的基礎(chǔ)上,掌握Linux架構(gòu),驅(qū)動(dòng)自然很容易寫出來或者很容易就移植成功,希望此篇文章可以幫助讀者初步進(jìn)入嵌入式Linux設(shè)備驅(qū)動(dòng)的世界。
-
led
+關(guān)注
關(guān)注
244文章
24731瀏覽量
692646 -
Linux
+關(guān)注
關(guān)注
88文章
11822瀏覽量
219602 -
驅(qū)動(dòng)程序
+關(guān)注
關(guān)注
19文章
872瀏覽量
50793
發(fā)布評(píng)論請(qǐng)先 登錄
如何在 Yocto 中集成由 HID 設(shè)備控制的 I2C 觸摸驅(qū)動(dòng)程序?
32g3 有適用于 linux 的 vr5510 驅(qū)動(dòng)程序嗎?
【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核平臺(tái)抽線共和設(shè)備驅(qū)動(dòng)程序
【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開發(fā)基礎(chǔ)
Linux驅(qū)動(dòng)開發(fā)的必備知識(shí)
【書籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》
如何將 GPIO PWM 和 GPIO Capture 驅(qū)動(dòng)程序導(dǎo)入 Linux 內(nèi)核,實(shí)現(xiàn) PWM 輸出并檢測(cè)引腳的變化狀態(tài)?
如何使 ML56-TK 驅(qū)動(dòng)程序適應(yīng) Linux 內(nèi)核?
為FreeRTOS增加新的設(shè)備驅(qū)動(dòng)程序
【創(chuàng)龍TLT113-MiniEVM開發(fā)板試用體驗(yàn)】點(diǎn)亮LED
zephyr設(shè)備驅(qū)動(dòng)程序模型
如何使用Linux設(shè)備驅(qū)動(dòng)程序點(diǎn)亮LED
評(píng)論