1. 程式人生 > >字元裝置驅動(一)

字元裝置驅動(一)

寫字元裝置之前,我們先來看看linux驅動的整體框架吧,直接上圖。
這裡寫圖片描述
  linux系統主要將裝置分為3類:字元裝置、塊裝置、網路裝置

  • 字元裝置:是指只能一個位元組一個位元組讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後資料。字元裝置是面向流的裝置,常見的字元裝置有滑鼠、鍵盤、串列埠、控制檯和LED裝置等。

  • 塊裝置:是指可以從裝置的任意位置讀取一定長度資料的裝置。塊裝置包括硬碟、磁碟、U盤和SD卡等。

  • 網路裝置:網路裝置(也稱為網路介面,network inferface),如乙太網卡

   我們先把字元裝置分析一下,以後在慢慢分析其他的。先使用再去分析底層可能來的容易點,我當時直接看的驅動,其實學起來挺難受的。我們先來看看一個應用程式吧。

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

int main(int argc, char **argv)
{
    int fd1;
    int val = 1;
    fd1 = open("/dev/led", O_RDWR);
    if (fd1 < 0)
    {
        printf("error, can't open\n");
        return 0;
    }
    write(fd1, &val, 4
); }

  此程式主要用於點亮led,點亮小燈也算是C語言裡面的hello world 程式了。應用程式涉及到了兩個函式,open和write,那我們就先來分析一下這兩個函式吧,其實linux中還有很多的函式,咱們就用到哪個就開始學習哪個吧,其他函式可以自行百度,好文章很多。

  • open 函式用於開啟和建立檔案。
#include <fcntl.h>
int open(const char *pathname, int oflag, ... );

返回值:成功則返回檔案描述符,否則返回 -1
pathname 是待開啟/建立檔案的路徑名
oflag用於指定檔案的開啟/建立模式
O_RDONLY  只讀模式
O_WRONLY  只寫模式
O_RDWR  讀寫模式
第三個引數(…)僅當建立新檔案時才使用,用於指定檔案的訪問許可權位

  • write函式
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

返回值:等於請求寫的位元組數count
fd:要進行寫操作的檔案描述詞。
buf:需要輸出的緩衝區
count:最大輸出位元組計數
  OK了,兩個函式搞定了,現在再來看看那個程式,第一我們先以讀寫的方式開啟led裝置結點,然後在向結點寫入1。這樣就可以實現對led的操作。裝置結點現在可以簡單的理解為:是連線核心與使用者層的樞紐,應用程式用過他就能對應起來硬體裝置進行操作。其他的我們放在下面繼續說。