- 博客(97)
- 资源 (11)
- 收藏
- 关注
原创 最简单的BufferQueue测试程序(一)
本示例代码使用BufferQueue最基本的操作接口,演示了BufferQueue操作的基本流程。Android版本:8.1伪代码void main(void){ createBufferQueue(); consumerConnect() connect(); dequeueBuffer(); requestBuffer(); queueBuffer(); a...
2019-08-10 11:08:52 4489 1
原创 DRM 驱动程序开发(开篇)
前言在前面的《最简单的DRM应用程序》系列文章中,我们学习了如何使用 libdrm 接口编写 DRM 应用程序。从本篇开始,我们将进入一个全新的世界,一起来学习如何在 kernel 空间编写 DRM 驱动程序。Objects在开始编写 DRM 驱动程序之前,我有必要对 DRM 内部的 Objects 进行一番介绍。因为这些 Objects 是 DRM 框架的核心,它们缺一不可。上图蓝色部...
2019-05-04 09:01:50 42701 26
翻译 DRM (Direct Rendering Manager) 的发展历史
https://en.wikipedia.org/wiki/Direct_Rendering_Manager#History
2019-03-23 12:47:38 13327 13
原创 DRM应用程序进阶 (atomic-plane)
前言在上一篇《DRM应用程序进阶(atomic-crtc)》文章中,我们学习了如何通过libdrm的atomic接口实现modeseting的操作。本篇,我们将一起来学习如何通过atomic接口,来实现 drmModeSetPlane() 相同的操作。Atomic Commitplane update的atomic操作如下:drmModeAtomicAddProperty(req, pla...
2019-02-20 21:37:34 24208 45
原创 DRM应用程序进阶 (atomic-crtc)
前言在上一篇《DRM应用程序进阶(Property)》中,我们学习了Property的基本概念及作用。在本篇中,我们将一起来学习如何操作这些Property,即libdrm Atomic接口的用法。Atomic为什么叫“Atomic Commit”?初学者第一次接触到DRM时,总会好奇当初开发者为什么要起 Atomic 这个名字。Wiki上关于该名词有较详细的解释,如果大家感兴趣可以通过本...
2019-02-15 23:04:04 26093 14
原创 DRM应用程序进阶 (Property)
前言通过前面几篇《最简单的DRM应用程序》系列文章,我们学习了如何编写一个最基本的DRM应用程序。但是,这些程序所使用的接口,在如今的DRM架构中其实早已经被标记为 Legacy(过时的) 接口了,而目前DRM主要推荐使用的是 Atomic(原子的) 接口。Atomic接口我会在下篇文章中重点介绍,本篇主要介绍Atomic操作必须依赖的基本元素,Property(属性)。Property所谓...
2019-02-13 22:42:32 23515 22
原创 最简单的DRM应用程序 (plane-test)
在上一篇 最简单的DRM应用程序 (page-flip)中,我们学习了drmModePageFlip()的用法。而在更早的两篇文章中,我们还学习了drmModeSetCrtc()的使用方法。但是这两个接口都只能全屏显示framebuffer的内容,如何才能在屏幕上只显示framebuffer的一部分内容呢?本篇我们将一起来学习DRM另一个重要的刷图接口:drmModeSetPlane()。在学习...
2018-12-10 02:26:18 36471 77
原创 最简单的DRM应用程序 (page-flip)
在上一篇 最简单的DRM应用程序 (double-buffer)中,我们了解了DRM更新图像的一个重要接口drmModeSetCrtc()。在本篇文章中,我们将一起来学习DRM另一个重要的刷图接口:drmModePageFlip()。drmModePageFlip()的功能也是用于更新显示内容的,但是它和drmModeSetCrtc()最大的区别在于,drmModePageFlip()只会等到V...
2018-12-01 15:50:20 32370 61
原创 最简单的DRM应用程序 (double-buffer)
在上一篇 最简单的DRM应用程序 (single-buffer)中,我们学习了如何去编写一个最基本的DRM应用程序。而本篇文章,将在 modeset-single-buffer 的基础上,对其进行扩展,使用双buffer机制的案例,来加深大家对drmModeSetCrtc()函数的印象。使用上一节中的modeset-single-buffer程序,如果用户想要修改画面内容,就只能对mmap()后...
2018-11-24 19:52:35 24476 27
原创 最简单的DRM应用程序 (single-buffer)
在学习DRM驱动之前,应该首先了解如何使用DRM驱动。以下使用伪代码的方式,简单介绍如何编写一个最简单的DRM应用程序。伪代码:int main(int argc, char **argv){ /* open the drm device */ open("/dev/dri/card0"); /* get crtc/encoder/connector id */ drmModeGe...
2018-11-17 11:53:00 57164 60
原创 LCD显示异常分析——撕裂(tear effect)
概述在上一篇《LCD显示异常分析——开机闪现花屏》中,我们一起分析了开机花屏的问题,在这一篇中,我将对LCD撕裂(tear effect)问题进行详细分析,以及给出这类问题的常用解决方法。本文适用范围: 对象:LCD驱动调试人员 硬件:带GRAM的LCD (如SPI/MCU/DSI CMD屏) 软件:所有嵌入式操作系统 现象首先贴一张动态图,让大家能直观...
2018-02-13 23:58:31 33747 22
原创 LCD显示异常分析——开机闪现花屏
概述最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现。其实这类问题的原理分析并不难,只是在给别人解释的时候不太好描述,因此,我特地写了这篇文章,好让大家能够更容易、更直观的理解这类花屏问题的原因,也希望能够帮助那些遇到同样问题的朋友。环境 软件:Android 硬件:带GRAM的LCD(如
2018-01-30 01:08:44 16201 7
原创 STM32F429 Discovery FMC驱动原子4.3寸LCD
本人手里有块STM32F429 Discovery板子,因为某种原因需要使用8080接口的LCD,而该块开发板自带的LCD接口采用LTDC驱动,所以就在正点原子这里买了一块4.3寸电容触摸屏,驱动IC为NT35510。 为了快速搭建软件工程,本人使用STM32CubeMX工具生成代码模板,并编写了lcd.c和nt35510.c两个文件,代码如下:
2015-04-25 19:36:19 7189
原创 S3C2440之Camera驱动代码模板(RealView MDK)
好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 Camera驱动代码。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。最初,本人在网上下载了许多mini2440 camera驱动的代码,但结果都不尽人意,因为这些代码看起来都比较晦涩难懂,都是直接对寄存器进行位与位或操作,且有的代码排版布局很乱,对初学者来说难度较大。由于本人接触了STM32开发后,觉得STM32的库函数给初学者提供了很大帮助,仅仅通过函数名及变量名就能知道当前操作的是哪个寄存器,
2015-04-08 10:59:14 1093
原创 S3C2440之UART驱动代码模板(RealView MDK)
好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 UART驱动代码。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。需要注意的是,本代码中,对GPIO的初始化放在了s3c2440.s中完成,采用keil自带的html方式进行配置。该源码结构简单明了,原始工程下载地址:点击打开链接UART控制器初始化:voi
2015-03-03 18:08:03 1099
原创 S3C2440之MMU驱动代码模板(RealView MDK)
好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出自己写的S3C2440 MMU代码库。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。该源码结构简单明了,原始工程下载地址:点击打开链接
2015-03-03 17:36:41 1256 1
原创 S3C2440之LCD驱动代码模板(RealView MDK)
好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 LCD控制初始化代码。使用友善MINI2440开发板,LCD为320*240,开发环境为RealView MDK 4.22。该源码结构简单明了,原始工程下载地址:点击打开链接
2015-03-03 15:49:12 1225
原创 STM32F429之LTDC驱动图解
本文基于ST官方demo板STM32F429 Discovery硬件平台,以看图说话的形式给大家讲解LTDC的主要参数配置。关于本文提到的代码部分均摘自本人另一片文章《STM32F429之LTDC代码模板》,LCD硬件为240x320,驱动IC为ili9341。本文目的意在让大家通过几张图就能掌握STM32F429 LTDC控制器的配置要领,而从干涩的文字中解脱出来,方便记忆。当然本文只是讲解了LTDC一些常用的设置,关于更多细节的操作还是得参照ST的官方datasheet。
2015-03-02 00:34:21 20666 6
原创 STM32F429之LTDC代码模板
好记心不如烂笔头,为了方便以后快速查阅代码,提高开发效率,在这里特将LTDC驱动的初始化代码贴上来。本代码是基于ST官方STM32F429 Discovery Demo板的,学习LTDC驱动时参考了Demo板的官方例程,但是总觉得官方例程写得有点繁琐,不简洁明了,于是在此基础上重新整理代码得到如下初始化模板。
2015-02-28 16:47:16 7811 3
原创 Windows Phone 8.1 驱动开发——SPB 简介
SPB是Simple Peripheral Bus的简称,直译过来就是简单外设总线,它包括I2C总线、SPI总线。SPB是在Windows 8以后才被驱动支持的,而在之前如果系统想访问I2C外围设备,则只能通过BIOS程序间接的访问,没法直接访问外设寄存器。在系统启动时,ACPI固件会根据配置表扫描SPB设备,并将它们的资源信息传递给PnP(即插即用设备)管理器,这些资源就包括I2C从设备地址、I2C总线时钟频率以及该设备的中断号。需要注意的一点,在ACPI资源配置表中,是不允许使用Memory32Fixe
2015-01-21 23:37:07 3460
原创 Windows Phone 8.1 驱动开发——如何调用ACPI Method
今天给大家讲解一下,在KMDF(Kernel-Mode Driver Framework)中是如何调用ACPI配置表中用户定义的Method。在ACPI中,凡是以下划线开头的Method(如_STA)都系统预定义的Method,它们都由Windows OS自己调用,其他用户自定义Method则由驱动程序调用。
2015-01-20 00:20:51 5188 1
原创 Windows Phone 8.1 驱动开发——注册表read/write
在做Windows Phone驱动开发时,时常需要和注册表打交道,因此,作为手机驱动开发人员,有必要了解一下注册表相关的知识。本人目前对注册表也不怎么了解,也只是大概的知道在Windows Phone下,驱动的inf文件并不像桌面Windows那样提供驱动自动安装程序,在Windows Phone下,inf文件最终会被解析成注册表信息并添加到注册表中。我们驱动往往将一些硬件参数保存在注册表中,因此在软件编程时,自然就会涉及到注册表的读写更新操作。
2015-01-18 19:28:28 1739
原创 Windows Phone 8.1 驱动开发——GPIO Device
在上一节 Windows Phone 8.1 驱动开发——GPIO 简介 中,我们了解了Windows 8系统中GPIO驱动的大体架构,由于在工作中手机驱动开发人员很少涉及到GPIO Controller驱动的开发,该部分都由平台厂商开发完成,所以这里给大家讲解一下GPIO Peripheral Device Driver的开发步骤。本文以微软官方提供的GPIO Sample为例进行讲解,你也可以到MSDN官网进行源码下载:GPIO Sample Drivers
2015-01-18 03:55:34 4195 2
原创 Windows Phone 8.1 驱动开发——GPIO 简介
在windows 8系统中,GPIO驱动被分成了三部分:GPIO控制器驱动、GPIO框架(GpioClx) 和 GPIO外设驱动。GPIO控制器驱动:直接操作GPIO控制寄存器,与控制器硬件相关,并通过事件回调的方式将数据传送给GpioClx。GPIO框架:负责连接GPIO Controller Driver 和 Periphera Device Driver 的中间层,实现外设驱动与控制
2015-01-17 12:47:13 2000
原创 MTK DriverOnly——Camera移植
一、原理图确认 首先通过硬件人员或SPM获取到项目的电路原理图,观察Camera部分的电路原理图,了解Camera的总线接口以及引脚定义。下图为Tango+3GCamera部分的电路示意图: 二、GPIO配置 由以上原理图可知,Camera接口总共使用了17根引脚,分别为8根控制信号线、8根数据信号线和1根模组ID引脚。其中SCL、SDA、
2014-03-17 14:56:42 2935
原创 Config Spec语法举例说明
本文以Tango+3G V1.0 Bugfix 的Config Spec文件为例进行说明。 #==========================================================================# History :#----------------------------------------------------------
2014-02-20 11:12:03 1346
原创 ClearCase查不出checkout文件的解决办法
现象:在对某一个或某一些文件进行Check Out操作以后,当使用Find Checkouts时,却无法找出Check Out文件,如下图: 由上图可知,sim_msdc_test.c文件和BC_drv.c文件已经成功Check Out了,但是当使用Find Checkouts时,却出现如下状况: 问题原因:通过IT6000的帮
2014-02-20 11:02:00 948
原创 ClearCase基础培训——学习笔记
个人总结: 一个VOB实际上就是一个版本受控的文件的集合,这个集合存在于服务器上,并且这个集合是只读的。通过它的英文全称就很容易理解(Versioned Object Base)。 一个View实际上就是一个窗口,有了这个窗口,用户就能够看到VOB中的具体内容,实际上就是将VOB中想要访问的内容映射到这个窗口中来,没有这个窗口,用户就无法访问VOB中的数据。 注:以下图片均
2014-02-20 10:51:08 887
原创 FatFs源码剖析
一、介绍:本文以网上开源文件系统FatFs 0.01为研究对象,剖析FatFs文件系统的核心操作。FatFs目前最新版本已更新到0.10a版本,而我之所以选择0.01版本,是因为这是最早的发布版本,与最新的版本相比,去掉了很多高级应用,且代码量相对较小,宏开关也少了许多,易于阅读和理解,用来研究它的雏形再合适不过了,所以笔者选择0.01版本进行剖析。当大家了解了0.01的核心思想后,再回去看最
2014-02-19 17:25:22 10947 4
原创 FAT16图文详解
注:FAT16驱动代码不是本人编写的,是从网上下载的,本人只是对该代码进行研读学习,并做下笔记。该FAT16驱动应该是比较老的了,猜测应该在DOS时代比较流行,但放在今天,对于刚刚进阶FAT16的小伙伴来说,还是很适合初学者学习的好资料!笔者也相信,只要小伙伴们静下心来,慢慢读懂该代码,相信很快就能在脑海中形成一张FAT16的总览图了。 笔者对代码进行了简单测试,在STM32平台
2013-12-26 21:44:16 2990 3
原创 《建立一个属于自己的AVR的RTOS》笔记——完善的占先式内核
第八篇:完善的占先式内核 与第七篇没有多大区别,只是将前面的占先式内核与协作式内核相结合,增加了任务阻塞和信号量功能。 任务级切换:高优先级——>低优先级 中断级切换:低优先级——>高优先级
2013-12-12 13:14:24 885
原创 《建立一个属于自己的AVR的RTOS》笔记——任务调度对比
第七篇:占先式内核(只带延时服务)——任务调度对比 协作式内核 + 轮番调度内核 = 占先式内核
2013-12-12 13:10:55 806
原创 《建立一个属于自己的AVR的RTOS》笔记——时钟节拍中断对比
第七篇:占先式内核(只带延时服务)——时钟节拍中断对比增加了IntNum和OSCoreState两个变量register unsigned char IntNum asm("r4"); //中断嵌套计数器 //只有当中断嵌套数为0,并且有中断要求时,才能在退出中断时,进行任务调度 register unsigned char OSCoreState
2013-12-12 13:05:47 877
原创 《建立一个属于自己的AVR的RTOS》笔记——时间片轮番调度
第六篇:时间片轮番调度法的内核 //进行任务调度 void OSSched(void) { // 根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况 __asm__ __volatile__("PUSH __zero_reg__ \t"); //R1 …… __asm__ __volatile__("In
2013-12-12 12:59:36 970
原创 《建立一个属于自己的AVR的RTOS》笔记——OSTaskSemPost
第五篇:完善的协作式的内核——OSTaskSemPost //发送一个信号量,可以从任务或中断发送 void OSSemPost(unsigned char Index) { if(Sem[Index].OSEventType) //当要求的信号量是共享型 { Sem[Index].OSEventState=0x
2013-12-12 12:53:43 1131
原创 《建立一个属于自己的AVR的RTOS》笔记——OSTaskSemPend
第五篇:完善的协作式的内核——OSTaskSemPend //任务等待信号量,挂起 unsigned char OSTaskSemPend(unsigned char Index,unsigned int Timeout) { //unsigned char i=0; if(Sem[Index].OSEventState) //信
2013-12-12 12:08:53 1998
原创 《建立一个属于自己的AVR的RTOS》笔记——OSSemCreate
第五篇:完善的协作式的内核——OSSemCreate //信号量 struct SemBlk { unsigned char OSEventType; //型号 0,信号量独占型;1信号量共享型 unsigned char OSEventState; //状态 0,不可用;1,可用 unsigned char OSTaskPendT
2013-12-12 12:05:39 1062
原创 《建立一个属于自己的AVR的RTOS》笔记——OSTaskResume
第五篇:完善的协作式的内核——OSTaskResume //恢复任务 可以让被OSTaskSuspend或 OSTimeDly暂停的任务恢复 void OSTaskResume(unsigned char prio) { OSRdyTbl |= 0x01<<prio; //从任务就绪表上重置标志位 TCB[prio].OSWaitTick=0;
2013-12-12 12:02:54 781
原创 《建立一个属于自己的AVR的RTOS》笔记——OSTaskSuspend
第五篇:完善的协作式的内核——OSTaskSuspend //挂起任务 void OSTaskSuspend(unsigned char prio) { TCB[prio].OSWaitTick=0; OSRdyTbl &= ~(0x01<<prio); //从任务就绪表上去除标志位 if(OSTaskRunningPrio==prio)
2013-12-12 12:00:15 806
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人