preface
前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!
《linux
裝置驅動入門篇
》:《linux
裝置驅動掃盲篇》:
《fedora下的字元裝置驅動開發》:
開發乙個基本的字元裝置驅動
在linux核心驅動中,字元裝置是最基本的裝置驅動。
字元裝置包括了裝置最基本的操作,如開啟裝置、關閉裝置、i/o控制等。
功能:❶建立乙個名為globalchar的虛擬裝置,裝置內部只有乙個全域性變數供使用者操作。裝置提供了❷讀函式讀取全域性變數的值並且返回給使用者,❸寫函式把使用者設定的值寫入全域性變數。
①
**如下:
#include #include #include #include module_license("gpl");在核心中運算元據要區分資料的**,對於使用者空間的資料要使用copy_from_user()函式複製,使用copy_to_user()函式回寫,不能直接操作使用者空間的資料,否則會產生記憶體訪問錯誤。module_author("mystery");
#define dev_name "globalchar"
static ssize_t globalread(struct file *, char *, size_t, loff_t *);
static ssize_t globalwrite(struct file *, const char *, size_t, loff_t *);
static int char_major = 0;
static int globaldata = 0; // "globaldata" 裝置的全域性變數
//初始化字元裝置驅動的file_operations結構體
static const struct file_operations globalchar_fops =
; //注意分號啊!!!
//模組初始化函式
static int __init globalchar_init(void)
else
return ret;
}//模組解除安裝函式
static void __exit globalchar_exit(void)
//裝置驅動讀函式
static ssize_t globalread(struct file *filp, char *buf, size_t len, loff_t *off)
return sizeof(int);
}//裝置驅動寫函式
static ssize_t globalwrite(struct file *filp, const char *buf, size_t len, loff_t *off)
return sizeof(int);
}module_init(globalchar_init);
module_exit(globalchar_exit);
②編寫makefile
obj-m := globalchardev.o③編譯並載入核心模組④檢視核心分配的主裝置號kdir := /lib/modules/$(shell uname -r)/build
srcpwd := $(shell pwd)
all:
make -c $(kdir) m=$(srcpwd) modules
⑤使用mknod命令建立乙個裝置檔案
mknod命令使用-m引數指定globalchar裝置可以被所有使用者訪問。
249即上面查詢的主裝置號。
到這裡,我們就已經正確地新增了乙個字元裝置到核心,下面需要測試一下驅動程式能否正常工作。
測試字元裝置驅動
為了測試編寫的字元裝置是否能正常工作,我們編寫乙個應用程式測試一下能否正常讀寫字元裝置。
測試**:
#include #include #include #include #define dev_name "/dev/globalchar"程式首先使用open函式開啟裝置檔案,然後使用read()函式讀取字元裝置的值,open()系統呼叫最終會被解釋為字元裝置註冊的read呼叫。測試結果:int main()
read(fd, &num, sizeof(int));
printf("the globalchar is %d \n", num); //獲取當前裝置數值
printf("please input a number written to globalchar: ");
scanf("%d", &num);
write(fd, &num, sizeof(int)); //寫入新的數值
read(fd, &num, sizeof(int));
printf("the globalchar is %d \n", num); //重新讀取裝置數值
close(fd);
return 0;
}
從程式輸出結果來看,最初從裝置得到的數值是0,輸入520後寫入到字元裝置,重新讀出的數值也是520,與設定相同,表示裝置驅動程式功能正確。
總結
linux字元裝置驅動也不過如此嘛,嘿嘿,雖然只實現了read和write兩個函式,不過其它函式也大同小異。
重點:實踐再實踐!!!
本文出自 「成鵬致遠」 部落格,請務必保留此出處
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...
Linux裝置驅動 字元裝置驅動介面函式
核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是register chrdev region alloc chrdev region 和register chrdev 在linux2.6核心以前註冊字元裝置的函式介面是register chrdev,登出字元裝置介面函式是unregiste...