Red de conocimiento informático - Material del sitio web - Cómo depurar controladores en la plataforma MTK+

Cómo depurar controladores en la plataforma MTK+

1. makefile

MXX_GPRS.mak(mcu\make)

Option.mak(mcu\make)

Para la misma plataforma, diferentes proyectos tienen diferentes configuraciones de funciones. Para la depuración del controlador, es necesario modificar y agregar algunos controles de interruptor macro;

Formato y pasos básicos:

MXX_GPRS.mak:

XXX_XXX = XXX p>

XXX_XXX = NINGUNO

XXX_XXX = VERDADERO

XXX_XXX = FALSO

Option.mak:

ifdef XXX_XXX

ifneq ($(strip $( XXX_XXX)),FALSE)

COM_DEFS += XXX_XXX

endif

endif

XXX_XXX se usa en el código para controlar códigos relacionados;

#if definido(XXX_XXX)

//agregue código aquí

#endif

Custominfo.pl(mcu\tools)

Este archivo se utiliza cuando se agregan módulos similares a LCD, image_sensor, etc. en mcu\custom\drv. Este archivo debe modificarse para que. el sistema de compilación ADS puede compilar Vaya al archivo de este módulo;

Puede consultar image_sensor.

if (($project ne "basic") && ($project ne "l1s") && definido($cmos_sensor)) {

if ($cmos_sensor ne "NONE") {

push(@thatdirs, "drv\\image_sensor\\$cmos_sensor");

}

}

2. LCM; Luz de fondo; Vibrador

Tome SUNRISE_0255_LCM como ejemplo

Paso 1:

Configure LCD_MODULE y MAIN_LCD_SIZE en MXX_GPRS.mak;

LCD_MODULE = SUNRISE_0255_LCM

MAIN_LCD_SIZE = 240X320

Agregado en Option.mak:

COM_DEFS_FOR_SUNRISE_0255_LCM = SUNRISE_0255_LCM HX8312 COLOR_LCD TFT_MAINLCD QVGA_MAAINLCD

Entre ellos, HX8312 es el modelo LCD;

COLOR_LCD, TFT_MAINLCD, QVGA_MAINLCD son los tipos de LCD

QVGA_MAINLCD: 240X320

QCIF_MAINLCD: 176X220

QQVGA_MAINLCD : 120X160

Si agrega una pantalla compatible basada en SUNRISE_0255_LCM, agregue el número de modelo de LCD después de HX8312.

Si hay una pantalla LCD secundaria, debe agregar DUAL_LCD, COLOR_SUBLCD y modelo nombre en secuencia;

p>

Paso 2:

Agregue el módulo SUNRISE_0255_LCM al directorio Mcu\custom\drv\LCD; el directorio se llama SUNRISE_0255_LCM.

Puede consultar otros LCM; agregue y modifique los 5 archivos:

lcd.c

lcd_hw.h

lcd_sw. h

lcd_sw_inc.h

lcd_sw_rnd.h

lcd.c: implementar la interfaz del controlador LCD

Generalmente hay init en reposo; ;dormir; bloquear escritura, etc.

lcd_hw.h: generalmente no es necesario modificarlo;

lcd_sw.h: configurar la dirección de comando de datos y el formato de salida;

lcd_sw_inc.h: configura el ANCHO y ALTO del LCD;

lcd_sw_rnd.h: generalmente no es necesario modificarlo;

Paso 3:

Agregar código de control de retroiluminación;

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 )

{

// Utilice SUNRISE_0255_LCM para controlar el código

}

Modo GPIO y modo PWM (la función predeterminada es el modo PWM)

Si es el modo GPIO, entonces en la función anterior agregue código de simulación;

Si es el modo PWM, debe modificar PWM1_Level_Info en el archivo Mcu\custom\drv\misc_drv\custom_hw_default.c; situación real; es decir, la frecuencia y el ciclo de trabajo;

Además, hay códigos de control MMI detallados para la retroiluminación en mcu\plutommi\mmi\gpio\gpioSrc\GeneralDeviceInterface.c;

