linux 2.6 驱动笔记(二)
字符设备驱动
linux 2.6的字符驱动由cdev结构体描述,具体参考globalmem例子,代码主要分以下几部分:
1. 定义一个字符类型设备驱动的结构体
struct globalmem_dev{
struct cdev cdev; /*linux 2.6 内核表示一个字符设备结构体 */
unsigned char mem[];
};
其中cdev在cdev.h文件中定义如下:
struct cdev {
struct kobject kobj;
struct module *owner;
struct file_operations *ops; //文件操作结构体
struct list_head list;
dev_t dev; //设备号 unsigned long
unsigned int count;
};
2. 在驱动模块的加载、卸载函数中注册设备,同时绑定文件操作结构体
static const struct file_operations globalmem_fops = {
.owner = THIS_MODULE,
.llseek = globalmem_llseek,
.read = globalmem_read,
.write = globalmem_write,
.open = globalmem_open,
.release= globalmem_release}; //设备驱动加载
int globalmem_init(void){
int result;
dev_t devno = MKDEV(, ); result = register_chrdev_region(devno, , "globalmem");//注册字符设备编号
globalmem_devp= kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL);
memset(globalmem_devp, , sizeof(struct globalmem_dev)); cdev_init(&globalmem_devp->cdev, &globalmem_fops);
globalmem_devp->cdev.owner = THIS_MODULE; int err = cdev_add(&globalmem_devp->cdev, devno, ); return result;
}
3. 实现文件操作的具体接口,以文件写为例:
static ssize_t globalmem_read(struct file *flip, char __user *buf, size_t size, loff_t *ppos){
//.... struct globalmem_dev *dev = flip->private_data;
copy_to_user(buf, (void*)(dev->mem+p), count); //内核空间拷贝至用户空间
*ppos += count;
测试用应用代码如下:
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<fcntl.h> void main(){
int fd,num; fd = open("/dev/globalmem", O_RDWR); if(fd != -){
read(fd, &num, sizeof(int));
printf("the globalmem is %d\n", num); scanf("%d", &num);
printf("the input is %d\n", num);
write(fd, &num, sizeof(int)); read(fd, &num, sizeof(int));
printf("the new globalmem is %d/n", num); close(fd); }else{
printf("device err!");
}
return;
}
linux 2.6 驱动笔记(二)的更多相关文章
- linux 2.6 驱动笔记(一)
本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(二)
我们在 浅谈Linux PCI设备驱动(一)中(以下简称 浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设 ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二
/** ****************************************************************************** * @author 暴走的小 ...
- Linux 块设备驱动 (二)
linux下Ramdisk驱动 1 什么是Ramdisk Ramdisk是一种模拟磁盘,其数据实际上是存储在RAM中,它使用一部分内存空间来模拟出一个磁盘设备,并以块设备的方式来组织和访问这片内存.对 ...
- Linux系统运维笔记(二),Linux文件编辑命令
Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...
- linux下i2c驱动笔记 转
1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...
- linux 2.6 驱动笔记(三)
驱动的并发与应用的并发实现一样,以信号量为例,修改基本字符驱动代码如下: 1. 增加sem定义 struct globalmem_dev{ struct cdev cdev; /*linux 2.6 ...
- linux lcd设备驱动剖析二
上一节中,分析了s3c2410fb,c的入口出口函数,以及一些重要结构体的分析,初步知道了这是一个平台驱动的架构. 上一节文章链接:http://blog.csdn.net/lwj103862095/ ...
- linux shell编程学习笔记(二) --- grep命令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...
随机推荐
- Spring 4 官方文档学习(十四)WebSocket支持
个人提示:如果需要用到页面推送,高频且要低延迟,WebSocket无疑是最佳选择.否则还是轮询和long polling吧. 做了一个小demo放在码云上,有兴趣的可以看一下,简单易懂:websock ...
- [转]Snappy压缩库安装和使用之一
Snappy压缩库安装和使用之一 原文地址:http://blog.csdn.net/luo6620378xu/article/details/8521223 近日需要在毕业设计中引入一个压缩库,要求 ...
- Maven 整合 spring profile实现多环境自动切换
Maven 整合 spring profile实现多环境自动切换 时间:2014-03-19 15:32来源:Internet 作者:Internet 点击:525次 profile主要用在项目多环境 ...
- windows下nginx的启动关闭
Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍. .启 ...
- Oracle数据库备份 expdp/impdp导出导入命令
使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用, ...
- LInux配置jdk(mac和windows)
我的linux使用的是VMware搭建的虚拟环境,用的是CENTOS6.5 一.准备工作: 1.确定系统安装的是成功的. 2.系统没有其他的问题 3.确定没有安装过其他版本的jdk,两个jdk会反冲 ...
- Picard 法求方程根
要点: 首先对于任何方程 :f(x)=0 ,可以转换成 f(x)+x-x => f(x)+x=x; 取g(x)=f(x)+x; 那么 新方程g(x)=x 的解即是 f(x)=0的解,即g(x) ...
- C# 获取本机指定类型指定网卡的Ip地址
1.简单方式 ,适用于单网卡 string hostName = Dns.GetHostName(); IPAddress[] addresses = Dns.GetHostAddresses(hos ...
- 关于netty
现在我们一般使用应用程序或者链接库相互进行通信.例如,我们经常通过一个使用http协议的客户端链接库,从网站服务器中获得信息,并且通过网站服务,调用一些远程程序. 然而,一些通用协议或者它们的实现方式 ...
- css横向导航条
css横向导航条有两种方法 1. ul li a li{float:left} #navlist li, #navlist a{height:44px;display:block;} a{width: ...