MTK驱动架构分析及驱动调试指引_第1页
MTK驱动架构分析及驱动调试指引_第2页
MTK驱动架构分析及驱动调试指引_第3页
MTK驱动架构分析及驱动调试指引_第4页
MTK驱动架构分析及驱动调试指引_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MTK驱动架构分析及驱动调试指引张雷2006.9版本历史2005-9 张雷2005-11 张雷2006-9 张雷内容介绍MTK驱动程序架构分析Mediatask与Camera程序分析UEMtask与中断处理流程LCD及背光程序分析MTK驱动程序调试Camera实现方案及驱动调试介绍LCD及背光方案及调试介绍一、MTK驱动程序架构分析一、MTK驱动程序架构分析

1.1Mediatask与Camera程序分析1.2UEMtask与中断处理流程1.3LCD及背光程序分析Camera程序架构Camera程序相关模块MMItaskCameraAPP:控制应用程序逻辑MDI:应用程序接口层,直接操作CamerafeatureGDI:处理Multi-layer,实现OSD

Mediatask调用Camera驱动程序的接口层CameraDriver控制CameraBackendIC,Sensor以及LCD硬件LCDinterface控制LCMCameraMMI程序分析(1/3)CameraMMI层实现Camera的应用程序的逻辑,控制Camera的各种状态。应用程序实现了Camera的状态机,包括了preview,capture,save

confirm,save

down,cout

down,exit等各种状态控制。绘制Camera的OSD层实现连拍、延迟拍摄等功能实现对音频,LED,LCD的逻辑控制CameraMMI程序分析(2/3)CameraMMI程序分析(3/3)CameraMMI仅控制应用逻辑,而避免去涉及照相机驱动的细节。比如说进入preview过程,CameraMMI仅仅是向MDI接口模块发送一个Preview的请求,并将自己的数据结构传给MDI层,再由MDI层向Mediatask层发送请求,并最终调用到驱动程序来控制芯片实现preview。MMI不关心不同的芯片如何去进入preview。OSD是通过GDI层来绘制的,因为GDI支持最大4层的图像叠加(6228平台可支持6层GDI)MDI简介MDI模块是MediaDeviceInterface的缩写。MDI模块为多媒体MMI层提供一整套API,使得应用程序编程更加简单。MDI层位于MMI层与Mediatask之间,MDI对MMI屏蔽了与Mediatask通信的细节,以及多媒体状态信息。MDICamera模块是MDI中的一部分。CameraMDI分析(1/3)CameraMDI提供Camera相关的API,它有以下几个主要的作用:提供简单易用的Camera接口负责从MMItask向MediaTask发送并处理消息,并通过一些事件处理MMI与Mediatask的同步关系。负责过滤和转换从Cameraapp到MediaTask的数据CameraMDI分析(2/3)MDI在处理了APP的数据以后最终要和MediaTask进行通信,它通过cam_send_XXX_req()函数向MediaTask线程发一条消息,并将MMItask线程阻塞,在收到MediaTask线程的相应以后,再将MMItask恢复到就绪状态。阻塞MMI的命令是CAM_WAIT_EVENT(XXX),当Mediatask调用CAM_SET_EVENT(XXX)时,恢复MMI线程。CameraMDI分析(3/3)MMI程序通过MDI层对底层的调用关系:

mmi_camera_preview_start(MMI逻辑控制)

mdi_camera_preview_start(数据转换)

mdi_camera_preview_start_internal(数据打包,OSD层绘制,设置当前LCD的ID)

media_cam_preview(发消息,阻塞MMI线程)

cam_send_preview_req(消息排队)

med_task_main(检查消息)

med_maincam_main(识别消息)

