1、LCD的调试:
一般LCD厂商在提供样品的时候,都会提供给初始化代码,服务更好的还会提供进入和退出SLEEP的代码,如果厂商不提供的话,就只有看着文档自己写了。我们的工作一般是调节显示效果以及和厂商沟通,还有就是把厂商给的代码整合进程序里面去。
Lcd驱动程序相关的文件主要包括lcd.c,lcd_sw.h以及lcd_sw_inc.h。
调节LCD的驱动程序,最先要在lcd_sw_inc.h中修改lcd的尺寸,就是LCD_WIDTH和LCD_HEIGHT,如果有小屏的话还要定义下面的小屏的lcd的尺寸。
然后,根据硬件的设计修改lcd_sw.h中的宏,来确定lcd是使用8位的还是16位的接口,比如使用16位的lcd接口,就定义宏MAIN_LCD_16BIT_MODE。
最后,移植厂商给的初始化代码进入到初始化函数里,还有进入和退出Sleep状态。进入和退出Sleep状态要求重新进入Sleep状态后屏幕能正常的显示,退出Sleep状态要求LCD的耗电小于0.1ma。
如果是CSTN的屏幕,那么还有一个对比度的参数需要设定。有2个对比度的值,一个是在初始化函数中写进去的一个值,还有一个是在nvram_user_config.c中的结构NVRAM_EF_CUST_HW_LEVEL_TBL_DEFAULT中定义。
2、GPIO的设定:
GPIO就是General purpose IO pin的意思,是一些能用做一般的功能控制的IO引脚。MTK芯片的引脚一般有四个功能选项,可以通过寄存器来控制各个引脚的功能,一般功能0就是表示这个引脚用做GPIO。
用函数 void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada)来控制GPIO的功能,pin表示引脚号,conf_dada控制引脚的功能。
用函数void GPIO_InitIO(char direction, char port)控制GPIO的方向,port表示引脚号,direction表示是输入还是输出。
用函数void GPO_WriteIO(char data,char port)控制GPIO的输出值,port表示引脚号,data表示输出的是高电平还是低电平。
在文件custom_equipment.c中有一个结构GPIO_MAP_ENTRY gpio_map_tbl[],其中定义了控制震动的GPIO,应该根据原理图来更改第4项震动的GPIO的设定。
3、信号量的控制:
信号量指的是在手机信号的强弱。通过修改SimDetectionDef.h中的SIGNAL_STRENGTH_NONE到SIGNAL_STRENGTH_LEVEL4的值来修改在不同信号下手机显示的信号格数。默认满格信号显示是4格,如果是其他的,比如5格的话,还要修改程序NetworkFunctions.c中的函数void NetWorkSignalLevelIndication(void *inMsg)。
4、电池格数的控制:
在bb中有一个ad转换的部件,每隔一定时间采样电池的电压,来控制电池显示的格数。具体在什么电压显示几格在文件nvram_user_config.c中的结构NVRAM_EF_CUST_HW_LEVEL_TBL_DEFAULT中定义。计算的算法在custom_equipment.c中的kal_uint8 custom_cfg_vbat_level_regulator( kal_uint32 measure_voltage, kal_uint8 *last_level, kal_uint8 *disp_level, kal_uint8 *hit_count )中。
5、lcd背光的控制:
一般lCD的背光是通过控制PWM1的占空比来实现,背光的级别一般有5级,在每一级别的占空比是由custom_hw_default.c文件中的kal_uint32 PWM1_Level_Info[PWM_MAX_LEVEL][2] 来控制,控制的实现在pwm.c中的函数void PWM_level(kal_uint8 level)中。
6、键盘背光的控制
键盘的背光由pwm2来控制,一般很少改动。键盘的背光是否亮起来可以作为判断一个机器是否开机的一个标志,一般板子做好后,只要cpu和flash以及pmic连好后就可以正常开机了,这时lcd可能没显示,可是键盘灯一定会亮的。
7、usb和充电器的区分:
一般在mtk平台下usb和充电器是提供一样的电源,使用同一个接口,判断是否是usb还是充电器是通过判断usb的d+线上是否为低来判断的,因为在计算机上这根线是被拉低的,如果插入的是usb,这个线就会被拉低,如果插入的是充电器,因为充电器没有接这个线,所有它被手机内部的一个很大的电阻给拉高,通过检测这个线上的电压就可以判断插入的是usb还是充电器,具体的判断的算法在Bmt_main.c文件中的static void check_charger_or_usb(kal_uint8 sche_id)中。
8、键盘的定义:
在文件keypad_def.c中根据原理图修改数组const keypad_struct keypad_custom_def就可以了。
9、音频参数的修改:
根据硬件提供的用仪器测出来的值修改nvram_default_audio.c中的宏定义值。
10、外部中断的设定:
在文件eint_def.c中修改所使用的外部中断的号,比如USB_EINT_NO等。
11、待机电流控制:
一般要求手机的待机电流小于3ma,最小电流小于1ma,好的情况下能做到小于0.5ma,关机电流小于0.1ma。关机电流大一般是纯硬件问题,因为这时bb已经没有电了,软件完全不工作。待机电流大一般是lcd没有进入休眠、image sensor没有进入休眠或者cpu没有进入休眠。Cpu没有进入休眠一般是一直有个程序在工作,比如一个定时器一直工作或者一直来一个中断信号等。
12、image sensor的控制:
一般选用mtk推荐的image sensor的型号,这样在make文件中定义了型号以后就直接可以用了,需要注意的是i2c总线的定义,在sccb.h中定义,修改SCCB_SERIAL_CLK_PIN和SCCB_SERIAL_DATA_PIN的值到现在所用的gpio引脚,如果有多个i2c的设备的话就得修改程序了,默认的只支持一个i2c设备。image sensor的的驱动程序在image_sensor.c中。
13、FM芯片的控制:
一般选用mtk提供的fm芯片,在这样在make文件中定义了型号以后就直接可以用了。这里也需要注意i2c总线的定义。
14、手机开机过程:
开机以后,手机先进入到Boot Rom中去执行,等待150ms,如果在串口上接到特定的字符串就进入到和串口通讯的过程,在这时可以执行下载程序的过程了。如果没有接到特定的字符串,就进入到开机流程,首先执行的是bootarm.s,然后执行Nucleus的系统初始化,再执行init.c中的Application_Initialize,最后初始化任务,开始执行任务,mmitask.c中的MMI_TASK是最先要开始执行的任务。
15、FLASH芯片的设定:
根据硬件原理图,确定所使用的芯片的型号,然后到tools/MemoryDeviceList目录下,找到里面的EXCEL文件,找到对应的flash的型号,在Region栏下修改所需要的nvram的空间,这个栏目下的格式一般是类似于{0x10000,7}{0x2000,8}的形式,每个大括号中的前一个表示的是块的大小,后一个表示的是块的数量。在FLASH的文档中有块的分布的介绍,注意nvram不能跨越bank。
然后设置custom_MemoryDevice.h文件中的CS0_PART_NUMBER为对应的flash型号,要注意的是这里的flash的型号需要和excel文件中的flash型号完全一致。
16、一点体会: