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

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

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

专栏目录

2023-01-03 21:08:58 345

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

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

2023-09-08 07:53:22 549

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

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

2023-09-08 07:52:27 867

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

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

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

2023-09-08 07:49:27 345

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

原创 计算Yocto中LIC_FILES_CHKSUM的md5值

使用以下网站:

2023-05-27 10:02:41 1282

原创 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 916 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 682

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

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

2023-04-09 20:40:08 195

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

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

2023-04-06 20:17:30 342

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

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

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

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

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

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

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

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

2023-01-08 08:39:17 639

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

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

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

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

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

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

原创 Uboot中的DM驱动模型

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

2022-12-27 09:15:33 2742

原创 【环境配置笔记】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 3589

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

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

2022-10-24 11:06:34 1360

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

原创 Linux内存管理之CMA简介

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

2022-10-14 22:04:24 2397

原创 生成patch

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

2022-09-19 14:22:55 839

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

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

2022-09-15 17:09:20 527

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

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

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

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

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

2022-09-05 13:24:34 914

原创 DRM系列(12)之vblank_pageflip_buffer切换流程总结

本系列专栏《》Vblank从右下角返回左上角的时间间隔内,可以通知驱动进行下一帧图像的送显,一般硬件进入vblank后(也就是扫描完一帧图像)会通过中断机制触发硬件的vblank事件,然后再由驱动提交软件的vblank事件。vblank中断发生意味着可以刷新下一帧了。vblank发生后,中断处理函数会使用来告知DRM,中断发生了。从dev中的vblank数组中拿到这个crtc对应的vblank数据,然后将vblank计数值和时间戳存入对应的vblank数据结构中。唤醒队列。

2022-09-05 13:19:07 1723

原创 DRM系列(11)之VIV IOCTLS

【代码】DRM系列(11)之VIV IOCTLS

2022-09-04 18:53:03 255

原创 DRM系列(10)之drm_read

返回buffer给用户层,buffer是event对象。这个file_priv->event_list链表中的drm_pending_event对象是由drm_send_event_helper添加的。

2022-09-04 18:50:53 599

原创 DRM系列(9)之drm_atomic_helper_commit

这里的event是我们commit ioctl一开始构造的,drm_crtc_arm_vblank_event的注释如下,这里的drm_crtc_arm_vblank_event会武装event,这里的武装是指配置。从上面的代码可以看出来,先遍历state中的所有crtc,然后.atomic_begin,然后对于所有planes,需要atomic_disable,最后atomic_flush会flush所有crtc中的数据。如果硬件没有这样的功能(例如,使用 "go "位),那么使用这个功能是不安全的。

2022-09-04 15:00:54 1137 1

原创 DRM系列(8)之prepare_signaling

构造drm_pending_vblank_event对象,并且设置进crtc_state->event中。将drm_out_fence_state和crtc中的dma_fence对象关联起来。最后conn_state->writeback_job中的out_fence。拿到state中每一个新crtc_state的out_fence_ptr。out_fence_ptr填充进drm_out_fence_state中。out_fence_ptr填充进drm_out_fence_state中。

2022-09-03 10:41:03 532

原创 DRM系列(7)之drmModeAtomicCommit底层流程

drm_atomic_helper_check_planes 检查state中的planes变更物理上是否合法。上面的几个函数都是对state成员的检查,prepare_signaling是在commit之前最重要的一步,设置drm_pending_vblank_event中 vblank事件的crtc id和user_data。drm_atomic_helper_check_modeset检查state中的mode变更是否合法。idr_find根据id找到对应的drm_mode_object对象。

2022-09-03 08:38:45 2016 4

原创 DRM系列(6)之drm_atomic_state数据结构

对于更复杂的硬件,这可以通过 drm_crtc_send_vblank_event() 函数来处理,驱动程序应该在原子提交完成后调用提供的事件。使用当前的 vblank 帮助器基础结构,这可以通过在页面翻转挂起时保持 vblank 引用来实现,通过 drm_crtc_vblank_get() 获取并通过 drm_crtc_vblank_put() 释放。实现这一点的最简单方法是在调用 drm_crtc_vblank_off() 之后调用 drm_crtc_send_vblank_event()。......

2022-09-01 10:47:46 629

原创 《Linux图形驱动与桌面》之DMA-FENCE

🌟🌟🌟dma-fence由结构体dma_fence表示,是用于DMA操作的内核内部同步原语,如GPU渲染、视频编码/解码或在屏幕上显示缓冲区。fence使用dma_fence_init()初始化,并使用dma_fence_signal()完成。fence与上下文相关联,通过dma_fence_context_alloc()分配,同一个上下文上的所有fence都是完全排序的。...

2022-08-30 13:19:56 1453 1

原创 DRM系列(5)之vblank事件驱动

虽然设计了相当数量的硬件,以便 CPU 不需要关注对时间极为敏感的编程,但在某些情况下它是无能为力的。但对于一些司机来说,drm_handle_vblank的第二个参数是crtc的index号,对于这个index号,是在component_ops.bind->lcdifv3_crtc_init->drm_crtc_init_with_planes中赋值的,也就是说每个lcdif接口驱动加载一次,都会产生一个独立的crtc index,以后drm框架只要根据这个index就能找到对应lcdif口的资源。...

2022-08-27 09:05:42 1598

嵌入式驱动开发--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

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0-尝鲜版-已解鎖.pdf

PDF解密版本PDF

2019-10-24

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关注的人

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