在Linux设备驱动之字符设备(一)中学习了设备号的构成,设备号的申请与释放。在Linux设备驱动之字符设备(二)中学习了如何创建一个字符设备,初始化,已经注册到系统中和最后释放该字符设备。

本节将结合前两节学到的知道,编写一个简单的字符设备驱动。最后总结一下字符设备驱动的模型。

字符设备驱动程序源码

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>static int major = 0;
static dev_t ndev;
//static struct cdev char_dev; //静态分配
static struct cdev* char_dev;  //动态分配static ssize_t char_read(struct file *file, char __user *buf, size_t size, loff_t *offset)
{printk(KERN_EMERG "char_dev: char_read!\n");return 0;
}static int char_open(struct inode *node, struct file *filp)
{printk(KERN_EMERG "char_dev: char_open!\n");return 0;
}
//文件操作函数集
static struct file_operations char_ops={.owner = THIS_MODULE,.open  = char_open,.read  = char_read,
};static int char_dev_init(void)
{int ret;//主设备号存在if(major){ret = register_chrdev_region(MKDEV(major, 0), 1, "char_dev");if(ret < 0){printk(KERN_EMERG "char_dev: register chardev error!\n");return ret;}}else//主设备号不存在,动态分配{ret = alloc_chrdev_region(&ndev,0,1,"char_dev");if(ret < 0){printk(KERN_EMERG "char_dev: alloc chardev error!\n");return ret;}}char_dev = cdev_alloc();//动态分配cdevif(char_dev){char_dev->ops = &char_ops;//设置文件操作集}//cdev_init(&char_dev, &char_ops);//初始化cdev,以及设置操作函数集cdev_add(char_dev, ndev, 1);return 0;
}static void char_dev_exit(void)
{cdev_del(char_dev);//注销cdevunregister_chrdev_region(ndev, 1);
}module_init(char_dev_init);
module_exit(char_dev_exit);
MODULE_LICENSE("GPL");注:  注释掉的是静态分配cdev过程

安装模块

insmod demo_char_dev.ko

查看安装后结果

cat  /prco/devices
root@test_home:/data # cat /proc/devices
Character devices:
....
189 usb_device
237 char_dev
238 audio_dsp_mem

可以看到系统给分配的主设备号为237,所以下一步就是根据主设备号创建设备节点。

创建设备节点

root@test_home:/data # mknod /dev/mychardev c 237 0
root@test_home:/data # ls /dev/mychardev
/dev/mychardev

编写应用程序测试

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd;int buf;fd = open("/dev/mychardev", O_RDWR);if(fd == -1){printf("open device faild!\n");return -1;}read(fd, &buf, 1);close(fd);return 0;}

测试结果如下:

root@test_home:/data # ./chardev_test
root@test_home:/data # dmesg | grep char_dev
[ 9921.636518] c7 char_dev: char_open!
[ 9921.639924] c7 char_dev: char_read!

可以看到是进入了open函数和read函数。

字符设备驱动模型

Linux设备驱动之字符设备(三)相关推荐

  1. linux的驱动开发——字符设备驱动

    1.字符设备驱动 \qquad字符设备驱动是最基本,最常用的设备.它将千差万别的硬件设备采用统一的接口封装起来,屏蔽了硬件的差异,简化了应用层的操作. 2.描述所有字符设备的结构体 \qquad描述所 ...

  2. 设备驱动,字符设备驱动、(总线)设备驱动模型、sysfs文件系统、平台设备驱动

    以下内容转载于微信公众号:嵌入式企鹅圈.如有侵权,请告知删除. 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术. 对于初学者来说会非常 ...

  3. linux PCI驱动调用字符设备驱动方式

    上一篇文章写了字符设备驱动的基本结构及访问方式,在实际应用时首先需要绑定自己的硬件设备.本篇主要描述字符设备驱动与PCI接口类型的设备访问方式(内核为2.6.24及以上的方法,测试内核为2.6.32) ...

  4. 深入浅出:Linux设备驱动之字符设备驱动

    一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流 ...

  5. 蜕变成蝶~Linux设备驱动之字符设备驱动

    一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流 ...

  6. 嵌入式linux驱动之———字符设备驱动(一)

    一.简介: 在Linux内核驱动中,字符设备是最基本的设备驱动.字符设备是能够像字节流(比如文件)一样被访问的设备,就是说对它的读写是以子为单位的.比如串口在进行收发数据时就是一个字节一个字节进行的. ...

  7. Linux驱动之字符设备驱动

    系列文章目录 第一章 Linux入门之驱动框架 第二章 Linux驱动之字符设备驱动 文章目录 系列文章目录 前言 一.认识字符设备驱动 1.基本概念 2.基本概念 二.字符设备旧框架 1.注册和注销 ...

  8. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联

    参考原文:https://www.kancloud.cn/yueqian_scut/emlinux/106829 对原文笔误地方做了修改.重新排版 目录 字符设备驱动.平台设备驱动.设备驱动模型.sy ...

  9. STM32MP157驱动开发——字符设备驱动

    一.简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的.比如我们最常见的点灯.按键. IIC. SPI, LCD ...

  10. 驱动学习----字符设备驱动框架

    字符设备驱动框架 1.字符设备驱动简介 2.file_operations 3.驱动模块的加载和卸载 4.字符设备的注册与注销 5.实现设备具体操作函数 6.添加LICENSE和作者信息 7.linu ...

最新文章

  1. WPF中实现文件夹对话框(OpenFileDialog in WPF)
  2. C++Poisso statistics泊松统计的实现算法(附完整源码)
  3. 小程序生成二维码报错:40169:invalid length for scene, or the data is not json string
  4. react当中子组件改变父组件的状态
  5. php 浮点型float 强转int php金额计算 php元转分
  6. 镭威视监控怎么复位_三大原因导致海康威视、大华股份近期连续暴跌
  7. 亚马逊计划明年推出云游戏服务,紧追微软谷歌;华为GaussDB数据库推出双分布式架构;腾讯擎天5G智慧灯杆助智慧城市服务升级……...
  8. 用IDEA debug按键功能
  9. element 让日期选择器一直显示选择面板
  10. 多维随机变量与其对应的分布
  11. 初始化列表和构造函数内赋值的区别
  12. AttributeError: module 'socketio' has no attribute 'Server'
  13. 前端学习--PS移动和选区工具
  14. HTML5期末大作业:出行网站设计——西安旅游-高质量(9页) HTML+CSS+JavaScript 学生DW网页设计
  15. 背单词软件速度对比测试,手机背单词大比拼,谁才是速度之王
  16. Android Studio一直停留在MyApplication:syncing(解决方案)
  17. 时间戳与日期相互转换
  18. ECharts 地图绘制
  19. 『统计学』第五部分:方差分析和F检验
  20. 使用 Pycharm 创建一个 Django项目(详解)

热门文章

  1. jquery easyui+spring mnv 样式引不进,需要加载静态资源
  2. #ifdef 支持Mac #ifndef 支持Windows #if defined (Q_OS_WIN) 应该可以再两个系统通用
  3. 优先级继承 linux,非独占锁的优先级继承协议及其在Linux下的实现
  4. php中的http是什么意思,请问php中三种http请求方式有什么区别呢(cURL,stream,socket)...
  5. php项目升级包制作,PHP项目安全:PHP的安装与升级
  6. python3.7升级pip_完美解决python3.7 pip升级 拒绝访问问题
  7. 记一次服务器故障及解决办法
  8. AppCan入门教程
  9. java 计算两个日期之间的自然周
  10. Struts2实现通过浏览器返回一个helloworld页面给用户