首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 设备驱动相遇

一个开发板 上一节最后我们讲到设备三大作用,其最后一个作用也是最重要作用:设备信息集合。这一节结合设备信息集合详细讲解来认识一下设备驱动是如何绑定。...所谓设备信息集合,就是根据不同外设寻找各自外设信息,我们知道一个完整开发板有 CPU 各种控制器(如 I2C 控制器、SPI 控制器、DMA 控制器等),CPU 控制器可以统称为 SOC,除此之外还有各种外设...我们看到一个开发板有很多设备,这些设备是如何一层一层展开呢?设备驱动又是如何绑定呢?我们带着这些疑问进入本节主题。...第一节中讲了总线、设备驱动模型原理,即任何驱动都是通过对应总线设备发生联系,故虽然 soc 内部没有具体总线,但是内核通过 platform 这条虚拟总线,把控制器一个一个找到,一样遵循了内核高内聚...3.展开 spi 设备 spi 设备注册 i2c 设备一样,在 spi 控制器下遍历 spi 节点下设备,然后通过相应注册函数进行注册,只是 i2c 注册 api 接口不一样,下面看一下具体代码

2.5K40

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

前言 这一部分主要是用来介绍 Linux 设备驱动程序一些基本概念,包括:Linux 设备驱动程序作用、内核功能划分、设备模块分类以及版本编号。...一、Linux 设备驱动程序作用 设备驱动程序就像一个个“黑盒子”,使某个特定硬件响应一个定义良好内部编程接口,这些操作完全隐藏了设备工作细节。...三、设备模块分类 以 Linux 方式看待设备可区分为 3 种基本设备类型,每个模块常常实现 3 种类型中 1 种,因此可分类成字符模块,块模块,或者一个网络模块。...Linux,相反,允许应用程序读写一个块设备象一个字符设备一样 – 它允许一次传送任意数目的字节。结果就是,块字符设备区别仅仅在内核在内部管理数据方式上,并且因此在内核/驱动软件接口上不同。...不用 read write,内核调用报文传递相关函数。 有其他划分驱动模块方式,与上面的设备类型是正交。通常,某些类型驱动与给定类型设备其他层内核支持函数一起工作。

