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> p>
XXX_XXX = NINGUNO
XXX_XXX = VERDADERO
XXX_XXX = FALSO
Option.mak:
ifdef XXX_XXX p>
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 p >
//
#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[]=
{ p>
CLAVE_0,
CLAVE_1,
CLAVE_2,
CLAVE_3,
CLAVE_4,
KEY_5,
......
//Definir claves específicas
#if wanted(__SLIDE_M678)
,KEY_XX
#endif p>
};
//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,
…… p>
#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 p>
#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) p>
{
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