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的驱动开发——字符设备驱动相关推荐

  1. <Linux开发>--驱动开发-- 字符设备驱动(3) 过程详细记录

    <Linux开发>–驱动开发-- 字符设备驱动(3) 过程详细记录 驱动开发是建立再系统之上的,前面作者也记录了系统移植的过程记录,如果有兴趣,可进入博主的主页查看相关文章,这里就不添加链 ...

  2. 正点原子-驱动开发-字符设备驱动

    Linux中的三大类驱动:字符设备.块和网络设备驱动 I2C.SPI.音频等都属于字符设备驱动 的类型 EMMC.NAND.SD卡和 U盘等存储都属于块设备 网卡,WIFI等都属于网络驱动 一个设备可 ...

  3. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)

    哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...

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

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

  5. _Linux驱动开发 / 字符设备驱动内幕 (1)

    哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...

  6. 【linux驱动之字符设备驱动基础】

    linux驱动之字符设备驱动基础 文章目录 linux驱动之字符设备驱动基础 前言 一.开启驱动学习之路 二.驱动预备知识 三.什么是驱动? 3.1 驱动概念 3.2 linux 体系架构 3.3 模 ...

  7. Linux 设备驱动开发 —— platform设备驱动应用实例解析

    前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 -- platform 设备驱动 ,下面将通过一个实例来深入我们的学习. 一.platform 驱动的工作过程 platfor ...

  8. Linux驱动开发|块设备驱动

    块设备驱动 块设备驱动是 Linux 三大驱动类型之一,块设备驱动比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统,下面介绍块设备驱动框架及使用 一.块设备介绍 块设备是针对存储设备的 ...

  9. linux用户空间flash驱动,全面掌握Linux驱动框架——字符设备驱动、I2C驱动、总线设备驱动、NAND FLASH驱动...

    原标题:全面掌握Linux驱动框架--字符设备驱动.I2C驱动.总线设备驱动.NAND FLASH驱动 字符设备驱动 哈~ 这几天都在发图,通过这种方式,我们希望能帮大家梳理学过的知识,全局的掌握Li ...

最新文章

  1. OPPO R9s在哪里开启Usb调试模式的完美步骤
  2. 学习响应式BootStrap来写融职教育网站,Bootsrtap第十三天讲师列表栏目
  3. 针对“零时差”*** 赛门铁克推免费杀毒软件
  4. bzoj1612 Usaco08 Jan 牛大赛
  5. idea gui插件_「Java」 - 自写IntelliJ IDEA插件
  6. linux 创建用户/添加用户/用户组添加修改删除(ubuntu/centos)
  7. 64位WIN7上成功安装theano,并运行了g++, GPU
  8. 加入收藏与设为首页代码(兼容各种浏览器)
  9. c语言编写的车道线检测程序,opencv车道线检测的实现方法
  10. Make sure that `gem install sqlite3 -v '*.*.*'`succeeds before bundling Error: 问题解决
  11. UE4 Take Recorder的使用
  12. PTA 奇数值结点链表 超详细
  13. 动态图解实例 ConstraintLayout Chain
  14. CTF解题思路:图片隐写
  15. html和js画圣诞树图片,基于JS2Image实现圣诞树代码
  16. 大几率破解word文档密码
  17. 六度分离理论、150法则与弱链接 (转载)
  18. Qt Undo Framework学习,实现撤销、重做功能
  19. 最适合python程序员用的笔记本-适合编程的笔记本
  20. 机架服务器的系统安装,机架服务器操作系统安装

热门文章

  1. 牛客 Bang! Bang!(动态规划)
  2. LeetCode 1636. 按照频率将数组升序排序(哈希+排序)
  3. LeetCode 774. 最小化去加油站的最大距离(极小极大化 二分查找)
  4. LeetCode 356. 直线镜像
  5. python中多层装饰器使用步骤
  6. ClickHouse表引擎
  7. 线性规划 - 用单纯形法解决LP问题 - (Matlab、Lingo建模)
  8. python bottle支持https_python bottle 简介
  9. 重磅!吴恩达家的NLP课程发布啦!
  10. ACL20 | 让笨重的BERT问答匹配模型变快!