1.2K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux字符设备驱动

    Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样设备设备驱动程序是操作系统内核机器硬件之间接口,系统调用是操作系统内核应用程序之间接口。...linux如何管理文件 Linux设备纳入文件系统范畴来管理。 每个设备Linux系统上看起来都像一个文件,它们存放在/dev目录中,称为"设备节点"。...Linux设备属性 设备类型:字符设备、块设备、网络设备; 主设备号:标识设备对应驱动程序。...一些重要数据结构 大部分驱动程序涉及三个重要内核数据结构: 文件操作file_operations结构体 - 结构体file_operations在头文件 linux/fs.h中定义,用来存储驱动内核模块提供设备进行各种操作函数指针...struct file_operations *i_fop;在生成设备文件时候,这个文件操作成员被赋予一个默认值; 从inode中获得主设备设备宏: * unsigned int iminor

    10.6K65

    linux 字符设备驱动

    Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样设备设备驱动程序是操作系统内核机器硬件之间接口,系统调用是操作系统内核应用程序之间接口。...linux如何管理文件 Linux设备纳入文件系统范畴来管理。 每个设备Linux系统上看起来都像一个文件,它们存放在/dev目录中,称为"设备节点"。...Linux设备属性 设备类型:字符设备、块设备、网络设备; 主设备号:标识设备对应驱动程序。...一些重要数据结构 大部分驱动程序涉及三个重要内核数据结构: 文件操作file_operations结构体 - 结构体file_operations在头文件 linux/fs.h中定义,用来存储驱动内核模块提供设备进行各种操作函数指针...struct file_operations *i_fop;在生成设备文件时候,这个文件操作成员被赋予一个默认值; 从inode中获得主设备设备宏: * unsigned int iminor

    9.6K45

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

    通过上一节Linux设备驱动字符设备(一)了解了Linux设备驱动分类,设备构成,设备申请以及设备释放。 在Linux内核中使用struct cdev结构来代码字符设备。...struct kobject kobj 内核内嵌对象,是Linux设备驱动模型重要成员。...struct module *owner 字符设备驱动程序所在内核模块指针 struct file_operations *ops 字符设备驱动程序文件操作函数集,是应用程序通过文件系统访问驱动桥梁...该部分在后面Linux字符设备框架一节会详细分析,目前只要明白主要流程即可。 字符设备注销 当驱动程序需要从系统卸载时候,就需要使用cdev_del释放字符设备占用内存。...目前为止,已经了解了设备号,设备构成,字符设备分配,字符设备初始化,字符设备注册以及字符设备注销。将在下一节通过一个简单字符设备驱动程序来再次熟悉整个流程,然后总结字符设备驱动编写模型。

    6.1K20

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

    Linux设备驱动分类 从上图可以看到Linux系统将各异设备分为三大类:字符设备,块设备网络设备。内核针对每一类设备都提供了对应驱动模型架构,包括基本内核设施和文件系统接口。...主设备号用来标识对于设备驱动程序,而次设备号则由驱动程序使用,用来标识它所管理若干同类设备设备表示 在linux系统中,设备号用dev_t表示。这是个32位无符号整数。...随着Linux系统演变,上述主次设备分发可能在将来会发生变化,所以设备驱动程序开发者应该避免直接使用主次设备号所占位宽来获得对于设备号或次设备号。...MKDEV则是将主设备号ma设备号mi合成一个dev_t类型设备号。...假设在内核版本之后对主次设备号所占位数发生了变化,MINORBITS修改为18位,只要驱动是使用MAJORMINOR宏来操作设备号,就不需要修改驱动代码也可以在新内核中使用。

    7.1K52

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

    设备是与字符设备并列概念, 这两类设备Linux驱动结构有较大差异,总体而言, 块设备驱动比字符设备驱动要复杂得多,在 I/O 操作上表现出极大不同,缓冲、 I/O 调度、请求队列等都是与块设备驱动相关概念...在Linux中,驱动对块设备输入或输出(I/O)操作,都会向块设备发出一个请求,在驱动中用request结构体描述。...但对于一些磁盘设备而言请求速度很慢,这时候内核就提供一种队列机制把这些I/O请求添加到队列中(即:请求队列),在驱动中用request_queue结构体描述。...编写块设备驱动时,使用一些单位介绍: 1. 扇区(Sectors):任何块设备硬件对数据处理基本单位。通常,1个扇区大小为512字节。(对设备而言) 2....硬盘是集精密机械、微电子电路、电磁转换为一体电脑存储设备,它存储着电脑系统资源重要信息及数据,这些因素使硬盘在PC机中成为最为重要一个硬件设备 最精密部分--磁头: 由于磁头工作性质

    32.3K30

    Linux设备驱动详解

    Linux系统一次读取磁盘大小是一个块,而不是一个扇区,块设备驱动由此得名。 二、块设备处理过程 1、linux 内核中,块设备将数据存储与固定大小块中,每个块都有自己固定地址。...Linux内核中块设备其他模块关系如下。 ? 1、块设备处理过程涉及Linux内核中很多模块,下面简单描述之间处理过过程。   ... ?...(Linux系统中,对块设备IO请求,都会向块设备驱动发出一个请求,在驱动中用request结构体描述) 内核结构如下:. struct request { struct list_head queuelist...(也可以不用注册设备驱动一样可以工作,该函数字符设备register_chrdev()函数相对应,对于大多数设备,第一个工作就是相内核注册自己,但是在Linux2.6以后,register_blkdev

    5.5K30

    Linux音频驱动-PCM设备

    声音转化过程为,先对连续模拟信号按照固定频率周期性采样,将采样到数据按照一定精度进行量化,量化后信号采样后信号差值叫做量化误差,将量化后数据进行最后编码存储,最终模拟信号变化为数字信号...对于人类而言,能接受声音频率范围是20Hz-20KHz, 所以采样频率44.1KHz 以及16bit采样位数就可以有很好保真能力(CD格式采样率采样位数)。...图1-1 声音录音播放过程 数据结构 在ALSA架构下,pcm也被称为设备,所谓逻辑设备。在linux系统中使用snd_pcm结构表示一个pcm设备。...应用到驱动过程 当应用程序在通过open系统调用打开/dev/pcmC0D0c过程 1....if ((err = substream->ops->open(substream)) < 0) 至此,整个pcm设备创建,调用,以及应用到驱动整个流程分析完毕。:)

    8.8K33

    Linux设备驱动模型-Bus

    前言 在linux设备驱动模型中,总线可以看作是linux设备模型核心,系统中其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线机会并不多。...为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型设备驱动都是必须挂载在一个总线上,无论是实际存在或者虚拟。....match: 当一个设备或者驱动添加到此总线上时候,bus就会调用match对设备驱动一一匹配。...p: 一个用来管理总线上设备驱动数据结构。....drivers_autoprobe: 代表在该bus下注册某一个驱动或者设备时候,是否需要自动匹配 .bus: 指向所属bus。

    3.9K20

    Linux设备驱动模型-Kobject

    而目前456_test目录下是不存在任何文件,那是因为我们没有添加该obj属性,此测试case将在下解完善。 Kobject是linux设备驱动模型基础,也是设备模型中抽象一部分。...如果想了解设备驱动模型就需要明白Kobject构成或原理。linux内核为了兼容各种形形色色设备,就需要对各种设备共性进行抽象,抽象出一个基类,其余设备只需要继承此基类就可以了。...而此基类就是kobject,但是C语言没有面向对象语法,这时候就需要将此基类(Kobject)嵌入到具体结构体中,从而就可以访问控制此设备操作。...通常驱动程序员很少使用到kobject结构及其相关接口,而是使用封装之后更高层接口函数。 Kobject结构体 内核使用kobject来表示内核一个对象。...kset对象用来容纳一系列同类型kobject ktype: 用来定义该内核对象sys文件系统相关操作函数属性。

    5.4K32

    Linux设备驱动模型-Uevent

    前言 当一个设备动态加入到系统时候(比如常见将U盘插入到PC机器上), 设备驱动程序就需要动态检测到有设备插入了系统,就需要将此事件通知到用户层,然后用户层对这一事件做响应处理,比如加载USB驱动...而将此事件通知到用户层就需要某种机制,典型就是mdev hotplugudev。关于udevmdev hotplug可以在上篇文章有解释。...Linux系统对uevent机制具体实现是建立在设备模型基础上,通过kobject_uevent函数实现。 在前面的kset小节中提到了注册一个kset接口,可以在这里习复下。...而kobjectkset主要区别就是,将一个kset注册到系统时候,就需要将此事件通过kobject_uevent发送到用户空间,而kobject如果是单独,没有依赖kset,则无法通过uevent...如果是嵌入式设备,会在etc目录下看到这样配置: echo /sbin/mdev >/proc/sys/kernel/hotplug /sbin/mdev -s 也就是说uevent_helper最终调用到

    4.1K41

    Linux设备驱动模型-Device

    前言 Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。...这样设计之后就方便驱动开发工程师编写驱动,只需要将具体设备包含struct device结构,具体驱动包含struct device_driver结构。...最终会调用device_registerdriver_register将驱动设备注册到系统,表现出来就是在sys目录devicedriver目录下。...C: 关于总线先设备驱动匹配设备驱动模型核心 void bus_probe_device(struct device *dev) { struct bus_type *bus = dev->...,最终会调用到设备showstore函数中,具体流程分析可见Linux设备驱动模型-Ktype static ssize_t dev_attr_show(struct kobject *kobj

    8.1K21

    Linux内核设备驱动之字符设备驱动笔记整理

    设备通过设备号来标识。设备号分两部分,主设备设备号。 通常,主设备号标示设备对应驱动程序,linux允许多个驱动共用一个主设备号; 而次设备号用于确定设备文件所指设备。...在驱动中访问设备号应该用中定义宏。...(3)字符设备基本数据结构 字符设备驱动关系最紧密3个基本数据结构是:file, file_oepeationsinode a.file_operations数据结构 结构中包含了若干函数指针...见驱动p54 2.6内核结构初始化: struct file_operations my_fops = { .owner = THIS_MODULE, .llseek =...(mi)) //根据指定设备设备号生成设备号 #include //静态:申请指定设备号, from指设备号, count指使用该驱动有多少个设备(次设备

    4.8K20
    领券