Linux I2C驱动通用框架和编写细节 I2C子系统架构 I2C子系统采用分层设计: I2C核心层 提供总线协议实现、设备注册/注销、总线通信接口(如i2c_transfer) struct i2c_adapter:抽象化的I2C控制器 struct i2c_client:连接到总线的I2C从机 管理适配器和设备,提供用户空间接口(/dev/i2c-*) I2C总线驱动 控制物理I2C控制器硬件,实现底层时序和寄存器控制 填 2025-04-01 嵌入式(Linux开发)
Linux Input设备通用驱动框架 Input子系统架构 1234567891011121314151617+-----------------------+| 用户空间 ||-----------------------|| /dev/input/eventX | <- 应用程序通过读取这些设备文件获取输入事件+-----------------------+ ↑+-- 2025-03-31 嵌入式(Linux开发)
Linux线程(一)基本概念 基本概念 进程:资源管理的最小单位 线程:程序执行的最小单位 每个进程拥有自己的数据段、代码段和堆栈段。 线程通常叫做轻型的进程,包含独立的栈和CPU寄存器状态。线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源。 线程和进程比起来很小,相对来说线程花费更少的CPU资源。 更形象一点: 进程是资源的管理单位 进程就像一个工厂,里面有自己的设备(CPU、内存、文件、网络连接等) 2025-03-31 Linux 线程
Linux Platform驱动通用框架 设备树 Platform驱动需要读取设备树中的compatible信息用于of_match_table进行匹配: 12345678910/* Custom LED pinctrl */gpioled { #address-cells = <1>; #size-cells = <1>; compatible = "custom-gpioled" 2025-03-28 嵌入式(Linux开发)
Linux文件描述符 文件描述符(file descriptor) 我们知道在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件的时候,我们每操作一次就找一次名字,这会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引,这样要操作文件的时候,我们直接找到索引就可以对其进行操作了。 文件描述符(file descriptor)就是内核为了高效管 2025-03-26 嵌入式(Linux开发)
Linux阻塞、非阻塞与异步通知 阻塞IO 阻塞状态下应用程序从驱动读取函数时,若kernel回报设备不可用,应用程序对应的线程将会进入睡眠,等待设备可用后由设备通知应用程序并将其唤醒以继续执行。 Linux依靠等待队列(wait queue)来进行进程同步,其允许进程在某个条件满足前进入睡眠,并在条件满足时由驱动进行唤醒,避免CPU忙等。 等待队列 基本的等待队列包括: 事件(event):通常是 硬件中断、数据可用 或 2025-03-26 嵌入式(Linux开发)
Linux中断机制 设备树中断信息节点 IMX6ULL和IMX6UL的中断控制器呈兼容关系,即IMX6ULL继承IMX6UL的GIC节点信息。在imx6ul.dtsi中有: 12345678910111213141516171819intc: interrupt-controller@a01000 { compatible = "arm,gic-400", "arm,cort 2025-03-26 嵌入式(Linux开发)
Linux内核定时器 新版本Kernel下定时器API得到了比较好的优化,以正点原子阿尔法基于4.4版本kernel的旧版API为例做对比: 定时器回调函数: 旧版: 12345678void timer_function(unsigned long arg) { struct timer_dev *dev = (struct timer_dev *)arg; static int sta = 1; /* 2025-03-26 嵌入式(Linux开发)
Linux并发与竞争 原子操作 原子操作能够在无锁条件下实现线程安全操作,避免多个线程同时修改变量导致数据竞争。比较适用于简单的计数或标志变量等小型共享数据。但是原子操作只能保证单个原子变量的原子性,不能保护复杂数据结构。并且虽然其不会导致线程阻塞,但可能导致活锁,即多个线程不断重试并竞争CPU资源。 驱动中通过原子操作来保护进程的方式为: 在设备结构体中声明原子变量 1234struct gpioled_dev 2025-03-24 嵌入式(Linux开发)
Linux字符设备驱动框架 字符设备 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。 字符设备驱动工作流程 加载/卸载驱动模块 Linux的驱动有两种工作方式: 驱动编译进kernel,kernel启动时自动运行驱动程序 驱动编译为模块( 2025-03-14 嵌入式(Linux开发)