迅為4412開(kāi)發(fā)板Linux字符設備控制

發(fā)布時(shí)間:2021-3-4 14:30    發(fā)布者:落風(fēng)
關(guān)鍵詞: 迅為 , 4412 , Linux
在 linux 驅動(dòng)中字符設備驅動(dòng)是必須掌握的,本章主要介紹字符設備應用的程序,無(wú)論是學(xué)習了后面的知識自己寫(xiě)的字符驅動(dòng),還是已有的字符驅動(dòng),都需要能夠寫(xiě)一些簡(jiǎn)單的應用程序。即使從事 Linux 驅動(dòng)方面的工作,Linux 驅動(dòng)寫(xiě)出來(lái)之后,也需要由驅動(dòng)程序員編寫(xiě)簡(jiǎn)單的應用程序來(lái)進(jìn)行測試的。
另外,關(guān)于驅動(dòng)部分,迅為電子有專(zhuān)門(mén)的驅動(dòng)實(shí)驗教程提供給大家學(xué)習,大家有了這些基礎之后再去學(xué)習底層的知識就會(huì )很容易了。
在本手冊的 10.22 章節,大家可以看到這些 C 程序也是可以在 Android 下面運行的,只不過(guò)沒(méi)有圖形界面。
本章配套視頻為:
“視頻 06_01 字符設備控制之 main 函數傳參數”
“視頻 06_02 字符設備控制之 led 燈”
“視頻 06_03 字符設備控制之 buzzer 蜂鳴器”
“視頻 06_04 字符設備控制之 ADC 模數轉換”
17.1  入口 main  函數的參數
在和用戶(hù)交流的過(guò)程中,雖然所有人都學(xué)習過(guò) C 語(yǔ)言,但是對 C 語(yǔ)言中的 main 函數的用法并不是很清楚。由于后面的實(shí)驗需要用到這部分知識,這里就占用一個(gè)小節,先簡(jiǎn)單介紹一下 main 函數。
main  函數簡(jiǎn)介
main 函數作為應用程序的入口,在頭文件“#include ”中。main 函數需要傳參數的時(shí)候完整的定義為
int main(int argc,char **argv)
參數 argc,表示參數的個(gè)數
參數**argv,存儲輸入字符的數組,argv[0]表示程序名稱(chēng),argv[1]——argv[n]輸入的參數
不傳參數的時(shí)候定義為
int main(void)
函數 main 的返回值為類(lèi)型為 int,用于判斷程序執行成功還是失敗
main  函數例程
編寫(xiě)簡(jiǎn)單的 argvc.c 文件測試 main 函數。

如上圖所示,將輸入的參數第一個(gè)和第二個(gè)轉換成 int 類(lèi)型,賦值給 i 和 j,最后輸出打印。
其中 argv[0]為程序名稱(chēng),這里就是后面要編譯的目標文件“argvc”。

編譯運行測試
Ubuntu 系統下,如下圖所示,進(jìn)入前面實(shí)驗創(chuàng )建的目錄“/home/linuxsystemcode/”,使用命令“mkdircharcontrol”新建 charcontrol 文件夾,將源碼 argvc.c 拷貝進(jìn)去,進(jìn)入新建的文件夾 charcontrol,如下圖所示。

使用命令“arm-none-linux-gnueabi-gcc -o argvc argvc.c -static”編譯 argvc 文件, 如下圖所示,使用命令“l(fā)s”可以看到生成了 argvc 可執行文件。

這里介紹 U 盤(pán)拷貝代碼的方法,也可以編譯進(jìn)文件系統,具體方法參考 10.3.5 小節。 將編譯成的可執行文件 argvc,拷貝到 U 盤(pán),啟動(dòng)開(kāi)發(fā)板,插入 U 盤(pán),加載 U 盤(pán),運行程序如下。

如上圖所示,程序成功運行,打。
the Program name is ./mnt/udisk/argvc。
因為運行的程序就是“./mnt/udisk/argvc”,這是第一個(gè)參數
The command line has 2 argument:
10,11。

