linux驱动教程加强整理版


驱动代码:

/*************************************************
*linux字符设备驱动程序,运行于rh9 linux
赖晓晨
*************************************************/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>

MODULE_LICENSE("GPL");
#define MAJOR_NUM 254    //主设备号
#define EFALUT 1
static ssize_t my_read(struct file * filp,char * buf, 
												ssize_t size,loff_t * off);   //读函数:从flip指定的文件中读size个字符到buf中
static ssize_t my_write(struct file * flip,const char * buf,
												ssize_t size,loff_t *off);
struct file_operations my_ops=
{
	read:my_read,
	write:my_write,
};  //函数指针设置
static int global_var=0;

static int __init my_init(void)
{
	int ret;
	ret=register_chrdev(MAJOR_NUM,"mydev",&my_ops);
	if(ret)
		printk("my dev register failer!\n");
	else
		printk("my dev register success!\n");
	return ret; 
}
static void __exit my_exit(void)
{ 
	int ret;
	ret=unregister_chrdev(MAJOR_NUM,"mydev");
	if(ret)
		printk("my dev unregister failer!\n");
	else
		printk("my dev unregister success!\n");
}

static ssize_t my_read(struct file * filp,char * buf,ssize_t size,loff_t * off)
{
	if(copy_to_user(buf,&global_var,sizeof(int))) //把数据从内核空间拷贝到用户空间,从global_var读到buf
	{
		return -EFALUT;
	}
	return sizeof(int);
}


static ssize_t my_write(struct file * flip,const char * buf,ssize_t size,loff_t *off)
{
	if(copy_from_user(&global_var,buf,sizeof(int)))
	{
		return -EFALUT;
	}
	return sizeof(int);
}
module_init(my_init);
module_exit(my_exit);

驱动代码的makefile

INCLUDEDIR=/usr/src/linux-2.4/include
CC=gcc
CFLAG= -D__KERNEL__ -DMODULE -DLINUX -I${INCLUDEDIR}
all:hello.o
hello.o:hello.c
	$(CC) $(CFLAG) -c hello.c
clean:
	rm -f *.o

编译步骤

在命令执行make,用insmod插入模块,然后在/dev目录下建立一个设备文件,主设备号为254,此设备号为0,字母c代表字符设备,命令如下:
nmknod/dev/mydev c 254 0


接下来编写测试程序:


#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
void main()
{
	int fd,num;
	fd=open("/dev/mydev",O_RDWR,S_IRUSR|S_IWUSR);
	if(fd!=-1)
	{
		read(fd,&num,sizeof(int));
		printf("my read num is %d\n",num);
		printf("please input a num:");
		scanf("%d",&num);
		write(fd,&num,sizeof(int));
		read(fd,&num,sizeof(int));
		printf("my read num is %d\n",num);
		close(fd);
	}
	else
		printf("open device failed!\n");
}

如果在研究的过程中有什么问题,可以留言,也可以联系我,共同探讨,方式见专栏。

                                                                                                                                                                                                  成都C罗编辑

详细教程下载地址:

http://ishare.iask.sina.com.cn/f/36626835.html

                                                                                      



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值