cam_preview_req_hdlr(消息处理,控制驱动程序)GDI简介(GraphicsDeviceInterface)MTK的画图功能有两套体系,一套是pixtel的体系,另一套是GDI。Pixtel的体系比较老,它最开始是用来处理单层图像的简单接口,pixtel体系也是基于GDI基础上封装出来的。而GDI体系由于有硬件的支持,它可以处理最多4个层数据的叠加,有很强的表现能力。硬件支持有:DMA的传输,图片硬件解码,以及2D加速器等。GDI应用大部分的菜单使用Pixtel_UI来绘制,因为没有必要使用复杂的GDICamera程序需要使用GDI来实现,因为最初的backendIC并不是很强大,很多都不能支持多层OSD,这时就不能在Preview区域以内叠加ICON(象框除外)。这时需要GDI来实现多层叠加,事实上在19以后的平台,MTK的拍照部分是完全依赖GDI来实现多层叠加的除Camera以外,Idlescreen和MediaPlayer等也使用GDI,对基于05C软件体系的新软件,在MMI的体系尚做了大的变革,GDI的作用更大GDI和pixtel_UI的关系GDI使用简介使用GDI_HANDLE,gdi_handle来操作GDI对象,GDI的对象可以是layer,gif,jpeg等。GDI函数返回一个GDI_RESULTGDI函数使用互斥来保护,进入GDI函数时调用GDI_ENTER_CRITICAL_SECTION()退出函数时调用GDI_EXIT_CRITICAL_SECTION()MediaTask简介MediaTask模块分成4个部分:CameraAudioImageVideoMediaTask分析(1/3)MediaTask模块有以下的作用:管理硬件资源(camera,audio,ect.),为上层程序提供方便和统一的接口。使用一个单独的线程,能更好的处理实时性很强的任务,如Camera,Audio,jpegdecoder,并且各个模块之间共享内存资源,提高了内存使用效率。MediaTask封装了硬件驱动程序的API,其他线程通过消息调用各种功能MediaTask功能很强,管理方便,但它并不是完美的体系,比如在Mp3背景播放时不能同时使用照相机功能,这是由于将Mp3和Camera用同一个task管理所必然引起的。MediaTask分析(2/3)MediaTask线程从med_create开始创建,其实med_create函数只是将入口地址传递给库里的函数,由里面的函数来创建线程。Med_create中传入了以下的函数:

med_task_main, /*线程入口,消息泵*/

med_init, /*初始化,指定空间分配*/NULL, /*线程配置*/

med_reset, /*重设*/NULL, /*线程结束*/MediaTask分析(3/3)med_task_main函数是MediaTask的消息泵。这里是一个无限循环,不停从消息队列中获取消息分发消息。从消息队列中获取消息,通过receive_msg_ext_q函数来实现设置当前活动模块,通过stack_set_active_module_id分发消息,通过消息号,找到对应的消息处理函数,使用med_main函数。程序里面有很大的一个消息索引释放返回消息数据内存区域,free_ilmMediaTask

Camera(1/4)MediataskCamera部分可以分为两层:上层为Msghandler负责处理Mediatask消息,并和MDI层共同维护一个Camera的状态机。下层为驱动程序封装层,这层按驱动程序的接口一一对应封装程序。MediaTask

Camera(2/4)MediaTask

Camera(3/4)在Mediatask上层,实际上对Camera硬件逻辑进行了判断,并和上层是交互的。Msghandler对各种逻辑的判断,并不涉及太多硬件操作细节,更多的是对消息逻辑的控制,在一定时间没有驱动程序响应,或者Powercheck失败等情况,就返回并通过SetEvent来释放被阻塞的MMI线程。MediaTask

