MTK调试- 工程模式配置
工厂模式提供了一个简单的用户接口给测试人员去验证各个硬件模块的功能,测试人员能使用这种模式去检查是否相应的硬件模块都能工作正常。
1、工厂模式
默认按下power+音量上键进入工厂模式(可以在对应项目codegen.dws中修改),有如下菜单项:
1)自动测试 对所有的单项测试项进行测试。测试完毕后,将测试报告显示在屏幕上。
2)单项测试 可以对单独的模块进行测试。
3)测试报告 每个模块测试结果将被显示出来。
4)SN (serial number)
5)硬件设备信息 显示各模块的硬件信息,如:Flash, LCD,TP,Camera,Alsps,WIFI等
6)版本信息 软件的版本,IMEI号及SN
7)关机 关闭手机
2、涉及相关主要文件:
alps\mediatek\factory\src\factory.c 整个工厂模式的入口文件
alps\mediatek\factory\src\test\ftm.c 衔接各个模块
alps\mediatek\custom\common\factory\inc\ 客户定制文件
alps\mediatek\factory\src\test\ftm_* 各个模块具体的代码实现
2.1 factory.c
main()函数:ftm_init(); //工厂模式各个模块初始化
case ITEM_FULL_TEST:
full_test_mode(buf, BUFSZ);
break;
case ITEM_ITEM_TEST:
item_test_mode(buf, BUFSZ);
break;
case ITEM_REPORT:
item_test_report(get_item_list(), buf, BUFSZ);
break;
......
对应了我们进入工厂模式时的菜单项。
1)full_test_mode()
......
pthread_create(&full_test_thd,NULL,init_full_test_new_mode,NULL);
......
while (items.name)
{
......
ftm_entry(items.id, ¶m);
int ret = report_writeByID(mod->id, mod->test_result);
......
}
full_test_mode 对应了菜单项的自动测试模式,其实应该译为全部测试(个人意见),首先会创建一个线程,该线程会在后台运行我们一些测试项 (比如bt wifi,GPS,eMMC,存储卡、SIM) ,测试完成后,会自动保存到测试报告中。循环语句中的是对其他的各个模块进行逐个测试,进入它们自己的ftm_entry函数进行测试,该函数是在ftm.c中构造的,在每个模块测试完成后,测试通过时将结果写入文件。
report_writeByID()
FILE *fp1 = fopen(reportlistname, "w"); // reportlistname[] = "/data/factoryreport.log";
fwrite(&read_rst, sizeof(report_save_struct), count, fp1);
report_writeByID 将结果写入factoryreport.log文件中。
2)item_test_mode 对应单项测试模式,每测试一次都会将结果写入factoryreport.log,原理一样。拔掉电池再次进入到工厂模式查看测试报告,仍可查看到上次的测试结果。
2.2 ftm.c
int ftm_init(){
ftm_init_fn *initfn = &ftm_init_funcs[0];
ftm_init_fn *initdbfn = &ftm_init_debug_funcs[0];
while (*initfn != NULL)
(*initfn)();
initfn++;
while (*initdbfn != NULL)
(*initdbfn)();
initdbfn++;
}
ftm_init_debug_funcs 主要针对音频调试。它和ftm_init_funcs定义在alps\mediatek\factory\src\test\ftm.mods.c中。
ftm_register(struct ftm_module *mod, ftm_entry_fn entry, void *priv)
{
......
mod->test_result = FTM_TEST_UNKNOWN;
mod->visible = true;
mod->entry = entry;
mod->priv = priv;
ftm_mods[mod->id] = mod;
return 0;
}
这个函数很重要,起到衔接的作用,外部调用模块ftm_entry_fn函数是通过ftm_mods数组来进行的。如在facotroy.c中调用ftm_entry测试各个模块。
ftm_entry(int id, struct ftm_param *param)
{
if (ftm_mods[id] && ftm_mods[id]->entry)
return ftm_mods[id]->entry(param, ftm_mods[id]->priv);
}
2.3 cust.h
功能宏控公共部分一般都是定义在\alps\mediatek\custom\common\factory\inc\cust.h
1)产线工模常用功能及宏控对应关系:(cust.h)
触摸屏:FEATURE_FTM_TOUCH
按键:FEATURE_FTM_KEYS
LCD:FEATURE_FTM_LCD
耳机:FEATURE_FTM_HEADSET
OTG:FEATURE_FTM_OTG
扬声器OC测试:FEATURE_FTM_SPK_OC
实时时钟:FEATURE_FTM_RTC
LED:FEATURE_FTM_LED
主照相机:FEATURE_FTM_MAIN_CAMERA
副照相机:FEATURE_FTM_SUB_CAMERA
双麦克风回路测试:FEATURE_FTM_ACSLB
Receiver:FEATURE_FTM_RECEIVER
FM收音机:FEATURE_FTM_FM
电池充电:FEATURE_FTM_BATTERY
eMMC:FEATURE_FTM_EMMC
存储卡:FEATURE_FTM_MEMCARD
SIM卡探测:FEATURE_FTM_SIM
NAND闪存:FEATURE_FTM_FLASH
BT:FEATURE_FTM_BT
Wifi:FEATURE_FTM_WIFI
GPS:FEATURE_FTM_GPS
Strobe闪光灯:FEATURE_FTM_STROBE
Wave回放:FEATURE_FTM_WAVE_PLAYBACK
2)传感器及校准功能宏控定义在ProjectConfig.mk,例如:
磁力传感器:CUSTOM_KERNEL_MAGNETOMETER
光传感器距离传感器:CUSTOM_KERNEL_ALSPS
距离传感器校准:WT_PSCALI
陀螺仪传感器:CUSTOM_KERNEL_GYROSCOPE
加速度传感器:CUSTOM_KERNEL_ACCELEROMETER
气压传感器:CUSTOM_KERNEL_BAROMETER
3)LED相关宏控单独控制在factory\inc\ cust_led.h
按键操作背光:CUST_LED_HAVE_BUTTON_BACKLIGHT
RGB三基色:CUST_HAVE_NLEDS
RED:CUST_LED_HAVE_RED
GREEN:CUST_LED_HAVE_GREEN
BLUE:CUST_LED_HAVE_BLUE