注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

W_中原的博客笔记

通知:新博客日志将更新到个人站点:http://www.zhgyuan.cn/

 
 
 

日志

 
 

Linux字符设备驱动之读写read、 write  

2014-05-05 19:38:10|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
写一个简单的读写字符设备驱动,实现read和write
新建.c文件text.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>    //设备
#include <asm/uaccess.h>    //copy_to_user、copy_from_user

#define DEV_NAME "WZY"

static ssize_t WZY_Read(struct file *,char *,size_t,loff_t*);
static ssize_t WZY_Write(struct file *,const char *,size_t,loff_t*);

static int char_major = 0;
static int CharData = 0;
static struct class *char_class;     //节点

static ssize_t WZY_Read(struct file *filp,char *buf,size_t len,loff_t *off)
{
if(copy_to_user(buf,&CharData,sizeof(int)))
{
return -EFAULT;
}
return sizeof(int);
}

static ssize_t WZY_Write(struct file *filp,const char *buf,size_t len,loff_t *off)
{
if(copy_from_user(&CharData,buf,sizeof(int)))
{
return -EFAULT;
}
return sizeof(int);
}

struct file_operations wzy_char_fops =
{
.owner = THIS_MODULE,
.read = WZY_Read,
.write = WZY_Write,
};


static int __init WZY_Char_init(void)
{
int ret;
ret = register_chrdev(char_major,DEV_NAME,&wzy_char_fops);
if(ret<0)
{
printk("Fail");
}
else
{
printk("Success");
char_major = ret;
printk("Major = %d\n",char_major);
}
char_class = class_create(THIS_MODULE, DEV_NAME); //创建节点
if(IS_ERR(char_class))
{
printk("Err: failed in  class. \n");
return -1;
}
device_create(char_class, NULL, MKDEV(char_major, 0), NULL, DEV_NAME);
return 0 ;
}

static void __exit WZY_Char_exit(void)
{
unregister_chrdev(char_major,DEV_NAME);
device_destroy(char_class, MKDEV(char_major, 0));
class_destroy(char_class);
return;
}

module_init(WZY_Char_init);
module_exit(WZY_Char_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION ( "char driver\n" ) ;
MODULE_AUTHOR ( "WZY" ) ;

编写Makefile:
obj-m := text.o
 KERNELDIR :=/lib/modules/$(shell uname -r)/build
 PWD := $(shell pwd)
default:  
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
install:
insmod text.ko
uninstall:
rmmod text

clean:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean
rm -f *.o *.ko *.mod.c 
Linux字符设备驱动之读写read、 write - W_中原 - 汪中原的博客笔记

接下来编写测试程序text_char.c:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>

#define DEV_NAME "/dev/WZY"

int main()
{
int fd,num;
fd = open(DEV_NAME,O_RDWR,S_IRUSR | S_IWUSR);
if(fd < 0)
{
printf("Open Device Fail");
return -1;
}
read(fd,&num,sizeof(int));
printf("The WZY_Char is %d\n",num);
printf("Please input a number written to WZY_Char:\n");
scanf("%d",&num);
write(fd,&num,sizeof(int));
read(fd,&num,sizeof(int));
printf("The WZY_Char is: %d\n",num);
close(fd);
return 0;
}
上面的测试例程是输入一个int数写入到内核,然后再从内核读取这个数现实出来

文件都写好后执行指令:
编译text.c:
#make
添加驱动模块:
#make install
编译测试例程:
#gcc -o text_char text_char.c
执行text_char:
#./text_char
 输入一个整形数如9014返回仍是9014说明读写都正确
Linux字符设备驱动之读写read、 write - W_中原 - 汪中原的博客笔记
 
  评论这张
 
阅读(30)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017