最近在鼓捣lnux字符设备驱动,在网上搜集的各种关于linux设备驱动的代码和注释,要么是针对2.4的,要么是错误百出,根本就不能运行成功,真希望大家在发博客的时候能认真核对下代码的正确性,特别是要把代码的运行环境和依赖条件列举出来,否则会对读者造成很大的误解。

以下代码的运行环境为:

操作系统:debian 6

内核版本:2.6.32(amd 64)

gcc版本:4.4.5

源代码如下所示(源代码确保编译可通过,运行无bug):

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h>
#include<linux/types.h>
#include<linux/cdev.h>
#include<asm/uaccess.h>
#include <linux/init.h> MODULE_LICENSE("GPL"); static int yang_open(struct inode*, struct file*);
static int yang_release(struct inode*, struct file*); static ssize_t yang_read(struct file*, char *,size_t, loff_t*);
static ssize_t yang_write(struct file*,const char*, size_t,loff_t*); loff_t yang_llseek(struct file *filp, loff_t off, int whence); static int major;
static int device_open = 0; static char *device_name = "myvar"; static dev_t devid; static struct mydev *my_cdev; struct mydev{
char *data;
struct cdev cdev;
unsigned long size;
}; static struct file_operations fops =
{
.owner = THIS_MODULE,
.read = yang_read,
.write = yang_write,
.open = yang_open,
.release = yang_release,
.llseek = yang_llseek
}; int init_yang_module(void)
{
struct mydev *dev = (struct mydev *)kmalloc(sizeof(struct mydev),GFP_KERNEL); my_cdev = dev;//注册为全局变量,便于模块卸载 memset(dev, 0, sizeof(struct mydev)); dev->size = 10; int err; alloc_chrdev_region(&devid, 0, 1, "myvar"); major = MAJOR(devid); cdev_init(&dev->cdev, &fops); err = cdev_add(&dev->cdev, devid, 1); if(err)
{
printk(KERN_INFO"I was major number %d.\n",major);
return -1;
} printk("major number is %d\n",MAJOR(devid)); dev->data = (char*)kmalloc(dev->size * sizeof(char),GFP_KERNEL); memset(dev->data,0,dev->size * sizeof(char)); return 0;
} void cleanup_yang_module(void)
{
cdev_del(&my_cdev->cdev);
unregister_chrdev_region(devid, 1);
printk("cleanup done\n");
} loff_t yang_llseek(struct file *filp, loff_t off, int whence)
{
struct mydev *dev = filp->private_data; loff_t newpos;
switch(whence)
{
case SEEK_SET:
newpos = off;
case SEEK_CUR:
newpos = filp->f_pos + off;
case SEEK_END:
newpos = dev->size + off;
break;
default:
return -EINVAL;
}
if(newpos < 0) return -EINVAL;
filp->f_pos = newpos;
return newpos;
} static int yang_open(struct inode* inode, struct file* file)
{
struct mydev *dev; dev = container_of(inode->i_cdev, struct mydev, cdev); file->private_data = dev; return 0;
} static int yang_release(struct inode* inode, struct file* file)
{
return 0;
} static ssize_t yang_read(struct file* filp, char *buffer,size_t length, loff_t* off)
{
struct mydev *dev = filp->private_data; if(*off >= dev->size)
{
return 0;
}
if(*off + length > dev->size)
length = dev->size - *off;
if(copy_to_user(buffer,dev->data + *off,length * sizeof(char)))
{
return -EFAULT;
}
*off += length; return length;
}
static ssize_t yang_write(struct file* filp,const char* buffer, size_t length,loff_t* off)
{
struct mydev *dev = filp->private_data; if(length > dev->size)
{
return -EFAULT;
}
if(copy_from_user(dev->data,buffer,dev->size * sizeof(char)))
{
return -EFAULT;
}
*off += length;
return dev->size;
} module_init(init_yang_module);
module_exit(cleanup_yang_module);

  

