1. 程式人生 > >【迅為iTop4412學習筆記】9.編寫簡單應用呼叫驅動

【迅為iTop4412學習筆記】9.編寫簡單應用呼叫驅動

宣告

以下都是我剛開始看驅動視訊的個人強行解讀,如果有誤請指出,共同進步。

本節目標

編寫簡單應用呼叫驅動


編寫應用就和我們平時寫c檔案差不多了。
首先要包含一些標頭檔案

// 這不解釋
#include <stdio.h>
// 拓展了資料型別(uint32_t之類的)
#include <sys/types.h>
// 系統呼叫函式標頭檔案,可以獲取各種東西的屬性
#include <sys/stat.h>
// 檔案操作函式(包含了open()等函式)
#include <fcntl.h>
// unix標準函式庫(包含了close()等函式)
#include <unistd.h> // IO控制函式(包含了ioctl()函式) #include <sys/ioctl.h>

因為我們編譯了是要在板子上跑的,所以編譯器不是gcc而是使用迅為提供的arm交叉編譯器 arm2009q3,編譯命令不是gcc而是arm-none-linux-gnueabi-gcc。

我們本次用到的函式其實和學習C語言檔案操作的時候差不多,雖然編譯器不同,但是函式幾乎一樣,所以我就不看arm的編譯器內的標頭檔案裡的函式長啥樣了。

聯絡上一節,其實很多函式都是有關聯的。

比如我們在應用裡是open()函式,在上節我們也編譯過mryang_open()函式。
應用裡是close(),我們上節也編譯過mryang_release()函式。
應用裡是ioctl(),我們上節也編譯過mryang_unlocked_ioctl()函式。

隱隱覺得背後果然是有一些py交易的…

至於應用程式碼就很簡單了,直接上程式碼吧,內容基本和學C的檔案操作是一樣的

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>

int main(int argc, char* argv[])
{
	char *mryang_node = "/dev/mryang_misc_ctl"
; int fd = open(mryang_node, O_RDWR|O_NDELAY); if(fd < 0) { printf("open failed!\n"); } else { printf("open success! fd=%d\n", fd); ioctl(fd, 1, 2); } close(fd); return 0; }

我們用arm的編譯器編譯(我的程式叫app.c)

arm-none-linux-gnueabi-gcc -o app app.c

現在我們直接在板子上啟動,會發現

[[email protected]]# ./app
open failed!

這是為什麼呢?因為我們還沒插入上一節寫的驅動。(稍後回憶整個流程)
在插入模組後我們再啟動

[[email protected]]# ./app
[  101.692030] mryang_open!
[  101.693772] cmd is 1
[  101.695357] arg is 2
[  101.697478] mryang_release
open success! fd=3

顯然呼叫成功了

收尾

這一節的內容看似很簡單,其實東西還是有點東西的。

  1. 我們開啟的檔案,是一個裝置節點,這個裝置節點,是我們上一節編寫的註冊雜項裝置生成的裝置節點。所以我們若是不註冊,直接啟動應用,會開啟失敗
  2. 註冊了雜項裝置之後,我們再啟動就能成功開啟裝置節點進行操作了
  3. 以我目前的見識,你開啟這個裝置節點的時候,就會呼叫上節我們編寫的mryang_open()函式,所以開啟就會輸出mryang_open!。
  4. 開啟之後,我們用了ioctl()函式來向底層傳值。ioctl()會呼叫我們定義的mryang_unlocked_ioctl(),並把ioctl()第二、三個引數傳遞給mryang_unlocked_ioctl()。而上節我們編寫的函式就是列印第二、三個引數,所以輸出了cmd is 1和arg is 2。
  5. 操作完之後我們關閉了檔案,呼叫了mryang_release()函式輸出了mryang_release!

以上就是整個流程

其實這裡應該是比較完整的一個東西了。

我們在剛學習C語言的時候,就學過這些檔案操作函式。而此刻,我們只不過是讓檔案操作函式操作的是我們的驅動而已。通過ioctl()函式,可以像底層傳值。這樣我們就可以做到輸入1開LED,輸入0關LED了。