自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Muggle的博客

热爱嵌入式Linux

  • 博客(218)
  • 资源 (8)
  • 收藏
  • 关注

原创 《i.MX平台开发分享》- 目录

专栏目录

2023-01-03 21:08:58 710

原创 《PCI EXPRESS体系结构导读》---(8)预读机制

摘要:本文探讨了处理器主频提升导致的存储器瓶颈问题及预读机制的解决方案。重点分析了指令预读(通过分支预测提高指令缓存命中率)、数据预读(硬件/软件方式缓解"存储墙"问题)以及PCI总线预读(MRL/MRM事务优化设备访问)三种机制。比较了软件预读(精准可控但需编程介入)和硬件预读(自动运行但可能缓存污染)的优劣,指出预读技术能有效隐藏内存延迟,但对缓存管理和带宽分配提出了更高要求。这些机制共同构成了现代计算机系统应对存储性能瓶颈的关键技术。

2026-01-12 08:45:00 574

原创 《PCI EXPRESS体系结构导读》---(7)cache相关的事务

本文主要介绍了多处理器系统中Cache一致性的实现机制,重点分析了MESI协议下PCI设备DMA读写操作的处理流程。在SMP系统中,各CPU通过HIT#和HITM#信号线进行Cache状态交互,由Request Agent、Snoop Agent和Response Agent协同完成总线事务。当PCI设备对可Cache空间进行DMA写操作时,系统会根据Cache行状态(E/S/M)采取不同处理策略:对E/S状态直接使无效Cache行并写入存储器;对M状态则需特殊处理以避免数据丢失,可采用重试/延时、数据缓冲

2026-01-11 08:30:00 701

原创 《PCI EXPRESS体系结构导读》---(6)PCI数据的传递

摘要:本文介绍了PCI总线的地址译码机制和数据传输过程。在PCI总线上,设备通过BAR空间地址匹配认领事务,未认领时由负向译码设备处理。处理器向PCI设备写数据时,HOST主桥将DDR地址转换为PCI地址并转发;PCI设备进行DMA操作时,需通过PCI地址空间间接访问DDR。整个过程涉及多级总线仲裁和地址转换,其中写操作为Posted方式,读操作为Non-Posted方式。图文结合说明了地址映射关系和传输路径。(149字)

2026-01-10 15:29:19 339

原创 《PCI EXPRESS体系结构导读》---(5)PCI总线Device号的分配

以此类推,与信号线AD31相连的PCI设备的设备号为15。其中PCI设备0与Device Number字段的0b00000对应:PCI设备1与Device Number字段的0b00001对应,并以此类推,PCI设备15与DeviceNumber字段的0b01111对应。在实际的应用中,一条PCI总线能够挂接21个设备已经足够了,实际上由于PCI总线的负载能力有限,即便在总线频率为33MHz的情况下,在一条PCI总线中最多也只能挂接 10个负载,一条PCI总线所能挂接的负载详见表1-1。

2026-01-06 20:15:33 516

原创 《PCI EXPRESS体系结构导读》---(4)PCI总线Bus号初始化

(8)在PCI总线0上,系统软件扫描到PCI桥4,则首先将PCI桥4的PrimaryBusNum-ber寄存器赋值为0,而将Secondary Bus Number寄存器赋值为4,即PCI桥1的上游PCI总线号为0,而下游PCI总线号为4。(9)系统软件发现PCI总线4上没有任何PCI桥,将结束对PCI总线4的扫描,并将 PCI桥4的Subordinate Bus number寄存器赋值为4,之后回退到PCI总线4的上游总线,即 PCI总线O继续进行扫描。例如PCI设备01下不可能挂接新的PCI总线。

2026-01-06 20:14:24 823

原创 《PCI EXPRESS体系结构导读》---(3)PCI总线配置请求的转换原则

摘要:本文介绍了PCI总线配置请求的类型转换规则。当访问PCI总线0上的设备时,HOST主桥直接产生Type00h请求;访问其他总线设备时产生Type01h请求。对于Type01h请求,PCI总线0会遍历所有PCI桥,根据Secondary Bus Number和Subordinate Busnumber寄存器判断请求转发路径:若目标设备直接连接在桥的Secondary bus上,则将Type01h转换为Type00h;若目标位于下游总线,则继续转发Type01h请求。未接收的Type00h请求会引发Mas

