linux字符设备驱动程序--创建设备节点 基于4.14内核,运行在beagleBone green 在上一讲中,我们写了第一个linux设备驱动程序--hello_world,在驱动程序中,我们什么也没有做,仅仅是打印了两条日志消息,今天,我们就要丰富这个设备驱动程序,在/dev目录下创建一个设备节点,用户通过读写文件来与内核进行交互. 预备知识 在linux中,一切皆文件,不管用户是控制某个外设又或者是操作I/O,都是通过文件实现. 设备驱动程序被装载在内核中运行,当用户程序需要使用对应设备…
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing with Device Drivers  Device drivers in user space 用户空间中的设备驱动程序 在开始编写设备驱动程序之前,请暂停片刻,考虑是否确实有必要.对于许多常见类型的设备,有通用的设备驱动程序,允许您直接从用户空间与硬件交互,而不必编写一行内核代码.用户空间代码…
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件.#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件.#include <mach/***.h> 是在linux-2.6.29/arch/ar…
linux sysfs文件系统 本文部分内容参考自官方文档 自2.6版本开始,linux内核开始使用sysfs文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整. 与ext系列和fat等文件系统不同的是,sysfs是一个系统在启动时构建在内存中虚拟文件系统,一般被挂载在/sys目录下,既然是存储在内存中,自然掉电不保存,不能存储用户数据. 事实上,在之前也有同样的虚拟文件系统建立了内核与用户系统信息的交互,它就是procfs,但是procfs并非…
linux 串行通信接口驱动框架 在学习linux内核驱动时,不论是看linux相关的书籍,又或者是直接看linux的源码,总是能在linux中看到各种各样的框架,linux内核极其庞杂,linux各种框架理解起来并不容易,如果直接硬着头皮死记硬背,意义也不大. 博主学习东西一直秉持着追本溯源的态度,要弄清一个东西是怎么样的,如果能够了解它的发展,了解它为什么会变成这样,理解起来就非常简单了.抓住主干,沿着线头就可以将整个框架慢慢梳理清楚. 从i2c开始 在嵌入式中,不管是单片机还是单板机,i2…
linux 中bus驱动解析 总线(bus)是linux发展过程中抽象出来的一种设备模型,为了统一管理所有的设备,内核中每个设备都会被挂载在总线上,这个bus可以是对应硬件的bus(i2c bus.spi bus).可以是虚拟bus(platform bus). 简述bus的工作流程 bus将所有挂在上面的具体设备抽象成两部分,driver和device. driver实现了同类型设备的驱动程序实现,而device则向系统注册具体的设备需要的资源,每当添加一个新的driver(device)到b…
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经常用到等待队列. 一.阻塞与非阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回. 非阻塞指不能立刻得到结果之前,该函数不会阻塞当前进程,而会立刻返回. 对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但并不是一一对应的.阻塞对象上可以有非阻塞的调用方式,我…
Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #include <linux/module.h> // 声明模块的许可证书 MODULE_LICENSE("Dual BSD/GPL"); static __init hello_init(void) { // KERN_ALERT表示的是日志级别 printk(KERN_ALERT &…
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模块却只是预先注册自己以便服务于将来的某个请求,然后初始化函数立即结束.即模块初始化函数(hello_init)的任务就是为以后调用模块函数预先做准备.模块的退出函数(hello_exit)将在模块被卸载之前调用. 这和事件驱动编程有点类似,但不是所有的应用程序都是事件驱动的,而每个内核模块都是这样的…
linux设备驱动程序-i2c(2)-adapter和设备树的解析 (注: 基于beagle bone green开发板,linux4.14内核版本) 在本系列linux内核i2c框架的前两篇,分别讲了: linux设备驱动程序-i2c(0)-i2c设备驱动源码实现 linux设备驱动程序-i2c(1):i2c总线的添加与实现 而在linux设备驱动程序--串行通信驱动框架分析中,讲到linux内核中串行通信驱动框架大体分为三层: 应用层(用户空间接口操作) 驱动层(包含总线.i2c-core的…