Camera(4/4)MediaTaskCamera主要有两个部分,前面所讲的是Cam_msg_handler.c部分。在下层是Ext_camera.c文件。虽然都属于MediaTask模块,但实现的职责并不相同:Cam_msg_handler.c主要负责处理和控制消息Ext_camera.c文件则主要是封装驱动程序,并负责控制LCD和Camera状态的逻辑。此文件里的函数基本上和Cam_module.c驱动文件里的函数一一对应,它抽取出了每个函数的一些共性的东西(主要是对芯片状态的控制和对LCD的控制),使得在对Cam_module.c编程的时候仅需要考虑和backendIC硬件相关的东西。Camera驱动封装方法Ext_camera.c模块下层是Cam_module.c模块,Cam_module.c是按照一个模板规则编写的驱动程序实现文件:这里使用全局函数结构体ext_cam_module_func,来共享驱动函数的指针。ext_camera.c可以从ext_cam_module_func类型的全局变量中得到驱动函数指针,并调用相关函数这样做是为了方便配置管理,驱动程序可以使用不同的函数名称,可以配置在不同的目录,只要符合ext_cam_module_func模板的规则即可驱动函数封装解析(1/2)驱动函数封装解析(2/2)MediaTaskCamera总结总结MediaTaskCamera的主要作用:封装了Camera驱动程序控制了消息循环进行出错判断,控制一些超时等待以及硬件错误的处理逻辑med_global.h中可以简单配置MediaTask的一些参数MediaTask总结总结充分了解MediaTask的作用和工作流程以后,就可以理顺从Camera应用程序到底层程序的整个流程和逻辑,无论是应用程序还是驱动程序编程都会变得非常的轻松。MediaTask是可扩展可更改的,所有的代码都是开放的,我们也可以订制一些自己的东西。比如在200万像素拍照时出现了内存不足问题,我们就修改了对文件的操作方法。一、MTK驱动程序架构分析 1.1Mediatask与Camera程序分析1.2UEMtask与中断处理流程1.3LCD及背光程序分析UEMtaskUEM(UserEquipmentManager)用户设备管理模块,管理Keypad、GPIO、RTC、USB及耳机等基本的用户设备。UEM层是位于设备Driver层与L4C层之间的中间层。UEM的下行消息一般是MMI对设备的请求,UEM的上行消息,一般是由设备中断发起。UEMOverviewUEMtask简介UEMtask和普通task的创建流程是一样的,关于task的创建在《MTK软件架构分析》课程中已经讲过。uem_main.c文件中的uem_main函数是uem_task消息分发的地方,处理所有的消息。Uemtask中直接调用与中断协议栈相关的函数,并且直接操作芯片地址空间UEM与中断处理流程分析(1/6)下面以CLAM中断为例来讲UEMtask与中断(示例代码为T05A_V31)中断的注册UEM与中断处理流程分析(2/6)中断服务例程UEM与中断处理流程分析(3/6)消息处理UEM与中断处理流程分析(4/6)L4c的相应函数UEM与中断处理流程分析(5/6)MMItask的处理函数UEM与中断处理流程分析(6/6)GpioDetectInd函数一、MTK驱动程序架构分析 1.1Mediatask与Camera程序分析1.2UEMtask与中断处理流程1.3LCD及背光程序分析LCD及背光程序分析LCD和背光程序是都是程序中最基本的模块,它们是相互独立的模块:LCD相关的主要是LCDIF模块(lcd_if.c),它直接控制LCD显示,它可能被GDI及Meditatask调用背光相关模块有GeneralDeviceInterface.c文件,是MMI中控制背光的程序。另外,custom_equipment.c文件,是在uemtask中直接操作背光芯片的模块LCDIF介绍LCDIF模块是LCD的重要模块,它位于GDI与LCDdriver之间LCDdriver模块控制LCD芯片,而LCDIF控制MTK芯片的LCDinterface硬件模块LCDIF并不是使用单独的task,LCDIF直接被GDI和Mediatask调用。这里存在的问题是Mediatask和MMI可以同时控制LCD显示LCDIF图解LCD接口程序模块是一个中间层,它在整个软件架构中的位置是:MMIGDI/GUILCDIFLCDLCDDriverLCD驱动的封装方法同Camera程序,封装的函数中,有以下几个关键函数:LCDinitial:开机时初始化LCDLCDentersleep:使LCD进入休眠状态LCDExitsleep:使LCD从休眠状态进入Standby状态LCDBlockwrite:控制LCD显示一帧画面二、MTK驱动程序调试二、MTK驱动程序调试

2.1Camera实现方案及驱动调试介绍2.2LCD及背光方案及调试介绍Camera硬件架构Camera模块硬件在手机上的基本架构有三种:Baseband控制LCD+Sensor,Baseband对图像进行硬件或软件的jpeg编解码(如6219)。Baseband控制LCD+Backend

IC,BackendIC只控制Sensor。这时BackendIC的处理能力会相对较弱,硬件结构也比较简单(如PAP1301)。Baseband控制BackendIC,并且在非Camera模式下Baseband控制LCD,在Camera模式下BackendIC控制LCD进行各种操作。目前的大部分backendIC都是这样的硬件架构(如CL71x和VC05xx系列)。Camera硬件架构架构1(MT6219)MT6219LCMBasebandSensorCamera硬件架构架构2(PAP1301)MT6218BPAP1301LCMBasebandCameraBackendSensorCamera硬件架构架构3(CL712S8)MT6218BCL712S8

