Linux 设备驱动程序 字符设备

已经无法再精简,适合入门。

 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.c

然后在相同目录下建立一个Makefile文件,文件内容如下(只需这一行):

obj-m :=mengcdev.o

 

然后在此目录下执行 make -C /lib/modules/`uname -r`/build/ M=`pwd` 这条命令执行成功的前天是安装了源代码包,具体可以参阅其他资料,Ubuntu只需apt-get install 几个包,Redhat系列只需yuminstall 几个。当然需要有开发环境了,即gcc之类的。

 

一旦编译完成即可生成mengcdev.ko 这个模块

用root插入这个模块 insmod mengcdev.ko

然后去/proc/device中找相应的设备号 

cat /proc/devices |grep meng

如果输出如下:

248 mengcdev

则执行 

mknod /dev/mengcdev c 248 1,注意把248换成实际输出的值

 

然后就可以进行测试了  echo hello >/dev/mengcdev

cat /dev/mengcdev

 

 

Linux 设备驱动程序 字符设备,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。