輸入的參數是 10 和 11,對應 argv[2]和 argv[2]。
17.2  字符類(lèi) led  燈
在前面介紹 open 函數的時(shí)候,已經(jīng)提到過(guò)如何打開(kāi)字符類(lèi)設備,獲得句柄的方法和一般文件都是一樣。
Led 燈的設備節點(diǎn)在/dev 目錄下,如下圖所示,在超級終端可以使用 ls 命令查找。

由于涉及到硬件知識,這里簡(jiǎn)單介紹一下硬件原理,如下圖所示,led 小燈的硬件原理很簡(jiǎn)單。

如上圖所示,給 KP_COL0 和 VDD50_EN 網(wǎng)絡(luò )高電平,三極管 L9014 就會(huì )導通,電源 VSYS 就會(huì )將電壓加到電阻 R 和 led 小燈上,小燈就會(huì )亮。
給 KP_COL0 和 VDD50_EN 網(wǎng)絡(luò )低電平,三極管 L9014 就會(huì )截止,形成斷路,小燈滅。
在前面介紹過(guò),如果要給文件進(jìn)行寫(xiě)操作,那么使用的是 write 函數。對于 led 小燈的操作,使用寫(xiě)函數,理論上也是可以的。但是對于 IO 口(這里的 IO 口指的是硬件上的 IO 口, 不是指 IO 文件)的

操作,Linux 專(zhuān)門(mén)設計了一個(gè)高效的函數 ioctl。
這個(gè)函數在頭文件#include中。
int ioctl( int fd, int request, int cmd);
參數 fd,函數 open 返回的句柄。
參數 request 和參數 cmd,由內核驅動(dòng)決定具體操作,例如 request 可以代表那個(gè) IO 口,cmd 代表對 IO 進(jìn)行什么樣的操作,也可以反過(guò)來(lái)。具體的含義由驅動(dòng)工程師在驅動(dòng)中 switch 決定。
返回值:返回 0 成功;返回-1,出錯。

小燈測試例程
編寫(xiě)簡(jiǎn)單的 leds.c 文件測試小燈。首先添加頭文件,如下圖所示。
通過(guò) main 參數傳過(guò)來(lái)的參數是 char 字符格式的,如果要傳遞給 ioctl 函數,需要用到數值轉化函數atoi,添加了頭文件#include 。
接著(zhù)由于小燈的數量和命令都是 2,所以對小燈數量和操作數進(jìn)行宏定義
#define LED_NUM 2
#define LED_C 2。

然后 main 函數如下圖所示。

如上圖所示。
第 33 行,調用了 ioctl 函數,將 main 函數的第一個(gè)和第二個(gè)參數傳入驅動(dòng)。
第 19 行,解釋那個(gè)參數具體代表什么含義,"argv1 is cmd;argv2 is io”,參數 1 對應命令,參數 2 對應具體那個(gè) led 燈。
第 36 行,將打開(kāi)的設備節點(diǎn)"/dev/leds"關(guān)閉。

編譯運行測試
在 Ubuntu 系統下,如下圖所示,進(jìn)入前面實(shí)驗創(chuàng )建的目錄“/home/linuxsystemcode/charcontrol”,將源碼 leds.c 拷貝進(jìn)去,如下圖所示。

使用命令“arm-none-linux-gnueabi-gcc -o leds leds.c -static”編譯 leds 文件,如下圖所示,使用命令“l(fā)s”可以看到生成了 leds 可執行文件。

這里介紹 U 盤(pán)拷貝代碼的方法,也可以編譯進(jìn)文件系統,具體方法參考實(shí)驗 02
將編譯成的可執行文件 open,拷貝到 U 盤(pán),啟動(dòng)開(kāi)發(fā)板,插入 U 盤(pán),加載 U 盤(pán),運行程序如下。
如下圖所示,如果不加參數會(huì )有提示,然后報錯。

如下圖所示,使用命令“./mnt/udisk/leds 0 0”運行,可以看到靠近蜂鳴器的小燈滅了。

所有參數對小燈的控制如下:
0 0 靠近蜂鳴器的小燈滅;
0 1 靠近按鍵的小燈滅;
1 0 靠近蜂鳴器的小燈亮;
1 1 靠近按鍵的小燈亮。用戶(hù)可以自行測試一下。


本文地址:http://selenalain.com/thread-760861-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页