Además, debe estar familiarizado con lcd_if.c (mcu\drv\src) para llamar a la interfaz anterior;

3. Módulo de cámara; Sensor

El DSP externo no se discutirá por ahora, tome OV9650 como ejemplo:

Paso 1:

Configure ISP_SUPPORT y CMOS_SENSOR en MXX_GPRS. .mak;

p>

ISP_SUPPORT = TRUE

CMOS_SENSOR = OV9650

CAMERA_PIXEL = ONE_MEGA_PIXEL

Nota: (Generalmente, Se pueden interpolar 300.000 píxeles a 1 millón 130 (Wang puede interpolar a 2 millones de píxeles)

Paso 2:

Agregue el directorio OV9650 en Mcu\custom\drv\image_sensor;

Agregar o modificar archivos:

camera_hw.c: control de encendido/apagado del módulo (la asignación de GPIO depende de la tabla de asignación de recursos de hardware)

camera_para.c : ISP, configuración de registro relacionada con el sensor; en la depuración real Modificar comparando el efecto;

image_sensor.c: sincronización; encendido/apagado de captura y otras implementaciones de interfaz;

image_sensor.h: algunas configuraciones de atributos relacionadas con el sensor (algunas definiciones de macro);

camera_info.c: generalmente no es necesario modificarlas;

Después de completar todas las funciones ; la depuración de efectos es el trabajo principal;

Principalmente herramientas: META, etc.;

Acerca de ISP Add;

ress puede consultar la hoja de datos de la plataforma MTK;

Paso 3:

¡Debe tener cierta comprensión de los archivos en los siguientes directorios!

media\camera\;

media\video\;

plutommi\mtkapp\Camera\

plutommi\mtkapp\Video\

plutommi\mtkapp\MDI\

La definición y asignación del teclado para un proyecto específico y algún otro procesamiento especial el código se controla mediante la combinación de PHONE_TYPE y PLATFORM_NAME;

Por ejemplo, PHONE_TYPE = SLIDE

PLATFORM_NAME = M678

El control del código es el siguiente:

custom\drv\misc_drv\M678_BB \keypad_def.c

const keypad_struct keypad_custom_def = {

#if definido(__PHONE_SLIDE__) //Modelo deslizante

#if definido(__SLIDE_M678)

// agregue el teclado m678 definido aquí

//FILA 0 (primera columna)

DEVICE_KEY_XX,

……

//FILA 1 (Segunda columna)

…….

//

…….

#else

#endif

#elif definido(__PHONE_BAR__) //Modelo recto

//

#elif definido(__PHONE_SPIN) //Modelo rotativo

//

#elif definido(__PHONE_CLAMSHELL) //Modelo Flamshell

//

#endif

} ;

Si necesita agregar definiciones de claves específicas además de las claves básicas proporcionadas por la plataforma, además de lo anterior, debe modificar lo siguiente:

interfaz\hwdrv; \kbd_table.h

Defina DEVICE_KEY_XX; preste atención al orden

#define el valor de secuencia DEVICE_KEY_XX

plutommi\mmi\Framework\Osl\OslSrc\KeyBrd. c

Asumir que DEVICE_KEY_XX es una clave específica

//Definir una clave específica

const U16 PresentAllKeys[]=

{

CLAVE_0,

CLAVE_1,

CLAVE_2,

CLAVE_3,

CLAVE_4,

KEY_5,

......

//Definir claves específicas

#if wanted(__SLIDE_M678)

,KEY_XX

#endif

};

//Asignación de teclado (tenga en cuenta que el orden de adición debe ser coherente con PresentAllKeys[])

estática constante KeyPadMap nKeyPadMap[] = {

{DEVICE_KEY_0, KEY_0, KEY_TIME

R_ID0, TONE_DTMF_0, DEVICE_AUDIO_PLAY_INFINITE},

{DEVICE_KEY_1, KEY_1, KEY_TIMER_ID1, TONE_DTMF_1, DEVICE_AUDIO_PLAY_INFINITE},

……

……

//Asignar claves específicas

#if define(__SLIDE_M678)

{DEVICE_KEY_XX, KEY_XX, KEY_TIMER_IDXX, TONE_DTMF_1, DEVICE_AUDIO_PLAY_INFINITE},

#endif

p>

};

//Definir ID del TIMER; es decir, KEY_TIMER_IDXX

plutommi\mmi\Inc\TimerEvents.h

Agregar KEY_TIMER_IDXX en secuencia ;

Además, el tiempo de rebote; Mantenga presionado el tiempo; el tiempo de repetición y otros parámetros se pueden modificar en drv\src\kbdmain.c

para satisfacer necesidades especiales;

5 . Detección de auriculares; control por cable

custom\drv\misc_drv\M678_BB\auxmain.c

Para la detección de auriculares generalmente solo necesita preocuparse por AUX_EINT_NO (predeterminado general de la plataforma) y SENDKEY_ADC ( ver auxmain. c);

Se pueden realizar algunos ajustes relevantes según la situación real del hardware;

Para el control de línea, es necesario configurar los valores de ADC correspondientes. a REMOTE_EINT_NO, REMOTE_ADC y el botón Pulsar/Liberar

Para el proceso de procesamiento específico, consulte el código controlado por __LINE_CONTROL_EARPHONE_SUPPORT__ en la plataforma 26

6. ADC

Los recursos disponibles en la plataforma MT6226 son ADC0-ADC6;

Tome el control de línea como ejemplo para introducir el proceso de modificación o adición:

interfaz\ hwdrv\Bmt.h

typedef enum {

vbat_adc_channel=0,

visense_adc_channel,

vbattmp_adc_channel,

……

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

canal_adc_remoto,

#endif

……

} adc_channel_type;

p>

custom\drv\misc_drv\M678_BB\adc_channel.c

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

const kal_uint8 ADC_REMOTE=6; /Supongamos que el hardware está conectado a ADC6

#endif

kal_uint8 custom_adc_get_channel(adc_channel_type type)

{

Switch(type)

{

………

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

caso remoto_adc_chann

el:

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 definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

kal_uint8 remoto_adc_logic_id;

kal_uint8 remoto_adc_no

#endif

……

……

//Crear

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

remote_adc_no = custom_adc_get_channel(remote_adc_channel)

remoto_adc_logic_id = adc_sche_create_object(MOD_AUX, remoto_adc_no,40,1, KAL_TRUE);

#endif

……

mientras(1)

{

receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid, ¤t_ilm

switch(current_ilm.msg_id)

{

……

//Leer ADC

caso MSG_ID_READ_ALL_ADC_CHANNEL_REQ:

……

#si está definido( __LINE_CONTROL_EARPHONE_SUPPORT__)

aux_read_adc_channel(remote_adc_logic_id);

#endif

……

descanso;

//Destruir

caso MSG_ID_BMT_ADC_MEASURE_DONE_CONF:

……

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

else if (mea_done_ptr->adc_sche_id == remoto_adc_logic_id)

{

adc_measure_count++;

valor_remoto = (kal_int32)mea_done_ptr->voltio;

aux_re

move_adc_channel(remote_adc_logic_id);

}

#endif

……

}

}

}

El REGISTRADOR de la interrupción CLAMSHELL se puede agregar en la función anterior

7. EINT

Para obtener una descripción de EINT, consulte la hoja de datos de la plataforma;

Tome el control de cables como ejemplo para presentar el proceso de modificación o adición:

interfaz \hwdrv\Eint .h:

typedef enum

{

#si está definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

remoto_eint_chann ,

#endif

} eint_channel_type;

custom\drv\misc_drv\M678_BB\Eint_def.c

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

const kal_uint8 REMOTE_EINT_NO=3; //Asumimos que la configuración del hardware es EINT3

#endif

kal_uint8 custom_eint_get_channel(eint_channel_type tipo)

{

cambiar(tipo)

{

……

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__ )

caso remoto_eint_chann:

retorno ((kal_uint8)REMOTE_EINT_NO);

#endif

}

}

custom\drv\misc_drv\M678_BB\auxmain.c

//Función de procesamiento de interrupción

void REMOTE_EINT_HISR( void)

{

if (remote_state) //Nivel alto

{

//Código de procesamiento relacionado

}

else//Nivel bajo

{

//Código de procesamiento relacionado

}

}

//Interrumpir registro

void aux_task_main( task_entry_struct * task_entry_ptr)

{

kal_uint8 remote_eint_no;

……

#if definido(__LINE_CONTROL_EARPHONE_SUPPORT__)

remoto_eint_no = custom_eint_get_channel(remote_eint_c

hann);

EINT_Registration(remote_eint_no,KAL_TRUE,remote_state,REMOTE_EINT_HISR, KAL_TRUE);

#endif

……

}

Al registrar interrupciones, preste atención a:

Modo de activación de interrupción: ¿disparador por nivel/disparador por flanco?

antirrebote: ¿Activar/Desactivar?

Problemas de activación de nivel, como si el nivel alto es válido o el nivel bajo es válido.

Para Eint0 - Eint3; puede modificar el tiempo de rebote a través del siguiente archivo; mientras que Eint4 - Eint7 no tiene un mecanismo de rebote

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*/

};

