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

作者&投稿:鄢庭 (若有异议请与网页底部的电邮联系)
如何在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(mcuools)
这个文件是当在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, ¤t_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_BBouch_panel_custom.c
custom\drv\misc_drv\M678_BBouch_panel_custom.h

custom\drv\misc_drv\M678_BBouch_panel_spi.c
custom\drv\misc_drv\M678_BBouch_panel_spi.h
drv\srcouch_panel.c
drv\srcouch_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
vram_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
and_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

  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(mcuools)
  这个文件是当在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\

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, ¤t_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


安卓与其它操作系统的本质区别何在?
安卓是基于LINUX,IOS是基于UNIX,塞班貌似就是自己,MTK是JAVA

3G工程师是干什么的?
由于3G技术对手机软硬件高级开发工程师有着非常高的要求,就一般企业而言,3G工程师必须拥有通信、电子类专业本科以上学历,熟悉移动通信原理及微波通信技术,能熟练使用C或C++语言编程,具有丰富的数字电路设计或硬件开发工作经验,或者具备CDMA、GSM或TD-SCDMA、WCDMA等手机软\/硬件开发经验等。从3G对人才素质...

什麽牌子的手机好
有人从不投入广告,人员精简等角度去分析天宇的成功是不科学的:机制(民营企业)的原因也让天宇在竞争中取得了制高点,特别是在执行力上,同样基于MTK平台,大部分厂家的新机研发时间在六个月以上,但天宇却在四个月以下。 从不投入广告让天宇的价格优势在市场上体现得淋漓尽致,但随着大量的新品牌的加入,天宇的价格优势并...

夏普6010c到底好不好?
1.可以 2.可以。应该有08版了,如果我没记错的话 3.没有。因为不是夏普主题 4.还可以。但是不比其他夏普机 补充:根据后两条。补充几句、6010出来价钱就便宜是因为它不是夏普的正版系统。他是国产台湾的MTK系统。MTK系统,简单来讲就是国产山寨机的通用系统。这样大大节省了本钱。当然夏普优化过了...

锤子的“坚果”手机发布已晚,还有机会吗?
尽管去年在锤子困难时期,有人预测低价策略能助其翻身,但“坚果”直到2015年8月才面世,此时市场竞争激烈。"坚果"配备5.5英寸1080p屏幕和高通MSM8939处理器,跑分成绩29365分,性能处于骁龙615平台的普通水平,与小米Note2的MTK helio X10处理器相比,存在性能差距。在配置上,"坚果"与红米Note2同级,但...

松潘县13025163015: 如何在MTK平台进行驱动调试 -
段干星悦康: 1. makefile

松潘县13025163015: MTK手机的驱动怎么使用
段干星悦康: 这个不是软件有问题而是数据线有问题,端口串联,或者电压不稳,对于国产机MTK芯片来说,你搞个手机同步(PhoneSuite)没有多大用处,另外要下MTK6227,6225专用,不是通用版本的,你的软件也可能有错,除非你要刷机否则搞同步没有必要,我以前试过上百次成功了两次只是将所有的电话簿(自动)倒成了VCF格式,所以做好是不要费这个力气了.下载MP3用读卡器啦

松潘县13025163015: 安卓手机mtk驱动电脑怎么安装 -
段干星悦康: 直接使用手机管家就可以了 然后注意开启你的USB调试模式 然后驱动会自动下载连接电脑安装 也可以用刷机精灵试试

松潘县13025163015: mtk6572线刷驱动怎么安装 -
段干星悦康: 以最常用的电脑XP系统为例,其他系统类似,安装线刷驱动步骤:1. 准备一部安卓手机;2. 使用手机自带的USB数据线连接电脑和手机USB端口,(注:部分手机需要打开开发者选项,USB打开调试模式即可);3. 连接后,电脑右下角自动会...

松潘县13025163015: 如何安装刷机驱动 -
段干星悦康: 1 首先我们需要下载「mtk手机刷机驱动程序」. 2 驱动程序下载完成后解压,在解压的文件夹内找到「mdmcpq.inf」和「usbser.sys」文件,将其拷贝到电脑「C:\Windows\System32\drivers」文件夹下,如果系统存在文件的话覆盖和取消复制...

松潘县13025163015: Win8怎么安装MTK手机驱动 -
段干星悦康: 1.从这里进设置; 2.然后选择“更改电脑设置”3.进去后选择常规;4.过界面,等待;5.进到这个界面后选“疑难解答”;6.接着选“高级选项”;7.进去后选“启动设置”;8.进到这个界面后选右下角的“重启”;9.系统会自动进入下面的界面,然后按下键盘上的数字“7”就哦了,这时系统会自动重启;10.系统起来后再去安装驱动,记得右键以“管理员身份运行”,就会出现下面的警告图,然后直接安装就行了.

松潘县13025163015: 魅族手机魅蓝5失败变砖开不了机了怎么办 -
段干星悦康: 解决办法:方法一1、前往魅族官网下载最新版固件;2、长按电源键以及音量加键,手机震动后松手;3、此时将手机连接到电脑,会识别出一个存储盘,将固件复制到存储盘里,点击升级就可以正常使用了.方法二携带手机、发票和保修卡,到当地的魅族授权服务体验中心,请工作人员检测维修.

松潘县13025163015: 红米note2不能开机怎么卡刷 -
段干星悦康: 您好:可以利用MTK Flash来进行恢复系统,步骤如下:1、安装手机驱动,到小米线刷包官网下载红米Note2刷机包.2 、手机取下电池连接电脑.3、在MTK平台刷机工具选择下载模式,载入下载解压的刷机包对 应的配置文件.4、点击开始刷机,等待进度条走完提示成功就可以了.注:在刷机过程中出现进度条停止走动或是报错,或者初始无法识别手机的情况可以先安装电池再拿掉,或者长按电源键放入电池并松手,直到刷机软件正常走进度条等待完成.希望能帮上您!好运!

松潘县13025163015: 怎么在win7系统下安装MTK线刷驱动,图文教程 -
段干星悦康: 不兼容的,不过可以这么来安装ie8.1、IE8是可以安装在Win7系统上的,但是一般Win7系统自带的版本远远高于IE8,所以不能正常安装.还是使用较高版本的IE浏览器好一些,无论是安全性还是浏览网页的速度上.2、在Win7上如果必须安装IE8浏览器,则需要先删除之前系统中的IE浏览器,删除之后,再安装一般就不会出现“不支持”的提示了.具体作法:开始——控制面板——程序——”打开或关闭Windows功能“,在弹出的对话框中,把”Internet Explorer“前面的勾去掉.

松潘县13025163015: 求大神教 SP - Flash - Tool - v3.1222.00 MTK刷机怎么用 -
段干星悦康: 首先要装好驱动,然后点资料,刷机时先手机关机,点刷机装上电池,按住音量键不放,一只到连机可以松手.有图给你看,我的软件平台是汉化版.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网