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,表示全局正则表达 ...
随机推荐
- android基于GPS实现定位操作
一.定位的三种方式 1.wifi定位,ip地址定位,通过ip地址进行查询实际地址: 2.基站定位,信号塔,基站:手机通讯服务的设备 ,信号的格数决定了手机距离基站远近,精确度:几十米到几公里,精确度来 ...
- Oracle数据库迁移到AWS云的方案
当前云已经成为常态,越来越多的企业希望使用云来增加基础设施的弹性.减轻基础设施的维护压力,运维的成本等.很多企业使用云碰到的难题之一是如何将现有的应用迁移到云上,将现有应用的中间件系统.Web系统及其 ...
- vs2015 command prompt here
网上搜的很多方法都不能用,比如:http://app.paraesthesia.com/CommandPromptHere/ 主要是都搞错了注册表路径,写成了: HKCR,Directory\Shel ...
- getElementsByTagName获得的不是数组的问题!
getElementsByTag() returns a NodeList instead of an Array. You can convert a NodeList to an Array bu ...
- asp.net mvc3 利用Ajax实现局部刷新
1.利用Ajax.ActionLink()方法 首先在_Layout.cshtml文件中加载 运行AJAX必要的Jquery <script src="@Url.Content(&qu ...
- andorid frameanimation
Android中的逐帧动画 先来说说什么是逐帧动画,逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使 ...
- JAVA抓取URL
package com.ais.plugin.analyse.test; import com.ais.plugin.analyse.util.MD5; import java.io.*; impor ...
- 四川软件人才网:打造四川最专业的IT人才招聘平台
四川软件人才网(www.tfsp.net),原名:天府软件人才网:为了更好的发展和拓展的业务需要,更名为:四川软件人才网,强力打造四川最专业的IT人才的招聘平台. 网站依托四川软件人才社区,微博,微信 ...
- linux下 tar解压 gz解压 bz2等各种解压文件使用方法
http://alex09.iteye.com/blog/647128 大致总结了一下linux下各种格式的压缩包的压缩.解压方法. .tar 解包:tar xvf FileName.tar 打包:t ...
- SAS实验室之PROC TRANSPOSE
首先,抛开SAS,回忆我们在数学课本上学习的转置是什么概念,转置如下图: 以上就是数学中的转置. 那么在SAS里该如何转置呢? 先看语法格式: PROC TRANSPOSE <DATA=inpu ...