linux kernel
文章平均质量分 90
雪饼android之路
这个作者很懒,什么都没留下…
展开
-
linux cpufreq framework(4)_cpufreq governor
最后,我们介绍一下kernel中常见的cpufreq governor。性能优先的governor,直接将cpu频率设置为policy->{min,max}中的最大值。功耗优先的governor,直接将cpu频率设置为policy->{min,max}中的最小值。由用户空间程序通过scaling_setspeed文件修改频率。4)Ondemand根据CPU的当前使用率,动态的调节CPU频率。类似Ondemand,不过频率调节的会平滑一下,不会忽然调整为最大值,又忽然调整为最小值。转载 2024-02-23 22:00:00 · 115 阅读 · 0 评论 -
linux cpufreq framework(3)_cpufreq core
前文(Linux cpufreq framework(2)_cpufreq driver)从平台驱动工程师的角度,简单的介绍了编写一个cpufreq driver的大概步骤。但要更深入理解、更灵活的使用,必须理解其内部的实现逻辑。因此,本文将从cpufreq framework core的角度,对cpufreq framework的内部实现做一个简单的分析。转载 2024-02-21 23:00:00 · 91 阅读 · 0 评论 -
Linux cpufreq framework(2)_cpufreq driver
本文从平台驱动工程师的角度,介绍怎么编写cpufreq驱动。转载 2024-02-20 23:45:00 · 99 阅读 · 0 评论 -
linux cpufreq framework(1)_概述
本文介绍了cpufreq framework的基本情况,后面通过以下的文章,分析其它内容:linux cpufreq framework(2)_cpufreq driver,从平台驱动工程师的角度,介绍怎么编写cpufreq驱动;linux cpufreq framework(3)_cpufreq core,分析cpufreq的内部实现,并总结cpufreq提供的sysfs接口,介绍怎么通过sysfs,控制系统的调频行为;转载 2024-02-20 20:45:00 · 96 阅读 · 0 评论 -
Linux电源管理(14)_PM OPP Interface
当前复杂的SoCs都包括多个协同工作的子模块。根据具体的应用场景,很多子模块(蜗蜗注:典型的例子是 CPU )并不需要一直工作在最高的频率上。因此SoC中的子模块划分为不同的domains,允许一些domains在较低的电压 / 频率下工作,而另一些在较高的电压 / 频率下工作。domain中的设备支持的所有频率和电压的组合,称作Operating Performance Points,简称为OPPs。注1:为什么一定是频率和电压的组合?因为频率高低决定器件的工作性能,降低性能的目的是节省功耗。转载 2024-02-03 00:00:00 · 126 阅读 · 1 评论 -
Linux电源管理(12)_从设备驱动的角度看电源管理
相信工作稍微久一点的linux驱动工程师都深有体会:在旧时光里,实现某一个设备的电源管理功能,是非常简单的一件事情。大多数设备都被抽象为platform设备,driver只需要提供suspend/resume/shutdown等回调函数,并注册到kernel即可。kernel会在系统电源状态切换的过程中,调用driver提供的回调函数,切换设备的电源状态。但是在新时代中,设备电源管理有关的操作,被统一封装在struct dev_pm_ops结构中了。转载 2024-01-23 23:00:00 · 233 阅读 · 0 评论 -
Linux时间子系统之(一):时间的基本概念
1、时间和空间以及相对性有没有绝对时间的概念呢?时间是否是独立于一切存在的呢?相信有绝对时间的存在比较符合人类的思维,也就是说,有一根绝对时间轴存在,任何事件都可以投射在这个时间轴的某个点上,不论观察者处于什么状态,大家共享一个绝对的时间轴。在这样的时间框架下,同时的概念是绝对的,只要发生在时间轴的同一点上,那么两个事件就是同时发生。如果两个事件不同时发生,那么他们之间的间隔也是绝对的,所有感知到的时间间隔都是相同的。与之相对的是绝对空间的概念。转载 2023-12-25 23:00:00 · 42 阅读 · 0 评论 -
Linux cpuidle framework(4)_menu governor
本文以menu governor为例,进一步理解cpuidle framework中governor的概念,并学习governor的实现方法。在当前的kernel中,有2个governor,分别为ladder和menu(蜗蜗试图理解和查找,为什么会叫这两个名字,暂时还没有答案)。ladder在periodic timer tick system中使用,menu在tickless system中使用。注:有关periodic timer tick和tickless的知识,可参考本站时间子系统的系列文章。转载 2023-12-22 23:00:00 · 69 阅读 · 0 评论 -
Linux cpuidle framework(3)_ARM64 generic CPU idle driver
本文以ARM64平台下的cpuidle driver为例,说明怎样在cpuidle framework的框架下,编写cpuidle driver。另外,本文在描述cpuidle driver的同时,会涉及到CPU hotplug的概念,因此也可作为CPU hotplug的引子。转载 2023-12-21 23:00:00 · 82 阅读 · 0 评论 -
Linux cpuidle framework(2)_cpuidle core
cpuidle core是cpuidle framework的核心模块,负责抽象出cpuidle device、cpuidle driver和cpuidle governor三个实体,并提供如下功能(可参考“Linux cpuidle framework(1)_概述和软件架构”中的软件架构):1)向底层的cpuidle driver模块提供cpudile device和cpuidle driver的注册/注销接口。2)向cpuidle governors提供governor的注册接口。转载 2023-12-19 23:00:00 · 86 阅读 · 0 评论 -
Linux cpuidle framework(1)_概述和软件架构
2: {4: }以蜗蜗之前使用过的一个ARM926的单核CPU为例(内核版本为Linux2.6.23),cpuidle的处理过程是:;系统初始化完成后,将第一个进程(init)变为idle进程,;以下都是在进程的循环中,周而复始…WFI指令虽然简单,却包含了idle处理的两个重点:1)idle进程idle进程的存在,是为了解决“何时idle”的问题。我们知道,Linux系统运行的基础是进程调度,而所有进程都不再运行时,称作cpu idle。但是,怎么判断这种状态呢?转载 2023-12-18 23:00:00 · 52 阅读 · 0 评论 -
CPU idle framework_ARM WFI和WFE指令
在 ARM 架构中,WFI(Wait For Interrupt)和 WFE(Wait For Event)是两个指令,用于处理器的低功耗和休眠模式。WFI 指令用于将处理器进入低功耗模式,直到中断信号到来时才被唤醒。当执行 WFI 指令时,处理器将停止指令的执行,停止取指,并且进入休眠状态。当一个中断被触发时(如外部中断、定时器中断等),处理器会退出低功耗模式,继续执行后续指令。WFE 指令用于将处理器进入低功耗模式,直到某个事件发生时才被唤醒。原创 2023-12-12 23:00:00 · 1214 阅读 · 0 评论 -
Linux common clock framework(3)_实现逻辑分析
和fixed rate类似,不再一一说明。转载 2023-12-05 23:45:00 · 151 阅读 · 0 评论 -
Linux common clock framework(2)_clock provider
我们在上面提到了clock provider的两种DTS定义方式,哪一种好呢?从规范化、条理性的角度,毫无疑问方式2是好的,它真正理解了Device Tree的精髓,并细致的执行。且可以利用很多clock framework的标准实现(后面会讲)。而方式1的优点是,DTS容易写,相应的clock driver也较为直观,只是注册一个一个clock provider即可,没有什么逻辑可言。换句话说,方式1比较懒。后面的API描述,蜗蜗会着重从方式2的角度,因为这样才能体会到软件设计中的美学。转载 2023-12-03 17:49:40 · 77 阅读 · 0 评论 -
Linux common clock framework(1)_概述
如今,可运行Linux的主流处理器平台,都有非常复杂的clock tree,我们随便拿一个处理器的spec,查看clock相关的章节,一定会有一个非常庞大和复杂的树状图,这个图由clock相关的器件,以及这些器件输出的clock组成。下图是一个示例:clock相关的器件包括:用于产生clock的Oscillator(有源振荡器,也称作谐振荡器)或者Crystal(无源振荡器,也称晶振);用于倍频的PLL(锁相环,Phase Locked Loop);用于分频的divider;用于多路选择的Mux;转载 2023-11-17 23:45:00 · 197 阅读 · 0 评论 -
linux 怎么判断一个dirver有没有被加载成功
2.因为是module_platform_driver(imx_blk_ctrl_driver);就找platform。如果是module_i2s_driver那就找下面的i2s。因此去/sys/bus目录下找platform。当然如果你的driver被模块化了,你可以通过lsmod或者rmmod + 模块名字,来查看加载的模块或者移除模块。3.进入drivers以后可以看到上面代码中name = "imx-blk-ctrl"对应的文件。就是对的driver连接(probe成功到)到。原创 2023-11-17 23:00:00 · 73 阅读 · 0 评论 -
一文搞懂linux regulator子系统
Regulator指的是稳定器,有电压稳定器及电流稳定器两种,能够自动维持恒定电流或者电压。其中,电压稳定器voltage regulator在电路中比较常见。从设备驱动的角度来看,regulator的控制比较简单,主要有enable/disable/输出电压或电流大小的控制。Linux利用regulator framework对regulator进行管理和控制。转载 2023-09-11 23:00:00 · 223 阅读 · 0 评论 -
Linux Regulator Framework(2)_regulator driver
本文从regulator driver的角度,描述怎样基于regulator framework编写regulator驱动。同时,以此为契机,学习、理解regulator有关的物理特性,以便能够更好的使用它们。转载 2023-09-10 16:30:31 · 218 阅读 · 0 评论 -
Linux Regulator Framework(1)_概述
Regulator,中文名翻译为“稳定器”,在电子工程中,是voltage regulator(稳压器)或者current regulator(稳流器)的简称,指可以自动维持恒定电压(或电流)的装置。voltage regulator最早应用于功放电路中,主要用于滤除电源纹波(100或者120Hz)和噪声,以及避免“输出电压随负载的变化而变化”的情况。后来,随着IC级别的regulator的出现(便宜了),voltage regulator几乎存在于任何的电子设备中。转载 2023-09-08 23:00:00 · 156 阅读 · 0 评论 -
Linux PM QoS framework(3)_per-device PM QoS
per-device PM QoS是针对指定设备的QoS framework,背后的思考如下:在Runtime PM的框架下,当device的引用计数减为0的时候,RPM会suspend该device。不过,device进入suspend状态以及从suspend状态resume是需要消耗时间的(相关信息保存在pm domain中),而系统其它实体(如用户空间程序)可能对该设备的响应时间有要求,这就是一种形式的QoS request,称作resume_latency。转载 2023-09-03 16:42:48 · 178 阅读 · 0 评论 -
Linux PM QoS framework(2)_PM QoS class
回顾上一篇文章(Linux PM QoS framework(1)_概述和软件架构),PM QoS framework抽象出4个系统级别的QoS constraint(统称为PM QoS class),分别是cpu&dma latency、network latency、network throughput和memory bandwidth。并提供一系列的接口,动态的搜集、整理系统对这些constraint的需求情况。转载 2023-08-31 00:00:00 · 291 阅读 · 0 评论 -
Linux PM QoS framework(1)_概述和软件架构
QOS为Quality Of Service(服务质量)的简称,对PM QoS而言,表示Linux kernel电源管理相关的服务质量。那到底什么是服务质量呢?我们知道,Linux PM的主要功能,是节省功耗,但同时,会付出一定的性能代价,例如延迟(latency)增加、吞吐量(throughput)下降。可以把PM当作一种服务,把它对性能的影响,类比为服务的质量(QoS)。对性能的影响越大,QoS越低,反之越高。转载 2023-08-28 22:00:00 · 227 阅读 · 0 评论 -
Linux设备模型(9)_device resource management
一个设备能工作,需要依赖很多的外部条件,如供电、时钟等等,这些外部条件称作设备资源(device resouce)。a)power,供电。b)clock,时钟。c)memory,内存,在kernel中一般使用kzalloc分配。d) GPIO ,用户和 CPU 交换简单控制、状态等信息。e) IRQ ,触发中断。f) DMA ,无 CPU 参与情况下进行数据传输。g)虚拟地址空间,一般使用ioremap、request_region等分配。h)等等。转载 2023-08-27 17:22:33 · 52 阅读 · 0 评论 -
一文搞懂linux PM QOS
linux PM QOS(power management quality of service,服务质量)表示linux内核电源管理的质量。它是一种在功耗和性能之间做出权衡的机制,通过使用constraint(约束)作为指标,来表达各个模块对PM的需求和限制。linux PM QOS有两种框架:CPU latency QoS和per-device PM QoS。CPU latency QoS用于控制CPU的最大延迟,以保证实时性能。转载 2023-08-27 16:32:34 · 461 阅读 · 0 评论 -
一文搞懂linux power domain framework
什么是power domain framework?在搞清楚这个问题之前,有必要先弄清楚什么是power domain,以及它解决了什么问题。从字面上理解,power domain指的是电源域。SOC是由多功能模块组成的一个整体,对于工作在相同电压且功能内聚的功能模块,可以划为一个逻辑组,这样的一个逻辑组就是一个电源域。简单来说,电源域就是逻辑划分,在该逻辑划分中包含了物理实体和电源线的连接关系。电源域之间存在着包含关系,这样就是一个父子关系的电源域。电源域也存在着兄弟关系,这样就是同一级的电源域。转载 2023-08-22 19:04:20 · 255 阅读 · 0 评论 -
Linux PM domain framework(1)_概述和使用流程
在复杂的片上系统(SOC)中,设计者一般会将系统的供电分为多个独立的block,这称作电源域(Power Domain),这样做有很多好处,例如:1)将不同功能模块的供电分开,减小相互之间的干扰(如模拟和数字分开)。2)不同功能所需的电压大小不同:小电压能量损耗低,但对信号质量的要求较高;大电压能量损耗高,对信号质量的要求较低。因此可以根据实际情况,使用不同的电压供电,例如CPU core只需1.2v左右即可,而大部分的I/O则需要3.3v左右。转载 2023-08-16 23:00:00 · 309 阅读 · 0 评论 -
Linux电源管理(9)_wakelocks
wakelocks最初出现在Android为linux kernel打的一个补丁集上,该补丁集实现了一个名称为“wakelocks”的系统调用,该系统调用允许调用者阻止系统进入低功耗模式(如idle、suspend等)。同时,该补丁集更改了Linux kernel原生的电源管理执行过程(kernel/power/main.c中的state_show和state_store),转而执行自定义的state_show、state_store。这种做法是相当不规范的,它是典型的只求实现功能,不择手段。转载 2023-07-31 22:30:00 · 309 阅读 · 0 评论 -
Linux电源管理(8)_Wakeup count功能
Wakeup count是Wakeup events framework的组成部分,用于解决“system suspend和system wakeup events之间的同步问题”。本文将结合“Linux电源管理(6)_Generic PM之Suspend功能”和“Linux电源管理(7)_Wakeup events framework”两篇文章,分析wakeup count的功能、实现逻辑、背后的思考,同时也是对这两篇文章的复习和总结。转载 2023-07-05 22:45:00 · 402 阅读 · 0 评论 -
Linux电源管理(6)_Generic PM之Suspend功能
下面图片对Linux suspend&resume过程做了一个概述,读者可以顺着这个流程阅读内核源代码。具体的说明,可以参考后面的代码分析。转载 2023-06-14 12:33:57 · 1480 阅读 · 0 评论 -
Linux kernel的中断子系统之(一):综述
对于CPU1而言,在执行该中断的handler的时候,将Interrupt processor target register中CPU0的bit为设置为1,disable本CPU的比特位,这样在下次中断发生的时候,interupt controller就把中断送给了CPU0。如果送达了多个cpu,实际上,也应该只有一个handler实际和外设进行交互,另外一个cpu上的handler的动作应该是这样的:发现该irq number对应的中断已经被另外一个cpu处理了,直接退出handler,返回中断现场。转载 2023-03-23 00:00:00 · 176 阅读 · 0 评论 -
linux内核中的GPIO系统之(5):gpio subsysem和pinctrl subsystem之间的耦合
不过,实际情况却不是这么简单,它们之间有着较为紧密的耦合(看一看kernel中pinctrl和gpio相关的实现就知道了)。本文将对这种耦合进行一个简单的分析,解释为什么要这样设计。转载 2023-02-25 11:45:00 · 136 阅读 · 0 评论 -
【Linux kernel】linux内核中的GPIO系统之(4):pinctrl驱动的理解和总结
本站之前的三篇文章[1][2][3]介绍了pin controller(对应的pin controller subsystem)、gpio controller(对应的GPIO subsystem)有关的基本概念,包括pin multiplexing、pin configuration等等。本文将基于这些文章,单纯地从pin controller driver的角度(屏蔽掉pinctrl core的实现细节),理解pinctrl subsystem的设计思想,并掌握pinctrl驱动的移植和实现方法。转载 2023-02-24 22:30:00 · 327 阅读 · 0 评论 -
【Linux kernel】Linux内核中的GPIO系统之(3):pin controller driver代码分析
定义 S3C2416 pin controller自己的属性……gpf {…… }其实S3C2416 pin controller定义了gpa到gpm共计11个sub node,每个sub node是描述S3C2416 GPIO controller的各个bank信息。之所以分成bank,主要是把特性相同的GPIO进行分组,方便控制。例如:这些bank中,只有GPF和GPG这两个bank上的引脚有中断功能,其他的都没有。转载 2023-02-13 22:00:00 · 442 阅读 · 0 评论 -
【Linux kernel】linux内核中的GPIO系统之(2):pin control subsystem
一般而言,学习复杂的软件组件或者软件模块是一个痛苦的过程。我们可以把我们要学习的那个软件block看成一个黑盒子,不论里面有多么复杂,第一步总是先了解其功能和外部接口特性。如果你愿意,你可以不去看其内部实现,先自己思考其内部逻辑,并形成若干问题,然后带着这些问题去看代码,往往事半功倍。功能规格。pin control subsystem的主要功能包括:(A)管理系统中所有可以控制的pin。在系统初始化的时候,枚举所有可以控制的pin,并标识这些pin。转载 2023-02-07 22:00:00 · 238 阅读 · 0 评论 -
【Linux kernel】linux内核中的GPIO系统之(1):软件框架
作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务。对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非常简单的任务,例如GPIO driver、LED driver。往往CPU datasheet的关于GPIO或者IO ports的章节都是比较简单的,非常适合刚入行的工程师。虽然GPIO子系统相关的硬件比较简单,没有复杂的协议,不过,对于软件抽象而言,其分层次的软件思想是每个嵌入式软件工程师需要掌握的内容。转载 2023-02-02 22:00:00 · 327 阅读 · 0 评论 -
【Linux kernel】ACCESS_ONCE宏定义的解释
ACCESS_ONCE 是 Linux 内核中的一个宏,它可以用来保护内核代码中的共享数据。它可以保证在多处理器环境下对共享数据的访问是原子的,即不会被其他处理器中断或破坏。在多处理器环境下,对共享数据的并发访问可能会导致数据不一致或者数据丢失等问题,使用 ACCESS_ONCE 可以有效避免这些问题。转载 2023-01-31 21:00:00 · 286 阅读 · 0 评论 -
【Linux kernel】Linux电源管理(5)_Hibernate和Sleep功能介绍
Hibernate和Sleep两个功能是Linux Generic PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电········>恢复系统——>恢复上下文——>继续使用。本文以内核向用户空间提供的接口为突破口,从整体上对这两个功能进行介绍,并会在后续的文章中,分析它们的实现逻辑和执行动作。转载 2023-01-30 22:00:00 · 644 阅读 · 0 评论 -
【Linux kernel】Linux电源管理(4)_Power Management Interface
Linux电源管理中,相当多的部分是在处理Hibernate、Suspend、Runtime PM等功能。而这些功能都基于一套相似的逻辑,即“Power management interface”。该Interface的代码实现于“include/linux/pm.h”、“drivers/base/power/main.c”等文件中。主要功能是:对下,定义Device PM相关的回调函数,让各个Driver实现;对上,实现统一的PM操作函数,供PM核心逻辑调用。转载 2023-01-29 22:00:00 · 802 阅读 · 0 评论 -
【Linux kernel】Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953实例分析篇)
iqs263节点中的pinctrl-0 属性指向了表明其io口属性的节点为iqs263_irq_config,相关代码也在2.3.1指示的msm8953-pinctrl.dtsi文件中。i2c_8节点中的pinctrl-0指向了定义其io口的节点i2c_8_active和i2c_8_sleep,代码如下可见该i2c的IO口为Gpio98和Gpio9。在前两篇中我们了解了DTS的背景基础知识以及发挥作用的流程,这篇文章我们以高通的MSM8953平台为例来添加一个基础的i2c设备(包含一个gpio中断)。转载 2023-01-12 23:30:00 · 561 阅读 · 0 评论 -
【Linux kernel】Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)
一个dts文件确定一个项目,多个项目可以包含同一个dtsi文件。找到该项目对应的dts文件即找到了该设备树的根节点。转载 2023-01-12 00:00:00 · 875 阅读 · 0 评论