驱动:
#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; }