Unidad: 50ms

También se puede modificar mediante los siguientes métodos

EINTaddr()

EINT_Set_HW_Debounce()

EINT_SW_Debounce_Modify()

y otras funciones

8. Cargador/USB

Consulte Customer_BMT_V0.1.pdf

Documentos relacionados:

custom\drv \misc_drv\M678_BB\ chr_parameter.c Enfoque:

bmt_customized_struct bmt_custom_chr_def[] = {};

Esta es la configuración del voltaje y la corriente relacionados con la carga;

static const kal_int32 chr_usb_detect_volt;

Este es el valor de voltaje detectado por el CARGADOR/USB;

Mcu\bmt\*.*

Mcu\drv\src \pwic.c

9. Panel táctil

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

personalizado\drv\misc_drv\M678_BB\touch_panel_spi.h

drv\src\touch_panel.c

drv\src\touch_panel_main .c

Los puntos de modificación incluyen:

asignación de GPIO; valor de ADC; configuración de interrupción, etc.

Consulte el código para modificaciones específicas;

p>

10. AFE

custom\audio\M678_BB\afe.c (interruptor analógico, conmutación de PA, etc.)

custom\ audio\M678_BB\audcoeff.c (parámetros de entrada/salida FIR)

custom\audio\M678_BB\nvram_default_audio.c (valor GANANCIA)

