首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏悟空被FFmpeg玩

    驱动基础——字符设备3

    字符设备驱动中的 read接口的使用,简单实例 驱动部分代码 #include <linux/module.h> #include <linux/slab.h> #include

    1.2K10发布于 2019-03-05
  • 来自专栏Gnep's_Technology_Blog

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

    前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。 例如,磁盘可被格式化成标准 Linux 的 ext3 文件系统,普遍使用的 FAT 文件系统,或者其他几个文件系统。 设备控制 几乎每个系统操作最终都映射到一个物理设备上。 除了处理器,内存和非常少的别的实体之外,全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行。这些代码称为设备驱动,内核中必须嵌入系统中出现的每个外设的驱动,从硬盘驱动到键盘和磁带驱动器。 三、设备和模块的分类 以 Linux 的方式看待设备可区分为 3 种基本设备类型,每个模块常常实现 3 种类型中的 1 种,因此可分类成字符模块,块模块,或者一个网络模块。 3驱动如下: 字符设备 一个字符(char)设备是一种可以当作一个字节流来存取的设备(如同一个文件); 一个字符驱动负责实现这种行为,这样的驱动常常至少实现 open,close,read,和 write

    3.5K41编辑于 2023-08-10
  • 来自专栏嵌入式ARM和Linux

    Linux设备驱动开发3-Kconfig构建系统

    menu 后面跟的“ Network device support”项仅仅是1个菜单,没有对应真实的配置选项,也不具备3 种不同的状态。这是它和config 的区别。 3 Makefile 这里主要对内核源代码各级子目录中的kbuild(内核的编译系统)Makefile 进行简单介绍,这部分是内核模块或设备驱动开发者最常接触到的。

    1.3K20编辑于 2022-08-10
  • 来自专栏Linux内核深入分析

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

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

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

    9.1K52编辑于 2022-05-08
  • 来自专栏司六米希

    设备驱动程序

    (在终端中输入) cd Desktop //然后按下回车 3.创建文件夹(此步骤可跳过,但建议创建) mkdir 文件名 4.建立文本 gedit helloworld.c //然后按下回车, 格式不对 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调度算法在哪里发挥作用,一直没有完全搞明白,查看了很多资料,终于对块设备驱动有所理解 一、传统块设备 我们先来实现一个基于内存的传统块设备驱动。 整个过程 1.创建request_queue(每个块设备一个队列),绑定函数simp_blkdev_do_request 2.创建一个gendisk(每个块设备就是一个gendisk) 3.将 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设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。 每当用户程序要访问某个设备时,通过系统调用,内核根据设备结点的信息调用相应的驱动程序。当驱动程序执行完后,又返回至用户进程。 Linux下设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。 一般“一个主设备号对应一个驱动程序” 次设备号:每个驱动程序负责管理它所驱动的几个硬件实例,这些硬件实例则由次设备号来表示。同一驱动下的实例编号,用于确定设备文件所指的设备。 文件名:设备文件名字。 为0代表自动分配设备号undefinedname 是驱动的名字(将出现在 /proc/devices),undefinedfops 是设备驱动的file_operations 结构。

    13.1K65编辑于 2021-12-04
  • 来自专栏若尘的技术专栏

    linux 字符设备驱动

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

    11.7K45编辑于 2021-12-05
  • 来自专栏嵌入式项目开发

    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驱动开发: 网络设备驱动开发

    驱动端与设备端的名称需要一致。 修改ENC28J60驱动源码里的名称与SPI总线设备端保持一致。 3. 它们由设备驱动初始化,并且只能被设备驱动访问;高层协议不需要关心这块内存。 6.1 网络设备驱动编程步骤 1. 以下代码,在上面的网络设备驱动模型里加入了ENC28J60驱动代码,实现了完整的网卡驱动程序。

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

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

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

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

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

    前言 本章的目的是编写一个完整的字符设备驱动,我们开发一个字符驱动是因为这一类适合大部分简单硬件设备,字符驱动也比块驱动易于理解。 1, 3, 9…。 3、主编号的动态分配 尽量使用动态分配的方法,这样就能在加载甚至编译模块的时候设定主设备号,大大优于静态分配。 %d\n", scull_major); return result; } 三、一些重要的数据结构 大部分的基础性的驱动操作包括 3 个重要的内核数据结构,称为 file_operations 如果想尝试比较简单的字符驱动实现,可以查看我的另一篇驱动开发之 hello 驱动程序实现的文章: 荔枝派Zero(全志V3S)驱动开发之hello驱动程序

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

    ,根据设备文件找到控制器的地址、相应的驱动程序等3、Unix/Linux中一切皆文件的层次模型在Unix/Linux系统中,把设备也当做文件来看待,设备与文件系统的系统调用接口是一致的,CPU通过out 、I/O设备驱动程序1、设备驱动程序1.1 设备驱动程序概念设备驱动程序是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象要求,如read或write命令,文件系统把这些请求转化为具体的要求后 I/O进程,专门用于执行系统中所有各类设备的I/O操作不设置专门的设备处理进程,而只为各类设备设置相应的设备处理程序(模块),供用户进程或系统进程调用3设备驱动程序的处理过程不同类型的设备应有不同的设备驱动程序 ()等调用驱动程序所实现的函数(设备操作)2.4 编写简单的字符设备驱动程序① 驱动初始化 ②实现设备操作 ③驱动注销2.4.1 字符设备驱动接口函数序号函数名功能1cdev_alloc()动态申请(构造 )cdev内存(设备对象)2cdev_init()初始化cdev的成员,并建立起cdev和file_operations之间的关联3cdev_add()注册cdev设备对象,添加到系统字符设备列表4cdev_del

    53610编辑于 2025-06-12
  • 来自专栏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.6K30发布于 2020-03-24
  • 来自专栏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.4K32发布于 2020-03-24
  • 来自专栏Linux内核深入分析

    Linux设备驱动模型-Ktype

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

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

    Linux设备驱动模型-Bus

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

    5K20发布于 2020-03-24
领券