Linux 設備驅動程序 字符設備

已經沒法再精簡,適合入門。node

 1 #include<linux/module.h>
 2 #include<linux/init.h>
 3 
 4 #include<asm/uaccess.h>
 5 #include <linux/types.h>
 6 #include<linux/fs.h>
 7 #include<linux/cdev.h>
 8 struct mengc_dev{
 9         char data[64];
10         struct cdev cdev;
11 };
12 int mengmajor;
13 struct mengc_dev meng_device;
14 
15 void exit_mengc_dev(void)
16 {
17         dev_t devno = MKDEV(mengmajor,1);
18         cdev_del(&meng_device.cdev);
19         unregister_chrdev_region(devno,1);
20 }
21 int meng_open(struct inode*inode,struct file *filep)
22 {
23         return 0;
24 }
25 int meng_release(struct inode*inode,struct file *filep)
26 {
27                 return 0;
28 }
29 
30 ssize_t meng_read(struct file*filep,char __user*buf,size_t count,loff_t*f_ops)
31 {
32         if(*f_ops>=strlen(meng_device.data))
33                 return 0;
34         if(copy_to_user(buf,meng_device.data,strlen(meng_device.data)))
35         {
36                 return -1;
37         }
38         *f_ops+=strlen(meng_device.data);
39         return strlen(meng_device.data);
40 }
41 
42 ssize_t meng_write(struct file*filep,const char __user*buf,size_t count,loff_t*f_ops)
43 {
44         if(count>63)
45                 count=63;
46         if(copy_from_user(meng_device.data,buf,count))
47         {
48                 return -EFAULT;
49         }
50         return count;
51 }
52 
53 
54 struct file_operations meng_fops=
55 {
56         .read=meng_read,
57         .write=meng_write,
58         .open=meng_open,
59         .release=meng_release
60 };
61 int init_mengc_dev(void)
62 {
63         int re;
64         dev_t dev=0;
65         re=alloc_chrdev_region(&dev,1,1,"mengcdev");
66         if(re<0)
67         {
68                 printk("meng_devc register failed.\n");
69                 return re;
70         }
71         mengmajor=MAJOR(dev);
72         memset(&meng_device,0,sizeof(meng_device));
73         cdev_init(&meng_device.cdev,&meng_fops);
74         meng_device.cdev.owner=THIS_MODULE;
75         meng_device.cdev.ops=&meng_fops;
76         re=cdev_add(&meng_device.cdev,dev,1);
77         if(re)
78         {
79                 printk("mengdevc add faild.\n");
80         }
81         return 0;
82 }
83 module_init(init_mengc_dev);
84 module_exit(exit_mengc_dev);

將上面的文件保存成mengcdev.clinux

而後在相同目錄下創建一個Makefile文件,文件內容以下(只需這一行):測試

obj-m :=mengcdev.oui

 

而後在此目錄下執行 make -C /lib/modules/`uname -r`/build/ M=`pwd` 這條命令執行成功的前天是安裝了源代碼包,具體能夠參閱其餘資料,Ubuntu只需apt-get install 幾個包,Redhat系列只需yuminstall 幾個。固然須要有開發環境了,即gcc之類的。spa

 

一旦編譯完成便可生成mengcdev.ko 這個模塊code

用root插入這個模塊 insmod mengcdev.koblog

而後去/proc/device中找相應的設備號 開發

cat /proc/devices |grep mengget

若是輸出以下:it

248 mengcdev

則執行 

mknod /dev/mengcdev c 248 1,注意把248換成實際輸出的值

 

而後就能夠進行測試了  echo hello >/dev/mengcdev

cat /dev/mengcdev

相關文章
相關標籤/搜索