永发信息网

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

答案:2  悬赏:0  手机版
解决时间 2021-02-23 03:51
  • 提问者网友:不爱我么
  • 2021-02-22 03:51
如何在MTK平台进行驱动调试
最佳答案
  • 五星知识达人网友:廢物販賣機
  • 2021-02-22 05:19
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,
25,
50,
50
};
单位: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
全部回答
  • 1楼网友:佘樂
  • 2021-02-22 05:51
需要下载「mtk手机刷机驱动程序」 驱动程序下载完成后解压,在解压的文件夹内找到「mdmcpq.inf」和「usbser.sys」文件,将其拷贝到电脑「C:\Windows\System32\drivers」文件夹下,如果系统存在文件的话覆盖和取消复制都可以。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