驱动代码:
/*************************************************
*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