2026-01-04 15:44:20 302

原创 《PCI EXPRESS体系结构导读》---(2)Type00和Type01配置请求

摘要:本文介绍了PCI总线中的两种配置请求类型。Type01h配置请求只能由PCI桥接收并转发,可转换为Type01h继续传递或转换为Type00h请求发送给设备。Type00h请求直接访问设备配置空间,由AD总线特定位选通目标设备。主桥或PCI桥在特定条件下生成Type00h请求,如总线号为0或次级总线匹配时进行请求转换。两种请求类型通过不同机制实现PCI设备的配置访问。

2026-01-04 14:20:17 648

原创 《PCI EXPRESS体系结构导读》---(1)基本概念

本文介绍了PCI总线地址空间与DDR地址空间的映射机制。BAR寄存器记录PCI地址空间的物理基地址,ARM处理器通过主桥将PCI设备的IO地址空间映射为DDR地址空间进行访问。iATU寄存器组维护两者映射关系,包含inbound(PCI→DDR)和outbound(DDR→PCI)寄存器。PCI设备通过总线号、设备号和功能号寻址配置空间,配置空间分为设备、桥和cardbus桥三种类型。PCI桥作为特殊设备管理其下设备,配置空间包含基地址、中断等寄存器。PCI总线配置请求分为Type00h(直接访问)和Typ

2026-01-01 10:36:09 1170

原创 i.MX8MP平台开发分享(TMU驱动及用户接口篇)

TMU的设备树定义了温度校准数据的存储位置。#thermal1;温控的thermal-zones有两个thermal, 分别对应两个TMU。可以看到设备树定义了温度范围,但是这个范围目前的驱动代码会被驱动覆盖。

2024-06-05 09:00:00 1514

原创 i.MX8MP平台开发分享(CSU控制器篇)

ATF中的CSU配置如下,OCARM和OCRAM_S被配置为了安全等级2,非锁定状态。) 来管理所有不直接支持安全(如 CPU 内核)的主/从设备的安全。CSU的描述请参考Security Reference Manual。

2024-06-05 07:59:24 537

原创 i.MX8MP平台开发分享(RDC软件配置篇)

Uboot中已经将RDC的配置写入到了OCRAM中,NXP在ATF中预设了SIP服务,SIP服务下有厂商自定义的smc命令ID。例如下面的DDR、GPC、SRC和HAB的smc回调函数。在SRC中断处理函数中,对于SRC_M4_START指令,先读取OCRAM中的配置,然后初始化RDC。

2024-06-05 07:46:51 965

原创 i.MX8MP平台开发分享(TMU功能介绍篇)

温度监控单元(TMU)监控并报告来自一个或多个芯片上远程温度测量点的温度。温度测量范围:-40至105°C。监控功能:单点或多点监控超出范围指示高/低温度范围监控即时和平均温度监控可编程低通滤波的平均温度监控可编程的正常和临界监控阈值报告功能:即时和平均温度报告TMU能够访问芯片上的两个温度测量点。主探头位于ANAMIX内部,而远程探头位于ARM核心附近。TMU监控这些位置,并在超过设定阈值时发出报警。上限和下限温度范围持续被捕获。

2024-06-04 20:40:38 909

原创 i.MX8MP平台开发分享(MU功能介绍篇)

消息传递单元(MU)模块通过 MU 接口传递消息(如数据、状态和控制),使 SoC 中的两个处理器能够进行通信和协调。MU 还能让一个处理器使用中断向另一个处理器发出信号。由于 MU 管理处理器之间的信息传递,因此 MU 使用不同的时钟(来自不同外设总线的每一端)。因此,MU 必须同步从一侧到另一侧的访问。MU 使用两组匹配寄存器(面向处理器 A,面向处理器 B)实现同步。

2024-06-04 19:58:34 989

原创 i.MX8MP平台开发分享(GPC控制器篇)

