如何在MTK平台进行驱动调试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MTK平台进行驱动调试相关的知识,希望对你有一定的参考价值。

1. makefile
MXX_GPRS.mak(mcu\\make)
Option.mak(mcu\\make)

对于同一个平台,不同的项目有着不同的功能配置。对于驱动调试来说,需要修改和添加一些宏开关控制;

基本格式和步骤:
MXX_GPRS.mak :
XXX_XXX = XXX
XXX_XXX = NONE
XXX_XXX = TRUE
XXX_XXX = FALSE

Option.mak:

ifdef XXX_XXX
ifneq ($(strip $( XXX_XXX)),FALSE)
COM_DEFS += XXX_XXX
endif
endif

代码中就使用XXX_XXX来控制相关代码;
#if defined(XXX_XXX)
//add code here
#endif

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_LCM
MAIN_LCD_SIZE = 240X320

Option.mak中加入:
COM_DEFS_FOR_SUNRISE_0255_LCM = SUNRISE_0255_LCM HX8312 COLOR_LCD TFT_MAINLCD QVGA_MAINLCD
其中HX8312为LCD的型号;
COLOR_LCD,TFT_MAINLCD,QVGA_MAINLCD为LCD的类型
QVGA_MAINLCD:240X320
QCIF_MAINLCD: 176X220
QQVGA_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.c
lcd_hw.h
lcd_sw.h
lcd_sw_inc.h
lcd_sw_rnd.h

lcd.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.c
kal_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 = TRUE
CMOS_SENSOR = OV9650
CAMERA_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\\

对于特定项目的键盘的定义和映射以及其他一些特殊的处理;代码用PHONE_TYPE和PLATFORM_NAME的组合来控制;
如 PHONE_TYPE = SLIDE
PLATFORM_NAME = M678

则代码控制如下:
custom\\drv\\misc_drv\\M678_BB\\keypad_def.c
const 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_IDXX
plutommi\\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__控制的代码;

6.ADC
MT6226平台可用资源ADC0-ADC6;

以线控为例,介绍一下修改或者添加流程:
interface\\hwdrv\\Bmt.h
typedef 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
#endif

kal_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.c
void 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, &current_ilm);
switch(current_ilm.msg_id)

……
//读ADC
case 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
#endif

kal_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?
电平触发高电平有效还是低电平有效等问题。

对于Eint0 - Eint3;可以通过下面的文件来修改debounce time;而Eint4 - Eint7没有debounce机制
custom\\drv\\misc_drv\\M678_BB\\Eint_def.c
kal_uint8 custom_eint_sw_debounce_time_delay[EINT_MAX_CHANNEL] =

50, /*EINT0*/
25, /*EINT 1*/
50, /*EINT2*/
50 /*EINT3*/
;
单位:50ms

也可通过下述方法来修改
EINTaddr()
EINT_Set_HW_Debounce()
EINT_SW_Debounce_Modify()
等函数来修改

8. Charger/USB
可参考Customer_BMT_V0.1.pdf
相关文件:
custom\\drv\\misc_drv\\M678_BB\\chr_parameter.c 关注点:
bmt_customized_struct bmt_custom_chr_def[] = ;
此为充电相关电压和电流的设置;
static const kal_int32 chr_usb_detect_volt;
此为CHARGER/USB检测的电压值;

Mcu\\bmt\\*.*
Mcu\\drv\\src\\pwic.c

9.Touch panel
custom\\drv\\misc_drv\\M678_BB\\touch_panel_custom.c
custom\\drv\\misc_drv\\M678_BB\\touch_panel_custom.h

custom\\drv\\misc_drv\\M678_BB\\touch_panel_spi.c
custom\\drv\\misc_drv\\M678_BB\\touch_panel_spi.h
drv\\src\\touch_panel.c
drv\\src\\touch_panel_main.c
修改点包括:
GPIO分配;ADC值;坐标值;中断配置;压力检测等
具体修改可参考代码;

10. AFE
custom\\audio\\M678_BB\\afe.c(模拟开关、PA切换等)
custom\\audio\\M678_BB\\audcoeff.c(FIR Input/Output参数)
custom\\audio\\M678_BB\\nvram_default_audio.c(GAIN值)
l1audio\\afe2.c (AFE管理代码)

以上根据硬件给出的数据来进行调整!

