mtk驱动调试举例
- 格式:pdf
- 大小:178.22 KB
- 文档页数:12
mtk 模拟器调试前篇文章介绍了手机调试的TRACE技巧,MTK手机调试是比较简单的,除了打TRACE,找ASSERT,分析DUMP外,剩下的就是经验了,有经验的人看到现象就能猜到问题出在什么地方,简单看一下TRACE只是为了确认自己的猜测.初涉此道的朋友往往需要时间,慢慢积累经验.要达到熟练,就需要有空的时候多读多研究代码.熟练的掌握了代码,解决问题就会熟能生巧.MTK的模拟器调试说没技巧也是对的,说有技巧也不错.因为模拟器的技术与其说是MTK经验,不如说是VC经验.由于模拟器能在没有样机的情况做大量的UI方面的开发,同时模拟器具有快捷,所见即所改等优点,因此,受到很多开发老手的青睐.熟练掌握模拟器使用技巧,对于提高工作效率,节省资源具有很积极的意义.工欲善其事,必先利其器.欲了解模拟器调试,就要先了解VC使用.VC调试过程中经常使用的快捷键如下:vc++断点的使用:按F9(设置断点),F5调试,F10单步调试,shift+F5退出调试F10单语句执行,F11单指令执行,Ctrl+F10执行至光标处;F9按行设置/取消断点, Alt+F9可按行,按数据或按消息设置断点;调试时,按Alt+3打开跟踪窗口,Alt+4打开变量窗口,Alt+5打开寄存器窗口,Alt+6打开内存窗口,Alt+7打开堆栈窗口,Alt+8打开汇编指令窗口;1.只要你有源代码,拥有一个模拟器是一件很容易的事.当然,有些情况下,这对于初入MTK的人来说,也是困难的,特别是在一些代码管理不善,公司人员众多,员工流动频繁的公司,你永远想象不出他们的代码会有多糟.不过一般情况下,我到一个新公司,都会试着去使用他们的代码编译得到模拟器,不管他们的代码多么糟,我总能快速的编出模拟器来.只要三个步骤: a.在编译模拟器前请关掉所有SP的宏,这是很重要的,很多SP都不提供在模拟器下运行的库,所以一个项目SP越多,在模拟器下,他无法识别的函数也会越多b.在编译过程中遇到错误,可以把所有与显示无关的代码全部使用#ifdef WIN32宏括起来,把所有不认识的类型使用typedef int xxx;重定义.把一些不能识别的宏定义使用WIN32括起来重定义一下c.在生成MODIS时,会遇到大量不认识的函数,如果少于50个,全部建成void xxx(){}类型的空函数.如果多于一百个,尝试查找这些函数的来源,如果是相关SP的,就再次补充关掉相关SP.当然如果你不怕麻烦,也可以把这一百个函数建成空函数.一般来说,把所有第三方功能和与MTK无关的功能关掉的话,不能识别的函数一般不会超过十个.经过这样三步,一般情况下你都能得一个差不多可以使用的模拟器.有了模拟器,你就可以进行下面的工作了.如果你仍然无法获得模拟器,建议咨询你的项目领导,如果你的领导也无法解决,说明这个软件组是一个组员变动很快,或者说缺乏条理性的部门,当然也有可能这个部门的程序员都是一些MTK的顶尖层高手,他们的程序从来不需要调试.总之这是会让人疯狂的部门.2.如果你顺利到到一个模拟器,那么就可以开始调试了.首先说一下断点,VC中的断点分三大类,一类是本地断点,一类是数据断点(也称之为条件断点,有人称之为高级断点),还是一类是消息断点;这三类断点分别对应于快捷键"ALT+F9"打开的对话框中三个选项卡.由于消息断点是用于跟踪WIN的消息,所以在MTK中用不着.在模拟器中一般我们只使用本地断点与数据断点.本地断点和数据断点在BUG调试中举足轻重,熠熠生辉。
MTK 平台 CAMERA 驱动浅析Camera Driver analysis in the platform of MTKDocument Number:Preliminary (Released) InformationRevision:0.1Release Date:Ghong Confidential Revision 0.1-Feb.14 2012- 1 -Ⓒ2012 Ghong inc.Revision HistoryRevision Date (dd/mm/yyyy)Author Comments0.114/02/2012Guoqing Zhang Draft VersionGhong Confidential Revision 0.1-Feb.14 2012- 2 -Ⓒ2012 Ghong inc.Contents一、.-二、.-三、.-四、.-五、.-、.-、.-、.-、.-六、.-七、.-、.-、.-、.-、.-、.-、.-八、.-).-).-).-九、.-十、.-Ghong Confidential Revision 0.1-Feb.14 2012- 3 -Ⓒ2012 Ghong inc.一、手机Camera的物理结构:FPC: Flexible Printed Circuit 可挠性印刷电路板Sensor:图象传感器IR:红外滤波片Holder:基座Lens:镜头二、Camera的成像原理:景物通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为模拟的电信号,经过 A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过 IO 接口传输到 CPU 中处理,通过 LCD 就可以看到图像了。
Ghong Confidential Revision 0.1-Feb.14 2012- 4 -百度文库 - 让每个人平等地提升自我Ⓒ2012 Ghong inc.图像传感器(SENSOR)是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。
MtK平台驱动调试指南GPIO设置篇一、GPIO有关的函数1.GPIO_ModeSetup:函数原型:void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada)功能:设置GPIO的工作模式是作为GPIO,还是作为专有功能接口。
参数:pin:GPIO 的pin脚号,对应于原理图上MTK62XX 主CPU芯片的上的GPIO标号conf_dada:值有0~3。
其中0是表示作为GPIO模式,其他根据专有功能的不同进行设置。
2.GPiO_InitIO函数原型:void GPIO_InitIO(char direction, char port)功能:初始化GPIO的工作方向是作为输入,还是作为输出参数:direction:工作方向,0表示输入,1表示输出port:GPIO的pin脚3.GPIO_ReadIO函数原型:char GPIO_ReadIO(char port)功能:从GPIO读取数据参数:port:GPIO的pin脚4.GPIO_WriteIO函数原型:void GPIO_WriteIO(kal_char data, kal_char port)功能:往GPIO写数据参数:data:1表示给高电平,0表示给低电平port:GPIO的pin脚备注:这些函数在Gpio.C中可以找到。
二、GPIO模式设置GPIO口在系统上电的时候,有的是默认高电平,有的是默认低电平,这是MCU 内部决定的,软件无法更改,但是在系统开机过程中,会对GPIO进行初始化,MCU中有几个GPIO模式初始化寄存器,通过这个寄存器给GPIO设置初始模式。
例如:以下这个寄存器就是用来设置0-7号GPIO的模工作模式的。
这个初始化过程在Gpio_Drv.C中的函数GPIO_init()中,项目开始的时候,先要检查这个部分的模式设置是否正确。
三、各个功能模块的GPIO设置1. LCD背光,马达有的LCD背光是靠GPIO进行控制的,有的则靠PMIC进行控制。
TAG:一.常见LCD接口规范介绍,二.MTK LCD驱动相关的主要文件路径三.怎样在MTK平台新建一个LCD驱动四.驱动程序(rm68120.c)主要任务实现五.主要调试经验总结一.常见LCD接口规范介绍,目前主流的LCD接口主要分为三种,DBI, DPI, DSI。
其中DBI又分为parallel DBI 和serial DBI。
DPI 与DBI的主要区别,简单说来就是:DPI接口的LCD,从AP端接收的数据已经解析成RGB的,只要直接显示就行了,刷新的频率也由AP控制;DBI接口的LCD, 从AP端接收的数据还要经过自己的处理,并自己控制刷新的频率。
而DSI采用的是目前较新的MIPI接口,MIPI接口的传输速度会快很多,主要用在一些分辨率较高的LCD上,目前在我们的平台上还未使用过,不做过多的介绍parallel DBI(B型DBI)的命令和数据都在数据总线D[17:0]上传输。
CSX为低时数据有效。
WRX 线控制D[17:0]为写时序,RDX控制D[17:0]为读时序。
D/CX指示D[17:0]上传输的是命令还是数据。
注:mt6575使用LP A0线作为D/CX线,LPCE线作为CSX线,LWRB线作为WRX线,LRDB线作为RDX线。
serial DBI(C型DBI)的命令和数据都在SPI接口上传输。
所以传输的速度较慢,一般用在分辨率较低的LCD上,在feature phone上用的较多,在smart phone上基本上已经淘汰DPI的命令在SPI上传输,数据(RGB data)在D[23:0]上传输。
其信号的控制方式也和DBI有很大的区别,在数据线上传输的是直接可以显示color data(RGB data),需要自己的4条控制线:DPICK_PIN(时钟) 、DPIDE_PIN(数据有效位)、DPIVSYNC(场同步)、DPIHSYNC(行同步) 。
二.与LCD驱动相关的主要文件路径\mediatek\platform\mt6575\uboot\mt6575_disp_drv.c\mediatek\platform\mt6575\uboot\mt6575_disp_drv_dpi.c\mediatek\platform\mt6575\uboot \mt6575_disp_drv_dbi.c\mediatek\platform\mt6575\uboot \mt6575_dpi_drv.c\mediatek\platform\mt6575\uboot \mt6575_dsi_drv.c\mediatek\platform\mt6575\uboot \mt6575_lcd_drv.c\mediatek\source\kernel\drivers\video\mtkfb.c\mediatek\source\kernel\drivers\video\disp_drv.c\mediatek\source\kernel\drivers\video\disp_drv_dpi.c\mediatek\source\kernel\drivers\video\disp_drv_dbi.c\mediatek\platform\mt6575\kernel\drivers\video\lcd_drv.c\mediatek\platform\mt6575\kernel\drivers\video\dpi_drv.c\mediatek\platform\mt6575\kernel\drivers\video\dsi_drv.c\mediatek\custom\common\kernel\lcm\LCM_NAME\LCM_NAME.c\mediatek\custom\common\uboot\lcm\LCM_NAME\LCM_NAME.c三.怎样新建一个LCD驱动LCD模组主要包括LCD显示屏和驱动IC,我们需要控制的是就是这个驱动IC。
MTK 平台 CAMERA 驱动浅析Camera Driver analysis in the platform of MTKDocument Number:Preliminary (Released) InformationRevision:0.1Release Date:Ghong Confidential Revision 0.1-Feb.14 2012- 1 -Ⓒ2012 Ghong inc.Revision HistoryRevision Date (dd/mm/yyyy)Author Comments0.114/02/2012Guoqing Zhang Draft VersionGhong Confidential Revision 0.1-Feb.14 2012- 2 -Ⓒ2012 Ghong inc.Contents一、.-二、.-三、.-四、.-五、.-、.-、.-、.-、.-六、.-七、.-、.-、.-、.-、.-、.-、.-八、.-).-).-).-九、.-十、.-Ghong Confidential Revision 0.1-Feb.14 2012- 3 -Ⓒ2012 Ghong inc.一、手机Camera的物理结构:FPC: Flexible Printed Circuit 可挠性印刷电路板Sensor:图象传感器IR:红外滤波片Holder:基座Lens:镜头二、Camera的成像原理:景物通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为模拟的电信号,经过 A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过 IO 接口传输到 CPU 中处理,通过 LCD 就可以看到图像了。
Ghong Confidential Revision 0.1-Feb.14 2012- 4 -百度文库 - 让每个人平等地提升自我Ⓒ2012 Ghong inc.图像传感器(SENSOR)是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。
分类:LINUX一、【一】调试串口的设置驱动的调式过程经常需要通过trace工具看log的,trace前需要修改手机串口,有以下三种方法设置串口1 通过手机进入工程模式设置2 修改代码,修改Nvram_user_config.c中的NVRAM_EF_PORT_SETTING_DEFAULT[]3.通过META工具修改在连上meta:左上角选中NVRAM Editor,在跳出的对话框里选择other LID,再选择NVRAM_EF_PORT_SETTING_LID,接下来read from nvram,对话框右边就会出现串口的设置情况,对调tst_port_ps(输入0)和ps_port(输入99)的值,二【【二】关于gpio口Gpio的初始化在文件gpio_drv.c里,可以用MTK提供的工具配置也可以用代码在程序里直接操作,二者的选择要看有没有定义宏__CUST_NEW__工具初始化时要注意配置codegen.dws,该文件里配置的只是对gpio口的初始化,并不是所有的gpio口都要设置成工作时的模式,尤其是当作时钟和蓝牙部分的gpiio口,初始化时就设置成工作模式的话会造成电机电流过大的。
代码初始化时DRV_WriteReg()、DRV_Reg对gpio口寄存器操作,分别定义gpio口的模式,和方向(0:输入;1:输出),对单个gpio口操作用到以下函数(以gpio25为例):GPIO_ModeSetup(25, 0);设置GPIO25为模式0GPIO_InitIO(1,25);初始化GPIO25方向为输出GPIO_WriteIO(0, 25 );设值GPIO25输入低电平0三、【三】键盘设置1)键盘定义Keypad_def.c如果定义CUST_NEW,工具中的键盘定义对应在改文件里的KEYPAD_MAPPING(keypad_drv.h);2)硬件键盘定义与软件mmi键盘的对应nKeyPadMap[](Keybrd.c)3)工程模式键盘测试函数EntryFMKeypadTest()修改键盘测试时界面显示的键的名称1. 做好上面的第一第二两步2. FactoryModeSrc.c开始部分定义添加的键所要显示的名称,值,分别应用到keypad_layout[](确定要显示的位置),keypad_value[]3.在EntryFMKeypadTest()函数中的数组IdleScreenDigits[]里添加要显示的键4)如果要设置一个键不管在什么界面下都起作用的话(如手电筒开关或则其他需求)就需要在键盘的事件响应函数static voidKeyEventHandler(KEYBRD_MESSAGE *eventKey)里设置,根据键值条用相应的响应函数,不过该函数及时在锁屏状态下也会执行的,需要根据需要添加条件语句四、关于LCDlcm背光驱动分为两种控制方式:1. pwm这个是通过调占空比来调节亮度的持续信号;2. PFM这个是通过脉冲的个数来控制LCM背光亮度。
我在MTK平台下调试⾳频ALSA#硬件原理图因为是我们公司的项⽬,我就不能把完整的原理图给出来。
因为两个MIC不涉及机密,跟MTK的公版是⼀样的。
可以给出来⼤家看看。
这个MIC是⼀个数字MIC,直接输出的就是数字信号,接在MTK8167S的⼀个数字通路上。
#MTK⾳频通路框图嵌⼊式设备和平台关系很⼤,所以做什么平台⼀定要弄清楚平台设备的框图。
MTK8167s⾳频的框图如下不同平台的差异也有不同,不要硬套,需要确认清楚。
图⽚上看到很多通路没?这些通路⾥⾯的东西都是需要根据tinymix来设置的,当然也有其他办法设置。
#通过tinymix配置通路我们正常的tinymix查看配置39 BOOL 1 O00 I05 Switch Off40 BOOL 1 O00 I07 Switch Off41 BOOL 1 O01 I06 Switch Off42 BOOL 1 O01 I08 Switch Off43 BOOL 1 O02 I05 Switch Off44 BOOL 1 O02 I06 Switch Off45 BOOL 1 O03 I05 Switch On46 BOOL 1 O03 I07 Switch On47 BOOL 1 O03 I10 Switch Off48 BOOL 1 O04 I06 Switch On49 BOOL 1 O04 I08 Switch On50 BOOL 1 O04 I11 Switch Off51 BOOL 1 O05 I00 Switch On52 BOOL 1 O05 I03 Switch Off53 BOOL 1 O05 I05 Switch Off54 BOOL 1 O05 I07 Switch Off55 BOOL 1 O05 I15 Switch Off56 BOOL 1 O06 I01 Switch On57 BOOL 1 O06 I04 Switch Off58 BOOL 1 O06 I06 Switch Off59 BOOL 1 O06 I08 Switch Off60 BOOL 1 O06 I16 Switch Off61 BOOL 1 O09 I00 Switch Off62 BOOL 1 O09 I03 Switch On63 BOOL 1 O10 I01 Switch Off64 BOOL 1 O10 I04 Switch On65 BOOL 1 O11 I02 Switch On66 BOOL 1 O11 I05 Switch Off67 BOOL 1 O13 I15 Switch Off68 BOOL 1 O14 I16 Switch Off69 ENUM 1 AIN Mux INT ADC70 ENUM 1 DAIBT Mux MRG71 BOOL 1 I2S O03_O04 Switch Off72 BOOL 1 INT ADDA O03_O04 Switch On73 BOOL 1 MRG BT O02 Switch On74 BOOL 1 PCM0 O02 Switch Off75 ENUM 1 Left PGA Mux OPEN76 ENUM 1 Right PGA Mux OPEN77 ENUM 1 AIF TX Mux Digital MIC78 ENUM 1 HPOUT Mux OPEN79 ENUM 1 LINEOUT Mux OPEN80 BOOL 1 DMIC Data Gen Switch Off81 BOOL 1 AMIC Data Gen Switch Off82 BOOL 1 SDM Tone Gen Switch Offaiv8167sm3_bsp:/ #⾥⾯已经有很多开关了,我们要做的时候通过tinymix把in 和 out对接起来。
MTK平台兼容多个G_SENSOR的调试1. 修改mediatek/config/project_name/projectconfig.mkCUSTOM_KERNEL_ACCELEROMETER=bma250_auto mc3xxx_autoMTK_AUTO_DETECT_ACCELEROMETER=yes2. 若已经调试好的bma250_auto mc3xxx_auto 只要直接配置就可以3. 若没有需将已经调试OK 的bma250和mc3xxx文件夹名字重命名为bma250_auto和 mc3xxx_automediatek/custom/common/kernel/accelerometer/bma250_automediatek/custom/common/kernel/accelerometer/mc3xxx_automediatek/custom/project_name/kernel/accelerometer/bma250_automediatek/custom/project_name/kernel/accelerometer/mc3xxx_auto3. 需修改bma250.c和 mc3xxx.c driver文件mediatek/custom/common/kernel/accelerometer/bma250_auto/bma250.cmediatek/custom/common/kernel/accelerometer/mc3xxx_auto/mc3xxx.c以bma250为例:(1)在代码文件靠前部分添加以下函数的声明static int bma250_local_init(void);static int bma250_remove(void);static int bma250_init_flag = -1;(2)增加定义或者打开定义static struct sensor_init_info bma250_init_info = {.name = "bma250",.init = bma250_local_init,.uninit = bma250_remove,}(3)重命名函数gsensor_operate为bma250_operateint gsensor_operate(void* self, uint32_t command, void* buff_in, int size_in,void* buff_out, int size_out, int* actualout)修改为int bma250_operate(void* self, uint32_t command, void* buff_in, intsize_in,void* buff_out, int size_out, int* actualout)(4) 修改相应的结构体static int bma250_i2c_probe(struct i2c_client *client, const structi2c_device_id *id)函数中sobj.sensor_operate = gsensor_operate;修改为:sobj.sensor_operate = bma250_operate;(5)将文件中所有的bma250_gsensor_driver.driver改为bma250_init_info.platform_diver_addr-> driverif(err = bma250_create_attr(&bma250_gsensor_driver.driver))替换为if(err=bma250_create_attr(&bma250_init_info.platform_diver_addr-> driver))(6)增加或者打开bma250_local_init和bma250_remove函数定义static int bma250_local_init(void){struct acc_hw *hw = get_cust_acc_hw();GSE_FUN();BMA250_power(hw, 1);if(i2c_add_driver(&bma250_i2c_driver)){GSE_ERR("add driver error\n");return -1;}if(-1 == bma250_init_flag){return -1;}}static int bma250_remove(void){struct acc_hw *hw = get_cust_acc_hw();GSE_FUN();BMA250_power(hw, 0);i2c_del_driver(&bma250_i2c_driver);return 0;}(7)在static int __init bma250_init(void) 中使用hwmsen_gsensor_add(&bma250_init_info);替换if(platform_driver_register(&bma250_gsensor_driver)){GSE_ERR("failed to register driver");return -ENODEV;}4. 如下修改mediatek/custom/project_name/kernel/accelerometer/bma250_auto/cust_a cc.c#include <linux/types.h>#include <cust_acc.h>#include <mach/mt_pm_ldo.h>/*------------------------------------------------------------*/int cust_acc_power(struct acc_hw *hw, unsigned int on, char* devname) {if (hw->power_id == MT65XX_POWER_NONE)return 0;if (on)return hwPowerOn(hw->power_id, hw->power_vol, devname);elsereturn hwPowerDown(hw->power_id, devname);}static struct acc_hw cust_acc_hw = {.i2c_num = 1,.direction =1,// 6,.power_id = MT65XX_POWER_NONE, /*!< LDO is not used */.power_vol= VOL_DEFAULT, /*!< LDO is not used */.firlen = 16, /*!< don't enable low pass fileter */.power =cust_acc_power,};struct acc_hw* get_cust_acc_hw(void){return & cust_acc_hw;}。
Contents一、手机CAMERA的物理结构:........................................................................................ - 4 -二、 CAMERA 的成像原理: ................................................................................................. - 4 -三、 CAMERA 常见的数据输出格式:.................................................................................. - 5 -四、阅读CAMERA的规格书(以TRULY模组OV5647_RAW为例):........................... - 6 -五、 CAMERA 的硬件原理图及引脚 ..................................................................................... - 7 -1、电源部分:.................................................................................................................... - 7 -2、 S ENSOR I NPUT部分:................................................................................................... - 7 -3、 S ENSOR O UT P UT部分:............................................................................................... - 7 -4、 I2C 部分:SCL,I2C时钟信号线和SDA,I2C数据信号线。
MTK平台进行驱动调试1.makefileMXX_GPRS.mak(mcu\make)Option.mak(mcu\make)对于同一个平台,不同的项目有着不同的功能配置。
对于驱动调试来说,需要修改和添加一些宏开关控制;基本格式和步骤:MXX_GPRS.mak :XXX_XXX = XXXXXX_XXX = NONEXXX_XXX = TRUEXXX_XXX = FALSEOption.mak:ifdef XXX_XXXifneq ($(strip $( XXX_XXX)),FALSE)COM_DEFS += XXX_XXXendifendif代码中就使用XXX_XXX来控制相关代码;#if defined(XXX_XXX)//add code here#endif以MT6226(05c)平台为例:列举一些修改比较频繁的开关:MT6226A MT6226B MT6226M MT6227A MT6227B PLATFORM MT6226 MT6226 MT6226M MT6227A MT6227B CHIP_VER S00 S01 S01 S00 S01 LCD_MODULE 用于LCM Module控制;详细见No.2CUSTOM_CFLAGS 如用JTAG进行DEBUG需打开此开关;注意关闭WatchDogEXT_CAM_MODULE 如用外部DSP来控制Sensor;需用到此开关;详见No.3 ISP_SUPPORT 如Camera没有外挂DSP需打开此开关;CMOS_SENSOR 用以区分Sensor的类型;如OV7660;OV9650等NOR_FLASH_TYPE 所用NOR Flash的类型;现一般是AMD Series;MSDC_CARD_SUPPORT_TYPE 用以是否支持T卡的开关;不支持为NONE;支持为MSDC_SD_MMCBLUETOOTH_SUPPORT 用以是否支持蓝牙的开关;不支持为NONE;支持为所用芯片的类型;TOUCH_PANEL_SUPPORT 用以是否支持触摸屏的开关;不支持为FALSE;支持为TRUE;MOTION_SENSOR_SUPPORT 用以是否支持Motion sensor的开关;不支持为NONE;支持为所用芯片类型MAIN_LCD_SIZE 所用LCD的大小;如240X320;176X220;120X160等FM_RADIO_CHIP 用以是否支持FM功能;不支持为NONE;支持为所用芯片类型;NAND_SUPPORT 用以是否支持NAND FLASH;不支持为FASLE;支持为TRUEPHONE_TYPE 滑盖机: SLIDE;翻盖机:CLAMSHELL;平板机:BAR;旋转:SPINPLATFORM_NAME 项目名称;CAMERA_PIXEL 所用Sensor象素;默认30万;130万:ONE_MEGA_PIXEL;200万:TWO_MEGA_PIXEL等等WEBCAM_SUPPORT 用以是否支持Web Camera功能开关;支持为TRUE;不支持为FALSEect…….其他一些开关视项目而定;可以会修改;可能会添加一些开关。
Custominfo.pl(mcu\tools)这个文件是当在mcu\custom\drv下添加与LCD,image_sensor等类似的模块时,需要修改此文件以便ADS编译系统能编译到此模块下的文件;可以参考image_sensor。
if (($project ne "basic") && ($project ne "l1s") && defined($cmos_sensor)) {if ($cmos_sensor ne "NONE") {push(@thatdirs, "drv\\image_sensor\\$cmos_sensor");}}2. LCM;Backlight;Vibrator以SUNRISE_0255_LCM为例步骤1:MXX_GPRS.mak中配置LCD_MODULE和MAIN_LCD_SIZE;LCD_MODULE = SUNRISE_0255_LCMMAIN_LCD_SIZE = 240X320Option.mak中加入:COM_DEFS_FOR_SUNRISE_0255_LCM = SUNRISE_0255_LCM HX8312 COLOR_LCDTFT_MAINLCD QVGA_MAINLCD其中HX8312为LCD的型号;COLOR_LCD,TFT_MAINLCD,QVGA_MAINLCD为LCD的类型QVGA_MAINLCD:240X320QCIF_MAINLCD: 176X220QQVGA_MAINLCD: 120X160如在SUNRISE_0255_LCM的基础上添加兼容屏;则在HX8312后面顺序加入LCD的型号如果有Sub LCD;则需要顺序加入DUAL_LCD;COLOR_SUBLCD以及型号名称;步骤2:Mcu\custom\drv\LCD目录下添加SUNRISE_0255_LCM模块;目录以SUNRISE_0255_LCM 为名。
可以参考其他LCM;加入和修改5个文件分别为:lcd.clcd_hw.hlcd_sw.hlcd_sw_inc.hlcd_sw_rnd.hlcd.c:实现LCD的驱动接口一般有init; sleep in;sleep out; block write等lcd_hw.h:一般不需要修改;lcd_sw.h: 配置data address;command address和output format;lcd_sw_inc.h:配置LCD WIDTH和HEIGHT;lcd_sw_rnd.h: 一般不需修改;步骤3:加入背光控制代码;Mcu\custom\drv\misc_drv\custom_equipment.ckal_bool custom_cfg_gpio_set_level(kal_uint8 gpio_dev_type, kal_uint8 gpio_dev_level ){//用SUNRISE_0255_LCM来控制代码}GPIO模式和PWM模式;(函数默认是PWM模式)如果是GPIO模式;则在上述函数中加入模拟代码;如果是PWM模式;则需要根据实际情况在Mcu\custom\drv\misc_drv\custom_hw_default.c文件中修改PWM1_Level_Info;即频率和占空比;另外在mcu\plutommi\mmi\gpio\gpioSrc\GeneralDeviceInterface.c中有详细的MMI对背光的控制代码;另外还需熟悉lcd_if.c(mcu\drv\src)对上述接口的调用;3.Camera module;Sensor外挂DSP暂不讨论;以OV9650为例:步骤1:MXX_GPRS.mak中配置ISP_SUPPORT和CMOS_SENSOR;ISP_SUPPORT = TRUECMOS_SENSOR = OV9650CAMERA_PIXEL = ONE_MEGA_PIXEL注:(一般30万象素可以插值到100万;130万可以插值到200万象素)步骤2:Mcu\custom\drv\image_sensor下添加OV9650目录;添加或修改文件:camera_hw.c:Module Power on/off 控制;(GPIO分配要看硬件的资源分配表)camera_para.c: ISP、Sensor相关寄存器配置;在实际调试中对比效果来修改;image_sensor.c:timing;sensor init;power on/off;preview;capture等接口实现;image_sensor.h:有关sensor一些属性设置(一些宏定义);camera_info.c:一般不需修改;在完成所有的功能之后;效果调试是主要工作;主要工具:META;CCT等;关于ISP Address可参考MTK平台的DataSheet;步骤3:需对以下目录的文件有一定的了解!media\camera\;media\video\;plutommi\mtkapp\Camera\plutommi\mtkapp\Video\plutommi\mtkapp\MDI\4.Keypad按键分布图(可对照特定项目的硬件资源分配表)KCOL0 KCOL1 KCOL2 KCOL3 KCOL4 KCOL5 KCOL6KEY_XXKEY KEY KEY KEY KEY KEY KROW0KEY KEY KEY KEY KEY KEY KEY KROW1KEY KEY KEY KEY KEY KEY KEY KROW2KEY KEY KEY KEY KEY KEY KEY KROW3KROW4KEY KEY KEY KEY KEY KEY KEYKEY KEY KEY KEY KEY KEY KEY KROW5对于特定项目的键盘的定义和映射以及其他一些特殊的处理;代码用PHONE_TYPE和PLATFORM_NAME的组合来控制;如PHONE_TYPE = SLIDEPLATFORM_NAME = M678则代码控制如下:custom\drv\misc_drv\M678_BB\keypad_def.cconst keypad_struct keypad_custom_def = {#if defined(__PHONE_SLIDE__) //滑盖机型#if defined(__SLIDE_M678)//add m678 keypad define here//ROW 0(第一列)DEVICE_KEY_XX,……//ROW 1(第二列)…….//…….#else#endif#elif defined(__PHONE_BAR__) //直板机型//#elif defined(__PHONE_SPIN) //旋转机型//#elif defined(__PHONE_CLAMSHELL) //翻盖机型//#endif};如果除了平台提供的基本的按键外还需添加特定的按键定义;则除了上述外还需修改以下几处:interface\hwdrv\kbd_table.h定义DEVICE_KEY_XX;注意顺序#define DEVICE_KEY_XX 顺序值plutommi\mmi\Framework\Osl\OslSrc\KeyBrd.c假设DEVICE_KEY_XX为特定的按键//定义特定的按键const U16 PresentAllKeys[]={KEY_0,KEY_1,KEY_2,KEY_3,KEY_4,KEY_5,……//定义特定的按键#if defined(__SLIDE_M678),KEY_XX#endif};//键盘映射(注意加入顺序要与PresentAllKeys[]一致)static const KeyPadMap nKeyPadMap[] = {{DEVICE_KEY_0, KEY_0, KEY_TIMER_ID0,TONE_DTMF_0, DEVICE_AUDIO_PLAY_INFINITE},{DEVICE_KEY_1, KEY_1, KEY_TIMER_ID1, TONE_DTMF_1, DEVICE_AUDIO_PLAY_INFINITE},…………//映射特定的按键#if defined(__SLIDE_M678){DEVICE_KEY_XX, KEY_XX, KEY_TIMER_IDXX,TONE_DTMF_1, DEVICE_AUDIO_PLAY_INFINITE},#endif};//定义TIMER ID;即KEY_TIMER_IDXXplutommi\mmi\Inc\TimerEvents.h顺序加入KEY_TIMER_IDXX;另外在drv\src\kbdmain.c中可以修改debounce time; Long press Time; Repeat Time等参数来满足特殊的需要;5.耳机检测;线控custom\drv\misc_drv\M678_BB\auxmain.c对于耳机检测;一般只需关心AUX_EINT_NO(一般平台默认)和SENDKEY_ADC(见auxmain.c);可根据硬件的实际情况作一些相关的调整;对于线控来说;需要配置REMOTE_EINT_NO、 REMOTE_ADC以及按键Press/Release对应的ADC值;具体的处理过程可参考26平台__LINE_CONTROL_EARPHONE_SUPPORT__控制的代码;MT6226平台可用资源ADC0-ADC6;以线控为例,介绍一下修改或者添加流程:interface\hwdrv\Bmt.htypedef enum {vbat_adc_channel=0,visense_adc_channel,vbattmp_adc_channel,……#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__) remote_adc_channel,#endif……} adc_channel_type;custom\drv\misc_drv\M678_BB\adc_channel.c#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__) const kal_uint8 ADC_REMOTE=6; //假设硬件接ADC6#endifkal_uint8 custom_adc_get_channel(adc_channel_type type) {Switch(type){………#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__) case remote_adc_channel:return ((kal_uint8)ADC_REMOTE);#endif………}#endif};custom\drv\misc_drv\M678_BB\auxmain.cvoid aux_task_main( task_entry_struct * task_entry_ptr ){#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__) kal_uint8 remote_adc_logic_id;kal_uint8 remote_adc_no#endif…………#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__)remote_adc_no = custom_adc_get_channel(remote_adc_channel)remote_adc_logic_id = adc_sche_create_object(MOD_AUX, remote_adc_no,40,1, KAL_TRUE);#endif……while(1){receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid, ¤t_ilm);switch(current_ilm.msg_id){……//读ADCcase MSG_ID_READ_ALL_ADC_CHANNEL_REQ:……#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__)aux_read_adc_channel(remote_adc_logic_id);#endif……break;……//销毁case MSG_ID_BMT_ADC_MEASURE_DONE_CONF:……#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__)else if (mea_done_ptr->adc_sche_id == remote_adc_logic_id){adc_measure_count++;remote_value = (kal_int32)mea_done_ptr->volt;aux_remove_adc_channel(remote_adc_logic_id);}#endif……}}}CLAMSHELL中断的REGISTOR可以在上述函数中添加7.EINT关于EINT的描述请参考平台的datasheet;以线控为例,介绍一下修改或者添加流程:interface\hwdrv\Eint.h:typedef enum{……#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__) remote_eint_chann,#endif……} eint_channel_type;custom\drv\misc_drv\M678_BB\Eint_def.c#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__) const kal_uint8 REMOTE_EINT_NO=3; //假设硬件配置为EINT3 #endifkal_uint8 custom_eint_get_channel(eint_channel_type type){switch(type){……#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__)case remote_eint_chann:return ((kal_uint8)REMOTE_EINT_NO);#endif……}}custom\drv\misc_drv\M678_BB\auxmain.c//中断处理函数void REMOTE_EINT_HISR(void){if (remote_state) //高电平{//相关处理代码}else//低电平{//相关处理代码}}//中断注册void aux_task_main( task_entry_struct * task_entry_ptr ){kal_uint8 remote_eint_no;……#if defined(__LINE_CONTROL_EARPHONE_SUPPORT__)remote_eint_no = custom_eint_get_channel(remote_eint_chann);EINT_Registration(remote_eint_no,KAL_TRUE,remote_state,REMOTE_EINT_HISR, KAL_TRUE);#endif……}在注册中断时要注意:中断触发方式:电平触发/边沿触发?debounce: Enable/Disable?电平触发高电平有效还是低电平有效等问题。