字符设备驱动

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 驱动笔记(二)的更多相关文章

  1. linux 2.6 驱动笔记(一)

    本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...

  2. 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(二)

    我们在 浅谈Linux PCI设备驱动(一)中(以下简称 浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设 ...

  3. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二

    /** ****************************************************************************** * @author    暴走的小 ...

  4. Linux 块设备驱动 (二)

    linux下Ramdisk驱动 1 什么是Ramdisk Ramdisk是一种模拟磁盘,其数据实际上是存储在RAM中,它使用一部分内存空间来模拟出一个磁盘设备,并以块设备的方式来组织和访问这片内存.对 ...

  5. Linux系统运维笔记(二),Linux文件编辑命令

    Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...

  6. linux下i2c驱动笔记 转

    1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...

  7. linux 2.6 驱动笔记(三)

    驱动的并发与应用的并发实现一样,以信号量为例,修改基本字符驱动代码如下: 1. 增加sem定义 struct globalmem_dev{ struct cdev cdev; /*linux 2.6 ...

  8. linux lcd设备驱动剖析二

    上一节中,分析了s3c2410fb,c的入口出口函数,以及一些重要结构体的分析,初步知道了这是一个平台驱动的架构. 上一节文章链接:http://blog.csdn.net/lwj103862095/ ...

  9. linux shell编程学习笔记(二) --- grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

随机推荐

  1. MVC 之 Code First

    在我们的工作和学习当中,经常会遇到中小型项目,这些项目除了业务上的区别较大 外,对于底层和数据访问,其实都差不多.记得以前做项目时,每次都要重复的写底层操作数据库的代码,不仅浪费时间,也无太大意思,后 ...

  2. ASP.NET 页生命周期

    ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行 呈现.了解页生命周期非常重要,因为这样 ...

  3. HMC V7.9.0升级至SP2版本

    补丁下载地址:http://www-933.ibm.com/support/fixcentral/ 选择补丁版本 MH01405是和ftp://ftp.software.ibm.com/softwar ...

  4. Ajax Step By Step1

    Ajax 最关键的地方,就是实现异步请求.接受响应及执行回调. jQuery 对 Ajax 做了大量的封装,不需要去考虑浏览器兼容性, 对于封装的方式,jQuery 采用了三层封装:最底层的封装方法为 ...

  5. dp px 转换工具

    public class DensityUtil { private final static String TAG = "DensityUtil"; private static ...

  6. java TreeMap用法

    转自:http://huchenqiang90.blog.163.com/blog/static/11250080020101025956498/ 最近工作遇到需要按一个model中不同的列进行排序的 ...

  7. poj1274(匈牙利算法)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22809   Accepted: 101 ...

  8. WInform关闭程序的几种方法以及区别。

    1.this.Close(); 关闭窗体,如果关闭的是主窗体 程序结束.2.Application.Exit(); 退出所有的窗体但是如果有托管线程的话无法完全退出3.Application.Exit ...

  9. (完全背包 大数)Dollar Dayz (POJ 3181)

    http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...

  10. loading动画效果记录

    看到好多网页都有一个炫酷的loading动画,以前不知道怎么实现的.今天学习了一下,发现其实也很简单. 首先在学习的时候偶然遇到一个pace.js的库,非常好用.优点是,不需要挂接到任何代码,自动检测 ...