整体来说,i.MX8MP中的电源是由General Power Controller (GPC) 来控制的。GPC可以提供各种电源模式的控制,如低功耗模式、深度睡眠模式等等。GPC包含两个模块,一个是系统模式控制器(SMC),控制系统的电源模式;另一个是电源门控控制器(PGC),控制模块的电源开关。详细信息请参考RM。本文重点分析其中的PGC(Power Gating Controller )。如下图所示,每个模块都有单独的PGC进行控制,从而实现对单个模块的电源开关功能。

2024-06-03 20:36:13 2041

原创 i.MX8MP平台开发分享(RDC资源分配控制器篇)

RDC 允许将外设和存储器分配到一个或多个域,而每个总线主站或内核则被置于多个域中的一个。否则,权限将不受限制。当软件或 DMA 尝试访问外设或内存时,相应的总线事务包括 DID 以及其他总线控制信息,如读取、写入和特权模式。对于该设备,请参考下表确定支持域的存储器、每个存储器的区域数、区域分辨率、存储器区域寄存器组的标识号,以及访问存储器区域寄存器组的 RDC 寄存器地址。下面是Uboot中关于RDC配置,此配置会存储到ocram指定位置,由ATF读取并写入RDC控制器,将对应模块的控制权移动到M7。

2024-06-03 20:34:07 1655

原创 i.MX8MP平台开发分享(SRC复位控制器篇)

复位控制器负责生成系统内部的各个复位信号和启动参数锁存。系统整体上电和复位的流程这里不再详细描述,可以参考手册。本文重点描述复位控制器对于内部子模块的复位控制,以及如何在代码中实现复位功能。下面是复位控制器(System Reset Controller)的设备树,其中定义了寄存器起始地址和中断信号,对应的驱动为。#reset1;对于复位驱动来说,需要实现以下几点功能接入Linux中的platform驱动。

2024-05-31 09:19:06 775

原创 我的创作纪念日

同时,通过文章进行技术交流也是一个重要的动力,我希望通过文字与更多的技术爱好者进行思想碰撞,互相学习,共同进步。我的文章获得了许多赞、评论和阅读量,让我感受到自己的努力得到了认可。同时,我也结识了很多志同道合的同行,通过交流学习,拓展了自己的视野和知识面。粉丝的关注和支持是我继续创作的重要动力,让我更加坚定了分享的信念。职业规划上,我希望能成为一名技术专家,能够在更高层次上解决复杂的问题,并为行业的发展贡献自己的力量。创作规划上,我希望能通过更多的优质内容,影响和帮助更多的开发者。

2024-05-31 09:14:39 352

原创 【精读Uboot】Uboot跳转内核

在进入ATF后,ATF与OP-TEE共同协作,转而跳转到处于非安全上下文的U-Boot中(ATF->Uboot)。在Uboot阶段会重新从汇编开始执行,不一样的是里面的函数不再是SPL阶段使用的,而是中定义的。SPL阶段的主要目的是使能芯片的核心器件,而中定义的函数是为了初始化Uboot的驱动框架。

2023-09-08 07:53:22 1678

原创 【精读Uboot】SPL阶段的board_init_r详细分析

对于i.MX平台上的SPL来说,其不会直接跳转到Uboot,而是在SPL阶段借助BOOTROM跳转到ATF,然后再通过ATF跳转到Uboot。会初始化设备相关的硬件,最后进入为镜像跳转做准备。下面是调用的核心函数流程,接下来我们会对其中的函数进行详细分析。

2023-09-08 07:52:27 2455

原创 【精读Uboot】its文件语法

前面我们分析了SPL汇编的执行过程,在SPL之后就要进入另一个loader加载镜像了。在正式分析跳转流程之前,我们需要搞清楚在我们平时下载的这个镜像是如何组成的。在编译完Uboot、optee和ATF之后,会产生bl31.bin和tee.bin。首先将ddr的固件和拼接为,这个bin文件就是SPL部分。其余的bin文件需要组装为一个含uboot.bin的文件,然后将这俩个bin组装起来,加上IVT等头信息就得到了最终可用的。

