Linux设备驱动之字符设备(三)
在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设备驱动之字符设备(三)相关推荐
- linux的驱动开发——字符设备驱动
1.字符设备驱动 \qquad字符设备驱动是最基本,最常用的设备.它将千差万别的硬件设备采用统一的接口封装起来,屏蔽了硬件的差异,简化了应用层的操作. 2.描述所有字符设备的结构体 \qquad描述所 ...
- 设备驱动,字符设备驱动、(总线)设备驱动模型、sysfs文件系统、平台设备驱动
以下内容转载于微信公众号:嵌入式企鹅圈.如有侵权,请告知删除. 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术. 对于初学者来说会非常 ...
- linux PCI驱动调用字符设备驱动方式
上一篇文章写了字符设备驱动的基本结构及访问方式,在实际应用时首先需要绑定自己的硬件设备.本篇主要描述字符设备驱动与PCI接口类型的设备访问方式(内核为2.6.24及以上的方法,测试内核为2.6.32) ...
- 深入浅出:Linux设备驱动之字符设备驱动
一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流 ...
- 蜕变成蝶~Linux设备驱动之字符设备驱动
一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流 ...
- 嵌入式linux驱动之———字符设备驱动(一)
一.简介: 在Linux内核驱动中,字符设备是最基本的设备驱动.字符设备是能够像字节流(比如文件)一样被访问的设备,就是说对它的读写是以子为单位的.比如串口在进行收发数据时就是一个字节一个字节进行的. ...
- Linux驱动之字符设备驱动
系列文章目录 第一章 Linux入门之驱动框架 第二章 Linux驱动之字符设备驱动 文章目录 系列文章目录 前言 一.认识字符设备驱动 1.基本概念 2.基本概念 二.字符设备旧框架 1.注册和注销 ...
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
参考原文:https://www.kancloud.cn/yueqian_scut/emlinux/106829 对原文笔误地方做了修改.重新排版 目录 字符设备驱动.平台设备驱动.设备驱动模型.sy ...
- STM32MP157驱动开发——字符设备驱动
一.简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的.比如我们最常见的点灯.按键. IIC. SPI, LCD ...
- 驱动学习----字符设备驱动框架
字符设备驱动框架 1.字符设备驱动简介 2.file_operations 3.驱动模块的加载和卸载 4.字符设备的注册与注销 5.实现设备具体操作函数 6.添加LICENSE和作者信息 7.linu ...
最新文章
- WPF中实现文件夹对话框(OpenFileDialog in WPF)
- C++Poisso statistics泊松统计的实现算法(附完整源码)
- 小程序生成二维码报错:40169:invalid length for scene, or the data is not json string
- react当中子组件改变父组件的状态
- php 浮点型float 强转int php金额计算 php元转分
- 镭威视监控怎么复位_三大原因导致海康威视、大华股份近期连续暴跌
- 亚马逊计划明年推出云游戏服务,紧追微软谷歌;华为GaussDB数据库推出双分布式架构;腾讯擎天5G智慧灯杆助智慧城市服务升级……...
- 用IDEA debug按键功能
- element 让日期选择器一直显示选择面板
- 多维随机变量与其对应的分布
- 初始化列表和构造函数内赋值的区别
- AttributeError: module 'socketio' has no attribute 'Server'
- 前端学习--PS移动和选区工具
- HTML5期末大作业:出行网站设计——西安旅游-高质量(9页) HTML+CSS+JavaScript 学生DW网页设计
- 背单词软件速度对比测试,手机背单词大比拼,谁才是速度之王
- Android Studio一直停留在MyApplication:syncing(解决方案)
- 时间戳与日期相互转换
- ECharts 地图绘制
- 『统计学』第五部分:方差分析和F检验
- 使用 Pycharm 创建一个 Django项目(详解)
热门文章
- jquery easyui+spring mnv 样式引不进,需要加载静态资源
- #ifdef 支持Mac #ifndef 支持Windows #if defined (Q_OS_WIN) 应该可以再两个系统通用
- 优先级继承 linux,非独占锁的优先级继承协议及其在Linux下的实现
- php中的http是什么意思,请问php中三种http请求方式有什么区别呢(cURL,stream,socket)...
- php项目升级包制作,PHP项目安全:PHP的安装与升级
- python3.7升级pip_完美解决python3.7 pip升级 拒绝访问问题
- 记一次服务器故障及解决办法
- AppCan入门教程
- java 计算两个日期之间的自然周
- Struts2实现通过浏览器返回一个helloworld页面给用户