驱动:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/errno.h> #include <linux/cdev.h>//cdev
#include <linux/device.h>//udev
#include <linux/sched.h>//schedule
#include <linux/uaccess.h>//copy_to_user
#include <linux/slab.h>//kmalloc() #define DEVICE_NAME "second_drv"
static int second_major=;/*主设备号*/
struct class *second_class; /*second设备结构体*/
static struct second_dev
{
struct cdev cdev;/*cdev 结构体*/
atomic_t counter;/*一共经历了多少时间;定义原子变量*/
struct timer_list s_timer;/*定义一个定时器*/
};
struct second_dev *second_devp;/*定义设备结构体指针*/ /*定时器处理函数*/
static void second_timer_handler(unsigned long arg)
{
mod_timer(&second_devp->s_timer,jiffies+HZ);/*再次调度定时器*/
atomic_inc(&second_devp->counter);/*counter 加1*/
printk(KERN_NOTICE"current jiffies is %d!!\n",jiffies);
} static int second_open(struct inode *inode, struct file *filp)
{
//printk("in the second_open!!\n");
filp->private_data=second_devp;/*将设备结构体指针赋值给文件私有数据指针*/ /*初始化定时器*/
init_timer(&second_devp->s_timer);
second_devp->s_timer.function=&second_timer_handler;
second_devp->s_timer.expires=jiffies+HZ;
add_timer(&second_devp->s_timer);/*添加定时器*/ atomic_set(&second_devp->counter,);/*计数清零*/ return ;
} static int second_release(struct inode *inode,struct file *filp)
{
del_timer(&second_devp->s_timer);/*删除定时器*/
return ;
} static ssize_t second_read(struct file *filp,char __user *buf,ssize_t count,loff_t *ppos)
{
//printk("in the second_read!!\n");
int counter;
counter=atomic_read(&second_devp->counter);/*获取count值*/ if(copy_to_user(buf,&counter,count))
return -EFAULT;
else
return sizeof(unsigned int);
} static ssize_t second_write(struct file *filp,const char __user *buf,ssize_t count,loff_t *ppos)
{
return ;
} /*文件操作结构体*/
static const struct file_operations second_fops={
.owner = THIS_MODULE,
.open =second_open,
.release =second_release,
.read =second_read,
.write =second_write,
}; /*初始化并注册cdev*/
static void second_setup_cdev(struct second_dev *dev,int index)
{
int err;
dev_t devno=MKDEV(second_major,index);
cdev_init(&dev->cdev,&second_fops);/*初始化cdev成员*/
dev->cdev.owner=THIS_MODULE;
err=cdev_add(&dev->cdev,devno,);/*向系统注册字符设备*/
if(err)
printk(KERN_NOTICE"error=%d",err);
} /*设备驱动模块加载函数*/
static int __init second_init(void)
{
/*申请设备号*/
int ret;
dev_t devno=MKDEV(second_major,);/*获得设备号*/
if(second_major)
ret=register_chrdev_region(devno,,DEVICE_NAME);
else
{
/*动态申请设备号*/
ret=alloc_chrdev_region(&devno,,,DEVICE_NAME);
second_major=MAJOR(devno);
}
if(ret)
{
printk("request chrdev failed!!\n");
return ret;
} /*动态申请设备结构体内存*/
second_devp=kmalloc(sizeof(struct second_dev),GFP_KERNEL);
if(!second_devp)
{
ret= -ENOMEM;
goto fail_kmalloc;
}
memset(second_devp,,sizeof(struct second_dev));/*申请到的内存空间清零*/ /*注册字符设备*/
second_setup_cdev(second_devp,); /*用udev机制自动创建设备文件结点*/
second_class=class_create(THIS_MODULE,"second_class");/*在sys/class下添加second_class这个类*/
if (IS_ERR(second_class))
{
printk(KERN_ERR "class_create() failed for second_class\n");
goto fail_class_create;
}
device_create(second_class,NULL,devno,NULL,DEVICE_NAME);/*创建设备/dev/$DEVICE_NAME*/ printk("init second_drv success!!,major=%d!!\n",second_major);
return ;
fail_class_create:
cdev_del(&second_devp->cdev);/*注销cdev*/
kfree(second_devp);/*释放设备结构体内存*/
fail_kmalloc:
unregister_chrdev_region(devno,);/*释放设备号*/ return ret;
} /*设备驱动模块卸载函数*/
static void __exit second_exit(void)
{
device_destroy(second_class,MKDEV(second_major,));/*注销设备*/
class_destroy(second_class);/*注销类*/
cdev_del(&second_devp->cdev);/*注销cdev*/
kfree(second_devp);/*释放设备结构体内存*/
unregister_chrdev_region(MKDEV(second_major,),);/*释放设备号*/
} MODULE_AUTHOR("mhb@SEU");
MODULE_LICENSE("GPL"); module_init(second_init);
module_exit(second_exit);

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h> main(int argc,char *argv[])
{
int fd;
int counter=;
int counter_old=; if ((fd=open("/dev/second_drv",O_RDONLY )) < )
{
printf("Open Device failed.\r\n");
exit();
}
else
while()
{
//printf("in the while(1)!\n");
read(fd,&counter,sizeof(unsigned int));
if(counter!=counter_old)
{
printf("seconds after open /dev/second_drv :%d\n",counter);
counter_old=counter;
}
} }

