- 博客(190)
- 资源 (1)
- 收藏
- 关注
原创 arm 2D 移植到lvgl(v8)
Arm-2D 本身并非GPU,而是一个,支持从Cortex-M0到最新的Cortex-M85等所有的Cortex-M处理器。Arm-2D提供两种加速方式加速LVGL9:和。当芯片支持或者时,推荐使用来加速LVGL;当芯片中存在Arm-2D所支持的2D GPU时,(例如:基于Arm DMAC-350所派生出来的2D GPU),推荐使用来加速LVGL。上述来源于。
2024-11-08 11:15:24
1144
原创 LVGL自己看系列之设置需要刷新的obj
void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p), a1和a2合并为a area。_lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p),判断a1是否包含了a2。从调用它开始,这个obj就注定会被重新渲染。
2024-08-30 14:56:45
563
原创 渲染timer开始工作
并加入到屏幕obj的脏域数组中(lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area);该函数主要是处理脏域,判断是否是合并过的区域,如果没有合并过,就进行合并,join from 被合并的区域就需要设置一个合并的标志位。有全刷和局部刷新的区分,layer_reshape_draw_buf会调整刷新的区域,根据是全刷还是局部刷新,调整刷新面积。5.判断,仅仅当合并后的区域小于合并之前的面积,才会合并,并将合并后的区域加入inv_areas。
2024-08-30 13:52:45
458
原创 lvgl 自己看系列
lv_obj_invalidate()` 函数是 LittlevGL 图形库中的一个函数,用于标记一个对象(object)需要重新绘制。当一个对象的外观或状态发生变化时,需要重新绘制该对象以反映这些变化。lv_obj_invalidate()函数可以将该对象标记为需要重新绘制,从而触发重新绘制操作。具体来说,`lv_obj_invalidate()` 函数会将对象的 `invalidate` 标志位置为 `true`,表示该对象需要重新绘制。
2024-08-29 16:48:43
796
原创 DRM入口之drm__XXXX_init
编码器是显示系统中的一部分,它的作用是接收CRTC(Cathode Ray Tube Controller)输出的图像信号,并将其转换成适合特定连接器(connector)的信号格式,比如HDMI、DVI、DisplayPort等。函数还会将编码器对象添加到DRM设备的相关列表中,使其成为显示配置的一部分。编码器初始化完成后,可以通过DRM提供的API进行进一步的配置和管理,例如设置模式(mode setting)、使能或禁用(enabling or disabling)等操作。
2024-08-25 22:52:37
494
原创 DRM 的入口之 __drm_mode_object_add
以上步骤提供了一个基本的框架,用于在DRM子系统中注册和初始化CRTC对象。函数的作用是将一个 DRM 模式对象添加到 DRM 模式对象列表中,并对其进行初始化。:最后,将初始化的CRTC添加到全局的CRTC列表中,这样它就可以被后续的显示管理操作所使用。这个函数通常在 DRM 驱动程序初始化期间被调用,用于设置和配置显示硬件的各种参数和模式。来为CRTC添加辅助函数,这些函数提供了一些标准的实现,简化了CRTC的管理。这个结构体包含了CRTC的所有相关信息和函数指针,用于后续的操作和管理。
2024-08-25 22:27:40
383
原创 MIPI之DCS
DCS还定义了不同的Power Level,对应不同的显示架构,以及在不同状态下(如Normal Idle,Sleep,Partial)命令的可访问性。在实际应用中,DCS命令集使得MIPI DSI接口能够灵活地与各种显示设备进行通信,支持命令模式和视频模式,允许通过发送命令和数据包来控制显示设备的行为,如调整显示参数、读取状态信息等。DCS的引入是为了标准化显示设备,使得不同制造商的产品能够遵循同一套标准进行命令和数据的交互,从而简化了移动设备的互连,缩短了上市时间和设计成本。
2024-08-21 13:46:10
799
原创 MIPI之DSI协议
DSI(Display Serial Interface)协议是MIPI Alliance制定的一种用于主机处理器与显示模块等外设之间传输数据的接口标准。它通过将并行数据、信号事件和命令转换为数据包,并在物理层进行串行化传输,从而实现高效的数据通信。
2024-08-14 14:48:04
3386
原创 MIPI之D-PHY硬件结构
D-PHY状态机与控制逻辑单元通过一系列复杂的控制位和状态转换来管理数据流,确保数据能够正确传输。同时,它利用校验码等机制进行基本的错误检测,但实际的错误纠正通常需要依赖于更高级别的协议或软件实现。
2024-08-14 12:19:25
2122
原创 SPI的通信过程
在SPI通信中,开始信号和结束信号通常是由特定的字节或位模式来定义的,它们帮助从设备识别数据传输的开始和结束。:从设备将接收到的数据位组合成字节或更高位宽的数据单元,然后根据接收到的命令或数据类型进行相应的处理。:在主设备发送数据的同时,从设备也可以通过MISO线向主设备发送数据。:从设备继续接收数据,直到检测到主设备发送的结束信号,这可能是一个特定的结束字节或命令。:从设备检测到主设备发送的开始信号,这通常是一个特定的命令或帧头,指示数据传输的开始。:如果需要,从设备准备要发送给主设备的数据。
2024-08-14 08:07:44
1846
原创 I2C的通信过程
每次发送一个字节的数据后,主设备需要等待从设备发送ACK信号,以确认数据已被成功接收。在实际应用中,主设备和从设备之间的通信速率、数据大小和协议细节可能会有所不同,但基本的通信流程是相似的。如果为1,表示读操作。:主设备在读取完所有需要的数据后,通过拉高SDA线,同时SCL线为高电平,来发送结束信号,结束通信。:从设备接收到地址后,如果地址匹配,它会发送一个应答信号(ACK),通常是通过拉低SDA线来实现。:在所有数据都发送完毕后,主设备通过在SCL为高电平的时候拉高SDA线,来发送通信的结束信号。
2024-08-14 07:51:24
1518
原创 DMA Fence与显示缓冲区同步的关系
这时,可以使用数组形式的DMA-Fence,其中每个fence代表一个缓冲区的同步状态。综上所述,内核中的DMA-Fence机制通过与DMA-BUF的结合,实现了高效的数据同步和缓冲区管理,确保了GPU渲染输出的 framebuffer 能够及时且正确地显示在屏幕上,避免了异步问题和潜在的死锁情况。综上所述,内核中的DMA Fence机制与显示缓冲区同步的关系在于它提供了一种同步机制,确保了GPU渲染的数据能够及时、准确地写入显示缓冲区,从而避免了因数据传输不同步导致的显示内容错误。
2024-08-13 10:00:26
1040
原创 GPU渲染中的纹理Mipmap
Mipmap技术与纹理过滤技术相结合,通过使用不同的纹理过滤方式,如最近点采样(Nearest Point Sampling)、双线性过滤(Bilinear Filtering)、三线性过滤(Trilinear Filtering)和各向异性过滤(Anisotropic Filtering),来提高渲染质量和性能。:尽管Mipmap技术会占用更多的显存空间,但可以通过一些优化技术,如UE4的纹理流缓存,来动态调整纹理的加载和缓存,以减少显存占用。
2024-08-12 09:56:42
1250
原创 I2C函数之s3c24xx_i2c_message_start函数解析(三)
这段代码主要处理I2C消息的开始阶段,包括设置I2C设备地址、配置读/写模式、可能的ACK使能,以及触发I2C传输的开始。代码使用了原始的寄存器读写操作(),这是Linux设备驱动中直接操作硬件寄存器的方法。用于在发送新的开始位之前提供短暂的延时。
2024-08-09 08:00:34
222
原创 I2C的简单模型
I2C用于微控制器和传感器等设备之间的通信。I2C驱动程序通常包含初始化I2C总线、发送和接收数据等功能。以下是一个使用C语言的简化示例,展示了如何实现一个基本的I2C驱动程序。Linux设备驱动开发详解.pdf这本书中对I2C开发讲的非常好,可以看看。
2024-08-09 07:21:46
153
原创 ioremap的作用
是一个在 Linux 操作系统中使用的宏或函数,用于将某个设备(通常是外设硬件)的物理内存地址映射到内核的虚拟内存空间。这样,内核就能够访问这些硬件设备的内存寄存器,进行读写操作,从而控制硬件设备。来映射一个设备的物理地址,然后通过返回的虚拟地址指针来访问设备的寄存器。非常有用,因为它允许驱动程序访问硬件设备的 I/O 端口或内存映射寄存器。:当需要访问硬件设备的寄存器时,比如在编写设备驱动程序时,就需要使用。返回一个指向新映射区域的指针,这个指针可以用于后续的读写操作。是要映射的物理地址,
2024-08-09 06:43:55
360
原创 如何通过I2C接口配置摄像头sensor
实际的配置过程可能会更复杂,包括更多的寄存器操作、错误检查、以及对特定sensor型号的支持。寄存器地址和命令值都是示例值,实际使用时需要根据摄像头sensor的数据手册来确定正确的寄存器地址和命令值。函数是示例函数,实际使用时需要根据你的I2C驱动库来实现这些函数。这些函数负责发送I2C命令到sensor,并读取响应。
2024-08-09 06:42:35
649
原创 I2C驱动温习(一)
I2C(Inter-Integrated Circuit)是一种由Philips公司开发的串行通信协议,广泛应用于各种微控制器和外围设备之间的短距离通信。其核心特点在于只需要两根信号线:数据线(SDA)和时钟线(SCL),这使得硬件实现非常简单且成本较低。
2024-08-08 21:18:23
939
原创 摄像头sensor的上电过程
摄像头sensor的上电过程通常包括几个关键步骤,这些步骤确保了sensor能够安全、稳定地开始工作。请注意,这个示例是一个简化的版本,实际的上电过程可能会更复杂,包括更多的错误检查、不同的初始化序列、电源管理等。具体的实现细节会根据所使用的sensor型号和硬件平台而有所不同。
2024-08-08 17:35:28
441
原创 OPENCL之分支同步栈
分支同步栈(Branch Synchronization Stack)是一种用于处理并行计算中的条件分支问题的数据结构。在GPU编程中,当多个线程执行不同的分支路径时,分支同步栈可以用来确保所有线程在继续执行之前都完成了它们各自的分支路径。这通常在SIMT(Single Instruction, Multiple Threads)架构中使用,以避免线程发散(Thread Divergence)带来的性能损失。以下是一个使用分支同步栈的简化示例,我们将使用CUDA编程模型来演示这个概念。
2024-08-08 15:32:42
1008
原创 SIMT的疑问解答
当SIMT中的多个线程处理同一个指令时,它们会使用相同的指令代码,但是每个线程可能会使用不同的参数数据。以下是一个使用CUDA编程模型的例子,展示了如何在一个线程块中,每个线程执行相同的指令,但使用不同的参数数据。因此,即使多个线程执行相同的指令,它们使用的参数数据可以是不同的,这使得SIMT模型在处理大规模数据集时非常高效。这样,尽管所有线程执行相同的指令,但它们操作的是不同的数据,实现了SIMT模型中的并行处理。通过这种方式,每个线程独立地处理其分配的数据元素,实现了高效的并行计算。
2024-08-08 15:28:37
1141
原创 OPENCL之SIMT与SIMD在架构上的主要区别是什么?
总结来说,SIMT与SIMD的主要区别在于执行单元的组织方式、软件暴露的信息、灵活性和控制能力以及性能优化方面。SIMT提供了更高的灵活性和更细粒度的控制,而SIMD则在特定应用场景下表现出色。
2024-08-08 14:56:39
727
原创 OPENCL之SIMT
SIMT(Single Instruction, Multiple Threads,单指令多线程)是一种并行计算模型,主要用于图形处理器(GPU)和其他一些并行处理器架构中。其核心工作原理是通过在SIMT架构中,所有线程共享同一指令流,但可以在不同的数据上并行执行相同的指令。这种设计使得,从而允许它们独立执行不同的分支路径。例如,。为了处理这种情况,SIMT架构提供了特殊的分支指令来管理线程的分歧和收敛。SIMT架构将线程分组为“Warp”,。在每个指令周期内,SIMT单元会选择一个。
2024-08-08 14:55:12
698
原创 OPENCL之SM
总结来说,流多处理器是NVIDIA GPU的核心计算单元,负责执行CUDA线程,通过其复杂的硬件结构和并行计算能力,能够高效地进行大规模数据处理和计算。SM是一种单指令多线程(SIMT)架构的处理器,类似于单指令多数据流(SIMD)的特点,含有指令发射单元及若干个。每个SM由多个流处理器组成,这些流处理器拥有独立的寄存器和指令指针,并且共享一套取指和发射单元、常量缓存、纹理缓存以及共享内存。SM可以完成线程的创建和调度,而线程的执行则由流处理器SP完成。,多个SM可以同时处理不同的任务。
2024-08-08 14:26:31
222
原创 OPENCL 之PE
在不同的设备上,PE可以有不同的形式,例如在CPU上可能是一个核心,在GPU上可能是一个流处理器(Streaming Multiprocessor,SM)中的一个线程块。:例如FPGA或DSP,PE可能指的是这些设备中用于执行计算任务的特定硬件单元。在FPGA中,PE可能是可编程逻辑单元,而在DSP中,PE可能是专门的数字信号处理单元。总结来说,PE在OpenCL中是执行计算任务的基本单元,它们在不同类型的设备上有不同的实现方式,但共同的目标是利用设备的并行处理能力来加速计算任务。
2024-08-08 13:42:31
330
原创 cache机制中为什么L1采用分离缓存,L2采用统一缓存
在计算机体系结构中,缓存(Cache)是一种位于CPU和主存储器(RAM)之间的高速存储器,它用于存储最近或频繁访问的数据,以减少CPU访问主存储器的次数,从而提高系统性能。此外,现代CPU可能包含更多级别的缓存(如L3缓存),它们通常也是统一缓存,因为随着缓存级别的增加,统一缓存的优势(如更大的容量和设计上的简化)变得更加明显。
2024-06-27 10:53:59
622
原创 设备树中地址转换规则
地址转换规则在设备树中通过ranges属性来定义,它允许将一个设备的地址空间映射到另一个不同的地址空间,这通常用于硬件设计中,其中某些设备通过总线桥接器(bus bridges)连接到CPU或主总线。这种映射是必需的,因为不是所有设备都直接连接到CPU可以访问的地址空间。
2024-06-25 21:56:45
408
原创 设备树(Device Tree)的结构和语法
DTS语法定义了如何在源文件中表示设备树的结构。节点定义:使用花括号{}定义节点,节点名称可以包含和单元地址。属性定义:在节点内部定义属性,属性值可以是字符串、单元列表或其他数据类型。注释:使用//进行单行注释。
2024-06-25 16:51:06
754
原创 LINUX中的设备树
Linux中的设备树(Device Tree)是一种用于描述硬件信息的数据结构,它允许内核在启动时获取硬件的配置信息。设备树的使用在嵌入式Linux系统中尤其普遍,特别是在ARM架构的系统中。以下是对设备树的详细分析以及在编写驱动时需要完成的工作和注意事项的讲解。
2024-06-25 16:29:13
1205
原创 Linux 5.7内核内存管理-brk系统调用的工作原理和代码流程
brk系统调用是用于控制进程数据段(也称为堆)大小的接口。在Linux中,堆是动态内存分配的一部分,进程可以通过brk系统调用来增加或减少堆的大小。brk系统调用接受一个参数,即新的堆结束地址。brk系统调用是Linux内核内存管理中的一个重要组成部分,它允许进程动态地调整堆的大小。通过sys_brk和do_brk函数的实现,我们可以看到内核是如何管理内存区域、分配内存页以及更新内存管理数据结构的。
2024-06-25 15:58:45
814
原创 Linux 5.7内核内存管理-缺页异常的工作原理和代码流程
在Linux 5.7内核中,内存管理是操作系统的核心功能之一,而缺页异常(Page Fault)处理是内存管理中的重要组成部分。缺页异常发生在进程访问的虚拟地址没有对应物理页面时。处理缺页异常涉及到内存保护、页面置换、内存映射和虚拟内存管理等多个方面。
2024-06-25 15:46:42
495
原创 进程上下文切换
在ARM64架构上运行的Linux 5.7内核中,进程上下文切换是通过一系列的函数调用完成的,这些函数负责保存当前任务的状态,并恢复新任务的状态。以下是进程上下文切换的详细流程,以及涉及的关键函数和代码片段。
2024-06-25 15:23:25
465
原创 __schedule()函数
在ARM64架构上运行的Linux 5.17内核中,函数的详细实现涉及多个步骤和组件。下面将对每个关键功能进行更深入的展开,并提供一些代码逻辑的示例。
2024-06-25 15:13:53
601
无线局域网入侵检测
2018-05-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人