驱动:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/fs.h> //struct file_operations
#include <linux/errno.h>
#include <linux/cdev.h> //struct cdev
#include <asm/uaccess.h> //copy_from_user和copy_to_user
#include <linux/slab.h>
struct cdev mdev;//静态分配cdev
dev_t devno;//设备号
int dev1_regs[5];
int dev2_regs[5];
/*#######################################################
(2)实现设备操作
#######################################################*/
loff_t mem_lseek(struct file *filp, loff_t offset, int whence)
{
loff_t new_pos = 0;
switch (whence)
{
case SEEK_SET:
new_pos = 0+offset;
break;
case SEEK_CUR:
new_pos = filp->f_pos + offset;
break;
case SEEK_END:
new_pos = 5*sizeof(int)+offset;
break;
}
filp->f_pos =new_pos;
return new_pos;
}
ssize_t mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
int *reg_base = filp->private_data;
copy_to_user(buf, reg_base+(*ppos),size);
filp -> f_pos += size;
return size;
}
ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
int *reg_base = filp->private_data;
copy_from_user(reg_base+(*ppos),buf,size);
filp -> f_pos += size;
return size;
}
//定义的结构体如果是指针,访问成员时就用 -> 如果定义的是结构体变量,访问成员时就用 .
int mem_open(struct inode *node, struct file *filp)
{
int num = MINOR(node->i_rdev);
if (num == 0)
{
filp->private_data = dev1_regs;
}
if(num == 1)
{
filp->private_data = dev2_regs;
}
return 0;
}
int mem_close(struct inode *node, struct file *filp)
{
return 0;
}
/*#######################################################
(1)驱动初始化
#######################################################*/
const struct file_operations memfops =
{
.llseek = mem_lseek,
.read = mem_read,
.write = mem_write,
.open = mem_open,
.release=mem_close,
};
int memdev_init(void)
{
//初始化cdev
cdev_init(&mdev, &memfops);
//注册cdev
alloc_chrdev_region(&devno, 0, 2, "memdev");
cdev_add(&mdev, devno, 2);
return 0;
}
/*#######################################################
(3)驱动注销
#######################################################*/
void memdev_exit(void)
{
cdev_del(&mdev);
unregister_chrdev_region(devno,2);
}
module_init(memdev_init);
module_exit(memdev_exit);
应用程序write_mem.c:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd = 0;
int src = 2013;
/*打开设备文件*/
fd = open("/dev/memdev0",O_RDWR);
/*写入数据*/
write(fd, &src, sizeof(int));
/*关闭设备*/
close(fd);
return 0;
}
应用程序read_mem.c:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd = 0;
int dst = 0;
/*打开设备文件*/
fd = open("/dev/memdev0",O_RDWR);
/*写入数据*/
read(fd, &dst, sizeof(int));
printf("dst is %d\n",dst);
/*关闭设备*/
close(fd);
return 0;
}