前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。...一、Linux 设备驱动程序的作用 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。...另外,Linux 支持多个文件系统类型,就是说,物理介质上不同的数据组织方式。例如,磁盘可被格式化成标准 Linux 的 ext3 文件系统,普遍使用的 FAT 文件系统,或者其他几个文件系统。...三、设备和模块的分类 以 Linux 的方式看待设备可区分为 3 种基本设备类型,每个模块常常实现 3 种类型中的 1 种,因此可分类成字符模块,块模块,或者一个网络模块。...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 块设备注册与注销函数
Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备。 设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。...linux如何管理文件 Linux把设备纳入文件系统的范畴来管理。 每个设备在Linux系统上看起来都像一个文件,它们存放在/dev目录中,称为"设备节点"。...Linux下设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。...一般“一个主设备号对应一个驱动程序” 次设备号:每个驱动程序负责管理它所驱动的几个硬件实例,这些硬件实例则由次设备号来表示。同一驱动下的实例编号,用于确定设备文件所指的设备。 文件名:设备文件名字。...一些重要的数据结构 大部分驱动程序涉及三个重要的内核数据结构: 文件操作file_operations结构体 - 结构体file_operations在头文件 linux/fs.h中定义,用来存储驱动内核模块提供的对设备进行各种操作的函数的指针
,驱动端与设备端的名称需要一致。...修改驱动端的probe函数,增加对SPI模式配置与中断号获取,正常情况下可以直接在SPI设备端直接修改,驱动端直接获取信息即可。...它们由设备驱动初始化,并且只能被设备驱动访问;高层协议不需要关心这块内存。...6.1 网络设备驱动编程步骤 1....以下代码,在上面的网络设备驱动模型里加入了ENC28J60驱动代码,实现了完整的网卡驱动程序。
前言 本章的目的是编写一个完整的字符设备驱动,我们开发一个字符驱动是因为这一类适合大部分简单硬件设备,字符驱动也比块驱动易于理解。...字符驱动的特殊文件由使用 ls -l 的输出的第一列的"c"标识,块设备也出现在 /dev 中,但是它们由"b"标识。 在Linux系统上输入:ls -l /dev 观察输出。...file_operation 结构是一个字符驱动如何建立这个连接,这个结构,定义在 ,是一个函数指针的集合。...2、文件结构(struct file) struct file,定义于 ,是设备驱动中第二个最重要的数据结构。...scull 驱动引入 2 个核心函数来管理 Linux 内核中的内存,这些函数定义在,是: void *kmalloc(size_t size, int flags); void
/******************** * 字符设备驱动 ********************/ (1)字符设备驱动介绍 字符设备是指那些按字节流访问的设备,针对字符设备的驱动称为字符设备驱动...设备通过设备号来标识。设备号分两部分,主设备号和次设备号。 通常,主设备号标示设备对应的驱动程序,linux允许多个驱动共用一个主设备号; 而次设备号用于确定设备文件所指的设备。...在驱动中访问设备号应该用中定义的宏。...(mi)) //根据指定的主设备和次设备号生成设备号 #include //静态:申请指定的设备号, from指设备号, count指使用该驱动有多少个设备(次设备号.../devices.txt可查看设备号的静态分配情况 ///内核里使用struct cdev来描述一个字符设备驱动 #include struct cdev { struct
前言 在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。...为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型的设备与驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。....dev_attrs: 此bus设备上默认的属性。 .bus_groups, dev_groups, drv_groups: 分别是总线, 设备,驱动的属性。....match: 当一个设备或者驱动添加到此总线上的时候,bus就会调用match对设备和驱动一一匹配的。...p: 一个用来管理总线上设备与驱动的数据结构。
coresight cpu event_source hid i2c iio mdio_bus mmc platform scsi sdio serio spi usb virtio workqueue 数据结构 linux
图1-1 声音的录音和播放过程 数据结构 在ALSA架构下,pcm也被称为设备,所谓的逻辑设备。在linux系统中使用snd_pcm结构表示一个pcm设备。...linux系统中使用snd_pcm_str定义stream, 使用snd_pcm_substream定义substream。...调用snd_kernel_minor函数获得设备的此设备号。该此设备号已经存在则返回BUSY,小于返回错误。 4....应用到驱动的过程 当应用程序在通过open系统调用打开/dev/pcmC0D0c的过程 1....if ((err = substream->ops->open(substream)) < 0) 至此,整个pcm设备创建,调用,以及应用到驱动整个流程分析完毕。:)
Linux系统一次读取磁盘的大小是一个块,而不是一个扇区,块设备驱动由此得名。 二、块设备处理过程 1、linux 内核中,块设备将数据存储与固定的大小的块中,每个块都有自己的固定地址。...Linux内核中块设备和其他模块的关系如下。 ? 1、块设备的处理过程涉及Linux内核中的很多模块,下面简单描述之间的处理过过程。 ... ?...(Linux系统中,对块设备的IO请求,都会向块设备驱动发出一个请求,在驱动中用request结构体描述) 内核结构如下:. struct request { struct list_head queuelist...(也可以不用注册设备,驱动一样可以工作,该函数和字符设备的register_chrdev()函数相对应,对于大多数的块设备,第一个工作就是相内核注册自己,但是在Linux2.6以后,register_blkdev
#include #include #include #include #include #include #include static struct kobject kobj;...it */ if (name) { pr_debug("kobject: '%s': free name\n", name); kfree(name); } } 所以基于上述的执行路径,在驱动的
Kobject是linux设备驱动模型的基础,也是设备模型中抽象的一部分。如果想了解设备驱动模型就需要明白Kobject的构成或原理。...linux内核为了兼容各种形形色色的设备,就需要对各种设备的共性进行抽象,抽象出一个基类,其余的设备只需要继承此基类就可以了。...通常驱动程序员很少使用到kobject结构及其相关接口,而是使用封装之后的更高层的接口函数。 Kobject结构体 内核使用kobject来表示内核一个对象。...#include #include #include #include #include #include #include
前言 linux将所有的驱动抽象为struct device_driver结构。这样设计可以方便驱动程序更好编写,在编写驱动的时候只需要将此结构嵌入到具体的驱动中即可。...bus: 设备驱动所属的总线 owner: 设备驱动的owner,通常为THIS_MODULE suppress_bind_attrs: 通过sysfs操作设备驱动的bind/unbind,...probe,remove: 当设备匹配/移除的时候,会调用设备驱动的probe/remove函数。 shutdown,suspend, resume: 代表设备驱动在调用管理的时候的回调函数。...groups: 设备驱动的属性。 p: 设备驱动的私有数据结构,通常可以将驱动的信息放入此结构中。...和设备一样,内核也为设备驱动定义了一些驱动的宏属性,方便定义驱动属性。
前言 Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。...这样设计之后就方便驱动开发工程师编写驱动,只需要将具体的设备包含struct device结构,具体的驱动包含struct device_driver结构。...数据结构 Linux将所有的设备统一抽象为struct device结构。...C: 关于总线先设备与驱动的匹配是设备驱动模型的核心 void bus_probe_device(struct device *dev) { struct bus_type *bus = dev->...,最终会调用到设备的show和store函数中,具体的流程分析可见Linux设备驱动模型-Ktype static ssize_t dev_attr_show(struct kobject *kobj
Linux 内核源码:include\linux\usb.h Linux 内核源码:drivers\hid\usbhid\usbmouse.c 1....BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口": USB 控制器或 Hub 识别出 USB 设备后,会创建、...注册 usb_device usb_device 被"drivers\usb\core\generic.c" 驱动认领后,会选择、设置某个配置 这个配置下面的接口,都会分配、设置、注册一个 usb_interface...接口函数 在 USB 设备驱动程序中,能使用的 USB 函数都在这个头文件里:include\linux\usb.h。...2.1 pipe 使用这些接口函数的主要目的是传输数据,传输数据的对象是 USB 设备里的某个 endpoint,这被称为 pipe: /* Create various pipes... */ #define
前言 当一个设备动态的加入到系统时候(比如常见的将U盘插入到PC机器上), 设备驱动程序就需要动态的检测到有设备插入了系统,就需要将此事件通知到用户层,然后用户层对这一事件做响应的处理,比如加载USB驱动...Linux系统对uevent机制的具体实现是建立在设备模型的基础上的,通过kobject_uevent函数实现。 在前面的kset小节中提到了注册一个kset的接口,可以在这里习复下。...如果是嵌入式设备,会在etc目录下看到这样的配置: echo /sbin/mdev >/proc/sys/kernel/hotplug /sbin/mdev -s 也就是说uevent_helper最终调用到
在Linux设备驱动之字符设备(一)中学习了设备号的构成,设备号的申请与释放。在Linux设备驱动之字符设备(二)中学习了如何创建一个字符设备,初始化,已经注册到系统中和最后释放该字符设备。...本节将结合前两节学到的知道,编写一个简单的字符设备驱动。最后总结一下字符设备驱动的模型。...字符设备驱动程序源码 #include #include #include #include <linux/...237,所以下一步就是根据主设备号创建设备节点。...字符设备驱动模型
通过上一节Linux设备驱动字符设备(一)了解了Linux设备驱动的分类,设备号的构成,设备号的申请以及设备号的释放。 在Linux内核中使用struct cdev结构来代码字符设备。...struct kobject kobj 内核的内嵌对象,是Linux设备驱动模型的重要成员。...struct module *owner 字符设备驱动程序所在的内核模块指针 struct file_operations *ops 字符设备驱动程序文件操作函数集,是应用程序通过文件系统访问驱动的桥梁...该部分在后面Linux字符设备框架一节会详细分析,目前只要明白主要流程即可。 字符设备的注销 当驱动程序需要从系统卸载的时候,就需要使用cdev_del释放字符设备占用的内存。...目前为止,已经了解了设备号,设备号的构成,字符设备分配,字符设备的初始化,字符设备的注册以及字符设备的注销。将在下一节通过一个简单的字符设备驱动程序来再次熟悉整个流程,然后总结字符设备驱动的编写模型。
上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。...下面就根据一个简单的实例来说明如何调试驱动程序。...如何根据oops定位代码行 我们借用linux设备驱动第二篇:构造和运行模块里面的hello world程序来演示出错的情况,含有错误代码的hello world如下: #include <linux/...以上就是通过oops信息来定位驱动崩溃的行号。...printk的使用方法类似printf,只是要注意一下打印级别,详细介绍在linux设备驱动第二篇:构造和运行模块中已有描述,另外需要注意的是大量使用printk会严重拖慢系统,所以使用过程中也要注意。
领取专属 10元无门槛券
手把手带您无忧上云