(CoreLogic)LCMBasebandCameraBackendSensorCamera硬件架构我们这里主要讨论的是架构3,拍照性能指标主要有:1、预览帧率,这主要由Sensor采集到的原始数据传输到BackendIC的速率决定2、拍照速率,主要由BackendIC中JPEGCodec模块编码的速度决定3、照片大小,主要内部的RAM空间大小,及Codec编解码能力预览桢率分析(1/3)分析瓶颈1,先了解Sensor的工作原理:Sensor可提供若干Size的预览模式,如OV9650是1.3MSensor,它提供两种Preview的模式:VGA和SXGA。两者在Preview时的数据量相差大约有4倍。如果不考虑BackendIC因素和LCD的刷新速度,Preview的帧率将相差4倍之多。BackendIC接收yuv信号后,转换成RGBbitmap,并做Resize,截取其中的部分或全部数据后,再进行图像压缩(压缩成LCD大小preview),然后送LCD显示。MClock将直接影响数据传输速度。预览桢率分析(2/3)影响预览桢率瓶颈的两个Sensor因素:预览的Size,size越小桢率越高MClock的频率,频率值越大,桢率越高除了Sensor端的因素,还有其他一些因素影响着预览桢率:LCD的最大刷新速率BackendIC的处理速度硬件方案的架构预览桢率分析(3/3)预览桢率与拍照速率之间的取舍,也是影响预览桢率的主要因素:低像素预览进行拍照时,需要切换到高像素模式,这需要消耗时间。高像素预览,不需要切换Sensor尺寸,拍照速率快,但预览速率很难提高。一般来说,Sensor工作模式的切换,需要较长时间。如OV9650在从VGA模式到SXGA模式的切换,需0.5~1秒的等待Sensor重新稳定(调节WB和EV等)。如果Sensor需要重新上电,则需要更长时间。拍照速率分析(1/1)影响拍照速率主要有以下几个因素:backendIC内部Codec的压缩速率,这是影响拍照速率的直接因素拍照时的图像截取方案,如是否切换Sensor尺寸,这是影响拍照速率的重要因素此外,拍照照片使用何种方式提取,是DMA方式还是普通方式,将照片从RAM直接转存到nandflash还是,使用内存缓冲,等也会影响拍照速率照片大小分析(1/1)相机支持相片大小,也是相机性能的重要指标。但它不是由驱动程序或外围电路方案决定,而是由芯片本身确定,主要是以下两个因素:BackendIC的jpeg编码能力芯片内部的RAM大小相机案例分析1(1/1)预览桢率与拍照速率的取舍问题,在M910的上,我们取拍照速率,采用SXGA预览模式。确定这样的方案是由整体硬件性能决定的:LCD选用的是CSTN屏,屏的刷新帧率最大只能达到10帧/s。预览高帧率是没有意义的。使用26MHz的较高频率时钟来驱动Sensor,SXGA模式下预览的帧率为7.2帧/秒。这和10帧/秒预览,在CSTN屏上没有明显差别。采用SXGA模式预览,拍照时无需进行模式切换,拍照时可以直接压缩当前预览帧的图像数据,拍照速率高。相机案例分析2(1/2)一个普遍存在的问题,拍照时“所见非所得”,即拍照所得的图片并非按下快门时看到的那张图片。品质部将其描述为,拍照过程中将手机从A处移动到B处,拍到了B处的景物,并将B处的景物回显出来以上的现象是由于拍照时,相机模式切换引起的。如案例1的情况,我们使用VGA预览,拍SXGA大小的图片,模式切换需要0.5~1秒时间,其间丢掉了若干预览桢,重新预览后,还需要等待Sensor的EV,WB等稳定,又必须要丢掉若干桢,所以导致了用户移动时,无法捕捉到按下快门的当前桢照片。相机案例分析2(2/2)关于拍照回显的问题,这里简要分析一下MTK的拍照回显过程:拍照时定格的图片为预览的最后一桢回显的图片为拍照最终存储的图片函数调用的过程:按下Capture键调用驱动层,送Capture命令芯片对RGB数据进行硬件编解码,并将数据存放在内部的RAM中MediaTask层申请一个buffer来从backend的RAM拷贝数据将拷贝到的数据送到GDI基带芯片对JPEG照片解码,并送到Layer2层GDI将提示信息(OSD)叠加,并送LCD_ifLCD刷屏,回显拍到的照片相机驱动方式Camera驱动采用查询方式实现,通过查询CL712S8的状态寄存器来判断相机状态。查询方式的好处是,程序的模块化较好,编程简单,容易实现,不容易出错。缺点是不够灵活。采用中断方式实现驱动,需要修改相应中断引脚的中断服务程序。对非AP类型的芯片,并不是必须使用中断方式。相机驱动porting(1/3)Porting指配置各种的参数和IO口,使芯片能在相应的基带系统中运行。Porting过程就是Bypass调试的过程。Porting过程以硬件调试手段为主,软件为辅调试手段包括:测量总线数据信号及读写时序测量时钟及电源信号的状况及信号稳定程度Reset线的信号质量及Reset是否成功仔细研究芯片资料及硬件电路原理图,各个功能引脚通过Trace确定程序执行的路径是必须的针对问题,编写测试程序是很有效的手段相机驱动porting(2/3)调Bypass主要是调试基带芯片到backendIC芯片之间的硬件通路,需要检查的模块包括:MHold引脚控制总线地址的确认及总线时序配置MClock时钟确认芯片内部偏移地址计算LCD驱动程序调试硬件电路确认,包括原理确认、供电、接地等信号确认相机驱动porting(3/3)MClcok及电源状况的确定,可以保证芯片正常的运行MHold引脚控制引脚要拉高,切换芯片的bypass状态总线地址、总线时序及芯片内偏移地址必须配置,才能对芯片进行指令读写LCD驱动调试通过,就可以确认bypass模式正常Bypass调试过程中,芯片的状态无法查询,所以调试过程基本以量测信号为主Preview调试分析(1/2)Preview的调试,主要是调试从backendIC到Sensor端及backendIC到LCD端的硬件通路及驱动模块:Sensor部分需要调试内容包括IIC总线的读写,Sensor信号和backendIC的同步等问题LCD部分主要是对BackendIC的LCD控制模块编程,使得BackendIC可以自由控制LCD刷屏Preview调试分析(2/2)调试经验:调试的顺序应该是先调试拍照功能,再调试预览刷屏,因为拍照功能,仅需要Sensor模块正常即可。BackendIC芯片中寄存器的状态应该随时获取,可以通过trace语句得到。调刷屏时,没有办法获得系统运行状态,要给LCD读写时序设置时给最保险的值。二、MTK驱动程序调试