11.Task
如何在MTK平台使用Task?
以DMB项目为例;请参照下述文件;DMB_SUPPPORT控制
custom\\system\\M678_BB\\custom_config.c
custom\\system\\M678_BB\\custom_config.h
custom\\drv\\DMB\\TCC78X\\dmb_hw.c

12 Nor/Nand Flash; T-Flash
添加新的NAND:
Drv\\src\\NAND_MTD.c
static const flash_list NAND_ID_Table[] =

// ID, planesize in MB, blocksize in KB, pagesize in B, address cycle, IO bus width, mtd sub driver

//添加新的NAND的相关信息(参考芯片Spec)

DA(Download Agent)部分代码(一般不需修改)
DA_SRC\\src\\nand_dev_tbl.c
Const NAND_Device_S g_NandFlashDevTbl[] =

//加入新的NAND信息(参考芯片Spec)
;

添加新的Nor Flash
DA_SRC\\src\\flash_dev_tbl.c
Const Nor_Device_S g_FlashDevTbl[] =

//加入新的Nor信息(参考芯片Spec)
;

对于DA的修改;需重新生成DA文件用于Flash Download Tool
参考技术A 需要下载「mtk手机刷机驱动程序」 驱动程序下载完成后解压,在解压的文件夹内找到「mdmcpq.inf」和「usbser.sys」文件,将其拷贝到电脑「C:\Windows\System32\drivers」文件夹下,如果系统存在文件的话覆盖和取消复制都可以。

MTK平台是啥

MTK是联发科技股份有限公司的英文简称,英文全称叫MediaTek。MTK手机系统是现在市场上所有国内手机设计、制造商使用的最多的一个完整的手机产品解决方案。

MTK手机系统是国内手机设计、制造商使用的最多的一个完整的手机产品解决方案,其高性价比和可二次开发的特性倍受手机制造商的青睐。

本方案选择MT6225为核心芯片,它内部集成了ARM7核和DSP核,通过MT6225的GPIO(General Purpose Input Output,通用输入输出口)可进行外部设备的扩展。MTK6225凭借优越的无线通信特性和成熟的软硬件系统。

扩展资料

MTK平台它的主要特点:一是低成本,对于竞争激烈的手机市场是最好的选择;二是芯片具有音乐和视频功能,满足了MP3和MP4的需求;三是芯片集成度高,功能较多技术性能好,迎合了市场的需要。

MTK平台发展及各芯片功能介绍:

1、 MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228均为基带芯片,所以芯片均采用ARM7的核;

2、 MT6305、MT6305B为电源管理芯片;

3、 MT6129为射频芯片,转换射频信号 ;

参考资料来源:百度百科-MTK手机系统

参考技术A mtk
采用联法科技的MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228基带芯片,芯片均采用ARM7的核。
MT6305、MT6305B为电源管理芯片
MT6129为RF芯片
RF3146(7×7mm)、RF3146D(双频)、RF3166(6×6mm)为RFMD的PA集成度较高
成本低
目前市场上主流的平台有TI、摩托罗拉、飞利浦、MTK、ADI、展讯、英飞凌、凯明等。我个人意见是TI平台占有率最高,而MTK平台开发最容易。目前市场上飞利浦平台在功耗上相对有优势,TI平台和MTK平台在手机成本上有着相对的优势。服务方面所有手机平台没有特别大的差别
中国台湾的MTK公司的产品因为集成较多的多媒体功能和较低的价格在大陆手机公司和手机设计公司得到广泛的应用
参考技术B 台湾“联发科”公司出品的山寨机平台。80%的山寨机都是用的这个平台。 参考技术C MTK平台就是用MTK的芯片来做手机。

首先手机有很多功能,摄像头,触摸屏,蓝牙等, 这些都是靠手机的各个芯片完成的,MTK就生产各个功能的芯片,比如蓝牙芯片,触摸屏芯片,等,这些同时用在同一部手机上,就是说MTK平台的手机里的很多主要功能都用了MTK生产的芯片,就说这部手机是MTK的平台。你可以拆一部山寨手机的电路板来看,会发现几块芯片上有个M的标志的。本回答被提问者采纳
参考技术D 山寨平台

以上是关于如何在MTK平台进行驱动调试的主要内容,如果未能解决你的问题,请参考以下文章

MTK sensor调试日志

MTK平台调试

MTK平台开发入门到精通(休眠唤醒篇)休眠唤醒LPM框架

SPI驱动调试感悟

android驱动开发好了,怎么调试

如何将 Android 的 WifiService 操作调试到驱动程序级别?