2023-09-08 07:50:59 2692

原创 【精读Uboot】异常向量的设置

对于ARM64而言,exception是指cpu的某些异常状态或者一些系统的事件(可能来自外部,也可能来自内部),这些状态或者事件可以导致cpu去执行一些预先设定的,具有更高执行权利(EL3)的异常处理程序(也叫exception handler)。在_start.S中,我们将vectors的地址设置进了了vbar_el3寄存器,也就让芯片知道了异常发生时,应该跳转到这个地址执行异常处理。的方式存储,这会将栈指针(sp)向下递减16字节,然后将寄存器的值存储到新的栈位置。标签,进入异常处理程序的第二部分。

2023-09-08 07:49:27 1652

原创 【精读Uboot】反汇编分析SPL的_main函数

典型的Uboot启动分为两个阶段,bootrom->->ATF->OPTEE(可选)->Uboot。其中SPL为BL2ATF为BL31OPTEE为BL32Uboot为BL33。其中bootrom是固化在芯片内部的代码,负责从各种外(sdcard、mmc、flash)中加载spl到芯片内部的SRAM;SPL的主要工作是初始化板载的DRAM和核心硬件;Uboot最主要的功能就是加载启动kernel。

2023-09-08 07:47:46 1156

原创 计算Yocto中LIC_FILES_CHKSUM的md5值

使用以下网站:

2023-05-27 10:02:41 2775

原创 i.MX8MP平台开发分享(gicv3篇)-- gic_handle_irq如何跳转到自定义的中断线程处理函数

在处理完中断后,处理器会将相应的IAR寄存器更新为0来确认该中断已被处理。该寄存器允许内核结束中断处理并通知 GICv3 中断控制器中的相应中断已被处理完毕,以允许下一个中断在该中断的后面立即传递到 CPU。当某个CPU请求中断处理时,GICv3控制器将相应的中断号和目标CPU的信息填充到ICR_ELx寄存器中,然后发出中断信号,目标CPU将从中断服务例程(ISR)中处理该中断。其中,ICR_EL1用于处理EL1级别的中断,ICR_EL2用于处理EL2级别的中断,ICR_EL3用于处理EL3级别的中断。

2023-04-13 22:07:36 1880

原创 i.MX8MP平台开发分享(gicv3篇)-- set_handle_irq及中断路由过程分析

来退出异常,恢复刚才保存的通用寄存器,执行 ERET 来恢复 PC 和 PSTATE。如果是el0,则使用ret_to_user返回用户态,el1是ret_to_kernel返回内核态。在__primary_switched函数中使用msr指令将vectors异常向量表的。在发生中断异常后,内核就会切入到这个中断处理函数中.arm64所有的异常向量存储在一下所示的vectors中。在这个函数中,会跳转到具体的。存储和清除EL0/1中的通用寄存器。这个函数,然后跳转到这个函数。这个函数的功能很简单,将。

2023-04-13 21:50:00 1249

原创 i.MX8MP平台开发分享(gicv3篇)-- irq_domain_create_tree分析

默认采用radix mapping的方式维护资源。注册进irq域中,并返回这个注册的。根据irq控制器的设备树节点和。在gicv3驱动中,

2023-04-09 20:40:08 519

原创 i.MX8MP平台开发分享(gicv3篇)-- gic_init_bases流程纵览及中断数量计算

对于SPI类型,数量等于GIC_LINE_NR - 32,其中GIC_LINE_NR。如何计算出中断数量?GICD_TYPER寄存器如下。对于Extended SPIs,

2023-04-06 20:17:30 638

原创 i.MX8MP平台开发分享(gicv3篇)-- dts定义及gic_of_init函数

dts中gic的节点定义如下,中断控制器基地址为0x38800000,GIC Distributor interface寄存器大小为0x10000,GIC Redistributors寄存器大小为后续的0xc0000。这里的interrupt-cells描述了dts中如何使用标记中断,这个值为3,意味着我们通过三个参数来描述中断,分别是中断类型、中断号、中断触发标志。首先映射Distributor和Redistributor基地址,gic_init_bases作为核心函数负责初始化中断控制器。

