在linux裝置驅動之字元裝置(一)中學習了裝置號的構成,裝置號的申請與釋放。在linux裝置驅動之字元裝置(二)中學習了如何建立乙個字元裝置,初始化,已經註冊到系統中和最後釋放該字元裝置。
本節將結合前兩節學到的知道,編寫乙個簡單的字元裝置驅動。最後總結一下字元裝置驅動的模型。
#include
#include
#include
#include
static
int major = 0;
static dev_t ndev;
//static struct cdev char_dev; //靜態分配
static
struct cdev* char_dev; //動態分配
static ssize_t char_read(struct file *file, char __user *buf, size_t size, loff_t *offset)
static
int char_open(struct inode *node, struct file *filp)
//檔案操作函式集
static
struct file_operations char_ops=;
static
int char_dev_init(void)
}else
//主裝置號不存在,動態分配
}char_dev = cdev_alloc();//動態分配cdev
if(char_dev)
//cdev_init(&char_dev, &char_ops);//初始化cdev,以及設定操作函式集
cdev_add(char_dev, ndev, 1);
return0;}
static
void char_dev_exit(void)
module_init(char_dev_init);
module_exit(char_dev_exit);
module_license("gpl");
注: 注釋掉的是靜態分配cdev過程
insmod demo_char_dev.ko
cat /prco/devices
root@test_home
:/data
# cat /proc/devices
character
devices:
....
189 usb_device
237 char_dev
238 audio_dsp_mem
可以看到系統給分配的主裝置號為237,所以下一步就是根據主裝置號建立裝置節點。
root@test_home
:/data
# mknod /dev/mychardev c 237 0
root@test_home
:/data
# ls /dev/mychardev
/dev/mychardev
#include
#include
#include
#include
#include
int main()
read(fd, &buf, 1);
close(fd);
return
0;}
測試結果如下:
root@test_home
:/data
# ./chardev_test
root@test_home
:/data
# dmesg | grep char_dev
[ 9921.636518] c7 char_dev: char_open!
[ 9921.639924] c7 char_dev: char_read!
可以看到是進入了open函式和read函式。
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...