2.1Camera实现方案及驱动调试介绍2.2LCD及背光方案及调试介绍LCDInterface(1/3)LCDInterface模块是MTK

LCD驱动方案的一个重要部分,它对LCD功能有一定的扩展及一些限制,超过LCDInterface模块处理能力的LCD器件是不能正常使用的LCD接口部分定义了一系列的寄存器,这些寄存器帮助实现LCD的中断、Muti-Layer、DMA传输控制等。LCDInterface(2/3)6217的LCD接口模块的一些基本参数:支持最大320*240的分辨率支持8位、12位、16位、18位、24位色4层结构,并且每层都有自己的大小、偏移、旋转度数等参量。LCDInterface(3/3)LCD驱动程序分析(1/4)LCD驱动程序包括lcd.c、lcd_sw.h、lcd_sw_rnd.h

、Lcd_sw_inc.h和lcd_hw.h五个文件:Lcd.c里面定义驱动程序的函数接口,被Lcd_if.c文件直接调用。这里只定义了一个全局变量MainLCD,它是一个函数结构体变量,结构体里包含所有LCD驱动函数的指针。Lcd_sw.h文件定义了总线地址、数据读写方式、DMA开关及读写语句、和Lcd.c和Lcd_if.c文件关联。这个文件里相关参量的配置非常重要。Lcd_sw_inc.h定义LCD的长和宽。Lcd_sw_rnd.h定义了颜色转换接口,定义了一些宏,将MMI层的颜色转换成LCD可以显示的颜色值。被GDI/GUI的接口层关联。LCD驱动程序分析(2/4)LCD驱动程序并不复杂,主要由以下几个关键的函数组成:LCDinitial:开机时初始化LCDLCDentersleep:使LCD进入休眠状态LCDExitsleep:使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论