随笔分类 -  Linux驱动开发

摘要:Linux素来以其强大的网络功能著名,同时, 网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对网络设备贯彻其"一切皆文件"的思想, 网络设备不以/dev下的设备文件为接口,用户程序通过socket作为访问硬件的接口。本文以Li 阅读全文
posted @ 2017-03-28 08:23 Abnor 编辑
摘要:MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化硬件驱动框架。本文基于3.14内核,讨论MTD驱动框架。 MTD子系统框架 设备节点层 :MTD框架 阅读全文
posted @ 2017-03-25 08:53 Abnor 编辑
摘要:磁盘驱动就是实现磁盘空间和内存空间数据上的交互 ,在上一篇中我们讨论了内存端的Page Segment Block Sector相关的概念,本文以3.14内核为例,讨论这部分内存是如何被组织管理的。我们知道,为了解决CPU和内存的速度不匹配,计算机系统引入了Cache缓存机制,这种硬件Cache的速 阅读全文
posted @ 2017-03-24 14:13 Abnor 编辑
摘要:块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备, 块设备(blockdevice) 是一种具有一定结构的随机存取设备,对这种设备的读写是按 块 (所以叫块设备)进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区。 作为存 阅读全文
posted @ 2017-03-21 07:30 Abnor 编辑
摘要:"./drivers/usb/usb skeleton.c"是内核提供给usb设备驱动开发者的海量存储usb设备的模板程序, 程序不长, 通用性却很强,十分经典, 深入理解这个文件可以帮助我们更好的理解usb子系统以及usb设备驱动框架, 写出更好的usb海量存储设备驱动。 匹配前 既然是一个usb 阅读全文
posted @ 2017-03-14 08:14 Abnor 编辑
摘要:USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配。 USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动,通常,对于USB这种标准化的设备,内核已经将主机控制器的驱动编写好了,设备上的Gadget驱动通常 阅读全文
posted @ 2017-03-10 09:36 Abnor 编辑
摘要:"./drivers/i2c/busses/i2c s3c2410.c"是3.14.0内核中三星SoC的i2c控制器驱动程序, 本文试图通过对这个程序的分析, 剥离繁复的细节, 总结一套编写i2c主机控制器驱动的框架以及一个分析内核驱动的流程. 匹配之前 1291 将主机控制器驱动在系统启动的时候就 阅读全文
posted @ 2017-03-09 09:28 Abnor 编辑
摘要:如果你也遇到了填充了id_match_table,compitible怎么看都一样,但probe就是不执行(让我哭一会),你可以回头看一下上一篇的模板,我们这里 虽然使用的是设备树匹配,但和platform的设备树匹配只填充i2c_match_table不同,i2c_driver的设备树匹配需要同时 阅读全文
posted @ 2017-03-08 08:02 Abnor 编辑
摘要:另外一种驱动 应用层除了使用上述的使用i2c_driver接口来访问i2c设备,Linux内核还提供了一种简单粗暴的方式——直接通过虚拟i2c设备驱动的方式,即上一篇中的i2c dev提供的方式,这种方式使用的i2c_client是随着open的操作临时创建的虚拟的client,即不是挂接在i2c_ 阅读全文
posted @ 2017-03-08 08:01 Abnor 编辑
摘要:i2c总线是一种十分常见的板级总线,本文以linux3.14.0为参考, 讨论Linux中的i2c驱动模型并利用这个模型写一个mpu6050的驱动, 最后在应用层将mpu6050中的原始数据读取出来 i2c子系统框架 下图就是我理解的i2c驱动框架示意图, 类似中断子系统, i2c子系统中也使用一个 阅读全文
posted @ 2017-03-07 09:22 Abnor 编辑
摘要:输入设备都有共性:中断驱动+字符IO ,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用 主设备号13 ,同时输入子系统也 支持自动创建设备文件 ,这些文件采用阻塞的IO读写方式,被创建在 "/dev/input 阅读全文
posted @ 2017-02-19 09:08 Abnor 编辑
摘要:misc子系统在Linux中是一个非常简单的子系统,但是其清晰的框架结构非常适合用来研究设备识别模型。本文从misc子系统的使用出发,通过了解其机制来总结一套的设备识别的驱动框架,即使用 使用同一个驱动,向上提供多个设备文件接口,向下控制多个(相应的)设备 ,这就需要该驱动可以根据不同的设备文件来控 阅读全文
posted @ 2017-02-18 14:09 Abnor 编辑
摘要:为了实现对临界资源的有效管理,应用层的程序有原子变量,条件变量,信号量来控制并发,同样的问题也存在与驱动开发中,比如一个驱动同时被多个应用层程序调用,此时驱动中的全局变量会同时属于多个应用层进程的进程空间,这种情况下也要使用一些技术来实现对并发的控制。本文将讨论内核中下述并发控制技术的技术特点和应用 阅读全文
posted @ 2017-02-15 08:26 Abnor 编辑
摘要:内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行。实际上,时钟中断处理程序会触发TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。 设备驱动程序如要获得时 阅读全文
posted @ 2017-02-14 12:00 Abnor 编辑
摘要:在硬件上,中断源可以通过中断控制器向CPU提交中断,进而引发中断处理程序的执行,不过这种硬件中断体系每一种CPU都不一样,而Linux作为操作系统,需要同时支持这些中断体系,如此一来,Linux中就提出了 软中断 的概念,也有人叫 内核中断 ,其本质就是使用统一的方式对不同硬件中断体系中的中断号进行 阅读全文
posted @ 2017-02-14 08:02 Abnor 编辑
摘要:等待队列 是内核中实现进程调度的一个十分重要的数据结构,其任务是维护一个链表,链表中每一个节点都是一个PCB(进程控制块), 内核会将PCB挂在等待队列中的所有进程都调度为睡眠状态,直到某个唤醒的条件发生 。应用层的阻塞IO与非阻塞IO的使用我已经在 "Linux I/O多路复用" 一文中讨论过了, 阅读全文
posted @ 2017-02-13 11:30 Abnor 编辑
摘要:异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资源可用时,驱动会主动通知指定的应用程序,和应用层的"信号"相对应,这里使用的是信号" SIGIO "。操作步骤是 1. 应用层程序将自己注册为接收来自设备文件的SIGIO信号的进程 2. 驱动实现相应的接口,以期具有向所有注册 阅读全文
posted @ 2017-02-12 08:36 Abnor 编辑
摘要:DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率 阅读全文
posted @ 2017-02-11 15:15 Abnor 编辑
摘要:ARM是对内存空间和IO空间统一编址的,所以,通过读写SFR来控制硬件也就变成了通过读写相应的SFR地址来控制硬件。这部分地址也被称为 I/O内存 。x86中对I/O地址和内存地址是分开编址的,这样的IO地址被称为 I/O端口 。本文只讨论IO内存的访问 IO内存访问流程 我们知道,为了管理最重要的 阅读全文
posted @ 2017-02-11 13:03 Abnor 编辑
摘要:先上基础,下图是Linux的内存映射模型 1. 每一个进程都有自己的进程空间,进程空间的0 3G是用户空间,3G 4G是内核空间 2. 每个进程的用户空间不在同一个物理内存页,但是所有的进程的内核空间对应同样的物理地址 3. vmalloc分配的地址可以高端内存,也可以是低端内存 4. 0 896M 阅读全文
posted @ 2017-02-11 12:01 Abnor 编辑