首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Gnep's_Technology_Blog

    Linux设备驱动程序(一)——设备驱动简介

    前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。 一、Linux 设备驱动程序的作用 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。 用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务。 3 类驱动如下: 字符设备 一个字符(char)设备是一种可以当作一个字节流来存取的设备(如同一个文件); 一个字符驱动负责实现这种行为,这样的驱动常常至少实现 open,close,read,和 write 内核与网络设备驱动间的通讯与字符和块设备驱动所用的完全不同。不用 read 和 write,内核调用和报文传递相关的函数。 有其他的划分驱动模块的方式,与上面的设备类型是正交的。

    3.5K41编辑于 2023-08-10
  • 来自专栏Linux内核深入分析

    Linux设备驱动之字符设备(三)

    在Linux设备驱动之字符设备(一)中学习了设备号的构成,设备号的申请与释放。在Linux设备驱动之字符设备(二)中学习了如何创建一个字符设备,初始化,已经注册到系统中和最后释放该字符设备。 本节将结合前两节学到的知道,编写一个简单的字符设备驱动。最后总结一下字符设备驱动的模型。 字符设备驱动程序源码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/ 237,所以下一步就是根据主设备号创建设备节点。 字符设备驱动模型

    8.5K41编辑于 2022-05-08
  • 来自专栏Linux内核深入分析

    Linux设备驱动之字符设备(一)

    Linux中设备驱动的分类 从上图可以看到Linux系统将各异的设备分为三大类:字符设备,块设备和网络设备。内核针对每一类设备都提供了对应驱动模型架构,包括基本的内核设施和文件系统接口。 主设备号用来标识对于的设备驱动程序,而次设备号则由驱动程序使用,用来标识它所管理的若干同类设备设备号的表示 在linux系统中,设备号用dev_t表示。这是个32位的无符号整数。 为了保证以后主次设备号所占的位数发生变化之后,驱动程序依然可以正常工作,内核提供了如下了几个宏来操作设备号。 假设在内核版本之后对主次设备号所占的位数发生了变化,MINORBITS修改为18位,只要驱动是使用MAJOR和MINOR宏来操作设备号,就不需要修改驱动代码也可以在新内核中使用。 ,第一个参数form表示一个设备号,第二个参数count表示次设备的个数,也就是当前驱动程序所管理的同类设备的个数,第三个参数name表示设备或者驱动的名称。

    9.1K52编辑于 2022-05-08
  • 来自专栏Linux内核深入分析

    Linux设备驱动之字符设备(二)

    通过上一节Linux设备驱动字符设备(一)了解了Linux设备驱动的分类,设备号的构成,设备号的申请以及设备号的释放。 在Linux内核中使用struct cdev结构来代码字符设备。 struct kobject kobj 内核的内嵌对象,是Linux设备驱动模型的重要成员。 struct module *owner 字符设备驱动程序所在的内核模块指针 struct file_operations *ops 字符设备驱动程序文件操作函数集,是应用程序通过文件系统访问驱动的桥梁 struct list_head 用来将系统中字符设备形成的链表 dev_t dev 字符设备设备号,由主次设备号组成 unsigned int count 次设备号的个数,用于表示驱动程序管理的同类设备的个数 目前为止,已经了解了设备号,设备号的构成,字符设备分配,字符设备的初始化,字符设备的注册以及字符设备的注销。将在下一节通过一个简单的字符设备驱动程序来再次熟悉整个流程,然后总结字符设备驱动的编写模型。

    7.9K20编辑于 2022-05-08
  • 来自专栏若尘的技术专栏

    linux 字符设备驱动

    Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。 每当用户程序要访问某个设备时,通过系统调用,内核根据设备结点的信息调用相应的驱动程序。当驱动程序执行完后,又返回至用户进程。 Linux下设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。 一般“一个主设备号对应一个驱动程序” 次设备号:每个驱动程序负责管理它所驱动的几个硬件实例,这些硬件实例则由次设备号来表示。同一驱动下的实例编号,用于确定设备文件所指的设备。 文件名:设备文件名字。 为0代表自动分配设备号undefinedname 是驱动的名字(将出现在 /proc/devices),undefinedfops 是设备驱动的file_operations 结构。

    11.7K45编辑于 2021-12-05
  • 来自专栏若尘的技术专栏

    linux字符设备驱动

    Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。 每当用户程序要访问某个设备时,通过系统调用,内核根据设备结点的信息调用相应的驱动程序。当驱动程序执行完后,又返回至用户进程。 Linux下设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。 一般“一个主设备号对应一个驱动程序” 次设备号:每个驱动程序负责管理它所驱动的几个硬件实例,这些硬件实例则由次设备号来表示。同一驱动下的实例编号,用于确定设备文件所指的设备。 文件名:设备文件名字。 为0代表自动分配设备号undefinedname 是驱动的名字(将出现在 /proc/devices),undefinedfops 是设备驱动的file_operations 结构。

    13K65编辑于 2021-12-04
  • 来自专栏司六米希

    设备驱动程序

    格式不对 Linux设备驱动程序安装fatal error: linux/module.h: No such file or directory 需要makefile文件 要在Ubuntu中安装整个Linux

    2.4K20编辑于 2022-11-15
  • 来自专栏王小二的Android站

    设备驱动初探

    前言 研究IO也很久了,一直无法串联bio和块设备驱动,只知道bio经过IO调度算法传递到块设备驱动,怎么过去的,IO调度算法在哪里发挥作用,一直没有完全搞明白,查看了很多资料,终于对块设备驱动有所理解 一、传统块设备 我们先来实现一个基于内存的传统块设备驱动。 struct block_device_operations simp_blkdev_fops = {//块设备的操作函数 .owner = THIS_MODULE, }; 1.2 加载驱动 1.5.3 bio-块设备 通过make_request_fn和request_fn,我们将bio和块设备驱动串联起来了。 而且IO调度算法会在这两个函数发挥作用。 ? 上面写的基于内存的块设备不就是一个超高速块设备嘛,我们能不能写一个没有中间商的驱动 2.1 simp_blkdev_init 我们需要重写一下init代码,不调用blk_init_queue。

    2.5K51发布于 2020-06-08
  • 来自专栏嵌入式项目开发

    Linux驱动开发: 块设备驱动开发

    设备是与字符设备并列的概念, 这两类设备在 Linux 中驱动的结构有较大差异,总体而言, 块设备驱动比字符设备驱动要复杂得多,在 I/O 操作上表现出极大的不同,缓冲、 I/O 调度、请求队列等都是与块设备驱动相关的概念 在Linux中,驱动对块设备的输入或输出(I/O)操作,都会向块设备发出一个请求,在驱动中用request结构体描述。 但对于一些磁盘设备而言请求的速度很慢,这时候内核就提供一种队列的机制把这些I/O请求添加到队列中(即:请求队列),在驱动中用request_queue结构体描述。 编写块设备驱动时,使用的一些单位介绍: 1. 扇区(Sectors):任何块设备硬件对数据处理的基本单位。通常,1个扇区的大小为512字节。(对设备而言) 2. 2.1 内核自带可参考的块设备驱动源码 drivers\block\z2ram.c drivers\block\xd.c \drivers\mmc\host\sdhci-s3c.c 2.2 块设备注册与注销函数

    36.7K31编辑于 2022-01-17
  • 来自专栏sofu456

    WDK设备驱动开发

    https://msdn.itellyou.cn/ 安装完成后,开始菜单中找到Windows Device Kits目录,查看帮助文档和编译demo

    1.3K20发布于 2020-07-15
  • 来自专栏嵌入式项目开发

    Linux驱动开发: 网络设备驱动开发

    驱动端与设备端的名称需要一致。 修改驱动端的probe函数,增加对SPI模式配置与中断号获取,正常情况下可以直接在SPI设备端直接修改,驱动端直接获取信息即可。 它们由设备驱动初始化,并且只能被设备驱动访问;高层协议不需要关心这块内存。 6.1 网络设备驱动编程步骤 1. 以下代码,在上面的网络设备驱动模型里加入了ENC28J60驱动代码,实现了完整的网卡驱动程序。

    18.6K11编辑于 2022-01-27
  • 来自专栏程序员互动联盟

    linux设备驱动第一篇:设备驱动程序简介

    驱动程序的任务是把这些标准化调用映射到实际硬件的设备特有操作上。 在编写驱动程序时,程序员应该特别注意下面这个概念:编写访问硬件的内核代码时,不要给用户强加任何特定策略。 linux中设备和模块的分类: 字符设备:字符设备是能够像字节流(类似文件)一样被访问的设备,有字符设备驱动程序来实现这种特性。 因而,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。 内核和网络设备驱动程序间的通讯,完全不同于内核和字符以及块驱动程序之间的通讯,内核调用一套和数据包传输相关的函数而不是read,write。 而网络设备没有设备节点是因为,网络设备是面向报文的,很难实现相关read、write等文件读写函数。所以驱动的实现也与字符设备和块设备不同。

    3.8K100发布于 2018-03-12
  • 来自专栏Gnep's_Technology_Blog

    Linux设备驱动程序(三)——字符驱动

    前言 本章的目的是编写一个完整的字符设备驱动,我们开发一个字符驱动是因为这一类适合大部分简单硬件设备,字符驱动也比块驱动易于理解。 一、scull 的设计 编写驱动的第一步是定义驱动将要提供给用户程序的能力(机制)。scull 源码实现下面的设备. 模块实现的每种设备都被引用做一种类型。 主编号标识设备相连的驱动,例如 /dev/null 和 /dev/zero 都由驱动 1 来管理,而虚拟控制台和串口终端都由驱动 4 管理;次编号被内核用来决定引用哪个设备,依据你的驱动是如何编写的,你可以从内核得到一个你的设备的直接指针 例如我们要操作某个设备,首先,我们要知道设备在/dev下的设备文件名。这个设备文件提供主设备号以及次设备号。然后内核通过设备文件提供的主设备找到设备驱动程序(操作设备驱动程序实现)。 最后通过主设备号和次设备构成的设备号找到正确的设备。有了操作的对象(设备)和操作的方法(驱动程序)那就可以完成了我们的要求。 一个驱动程序可以操作多个设备,所以不同的设备可以具有相同的主设备号。

    2.4K41编辑于 2023-08-10
  • 设备管理(设备管理概念、设备驱动程序)

    、I/O设备驱动程序1、设备驱动程序1.1 设备驱动程序概念设备驱动程序是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象要求,如read或write命令,文件系统把这些请求转化为具体的要求后 设备驱动程序应具备以下功能:接收由与设备无关的软件发来的命令和参数,并将命令中抽象的要求转换为与设备相关的低层操作序列检查用户I/O请求的合法性发出I/O命令及时响应由设备控制器发来的中断请求1.3 设备驱动程序的特点设备驱动程序属于低级的系统例程 ,主要是指在请求I/O的进程与设备控制器之间的一个通信和转换程序驱动程序与设备控制器和I/O设备的硬件特性紧密相关,因而对不同类型的设备应配置不同的驱动程序驱动程序与I/O设备所采用的I/O控制方式(中断方式和 ,大体分为两部分,第一部分,能够驱动I/O设备工作的驱动程序,第二部分,设备中断处理程序,以下是设备驱动程序的处理过程:将抽象要求转换为具体要求检查I/O请求的合法性读出和检查设备的状态传送必要的参数工作方式的设置启动 ()等调用驱动程序所实现的函数(设备操作)2.4 编写简单的字符设备驱动程序① 驱动初始化 ②实现设备操作 ③驱动注销2.4.1 字符设备驱动接口函数序号函数名功能1cdev_alloc()动态申请(构造

    48510编辑于 2025-06-12
  • 来自专栏Linux内核深入分析

    Linux设备驱动模型-Kobject

    Kobject是linux设备驱动模型的基础,也是设备模型中抽象的一部分。如果想了解设备驱动模型就需要明白Kobject的构成或原理。 linux内核为了兼容各种形形色色的设备,就需要对各种设备的共性进行抽象,抽象出一个基类,其余的设备只需要继承此基类就可以了。 而此基类就是kobject,但是C语言没有面向对象语法,这时候就需要将此基类(Kobject)嵌入到具体的结构体中,从而就可以访问控制此设备的操作。 通常驱动程序员很少使用到kobject结构及其相关接口,而是使用封装之后的更高层的接口函数。 Kobject结构体 内核使用kobject来表示内核一个对象。 init_name; /* initial name of the device */ const struct device_type *type; Kobject相关操作函数 kobject相关的操作函数一般驱动程序员是不会直接操作的

    6.3K32发布于 2020-03-24
  • 来自专栏Linux内核深入分析

    Linux设备驱动模型-Driver

    bus: 设备驱动所属的总线 owner: 设备驱动的owner,通常为THIS_MODULE suppress_bind_attrs: 通过sysfs操作设备驱动的bind/unbind, 用来使能/关闭设备驱动的自动匹配 of_device_id: device_tree中使用,用于匹配设备。 probe,remove: 当设备匹配/移除的时候,会调用设备驱动的probe/remove函数。 shutdown,suspend, resume: 代表设备驱动在调用管理的时候的回调函数。 groups: 设备驱动的属性。 p: 设备驱动的私有数据结构,通常可以将驱动的信息放入此结构中。 和设备一样,内核也为设备驱动定义了一些驱动的宏属性,方便定义驱动属性。

    5.5K30发布于 2020-03-24
  • 来自专栏Linux内核深入分析

    Linux设备驱动模型-Ktype

    it */ if (name) { pr_debug("kobject: '%s': free name\n", name); kfree(name); } } 所以基于上述的执行路径,在驱动

    5K21发布于 2020-03-24
  • 来自专栏linux驱动个人学习

    多功能设备mfd驱动

    一、概述 mfd是Multifunction device的简称,即多功能设备,是许多有共性的设备的集合,mfd由核心层(core)以及其下的“子设备”组成。 从下文将会看到,mfd只是将设备注册到platform总线——因此,其子设备属于platform设备。它并没有对涉及到的设备驱动做实质性改变。 但是,因为某些设备的共性,所以可以在mfd中提供共同的函数给其下子设备进行调用。 本文提到的hisi_fmc驱动就是如此: 下面就分析mfd设备注册过程,并结合1个实例讲解。 platform device的,只是写在了mfd设备上; 至此,mfd设备的添加就完成了,最终调用驱动的probe函数。 三、mfd实例 下面介绍hisi_fmc驱动的实例: static int hisi_fmc_probe(struct platform_device *pdev) { struct hisi_fmc

    2.3K11发布于 2019-05-25
  • 来自专栏Linux内核深入分析

    Linux设备驱动模型-Bus

    前言 在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。 为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型的设备驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。 .dev_attrs: 此bus设备上默认的属性。 .bus_groups, dev_groups, drv_groups: 分别是总线, 设备驱动的属性。 .match: 当一个设备或者驱动添加到此总线上的时候,bus就会调用match对设备驱动一一匹配的。 p: 一个用来管理总线上设备驱动的数据结构。

    5K20发布于 2020-03-24
  • 来自专栏悟空被FFmpeg玩

    驱动基础——字符设备2

    使用字符设备里的write 驱动代码 #include <linux/module.h> #include <linux/slab.h> #include <linux/kernel.h> #

    1.2K30发布于 2019-03-05
领券