自定义博客皮肤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

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

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

专栏目录

2023-01-03 21:08:58 409

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

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

2024-06-05 09:00:00 947

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

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

2024-06-05 07:59:24 257

原创 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 544

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

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

2024-06-04 20:40:38 282

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

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

2024-06-04 19:58:34 446

原创 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 1541

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

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

2024-06-03 20:34:07 1111

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

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

2024-05-31 09:19:06 429

原创 我的创作纪念日

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

2024-05-31 09:14:39 192

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

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

2023-09-08 07:53:22 861

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

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

2023-09-08 07:52:27 1221

原创 【精读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 1236

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

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

2023-09-08 07:49:27 630

原创 【精读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 522

原创 计算Yocto中LIC_FILES_CHKSUM的md5值

使用以下网站:

2023-05-27 10:02:41 1752

原创 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 1229 1

原创 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 834

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

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

2023-04-09 20:40:08 258

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

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

2023-04-06 20:17:30 402

原创 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 229

原创 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 1012

原创 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 970

原创 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 1285

原创 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 1527

原创 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 1211

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

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

2023-01-08 08:39:17 782

原创 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 659

原创 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 846

原创 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 1391

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

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

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

原创 Uboot中的DM驱动模型

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

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

原创 【环境配置笔记】VScode+clang15搭建linux内核代码阅读环境

C/C++插件里的intellisense和clangd是冲突的,如果我们没有手工设置setting.json,当使用vscode打开C文件时时会提示禁止intellisense,clangd索引失败的原因大部分都是CompileFlags的问题,你可以在索引失败的clangd日志中查看出错的原因,并添加需要移除的CompileFlags。根据下图的步骤打开json文件,我这里演示的是远程服务器端的配置,如果你本身是linux环境,则需要先点击【用户】,再按第四步来。这里的"Disabled"

2022-11-16 13:33:22 4137

原创 MIPI驱动中payload打包发送过程

是整个Linux 中MIPI framework的核心函数。会调用各个vendor的MIPI发包函数,在这里VENDOR层DSI发包的核心函数这个函数会将包通过MIPI DSI传递给最终的MIPI屏幕。

2022-10-24 11:06:34 1472

原创 Linux中的initcall以及module_init

在实际执行时,内核必须知道xxx_initcall section所在的位置,而在include/asm-generic/vmlinux.lds.h中将__initcallX_start和**.initcall*.init**链接到了一起,这样的话,do_initcalls()遍历不同ID的initcall时,initcallX_start便可以找到data section中对应的.initcall entry,然后循环遍历里面的各个initcalls。做的定义,唯一的区别就是第二个参数不一样,

2022-10-24 10:57:10 492

原创 Linux内存管理之CMA简介

在linux驱动开发过程中经常需要使用到连续大块物理内存,尤其是DMA设备。而实际在系统经过长时间的允许之后,物理内存会出现比较严重的碎片化现象,虽然通过内存规整,内存回收等手动可以清理出一段连续的物理内存,但是并不能保证一定能够申请较大连续物理块。

2022-10-14 22:04:24 2581

原创 生成patch

使用devtool工具将源码加入workspace,这份源码随便怎么改都行。将这个branch退回到某个版本/某次提交,此时刚才的两次提交在dev这个branch中不存在了,只存在于。查看提交log,例如commitID1是我们第一次提交的代码,commitID2是第二次提交的代码。从devtool分支中导出修改到dev分支【从devtool导入修改到dev分支】【清除dev分支刚才的提交】commit这次导入的修改【提交导入的修改】将合并后的生成patch【生成补丁】创建一个新的branch。

2022-09-19 14:22:55 1236

原创 Yocto中函数间隔_转为:的原因

从Yocto honister3.4之后,Yocto中local.conf和bb文件中的append和append函数命名产生了变化。由原来的变为了,变为了。

2022-09-15 17:09:20 624

原创 DRM系列(14)之writeback_job分析

本系列专栏《》前面提到连接器写回可以将 CRTC 的输出写入内存缓冲区的硬件。它是基于 workqueue 来实现的,本质上是一个独立的 encoder + connector object。该功能对于 WIFI-Display、录屏等功能都非常有用。

2022-09-07 15:41:21 1163 1

原创 DRM系列(13)之writeback_job介绍

与平面不同,当用户空间删除写回帧缓冲区时,DRM 不会尝试将其从连接器的活动使用中删除。这是因为没有提供任何方法来中止写回操作,并且在任何情况下,在写回进行时进行新的提交是未定义的(请参阅下面的 WRITEBACK_OUT_FENCE_PTR)。用户空间应等待此栅栏发出信号,然后再进行影响任何相同 CRTC、平面或连接器的提交。存储 DRM_MODE_OBJECT_FB 的只写对象属性:它存储要由写回连接器写入的帧缓冲区。此属性类似于平面上的 FB_ID 属性,但将始终读取为零,并且不会在提交之间保留。

2022-09-05 13:24:34 1069

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

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

2021-12-05

PDF解锁工具--SysTools_PDF_Unlocker.zip

解锁PDF

2021-12-05

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

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

2021-12-05

TB6612电机驱动资料.zip

TB6612电机驱动资料

2019-11-11

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

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

2019-04-23

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

STemWin资源包

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

2018-03-06

空空如也

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

TA关注的人

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