Linux设备驱动程序学习(二)虚拟字符设备globalmem
来源:互联网 发布:淘宝网流量 编辑:程序博客网 时间:2024/06/07 06:12
虚拟字符设备globalmem是一块大小为GLOBALMEM_SIZE的内存空间,在设备驱动程序中进行分配。
首先,需要定义虚拟字符设备globalmem的设备结构体相关的宏:
#define GLOBALMEM_SIZE 0x1000#define MEM_CLEAR 0x1#define GLOBALMEM_MAJOR 250static int globalmem_major = GLOBALMEM_MAJOR;struct globalmem_dev{struct cdev cdev;unsigned char mem[GLOBALMEM_SIZE];};struct globalmem_dev dev;
当然,在这之前,还需要包含相应的头文件:#include <linux/module.h>#include <linux/types.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/mm.h>#include <linux/sched.h>#include <linux/init.h>#include <linux/cdev.h>#include <asm/io.h>#include <asm/system.h>#include <uaccess.h>
然后是设备驱动程序的模块加载函数和卸载函数:static void globalmem_setup_cdev(void){int err = 0;int devno = 0;devno = MKDEV(globalmem_major, 0);cdev_init(&dev.cdev, &globalmem_fops);dev.cdev.owner = THIS_MODULE;err = cdev_add(&dev.cdev, devno, 1);if(err){printk(KERN_NOTICE "error %d adding globalmem", err);}}static int __init globalmem_init(void){int result = 0;dev_t devno = MKDEV(globalmem_major, 0);if(globalmem_major == 0){result = alloc_chrdev_region(&devno, 0, 1, "globalmem");globalmem_major = MAJOR(devno);}else{result = register_chrdev_region(devno, 1, "globalmem");}if(result < 0){return result;}globalmem_setup_cdev();return 0;}static void __exit globalmem_exit(void){cdev_del(&dev.cdev);unregister_chrdev_region(MKDEV(globalmem_major, 0), 1);}之后,需要注册驱动程序与文件系统之间的接口:
static const struct file_operations globalmem_fops ={ .owner = THIS_MODULE, .llseek = globalmem_llseek, .read = globalmem_read, .write = globalmem_write, .ioctl = globalmem_ioctl,};
下面,我们就需要分别实现这个接口中的每一个函数:globalmem_read:
static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos){ unsigned long p = *ppos; int ret = 0; if(p >= GLOBALMEM_SIZE) { return 0; } if(count > GLOBALMEM_SIZE - p) { count = GLOBALMEM_SIZE - p; } if(copy_to_user(buf, (void*)(dev.mem + p), count); { ret = -EFAULT; } else { *ppos = *ppos + count; ret = count; printk(KERN_INFO "read %d bytes(s) from %d\n", count, p); } return ret;}
globalmem_write:static ssize_t globalmem_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos){ unsigned long p = *ppos; int ret = 0; if(p >= GLOBALMEM_SIZE) { return 0; } if(count > GLOBALMEM_SIZE - p) { count = GLOBALMEM_SIZE - p; } if(copy_from_user((void*)(dev.mem + p), buf, count) { ret = -EFAULT; } else { *ppos = *ppos + count; ret = count; printk(KERN_INFO "written %d bytes(s) from %d\n", count, p); } return ret;}
- Linux设备驱动程序学习(二)虚拟字符设备globalmem
- Linux设备驱动学习(1) 全局内存空间“设备”驱动程序globalmem
- 关于虚拟字符设备驱动的学习笔记globalmem
- 嵌入式 globalmem虚拟字符设备驱动雏形
- 虚拟设备字符驱动globalmem分析
- globalmem虚拟设备实例描述(二)
- 《linux设备驱动开发详解》上的globalmem字符设备驱动程序
- linux驱动学习--第十二天:第六章 Linux 字符设备驱动(二) 之 globalmem 设备驱动
- 字符设备之globalmem
- LINUX—字符设备驱动之-globalmem
- LINUX—字符设备驱动之-globalmem
- LINUX—字符设备驱动之-globalmem
- linux 驱动-----字符设备globalmem驱动实现
- Linux驱动学习(二)——字符设备驱动程序入门 .
- Linux设备驱动程序(第三版)学习之字符驱动(二)
- globalmem虚拟字符设备驱动--字符驱动讲解(2)
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- 大学生活
- 编译windows版的 apache dso 模块
- 使用PYTHON3000读写Excel文件简单例子
- 新浪微博Android客户端视频教程-课程简述和技术要点
- System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本 解决办法
- Linux设备驱动程序学习(二)虚拟字符设备globalmem
- WPF学习笔记 - 控制数据的呈现
- java 简单排序
- ibus 的谷歌拼音输入法发布
- android定时刷新界面
- sql server语句修改默认值
- 用户权限管理
- 如何为嵌入式开发建立交叉编译环境
- bad_cast,const_cast,dynamic_cast,reinterpret_cast,static_cast(C++)