linux下如何寫乙個秒字元裝置

2021-08-18 13:40:29 字數 3160 閱讀 7153

做linux核心驅動,最重要的一種裝置驅動就是字元裝置驅動,也是最基本的最需要徹底掌握的。

字元裝置幾個重要的結構體和介面函式:

字元裝置結構體

struct cdev

初始化字元裝置

cdev_init(struct cdev*,struct file_operations*);

註冊或者說新增乙個字元裝置到核心

cdev_add(struct cdev*,int,int);

刪除某個字元裝置

cdev_del(struct cdev*);

我們可以自己定義乙個字元裝置結構體,在這個結構體中包含struct cdev。事實上很多其他的驅動裝置,也是這樣做的,比方i2c裝置、usb裝置等。

第一步、

初始化cdev_init這個cdev,這樣就可以將cdev和file_operations結構體繫結在一起,使用者空間才能夠通過read、write等函式來操作這個cdev裝置。

第二步、

註冊這個cdev到核心中,使用cdev_add介面。這樣乙個簡易的cdev字元算是存在於核心中了。

解除安裝這人cdev可以通過cdev_del介面函式來做,一般在__exit函式中呼叫。

這裡來實現乙個簡單的秒字元裝置。

1. second_dev.c

#include #include #include #include #include #include #include #include #include #include #include #include #define second_major 255

static struct class *firstdrv_class;//auto create a device node need a class

static int second_major = second_major;// major 255

//struct second device, contians struct cdev

struct second_dev ;

struct second_dev *second_devp;//a pointer of struct device

//timer handle func

static void second_timer_handle(unsigned long arg)

int second_open(struct inode *inode,struct file *filp)//open

//close file

int second_release(struct inode *inode,struct file *filp)

static ssize_t second_read(struct file *filp,char __user *buf,size_t count,loff_t *ppos)

static ssize_t second_write(struct file* filp,const char __user * buf, size_t count, loff_t* ppos)

static const struct file_operations second_fops = ;

//init cdev

static void second_setup_cdev(struct second_dev *dev,int index)

int __init second_init(void)

if(ret < 0)

return ret;

firstdrv_class = class_create(this_module, "second_major");//create the firstdrv class --> /sys/class/second_major

device_create(firstdrv_class,null,devno,null,"second");//auto create device node /dev/led

second_devp = kmalloc(sizeof(struct second_dev),gfp_kernel);

if(!second_devp)

memset(second_devp,0,sizeof(struct second_dev));

second_setup_cdev(second_devp,0);

return 0;

fail_malloc:

unregister_chrdev_region(devno, 1);

return ret;

}void __exit second_exit(void)

module_license("gpl");

module_init(second_init);

module_exit(second_exit);

2. makefile

#

# made from makefile.org by [email protected]

#obj-m += second-device.o

second-device-y := second-dev.o

3. make.sh

#/bin/sh

ver=`uname -r`

config_usbip_core=m \

config_usbip_vhci_hcd=m \

config_usbip_host=m \

make -c /lib/modules/$ver/build m=$pwd "$@"

直接執行make.sh就這可編譯出乙個ko檔案second-device.ko,然後insmod到核心中,這樣乙個秒字元裝置就做好了。

編寫乙個測試demo,看看效果如何。

second-dev-test.c

#include #include #include #include #include int main()

}} else

}

編譯然後執行一下。

成功。

如何寫乙個Stack?

1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...

如何寫乙個鍊錶

有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在 資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下 1 單個節點建立...

如何寫乙個Vue元件

寫的是以.vue結尾的單檔案元件的寫法,是基於webpack構建的專案。template 模板 js 邏輯 css 樣式 每個元件都有屬於自己的模板,js和樣式。如果將乙個頁面比喻成一間房子的話,元件就是房子裡的客廳 臥室 廚房 廁所。如果把廚房單獨拿出來的話,元件又可以是刀 油煙機.等等。就是說頁...