2023-04-04 20:24:30 483

原创 i.MX8MP平台开发分享(clock篇)-计算clock速度相关的内核API

有时,由于 frac 部分,重新计算的速率会有偏差。所以首先从表中找到准确的 pll 速率,如果表中没有匹配速率,则使用从PLL等式计算的速率。在父时钟速率被修改后,才会调用recalc_rate重新计算子时钟的速率。首先lcdif驱动会拿到pix时钟,接下来会根据屏幕的pixel clock大小设置pix时钟。在crtc驱动里,会检查pix时钟的大小,无法获取到精确时钟的时候会使用。会从pll表中找到对应的pll参数,找到以后将相应的参数写入寄存器。是门控时钟,名为pix,这个门控时钟控制的是。

2023-03-05 10:41:18 1367

原创 i.MX8MP平台开发分享(clock篇)- PLL14xx驱动

通过查询硬件,重新计算这个时钟的速率。首先从表中找到准确的pll速率,如果表中没有匹配的速率,则根据读取的MPSK参数从PLL公式中计算的速率。2、BYPASS模式【旁路模式】是指在修改PLL参数的时候,能够使系统在PLL稳定之前输出参考时钟信号。,我们提到VIDEO_PLL1,GPU_PLL等PLL是通过。中的drate,prate分别为需要的速度和父节点的速度。1、修改M和P参数必须重新初始化PLL,而S参数则不需要。下面我们看一下clk_ops中函数的实现过程。输入,返回实际上最接近的速率。

2023-02-15 13:37:35 1192

原创 i.MX8MP平台开发分享(clock篇)- 各类clock的注册

所有的"fixed-clock"信息都预先由drivers/clk/clk-fixed-rate.c注册进了clk框架,因此这里才能找到,返回一个clk_hw对象。先看看clock中的索引值,dts和clk驱动中使用的是同一份索引值文件,因此在解析dts中的clk信息是根据这些索引值来处理相应时钟的寄存器。这一类clock是从PLL分频得到的,例如PLL1_40M就是指从PLL1(800M)分频得到40M,下面的。注册进框架,传入的变量依次是gate clock的名字、父时钟、寄存器地址和位移量。

2023-02-13 15:26:11 1694

原创 i.MX8MP平台开发分享(clock篇)- clk概念和芯片手册

这一类clock具有固定的factor(即multiplier和divider),clock的频率是由parent clock的频率,乘以mul系数,除以div,多用于一些具有固定分频系数的clock。下图是时钟树,首先是使用24MHz生成各类PLL,公式在上一章,然后各个时钟mux模块可以从这些PLL,24Mhz时钟和外部clk中选择自己的父时钟,再根据想要的频率值设置分频值,就得到了相应频率的时钟。width:控制分频比的bit位数,默认情况下,实际的divider值是寄存器值加1。

2023-01-14 21:23:18 2051

原创 i.MX8MP平台开发分享(IOMUX篇)- 查看pinctrl系统的debug信息

子节点描述了gpio控制的基地址以及它们能控制的GPIO范围,以及pad范围。GPIOS【0-29】代表软件中GPIO的index范围,PINS【5-34】代表硬件上的index范围,呈线性映射关系。以设备为单位,例如下面的串口设备30860000,所属uart1grp组,使用pinctrl-0,它的四个GPIO的配置参数都是0x140,和dts中一致。以gpio1为例,dts如下,当前GPIO1控制器的0号引脚, 对应pinctrl中的5号引脚, 数量为30。记录了每个pinctrl组使用的pad信息。

2023-01-08 09:39:18 1506

原创 i.MX8MP平台开发分享(IOMUX篇)- Linux中的pinctrl调用过程

有时候,驱动程序的probe顺序很重要,但是内核并不总是有驱动之间的依赖性关系,这意味着一些驱动程序会在它所依赖的资源可用之前被probe。一旦出现一个成功的probe,将触发将其设备从pending列表移到active列表,这样工作队列最终会重试它们,也就是。会扫描设备树添加设备,如果设备树节点和驱动匹配,则就去probe这个驱动,对于这里的pinctrl设备来说,就会进入到。】,设置pinctl的操作函数,比如怎么设置寄存器实现需要的mux功能,怎么配置PAD属性等函数。来重新probe该设备的驱动。