使用内核定时器的second字符设备驱动及测试代码的更多相关文章

  1. 【驱动】linux设备驱动·字符设备驱动开发

    Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! <linux设备驱动入门篇>:http://infohacker.blog.51cto.com/6751 ...

  2. Linux内核分析(五)----字符设备驱动实现

    原文:Linux内核分析(五)----字符设备驱动实现 Linux内核分析(五) 昨天我们对linux内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷, ...

  3. 3.字符设备驱动------Poll机制

    1.poll情景描述 以之前的按键驱动为例进行说明,用阻塞的方式打开按键驱动文件/dev/buttons,应用程序使用read()函数来读取按键的键值. ) { read(fd, &key_v ...

  4. 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 百篇博客分析OpenHarmony源码 | v67.01

    百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  5. Linux字符设备驱动框架

    字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l ...

  6. LDD3 字符设备驱动简单分析

    最近在看LDD3,理解了一下,为了加深自己的印象,自己梳理一下.我用的CentOS release 6.6 (Final)系统. 一.编写编译内核模块的Makefile 以下是我用的Makefile ...

  7. 嵌入式Linux驱动学习之路(十)字符设备驱动-my_led

    首先贴上代码: 字符设备驱动代码: /** *file name: led.c */#include <linux/sched.h> #include <linux/signal.h ...

  8. Linux应用程序访问字符设备驱动详细过程【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51346532 下面先通过一个编写好的内核驱动模块来体验以下字符设备驱动 可以暂时 ...

  9. register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动

    内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1 ...

随机推荐

  1. C 高级编程4 makefile 与 IO

    make 与 makefile .目标的语法 目标名:依赖目标 @命令 @命令 make的命令行使用 make -f make 脚本文件 目标名 .目标的划分 demo.mk demo: gcc -c ...

  2. 性能测试中用LambdaProbe监控Tomcat Tomcat和Probe的配置

    转载:http://bbs.51testing.com/thread-90047-1-1.html 性能测试中用LambdaProbe监控TomcatLambdaProbe 是一款强大的免费开源工具, ...

  3. HTTPS证书制作

    openssl 安装可参照之前文章 1.mkdir /etc/ssl/xip.ioopenssl genrsa -out /etc/ssl/xip.io/xip.io.key 1024openssl ...

  4. java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

    过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码 ...

  5. Matlab图像函数之pie

    一.pie pie用于描绘平面饼图. (1)pie(X) 利用向量X中的数据描绘饼图. 例如: X = [1, 1, 2, 2, 3, 4, 5]; pie(X) 得到 注意,X中的数据被看做频数,饼 ...

  6. strstr,strchr,strtr 比较

    strstr - 查找字符串的首次出现 查找 "Shanghai" 在字符串中的第一次出现,并返回字符串的剩余部分: echo strstr("I love Shangh ...

  7. 【转】周末班LR笔记总结—新手入门必备

    本来想上传文件的,上传半天没反应,只有这样了,图片不知道能显示不. 上午 学到2012.1.13 七天课 第一天(入门)二.三.四天(VUGEN脚本) 五天(Controller)六天(Analyse ...

  8. (原创)鸟哥linux学习script shell相关笔记

    在使用鸟哥linux进行script shell学习的过程中碰到一些不太明白的知识点,在这里进行一些记录 1. [root@www scripts]# vi sh03.sh #!/bin/bash # ...

  9. ORM中去除反射,添加Expression

    之前接触了别人的ORM框架,感觉牛掰到不行,然后试着自己来写自己的ORM. 最初从园子里找到其他人写的反射的例子: List<PropertyInfo> pis = typeof(T).G ...

  10. ASP实现https和http之间转化

    HTTPS 是一个安全通信信道,用于在客户计算机和服务器之间交换信息.它使用安全套接字层 (SSL). HTTPS (Secure Hypertext Transfer Protocol) 安全超文本 ...