除了使用mknod工具建立Symbloic Link之外,字元驅動程式也可以自行建立這個Symbolic Link
建立步驟:
1. alloc_chrdev_region() 2. class_create() 3. device_create() 4. cdev_init() 5. cdev_add()
釋放步驟:
1. device_destroy() 2. cdev_del() 3. class_destroy() 4. unregister_chrdev_region()
main.c
#include <linux/cdev.h> #include <linux/init.h> #include <linux/device.h> #include <linux/module.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Steward Fu"); MODULE_DESCRIPTION("Linux Driver"); static int base = 0; static struct cdev mycdev; static struct class *myclass = NULL; static int myopen(struct inode *inode, struct file *file) { printk("%s\n", __func__); return 0; } static int myclose(struct inode *inode, struct file *file) { printk("%s\n", __func__); return 0; } static const struct file_operations myfops = { .owner = THIS_MODULE, .open = myopen, .release = myclose, }; int ldd_init(void) { alloc_chrdev_region(&base, 0, 1, "myfile"); myclass = class_create(THIS_MODULE, "myfile"); /* /sys/class/myfile */ device_create(myclass, NULL, base, NULL, "myfile"); /* /dev/myfile */ cdev_init(&mycdev, &myfops); cdev_add(&mycdev, base, 1); return 0; } void ldd_exit(void) { device_destroy(myclass, base); cdev_del(&mycdev); class_destroy(myclass); unregister_chrdev_region(base, 1); } module_init(ldd_init); module_exit(ldd_exit);
ldd_init: 建立字元驅動程式
myopen: 對應User Application的open()
myclose: 對應User Application的close()
ldd_exit: 刪除字元驅動程式
安裝驅動
# insmod /boot/main.ko
由於使用class device,因此,Symbolic已經建立完成,不再需要使用mknod建立
# ls -al /dev/myfile crw-r--r-- 1 root root 243, 0 Jan 1 00:00 /dev/myfile
開啟裝置
# echo "" > /dev/myfile myopen sh: write error: Invalid argument myclose