MTK平台驱动调试笔记
驱动的调式过程经常需要通过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为模式0
GPIO_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 void KeyEventHandler(KEYBRD_MESSAGE *eventKey)里设置,根据键值条用相应的响应函数,不过该函数及时在锁屏状态下也会执行的,需要根据需要添加条件语句
四、关于LCD
LCM背光驱动分为两种控制方式:
1. pwm这个是通过调占空比来调节亮度的持续信号;
2. PFM这个是通过脉冲的个数来控制LCM背光亮度。这个会有很小的几率造成亮度调节出错。在送多个脉冲的过程中不能保证不会出现什么中断什么的异常情况
Lcd相关函数
void init_lcd_interface(void) :接口函数
DRV_Reg(DRVPDN_CON1) &= (~DRVPDN_CON1_LCD); // 模块上电
set_lcd_driving_current(LCD_DRIVING_4MA); //模块电流(驱动能力)
SET_LCD_PARALLEL_CE2WR_SETUP_TIME(3);
SET_LCD_PARALLEL_CE2WR_HOLD_TIME(3);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(5);
SET_LCD_PARALLEL_READ_LATENCY_TIME(0);
SET_LCD_ROI_CTRL_CMD_LATENCY(4);
设置cld芯片的读写时序;
该函数里的东西在更换lcd时一般是不用修改的,但对于对时序要求比较严的芯片时序不对会引起白瓶的
LCD_Init_HX8306A():初始化,该函数进行对lcd芯片的初始化
LCD_Init_HX8306A();块写操作,定义每次刷屏的区域
LCD_EnterSleep_HX8306A():进入休眠设置,一般进行关电源,关显示的操作使屏进入睡眠状态
LCD_ExitSleep_HX8306A():睡眠唤醒函数,注意在休眠函数里设置过的寄存器在该函数里要重新设置成初始化时的值
如果屏幕显示全部正常,只是倒了180°翻转GS
SS位即可
初始化里的延时太短会出现闪白屏现象,太长可能开不了机
五、FM
涉及gpio口
gpio_fm_I2C_scl_pin(I2C时钟信号)
gpio_fm_i2c_sda_pin(I2C数据信号)
1、
I2C协议的时钟线和数据线要接上拉电阻,分别上拉, 有问题的时候先从fm芯片的电压和i2c信号量起,供电不够导致芯片不能正常工作,用了厂家提供的代码,i2c通信成功的话,软件就该没有什么问题了,
2、设置FM 默认频道的个数
NVRAM_EF_FM_RADIO_CHANNEL
3、手动收台可以收到台,自动搜索收不到台,可能因为上拉电阻阻值不合适,导致芯片读操作不正常
更换fm芯片:
1)
修改make文件中FM_RADIO_CHIP定义fm芯片类型
修改option.mak文件中与FM_RADIO_CHIP相关的,主要是修改所编译的文件夹,有些根据FM_RADIO_CHIP定义文件夹就不用修改了有的会被写死,这种情况下要手动修改一下
2)FM的驱动文件添加到相应的文件里,修改其中的gpio口
3) 修改make\fm_drv\fm_drv.lis把新加的驱动文件添加进去
4)编译是如果出现找不到MT6188A1.obj文件,需要删除MCU\mtk_lib\MT6225\S00\GPRS\fm_drv.lib重新remake就可以了
六、CAMERA
涉及gpio口
SCCB_SERIAL_CLK_PIN
(I2C时钟信号)
SCCB_SERIAL_DATA_PIN
(I2C数据信号)
gpio_camera_reset_pin
gpio_camera_cmpdn_pin
gpio_camera_power_en_pin
像fm一样先要调试同通信过程,如果通信成功没有图像测试sensor的输入信号(如mclk)和输出信号(如pclk,桢同步,场同步信号);图像出来之后效果方面一般都是有fae帮忙调的,尤其是色彩方面的效果,下面简单列出偶之前遇到过的情况仅供参考一下
1.
镜像(图像左右反)、翻转(图像上下反):这种情况可以通过修改sensor寄存器进行修改,有的sensor(如ov7670)只需要设置一位寄存器就好了,有的sensor在修改该寄存器位的时候会引起数据格式的改变,造成图像模糊色彩错乱,这时需要通过SET_CAMERA_INPUT_ORDER(INPUT_ORDER_CbYCrY1)相应的修改数据格式,也可以通过修改sensor修改数据格式,具体通过什么语句修改数据格式要看具体的版本和代码
对于做双摄像头的项目,要根据选择的摄像头对sensor镜像位进行不同的设置
也要控制好两个摄像头的powdown,否则前后摄像头会有干涉
2.
图像模糊色彩不对,可能因为摄像头连接不好造成的也能能因为gpio口模式不对造成的,在使用配置文件工具里的INV 表示取反,如果作为摄像头数据线的gpio口在此选项打了对钩导致摄像头数据有问题,进入摄像头显示花屏
3.
预览时有滚动的水波纹,可以通过设置sensor寄存器修改频率,也可以通过修改dummy_pixels,dummy_lines进行改善
4.
预览分屏可以通过设置sensor寄存器修改频率,也可以把默认频率设置为50HZ
七、BT
涉及gpio口
gpio_bt_power_pin
gpio_bt_reset_pin
gpio_bt_32k_pin
gpio_bt_urxd3_pin
gpio_bt_utxd3_pin
gpio_bt_pcmclk_pin
gpio_bt_pcmout_pin
gpio_bt_pcmin_pin
gpio_bt_pcmsync_pin
Mtk平台蓝牙这部分的代码的透明度不是很高,蓝牙容易造成待机电流大的问题
主要注意gpio口的初始化,尤其在使用工具配置gpio口的情况下不要在工具里就把蓝牙相关gpio口定义成gpio口模式就可以了,不要定义成功作模式,不用工具配置的话对蓝牙的配置函数在文件bt_common_config.c里,具体在数组const unsigned char bt_gpio_setting[16]里定义用哪一个gpio口
八、T卡
1. 基带(MT6225)与T卡相连管脚K15(GPIO44 MCWP) K16(GPIO45 MCINS)必须设置成模式1(硬上都要接地),否则不能T卡写保护不能向上写东西
2.T卡的mcck接在基带(MT6223)的U3脚上,该脚默认为BPI_BUS3,修改该管脚的模式修改基带寄存器ACIF_CON0的高两位的值,(也可以把BPI_BUS3用作mcck)
3. T卡热插拔控制宏
__MSDC_TFLASH_DAT3_1BIT_HOT_PLUG__
九、USB
涉及gpio口
gpio_usb_enable_pin
usb_custom.c中函数void USB_PowerControl(kal_bool enable)注意gpio_usb_enable_pin的操作,否则会引起USB连上后,电脑不识别,找不到T卡;不同的硬件设计对USB的供电模式可能不一样,也不一定都会用到这个gpio口
十、.rf
供电不够会导致芯片没有正常工作以至找不到网络
log图片为bmp格式的,如果改成gif格式会导致meta连不上天线不能校准
flash类型不对也会导致meta连不上天线不能校准
射频文件l1d_custom_rf.h文件,对照原理图,主要配置BPI_BUS0到BPI_BUS9。打开顺序按如下步骤进行配置:PT2B是让6139开始工作,PT1是打开PA,pt2是打开天线开关,pt3是关闭所有射频。PA和天线开关分立的和整合的都应该按照以上顺序进行配置
十一、触摸屏TP
涉及gpio口
gpio_tp_SPI_busy_pin
gpio_tp_spi_cs_pin
gpio_tp_spi_din_pin
gpio_tp_spi_clk_pin
gpio_tp_spi_dout_pin
触摸屏校准流程
touch_excute_cali()
读取ADC值
touch_panel_adc_to_coordinate()
adc值转化为屏幕坐标
touch_panel_check_cali_stage1()
touch_panel_check_cali_stage2()
touch_panel_check_cali_stage3() 判断测试三点
touch_panel_check_cali() 最终判决校准是否通过
HAND_WRITING_MAX_OFFSET,加大该值可以解决手写时划线划的快的话后半截笔画显示不出来的问题
十二、不能开机的可能原因
1.bin 文件超出
2.flash 不对
3.kcol6 公共开机键定义不对
4.23C平台需要在gpio_drv.c里打开camera的电源,否则编出来的也是开不了机的
5.打开触摸屏而不定义触摸中断会因assert引起开不了机
6.双卡版本6302的三个脚必须设置成模式1,否则重复重起,不停的循环显示logo
7.在nvrame里添加新的LID,logical_data_item_table_cust[]不能有#ifdefined
#endif,否则开机到显示完logo就死机
8.驱动不对
一、【一】调试串口的设置
驱动的调式过程经常需要通过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为模式0
GPIO_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 void KeyEventHandler(KEYBRD_MESSAGE *eventKey)里设置,根据键值条用相应的响应函数,不过该函数及时在锁屏状态下也会执行的,需要根据需要添加条件语句
四、关于LCD
lcm背光驱动分为两种控制方式:
1. pwm这个是通过调占空比来调节亮度的持续信号;
2. PFM这个是通过脉冲的个数来控制LCM背光亮度。这个会有很小的几率造成亮度调节出错。在送多个脉冲的过程中不能保证不会出现什么中断什么的异常情况
Lcd相关函数
void init_lcd_interface(void) :接口函数
DRV_Reg(DRVPDN_CON1) &= (~DRVPDN_CON1_LCD); // 模块上电
set_lcd_driving_current(LCD_DRIVING_4MA); //模块电流(驱动能力)
SET_LCD_PARALLEL_CE2WR_SETUP_TIME(3);
SET_LCD_PARALLEL_CE2WR_HOLD_TIME(3);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(5);
SET_LCD_PARALLEL_READ_LATENCY_TIME(0);
SET_LCD_ROI_CTRL_CMD_LATENCY(4);
设置cld芯片的读写时序;
该函数里的东西在更换lcd时一般是不用修改的,但对于对时序要求比较严的芯片时序不对会引起白瓶的
LCD_Init_HX8306A():初始化,该函数进行对lcd芯片的初始化
LCD_Init_HX8306A();块写操作,定义每次刷屏的区域
LCD_EnterSleep_HX8306A():进入休眠设置,一般进行关电源,关显示的操作使屏进入睡眠状态
LCD_ExitSleep_HX8306A():睡眠唤醒函数,注意在休眠函数里设置过的寄存器在该函数里要重新设置成初始化时的值
如果屏幕显示全部正常,只是倒了180°翻转GS
SS位即可
初始化里的延时太短会出现闪白屏现象,太长可能开不了机
五、FM
涉及gpio口
gpio_fm_i2c_scl_pin(I2C时钟信号)
gpio_fm_i2c_sda_pin(I2C数据信号)
1、
I2C协议的时钟线和数据线要接上拉电阻,分别上拉, 有问题的时候先从fm芯片的电压和i2c信号量起,供电不够导致芯片不能正常工作,用了厂家提供的代码,i2c通信成功的话,软件就该没有什么问题了,
2、设置FM 默认频道的个数
NVRAM_EF_FM_RADIO_CHANNEL
3、手动收台可以收到台,自动搜索收不到台,可能因为上拉电阻阻值不合适,导致芯片读操作不正常
更换fm芯片:
1)
修改make文件中FM_RADIO_CHIP定义fm芯片类型
修改option.mak文件中与FM_RADIO_CHIP相关的,主要是修改所编译的文件夹,有些根据FM_RADIO_CHIP定义文件夹就不用修改了有的会被写死,这种情况下要手动修改一下
2)FM的驱动文件添加到相应的文件里,修改其中的gpio口
3) 修改make\fm_drv\fm_drv.lis把新加的驱动文件添加进去
4)编译是如果出现找不到MT6188A1.obj文件,需要删除MCU\mtk_lib\MT6225\S00\gprs\fm_drv.lib重新remake就可以了
六、camera
涉及gpio口
SCCB_SERIAL_CLK_PIN
(I2C时钟信号)
SCCB_SERIAL_DATA_PIN
(I2C数据信号)
gpio_camera_reset_pin
gpio_camera_cmpdn_pin
gpio_camera_power_en_pin
像fm一样先要调试同通信过程,如果通信成功没有图像测试sensor的输入信号(如mclk)和输出信号(如pclk,桢同步,场同步信号);图像出来之后效果方面一般都是有fae帮忙调的,尤其是色彩方面的效果,下面简单列出偶之前遇到过的情况仅供参考一下
1.
镜像(图像左右反)、翻转(图像上下反):这种情况可以通过修改sensor寄存器进行修改,有的sensor(如ov7670)只需要设置一位寄存器就好了,有的sensor在修改该寄存器位的时候会引起数据格式的改变,造成图像模糊色彩错乱,这时需要通过SET_CAMERA_INPUT_ORDER(INPUT_ORDER_CbYCrY1)相应的修改数据格式,也可以通过修改sensor修改数据格式,具体通过什么语句修改数据格式要看具体的版本和代码
对于做双摄像头的项目,要根据选择的摄像头对sensor镜像位进行不同的设置
也要控制好两个摄像头的powdown,否则前后摄像头会有干涉
2.
图像模糊色彩不对,可能因为摄像头连接不好造成的也能能因为gpio口模式不对造成的,在使用配置文件工具里的INV 表示取反,如果作为摄像头数据线的gpio口在此选项打了对钩导致摄像头数据有问题,进入摄像头显示花屏
3.
预览时有滚动的水波纹,可以通过设置sensor寄存器修改频率,也可以通过修改dummy_pixels,dummy_lines进行改善
4.
预览分屏可以通过设置sensor寄存器修改频率,也可以把默认频率设置为50HZ
七、BT
涉及gpio口
gpio_bt_power_pin
gpio_bt_reset_pin
gpio_bt_32k_pin
gpio_bt_urxd3_pin
gpio_bt_utxd3_pin
gpio_bt_pcmclk_pin
gpio_bt_pcmout_pin
gpio_bt_pcmin_pin
gpio_bt_pcmsync_pin
Mtk平台蓝牙这部分的代码的透明度不是很高,蓝牙容易造成待机电流大的问题
主要注意gpio口的初始化,尤其在使用工具配置gpio口的情况下不要在工具里就把蓝牙相关gpio口定义成gpio口模式就可以了,不要定义成功作模式,不用工具配置的话对蓝牙的配置函数在文件bt_common_config.c里,具体在数组const unsigned char bt_gpio_setting[16]里定义用哪一个gpio口
八、T卡
1. 基带(MT6225)与T卡相连管脚K15(GPIO44 MCWP) K16(GPIO45 MCINS)必须设置成模式1(硬上都要接地),否则不能T卡写保护不能向上写东西
2.T卡的mcck接在基带(MT6223)的U3脚上,该脚默认为BPI_BUS3,修改该管脚的模式修改基带寄存器ACIF_CON0的高两位的值,(也可以把BPI_BUS3用作mcck)
3. T卡热插拔控制宏
__MSDC_TFLASH_DAT3_1BIT_HOT_PLUG__
九、USB
涉及gpio口
gpio_usb_enable_pin
usb_custom.c中函数void USB_PowerControl(kal_bool enable)注意gpio_usb_enable_pin的操作,否则会引起USB连上后,电脑不识别,找不到T卡;不同的硬件设计对USB的供电模式可能不一样,也不一定都会用到这个gpio口
十、.rf
供电不够会导致芯片没有正常工作以至找不到网络
log图片为bmp格式的,如果改成gif格式会导致meta连不上天线不能校准
flash类型不对也会导致meta连不上天线不能校准
射频文件l1d_custom_rf.h文件,对照原理图,主要配置BPI_BUS0到BPI_BUS9。打开顺序按如下步骤进行配置:PT2B是让6139开始工作,PT1是打开PA,pt2是打开天线开关,pt3是关闭所有射频。PA和天线开关分立的和整合的都应该按照以上顺序进行配置
十一、触摸屏TP
涉及gpio口
gpio_tp_spi_busy_pin
gpio_tp_spi_cs_pin
gpio_tp_spi_din_pin
gpio_tp_spi_clk_pin
gpio_tp_spi_dout_pin
触摸屏校准流程
touch_excute_cali()
读取adc值
touch_panel_adc_to_coordinate()
adc值转化为屏幕坐标
touch_panel_check_cali_stage1()
touch_panel_check_cali_stage2()
touch_panel_check_cali_stage3() 判断测试三点
touch_panel_check_cali() 最终判决校准是否通过
HAND_WRITING_MAX_OFFSET,加大该值可以解决手写时划线划的快的话后半截笔画显示不出来的问题
十二、不能开机的可能原因
1.bin 文件超出
2.flash 不对
3.kcol6 公共开机键定义不对
4.23C平台需要在gpio_drv.c里打开camera的电源,否则编出来的也是开不了机的
5.打开触摸屏而不定义触摸中断会因assert引起开不了机
6.双卡版本6302的三个脚必须设置成模式1,否则重复重起,不停的循环显示logo
7.在nvrame里添加新的LID,logical_data_item_table_cust[]不能有#ifdefined
#endif,否则开机到显示完logo就死机
8.驱动不对
好资料分享
看看。
小编高见。请教MT6582开机的时候一直在安卓界面就重启了。无法进入主页面是什么问题?
对我没什么帮助,但是只要能写出来,就算很厉害的,顶顶更健康。
强贴,顶顶顶
强!学习了
学习了,感谢分享!