linux驱动
文章平均质量分 82
WythePlus
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux驱动开发:锁与上下文的核心心法
是开发者最核心的两个“心法”。如果选错了锁,轻则性能下降,重则导致死锁或系统崩溃(Panic)。在 Linux 中,代码要么在为“人”(进程)工作,要么在为“事”(硬件中断)工作。在原子上下文中,任何可能导致放弃 CPU 的行为(如。软中断/Tasklet (SoftIRQ/Tasklet)锁的粒度 (Lock Granularity)锁的临界区里有 I/O 或内存申请吗?必须防止多核竞争 + 本地硬中断重入。提高读取的并发性能,减少缓存颠簸。当你习惯了基本的锁,就要开始从。都属于原子上下文,同时,原创 2026-05-29 14:54:50 · 23 阅读 · 0 评论 -
MTK崩溃日志分析全攻略
解析完成后,MediatekDBViewer 通常会自动跳转到一个新的分析界面(有时是调用浏览器打开一个本地生成的 HTML 报告页面)。如果你的设备正处于异常状态并连接着 USB(且开启了 ADB),你可以直接点击这个按钮,工具会尝试自动从设备端抓取当前的 DB 文件或常规日志,省去了手动输入。符号表的匹配问题,现在 GAT 已经完美地将原本枯燥的十六进制内存地址,还原成了清晰的 C 语言函数调用栈(Call Stack)。(底部的序号大,是最早执行的函数;顶部的序号小,是最后导致崩溃的函数)。原创 2026-05-29 09:38:22 · 383 阅读 · 0 评论 -
MTK8766 Camera调试全攻略
MTK 平台有时需要手动配置物理 Lane 和逻辑 Lane 的交叉映射(Mapping),如果 D-Lane 0 接到了 SoC 的 D-Lane 1,会导致同步失败。确认是否有正确的 ISP Tuning 效果文件。通常有四种组合(None, Mirror, Flip, Mirror+Flip)。1. 检查曝光增益(Exposure/Gain)的初始设置。ID 读到后,如果无法预览,通常是 MIPI 配置问题。MIPI 电气特性差、V-Blank 设得太小。供电不足、MCLK 无输出、RST 未拉高。原创 2026-05-28 14:31:05 · 85 阅读 · 0 评论 -
MTK8766触摸屏调试全攻略
MTK 拥有一套相对标准的 mtk_tpd(Touch Panel Driver)框架,虽然在 Android 14/GKI 架构下驱动位置可能有所迁移,但逻辑核心保持不变。在 kernel-x.x/arch/arm64/boot/dts/mediatek/ 下找到对应的项目文件。在 MTK 8766 平台上,触摸屏(TP, Touch Panel)的调试通常基于。测量电压是否稳定,纹波是否过大(影响报点精度)。检查上拉电阻(通常 2.2K 或 4.7K)。驱动加载时需有“高-低-高”的复位动作。原创 2026-05-28 14:22:56 · 163 阅读 · 0 评论 -
Linux内核锁机制:自旋与睡眠的智慧
当 CPU 0 修改了某个变量,而 CPU 1 的缓存里也有这个变量时,硬件是如何同步的?它根据任务的优先级和虚拟运行时间,精确决定下一个微秒该轮到谁跑。在 Linux 内核中,所有的同步原语都可以归为这两大阵营。Linux 并不是把所有程序揉在一起处理,而是采用了**“分而治之”**的策略。当拿不到锁时,CPU 是在“原地打转”还是“倒头就睡”。最后,我们要把软件的锁和硬件的 Cache 联系起来。是的,每个 CPU 都有自己的缓存。M (Modified, 已修改)I (Invalid, 无效)原创 2026-05-27 10:30:50 · 349 阅读 · 0 评论 -
自旋锁vs信号量:内核同步机制全解析
Tasklet 的实现是 Linux 内核“延迟执行”机制的一个经典案例。3.需要多核并行处理海量数据(如高性能网络协议栈)信号量 (semaphore) / 互斥锁 (mutex)触发 Cache 一致性流量(MESI 协议)可以很长(涉及磁盘 I/O、人工输入等)4.涉及阻塞操作(磁盘、信号量)这是“原地等待”与“挂起休眠”的区别。进入睡眠(让出 CPU,放入等待队列)极低(仅几次原子操作),但占满 CPU。数据量大,但需要快速响应,且不需要休眠。物理层面(不共享,但可路由)原创 2026-05-27 10:13:28 · 31 阅读 · 0 评论 -
Linux锁机制:从软件到硬件的深度解析
如果你在拿锁(M 状态)后被中断打断,而中断处理程序也想拿这把锁,它会发现 Cache Line 锁死在当前核心的“写缓冲区”里,但它自己又无法执行完成,这就形成了。Cache(缓存)和内存一致性(Memory Consistency)三个维度来分析,你会发现这些“锁”本质上是在不同层级上对电子信号流动的管控。为了性能,CPU 可能先执行“存入数据”指令,后执行“释放锁”指令。这在多核环境下是灾难性的。:触发原子指令(CAS/LL/SC),涉及跨核的“缓存行”争夺。锁的层次决定了你是在跟谁“抢”资源。原创 2026-05-27 09:59:36 · 24 阅读 · 0 评论 -
多核CPU关中断的致命陷阱
的内核中,抢占可以发生在任务运行的任何时刻。的硬件中断信号(如时钟中断、硬盘读写完成、网卡报文到达等)。键盘、网络等数据包会堆积在硬件缓冲区,等待开启中断后处理。闭上眼睛,不管外面发生什么硬件信号,都不要打断我。Linux 内核的调度(进程切换)很大程度上依赖于。关中断后,这些通往调度器的信号全部被切断。CPU 0 关中断,CPU 1 照常运行。当前进程会独占 CPU,直到它主动开中断。(节拍数)停止更新(直到重新开启)。时钟中断(Timer Tick)CPU 1 依然能正常接收中断。当前核心的进程调度。原创 2026-05-26 16:35:18 · 30 阅读 · 0 评论 -
多核环境下的锁机制本质解析
为了在多核(SMP)环境下,保护共享资源不被来自不同时空(跨核、跨进程、跨中断)的访问者同时破坏。本地中断 (Local Interrupt) —— [时间维度/硬件级]本质关系:在中断上下文共享数据时,必须同时使用自旋锁和关中断。们之间不是孤立的,而是一层套一层的“防护罩”。:同一个核上的“自己等自己”,死锁(Deadlock)。彻底封闭当前核,并拦截其他核访问。不具备多核保护能力。[多核锁] + [关中断] + [禁抢占]仅防范其他核访问,允许被当前核的中断打断。仅防范当前核被其他任务换走,允许中断。原创 2026-05-26 16:17:35 · 19 阅读 · 0 评论 -
Linux内核同步机制:从抢占控制到多核锁的深度解析
/ 1. 保存当前 CPU 中断寄存器状态,并执行汇编指令关中断 (cli) raw_local_irq_save(flags);// 3. 尝试原子操作修改锁变量,拿不到就死循环 (Spinning) arch_spin_lock(&lock->raw_lock);spin_lock_irqsave = 保存中断状态 + 关闭本地中断 + 禁止抢占 + 获取多核锁。访问 Per-CPU 数据,且不涉及中断。保存状态 + 关中断 + 获取锁。明确知道当前中断是开着的。注意:这只影响当前核。原创 2026-05-26 16:07:36 · 26 阅读 · 0 评论 -
Linux内核栈切换:用户态与内核态的秘密
在 ARM64(AArch64)架构下,逻辑与 x86 类似,但硬件实现的细节有显著差异。这样的指令,这其实是内核在用户态和内核态切换时,通过特殊的系统寄存器来管理不同特权级下的栈指针。理解 Linux 内核的栈切换,关键在于区分“谁在切换”这是进程调度发生的时刻,此时 CPU 已经在内核态。这是由硬件异步触发的切换(如时钟中断、键盘输入)。内核态寄存器 (Callee-saved)在 ARM64 内核代码中,你会经常看到。内核栈 (Kernel Stack)寄存器在找内核栈时的特殊作用。原创 2026-05-25 09:42:50 · 31 阅读 · 0 评论 -
Linux内核的I2C读写寄存器
在日常I2C设备驱动开发过程,经常要对设备进行一些简单寄存器读写,可以利用以下函数进行封装。原创 2023-09-15 10:42:54 · 1312 阅读 · 0 评论 -
Linux驱动I2C设备驱动
I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接集成电路(IC)之间进行数据传输。它由两根线组成:时钟线(SCL)和数据线(SDA)。I2C设备则是指使用I2C协议进行通信的各种外部硬件设备。I2C设备可以是各种芯片、传感器、存储器、扩展模块等。这些设备通过I2C总线与主控制器或其他设备进行连接,并通过发送和接收数据来实现通信和交互。每个I2C设备都有一个唯一的7位或10位地址,用于在总线上识别它。原创 2023-08-25 14:14:06 · 348 阅读 · 0 评论 -
摄像头初始化时序
DVP(Digital Video Port)接口是一种常用于摄像头模块和处理器之间的数字视频传输接口。它被广泛应用于嵌入式系统中,包括智能手机、平板电脑、工业视觉等领域。DVP接口使用平行数据传输方式,通过多个数据线同时传输视频像素数据,具有高带宽和低延迟的特点。它通常由以下几个信号线组成:1. D0-D7(Data0-Data7):D0至D7是并行数据线,负责传输视频像素的数字数据。数据位数可以根据使用的摄像头模块而变化,常见的有8位(RGB888)或10位(RAW10)。原创 2023-07-21 17:40:59 · 2869 阅读 · 0 评论 -
Linux内核读取IO内存物理地址
1.IO端口与IO内存IO端口和IO内存是计算机系统中用于实现输入输出(I/O)操作的两种方式。IO端口是一组特殊的寄存器,通过向这些寄存器写入或读取数据,可以控制设备进行输入输出操作。在x86架构的计算机中,通常有64KB的IO地址空间,其中前1024个I/O端口被保留用于系统使用。IO内存则是指一段专门用来进行I/O操作的物理内存区域,与普通内存不同,这段内存被映射到了设备控制器上。在使用I/O内存时,需要先将该段内存映射到一个虚拟地址空间上,并且必须遵循特定的访问规则才能进行有效的读写操作。原创 2023-07-21 11:00:17 · 1323 阅读 · 0 评论 -
内核input子系统分析
Linux内核的输入子系统分为三层,分别为事件处理层、核心层、驱动层通常是输入设备驱动,如触摸屏TP、按键驱动等;接收到底层中断时,主动上报数据,将底层的硬件输入转化为统一事件形式,想输入核心(Input Core)汇报。是由Linux内核发布时已经写好的,它承上启下为驱动层提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息。原创 2023-07-20 17:16:41 · 244 阅读 · 0 评论 -
/dev、/sys/devices 和 /sys/dev 之间区别
/dev,设备文件存储目录,应用程序通过对这些文件的读写和控制,可以访问实际的设备;/sys/devices 目录,按照设备挂接的总线类型,组织成层次结构,保存了系统所有的设备;是文件系统管理设备的最重要的目录结构;这是内核设备按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构转载 2016-03-28 15:57:16 · 795 阅读 · 0 评论 -
linux内核串口控制器注册以及收发
我们看到Linux dev目录下面ttyS系列的串口设备的终端,现在用一个uart 控制器的程序来分析下怎么实现的首先是定义了uart driverstatic struct uart_driver XX_uart_driver = {.owner = THIS_MODULE,.driver_name = XX_UART_DEV_NAME, //名字,实际是uart.d原创 2016-03-29 11:19:34 · 1845 阅读 · 0 评论 -
linux的内建函数
转自: http://blog.sina.com.cn/s/blog_4b8ad9530100cl2v.html内建函数是与语言相关的(或者更准确地说是编译器相关吧),作用应该是跟关键字一样,无需申明,编译器就知道它是什么东西。同样,无需#include任何头文件,只要语法符合,编译器就知道去哪儿链接相关代码!另外,如果显式申明的函数与内建函数同名,内建函数将会转载 2016-03-28 18:59:16 · 611 阅读 · 0 评论 -
字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
学习Linux设备驱动开发的过程中自然会遇到字符设备驱动、平台设备驱动、设备驱动模型和sysfs等相关概念和技术。对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了。要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码。网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析。对于开发者而言,能够转载 2016-03-28 16:00:28 · 628 阅读 · 0 评论 -
file结构中的private_data
这个是Linux下连接VFS文件系统框架和不同文件/文件系统底层实现之间的一个核心数据结构,虽然它只是一个指针,但是一个指针可以解决所有问题。我们回想一下用户态线程的创建结构,函数的入口同样是一个void*指针,而千言万语汇成一根指针,诗可以兴、可以观、可以群、可以怨,可以解决所有问题。因为file是VFS框架的一个基本概念,它要支持文件操作结构,例如open/read/write/relea转载 2016-03-28 16:13:21 · 1400 阅读 · 0 评论 -
Linux下面一个简单的虚拟platform驱动
/* * Yao.GUET * http://blog.csdn.net/Yao_GUET * Linux下面一个简单的虚拟platform驱动 */在Linux之中,约定如果设备不属于任何的总线,则可以把它注册为虚拟的platform设备。下面就简单来学习一下一个简单的platform设备是怎么创建出来的。一般注册platform驱动的步骤是转载 2016-03-28 15:59:33 · 431 阅读 · 0 评论 -
linux /sys目录下各个子目录的具体说明
/sys下的子目录内容 # ls /sys/block class firmware kernel powerbus devices fs module-----------------------------------------------------------------------------转载 2016-03-28 15:58:14 · 1050 阅读 · 0 评论 -
linux notification内核通知链
/******linux notification内核通知链***********/linux/notifier.h //内核中的一处来告知内核另一处某事件的发生,并执行注册的struct notifier_block { //notifier_call方法。 int (*notifier_call)(struct notifier_block *self,unsigned原创 2016-03-25 17:34:22 · 815 阅读 · 0 评论 -
imx6设备树pinctrl解析
最近在移植linux,用到kernel版本为3.14.28,在高版本的内核源码中用到了设备树(device-tree),设备树中用到pinctrl的配置,记录一下。1、普通设置在配置串口时,pinctrl的配置信息如下所示:[cpp] view plain copy&uart2 { pinctrl-nam转载 2016-03-25 14:52:57 · 909 阅读 · 0 评论 -
Linux芯片级移植与底层驱动(基于3.7.4内核)
1. SoC Linux底层驱动的组成和现状为了让Linux在一个全新的ARM SoC上运行,需要提供大量的底层支撑,如定时器节拍、中断控制器、SMP启动、CPU hotplug以及底层的GPIO、clock、pinctrl和DMA硬件的封装等。定时器节拍、中断控制器、SMP启动和CPU hotplug这几部分相对来说没有像早期GPIO、clock、pinctrl和DMA的实现那么杂乱转载 2016-03-25 14:56:48 · 1007 阅读 · 0 评论 -
linux驱动开发 主设备号与次设备号
一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设备号就分别表示两个LED灯。1.主设备号和转载 2016-03-25 14:58:36 · 1084 阅读 · 0 评论 -
Linux设备驱动之I2C架构分析
一:前言I2c是philips提出的外设总线.I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL.正因为这样,它方便了工程人员的布线.另外,I2C是一种多主机控制总线.它和USB总线不同,USB是基于master-slave机制,任何设备的通信必须由主机发起才可以.而I2C 是基于multi master机制.一同总线上可允许多个master.关于I2C协议的知识,这里不再赘述.可自转载 2016-03-25 15:04:06 · 688 阅读 · 0 评论 -
LINUX时间管理
实时时钟系统定时器纳秒微妙毫 秒延迟必须是短延迟时间过长会报错长延迟时间管理在内核中占有非常重要的地位。相对于事件驱动,内核中有大量的函数都是基于时间驱动的。内核必须管理系统的运行时间以及当前的日期和时间。首先搞清楚RTC在kernel内的作用:linux系统有两个时钟:实时时钟和系统定时器实时时钟 一个是由纽扣电池供电的“Real Time Cl转载 2016-03-25 15:43:06 · 607 阅读 · 0 评论 -
preempt_enable 和 preempt_disable
允许抢占和禁止抢占。例如:内核态程序 和 中断处理程序的互斥因为中断是异步的(不只要何时发生中断,也即随时可能发生中断),因此如果内核态的程序使用了和中断处理程序中相同的数据结构,那么必须进行互斥访问。load %r0, counteradd %r0,1 //发生中断store %r0,conter如果在第二条指令执行转载 2016-03-25 16:27:52 · 768 阅读 · 0 评论 -
linux高端内存映射
1 内核空间和用户空间 用户空间:在Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB的虚存地址是用户空间,通过每个进程自己的页目录、页表,用户进程可以直接访问。内核空间:从3GB到4GB的虚存地址为内核态空间,存放供内核访问的代码和数据,用户态进程不能访问,只有内核态进程才能寻址。所有进程从3GB到4GB的虚拟空间都是一样的,linux以此方式让内核态转载 2016-03-25 16:31:55 · 860 阅读 · 0 评论 -
内核中断,异常,抢占总结
内核中断,异常,抢占总结篇一、基本概念中断分为同步中断和异步中断。同步中断是由CPU控制单元产生的,“同步”是指只有在一条指令执行完毕后,CPU才会发出中断,而不是发生在代码指令执行期间,比如系统调用。而异步中断是由其他硬件设备依照CPU时钟信号产生的,即意味着中断能够在指令之间发生,例如键盘中断。按照Intel的微处理器手册,同步中断和异步中断也分别称为异常(或者软件中断转载 2016-03-25 16:46:33 · 672 阅读 · 0 评论 -
Linux中断研究
ARM里的中断通常是指IRQ和FIQ,以IRQ来讲,ARM对IRQ的处理过程大概是这样: 外部设备遇到某一事件发出一个IRQ中断给中断控制器,中断控制器对这个IRQ进行硬件上的处理,把一些信息记在中断控制器的寄存器上,然后中断控制器通过IRQ中断线给ARM发一个信号。ARM收到信号,开始进行以下处理: (1)将当前状态的cpsr拷贝到IRQ状态的spsr中。 (2)将pc拷贝到I转载 2016-03-25 16:48:49 · 805 阅读 · 0 评论 -
linux tasklet和workqueue的应用情景
当前的2.6版内核中,有三种可能的选择:softirq、tasklet和work queue。 tasklet基于softirq实现,所以两者很相近。work queue与它们完全不同,它靠内核线程实现。1、softirq 软中断支持SMP,同一个softirq可以在不同的CPU上同时运行,softirq必须是可重入的。软中断是在编译期间静态分配的,它不像tasklet那样能被转载 2016-03-25 16:49:57 · 639 阅读 · 0 评论 -
ARM寄存器介绍
一、ARM工作状态下的寄存器组织通用寄存器:通用寄存器包括R0~R15,可以分为三类: ─ 未分组寄存器R0~R7,8个 ─ 分组寄存器R8~R14,22个 ─ 程序计数器PC(R15),1个未分组寄存器R0~R7: 在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异转载 2016-04-01 10:07:45 · 1376 阅读 · 0 评论 -
kernel thread与进程描述符
/***********kernel thread的创建*****************/#include //wake_up_process()#include //kthread_creat,kthread_run()#include //IS_ERR(),PTR_ERR()struct task_struct *kthread_create(i原创 2016-03-25 17:35:59 · 661 阅读 · 0 评论 -
十种软件滤波方法
十种软件滤波方法1、限幅滤波法 A、方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值答题本次值 B、优点 能有效克服因偶然因素引起的忙冲干扰原创 2016-03-25 17:38:39 · 930 阅读 · 0 评论 -
Linux设备模型 device resource
1: 2: static int __init mx1_camera_probe(struct platform_device *pdev) 3: { 4: ... 5: 6: res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 7: irq = platform_原创 2016-03-25 17:44:04 · 1630 阅读 · 0 评论 -
Linux内核时间管理相关的接口
在内核经常会碰到一些要定时调度的任务,可以用timer处理,下面来看看都有哪些接口,/*******************************************************************/linux/param.hHZ;//宏,每秒定时器中断的次数,也即是系统每秒节拍或称滴答数linux/sched.h;包含了linux/jiffies.h原创 2016-03-28 10:59:50 · 564 阅读 · 0 评论 -
MTK 平台Camera 驱动架构
android 将系统大致分为应用层、库文件和硬 件抽象层、Linux 内核三层。在底层的内核空间,Camera 的driver 将其驱动起来以后,将硬 件驱动的接口交给硬件抽象层,android 上层的Camera 应用程序在android 实时系统中的虚 拟机中,加载android 留给Camera 公用的一些库文件,调用硬件抽象层的接口来控制Camera 硬件来实现功能。当然,如果是Ra原创 2016-03-28 11:11:59 · 4779 阅读 · 0 评论
分享