以后有时间我再把注释加上,如果有兄弟刚刚学习linux设备驱动,这份源代码是最好的礼物。

linux字符设备驱动学习笔记(一):简单的字符设备驱动的更多相关文章

  1. linux 驱动学习笔记05--文件系统与设备文件系统

    查看/proc/devices 文件可以获知系统中注册的设备,第 1 列为主设备号,第 2 列为设备名,如:

  2. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

  3. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

  4. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  5. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  6. Spark学习笔记0——简单了解和技术架构

    目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...

  7. Html学习笔记(二) 简单标签

    标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...

  8. Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动

    断断续续学驱动,好不容易有空,做了段字符驱动的例子.主要还是跟书上学习在此记录下来,以后说不定能回过头来温故知新. 首先上驱动源码 gmem.c: /************************* ...

  9. Linux设备驱动学习笔记

    之前研究Linux设备驱动时做的零零散散的笔记,整理出来,方便以后复习. 1.1驱动程序的的角色 提供机制 例如:unix图形界面分为X服务器和窗口会话管理器 X服务器理解硬件及提供统一的接口给用户程 ...

  10. linux设备驱动学习笔记(1)

    学习了将近半个月的设备驱动程序的编写,也有一些体会,这里写下来也给学习做一个总结,为后面的学习做更好的准备. 首先,个人感觉驱动程序的设计是很有套路的,最基本的要求就是要掌握这些套路.所谓的套路就是一 ...

随机推荐

  1. Codeforces Round #105 (Div. 2) ABCDE

    A. Insomnia cure 哎 只能说英语太差,一眼题我看了三分钟. 题意:给5个数k, l, m, n 和 d,求1~d中能被k, l, m, n 至少一个整除的数的个数. 题解:…… 代码: ...

  2. 安森美电量计采用内部电阻跟踪电流--电压HG-CVR

    http://www.dianyuan.com/article/34608.html LC709203F应用:用于便携式设备单节锂电池的智能电量计http://files.cnblogs.com/fi ...

  3. 转载 ASP.NET MVC中使用ASP.NET Identity

    转载原地址: http://blog.jobbole.com/90695/ 在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identit ...

  4. [置顶] Flex中Tree组件无刷新删除节点

    在Tree组件中经常要删除某个节点,而删除之后重新刷新加载该Tree组件会影响整个操作效果和效率,因此,无刷新删除就比较好,既删除了节点也没有刷新tree,而使Tree的状态处于删除之前的状态. 无刷 ...

  5. Mysql之二

    MySQL的数据类型 SQL接口 标准: ANSI SQL:SQL-86--------SQL-89--------SQL-99---------SQL-03 数据类型 字符型: CHAR(不区分字母 ...

  6. Sqlite数据库简介

    在应用sqlite之前需要添加sqlite库,那么我们就会发现有3和3.0的区别,开始我也并不懂,后才知道: 实际上libsqlite3.dylib本身是个链接,它指向libsqlite3.0.dyl ...

  7. Asp.Net事务和异常处理:

    Asp.Net事务和异常处理: 一.什么是事务处理? 事务处理是一组组和成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性. 如果在事务过程中没有遇到错误, ...

  8. webViewDidFinishLoad因为网页里的重定向,会调用多次,使用web view.isLoading来解决

    我编码如下,但我发现 webViewDidFinishLoad() 会发生若干次. 如何知道 webViewDidFinishLoad() 最后发生吗? iNavigate = ; - (void)w ...

  9. 怎样通过iPhone Safari 来安装测试版ipa

    http://www.cocoachina.com/bbs/read.php?tid=94101# <?xml version="1.0" encoding="UT ...

  10. Android多媒体-人脸识别

    1. 相关背景 Google 于2006年8月收购Neven Vision 公司 (该公司拥有 10 多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并不是常快应用到免费的 Pic ...