Linux 设备驱动程序 字符设备
时间:2014-05-26 22:52:42
收藏:0
阅读:371
已经无法再精简,适合入门。
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
评论(0)