2023-01-08 08:39:17 1004

原创 i.MX8MP平台开发分享(IOMUX篇)- imx_pinctrl_probe函数梳理以及重要结构体

结构用于描述pin控制器,包含控制器的名字、pin脚的数量、pinmux功能、pinconf功能和pinctl功能。其中pinmux功能和pinconf功能设置某个具体的gpio,而pinctl功能则是控制一组gpio,如uart、i2c、spi等外设的gpio组。)中,我们说过配置一个gpio需要经过mux控制寄存器和pad控制寄存器,对于输入引脚的配置,还需要另外配置输入选择寄存器,这个输入选择寄存器的设置和mux寄存器类似,因此我们可以放在一起处理。描述gpio组资源,通用的做法是调用。

2023-01-02 19:44:28 1015

原创 i.MX8MP平台开发分享(IOMUX篇)- Linux注册PAD

pinfunc.h中定义了所有的引脚,命名方式是MX8MP_IOMUXC___,例如下面的MX8MP_IOMUXC_GPIO1_IO00__GPIO1_IO00定义了MUX寄存器偏移,PAD配置寄存器偏移,输入选择寄存器偏移,MUX模式,输入寄存器的值。如果是输出引脚,那么输入选择寄存器偏移就为0。我们在dts中设置的0x184值是设置PAD的电气属性。这一篇开始我们深入Linux中的pinctl框架。下面的是8mp这颗芯片的所有PAD。中的number和name。芯片的物理PAD通过。

2023-01-02 11:21:33 2200

原创 i.MX8MP平台开发分享(IOMUX篇)- uboot驱动

pinfunc.h中定义了所有的引脚,命名方式是MX8MP_IOMUXC___,例如下面的MX8MP_IOMUXC_GPIO1_IO00__GPIO1_IO00定义了MUX寄存器偏移,PAD配置寄存器偏移,输入选择寄存器偏移,MUX模式,输入寄存器的值。设置一个gpio配置占用的大小,如果是SCU,那么pin_size为12,如果是共享MUX和配置寄存器的话,一个gpio占用的pin_size为20,正常的gpio占用pin_size为24。我们在dts中设置的0x184值是设置PAD的电气属性。

2023-01-01 13:48:07 1804

原创 i.MX8MP平台开发分享(IOMUX篇)- 硬件原理

我们都知道,芯片包含数量有限的引脚,其中大部分有多种信号选择。这些信号到引脚和引脚到信号的选择是由输入输出多路复用器称为IOMUX。IOMUX也被用来配置其他引脚的特性,比如说电压水平和驱动强度等等。

2023-01-01 13:45:08 3247 1

原创 Uboot中的DM驱动模型

对于DM模型初始化来说,uboot会在启动序列中使用dm_init创建一个dm_root(udevice)并将其绑定到“root_driver”(driver),然后来激活这个设备。第二步使用dm_scan来绑定设备树中的设备和驱动到dm_root下面。

2022-12-27 09:15:33 3933 1

嵌入式系统开发工具-EDID编辑器打包.zip

资源内容:edid-manager和EEditZ安装包 适宜人群:嵌入式工程师、显示器开发 具有的功能:读取EDID、修改EDID、编写EDID

2021-12-05

live555 最新lib资源包 VS2019编译 下载即可使用静态库

2019.4.23编译 live555 最新lib资源包 VS2019编译 下载即可使用静态库

2019-04-23

PDF解锁工具--SysTools_PDF_Unlocker.zip

解锁PDF

2021-12-05

gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar

gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar

2018-10-21

嵌入式驱动开发--PCIE学习资料打包.zip

适合人群:嵌入式驱动开发 内容:PCIE相关学习资料13份

2021-12-05

TB6612电机驱动资料.zip

TB6612电机驱动资料

2019-11-11

STemWin资源包

STemWin最新资源包!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2018-03-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除