l1audio\afe2.c (código de gestión AFE )

Arriba ¡Realice ajustes de acuerdo con los datos proporcionados por el hardware!

11. Task

¿Cómo utilizar Task en la plataforma MTK?

Tome el proyecto DMB como ejemplo; consulte los siguientes archivos de control DMB_SUPPPORT

custom\system\M678_BB\custom_config.c

custom\system; \M678_B

B\custom_config.h

custom\drv\DMB\TCC78X\dmb_hw.c

12 Nor/Nand Flash; T-Flash

Agregar nueva NAND:

Drv\src\NAND_MTD.c

static const flash_list NAND_ID_Table[] =

{

//{ ID, tamaño del plano en MB, tamaño de bloque en KB, tamaño de página en B, ciclo de dirección, ancho de bus IO, subcontrolador mtd}

//Agregar nueva información relacionada con NAND (consulte las especificaciones del chip)

}

DA (Agente de descarga) parte del código (generalmente no es necesario modificarlo)

DA_SRC\src\nand_dev_tbl.c

Const NAND_Device_S g_NandFlashDevTbl[] =

p>

{

//Agregar nueva información NAND (consulte las especificaciones del chip)

};

Agregar nuevo Nor Flash

DA_SRC\src\flash_dev_tbl.c

Const Nor_Device_S g_FlashDevTbl[] =

{

//Agregar nuevo Nor información (consulte las especificaciones del chip)

};

Para modificaciones DA, los archivos DA deben regenerarse para Flash Download Tool