linux的驱动开发——字符设备驱动
1.字符设备驱动
\qquad字符设备驱动是最基本,最常用的设备。它将千差万别的硬件设备采用统一的接口封装起来,屏蔽了硬件的差异,简化了应用层的操作。
2.描述所有字符设备的结构体
\qquad描述所有字符设备的结构体在linux内核目录下的\include\linux\cdev.h
中,结构体为:
struct cdev {struct kobject kobj;struct module *owner;const struct file_operations *ops;struct list_head list;dev_t dev; //设备号unsigned int count; //设备个数
};
\qquadcdev结构体中的struct file_operations
位于linux内核目录下的\include\linux\fs.h
中,除了第一个结构体变量是结构体指针,其它的都是函数指针。我们称struct file_operations
为提供给应用层的操作方法集。
\qquaddev_t
用于唯一的标识设备的号码,也是内核设备管理驱动设备的唯一标识符。其一系列定义如下,所以dev_t
是32位无符号整型。设备号:主设备号+次设备号
typedef __kernel_dev_t dev_t;
typedef __u32 __kernel_dev_t;
typedef unsigned int __u32;
MAJOR(dev_t dev) //从设备号中提取主设备号
MINOR(dev_t dev) //从设备号中提取次设备号
MKDEV(int ma,int mi) //主次设备号合成设备号
3.编写字符设备驱动
3.1为cdev结构体分配空间
\qquadcdev结构体分配内存空间,内核内存空间分配函数cdev_alloc()
\qquad功能:为cdev结构体分配空间
\qquad参数:void
\qquad返回值:成功就返回分配到的结构体地址;失败就返回NULL
struct cdev *cdev_alloc(void)
{struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL);if (p) {INIT_LIST_HEAD(&p->list);kobject_init(&p->kobj, &ktype_cdev_dynamic);}return p;
}
3.2初始化cdev结构体
\qquadcdev结构体初始化,初始化函数cdev_init()
\qquad功能:初始化cdev设备
\qquad参数:第一个参数:cdev结构体指针;第二个参数:操作方法集的指针
\qquad返回值:void
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{memset(cdev, 0, sizeof *cdev);INIT_LIST_HEAD(&cdev->list);kobject_init(&cdev->kobj, &ktype_cdev_default);cdev->ops = fops;
}
3.3添加(注册)字符设备到内核中,由内核统一管理
\qquad函数:int cdev_add(struct cdev *p, dev_t dev, unsigned count)
\qquad功能:添加字符设备到内核
\qquad参数:第一个参数:结构体指针;第二个参数:设备号;第三个参数:设备个数
\qquad返回值:成功返回0;失败返回错误码
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
{int error;p->dev = dev;p->count = count;error = kobj_map(cdev_map, dev, count, NULL,exact_match, exact_lock, p);if (error)return error;kobject_get(p->kobj.parent);return 0;
}
3.4删除(注销)字符设备
\qquad函数:void cdev_del(struct cdev *p)
\qquad功能:删除(注销)字符设备
linux的驱动开发——字符设备驱动相关推荐
- <Linux开发>--驱动开发-- 字符设备驱动(3) 过程详细记录
<Linux开发>–驱动开发-- 字符设备驱动(3) 过程详细记录 驱动开发是建立再系统之上的,前面作者也记录了系统移植的过程记录,如果有兴趣,可进入博主的主页查看相关文章,这里就不添加链 ...
- 正点原子-驱动开发-字符设备驱动
Linux中的三大类驱动:字符设备.块和网络设备驱动 I2C.SPI.音频等都属于字符设备驱动 的类型 EMMC.NAND.SD卡和 U盘等存储都属于块设备 网卡,WIFI等都属于网络驱动 一个设备可 ...
- linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)
哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...
- STM32MP157驱动开发——字符设备驱动
一.简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的.比如我们最常见的点灯.按键. IIC. SPI, LCD ...
- _Linux驱动开发 / 字符设备驱动内幕 (1)
哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...
- 【linux驱动之字符设备驱动基础】
linux驱动之字符设备驱动基础 文章目录 linux驱动之字符设备驱动基础 前言 一.开启驱动学习之路 二.驱动预备知识 三.什么是驱动? 3.1 驱动概念 3.2 linux 体系架构 3.3 模 ...
- Linux 设备驱动开发 —— platform设备驱动应用实例解析
前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 -- platform 设备驱动 ,下面将通过一个实例来深入我们的学习. 一.platform 驱动的工作过程 platfor ...
- Linux驱动开发|块设备驱动
块设备驱动 块设备驱动是 Linux 三大驱动类型之一,块设备驱动比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统,下面介绍块设备驱动框架及使用 一.块设备介绍 块设备是针对存储设备的 ...
- linux用户空间flash驱动,全面掌握Linux驱动框架——字符设备驱动、I2C驱动、总线设备驱动、NAND FLASH驱动...
原标题:全面掌握Linux驱动框架--字符设备驱动.I2C驱动.总线设备驱动.NAND FLASH驱动 字符设备驱动 哈~ 这几天都在发图,通过这种方式,我们希望能帮大家梳理学过的知识,全局的掌握Li ...
最新文章
- OPPO R9s在哪里开启Usb调试模式的完美步骤
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第十三天讲师列表栏目
- 针对“零时差”*** 赛门铁克推免费杀毒软件
- bzoj1612 Usaco08 Jan 牛大赛
- idea gui插件_「Java」 - 自写IntelliJ IDEA插件
- linux 创建用户/添加用户/用户组添加修改删除(ubuntu/centos)
- 64位WIN7上成功安装theano,并运行了g++, GPU
- 加入收藏与设为首页代码(兼容各种浏览器)
- c语言编写的车道线检测程序,opencv车道线检测的实现方法
- Make sure that `gem install sqlite3 -v '*.*.*'`succeeds before bundling Error: 问题解决
- UE4 Take Recorder的使用
- PTA 奇数值结点链表 超详细
- 动态图解实例 ConstraintLayout Chain
- CTF解题思路:图片隐写
- html和js画圣诞树图片,基于JS2Image实现圣诞树代码
- 大几率破解word文档密码
- 六度分离理论、150法则与弱链接 (转载)
- Qt Undo Framework学习,实现撤销、重做功能
- 最适合python程序员用的笔记本-适合编程的笔记本
- 机架服务器的系统安装,机架服务器操作系统安装
热门文章
- 牛客 Bang! Bang!(动态规划)
- LeetCode 1636. 按照频率将数组升序排序(哈希+排序)
- LeetCode 774. 最小化去加油站的最大距离(极小极大化 二分查找)
- LeetCode 356. 直线镜像
- python中多层装饰器使用步骤
- ClickHouse表引擎
- 线性规划 - 用单纯形法解决LP问题 - (Matlab、Lingo建模)
- python bottle支持https_python bottle 简介
- 重磅!吴恩达家的NLP课程发布啦!
- ACL20 | 让笨重的BERT问答匹配模型变快!