U盘配置文件的方式,读取工厂设置。
1、“menucnfig”开启FAC功能
2、“customize.h”文件,打开FAC宏
#ifdef CONFIG_SUPPORT_FACTORY_AUTO_TEST #define SUPPORT_FACTORY_AUTO_TEST #endif
3、配置文件为“键”:“值” 对方式
要注意“Z”为文件结束行
4、BOOT下的“loader0.c”->special_file_check()完场U盘载入和FAC文件的分析工作
与APP相关的,通过寄存器的方式传值到APP,如工厂模式/老化模式等,可用的寄存器如下:
0xbe0f0521[BIT0]:生产模式 //APP下的调用接口:tv_GetACSpecialFileStatus()
0xbe0f0521[BIT1]:老化模式
0xa0000084[BIT0]:判断生产的工厂 //APP下的调用接口:MID_TVFE_GetSpecialFileStatus()
if(!USBDisk_initial()) { if(CheckUpdateFile(CONFIG_SPECIAL_FILE_1, buff)) { ret = parser_special_file(buff); factory_file_setting(Factory_Burning); //判断老化模式,0xbe0f0521[BIT1]是否置位 factory_file_setting(Factory_Select); //判断工厂,0xa0000084[BIT0]是否置位 *(volatile u8 *)OnEvent_INT_Status_MMIOAddress |= Special_FileBit0; //U盘如果有“FACTEST.KK”,则0xbe0f0521[BIT0]置位 ret = TRUE; } }
5、APP main.c->umf_Init()会读取寄存器的值,并关闭打印信息:
#ifdef SUPPORT_FACTORY_AUTO_TEST tv_GetACSpecialFileStatus(&gacSpecialFileStatus); if((gacSpecialFileStatus & 0x02) == 0x02) //老化模式 { APP_Factory_SetAutoBurningOnOff(TRUE); } else if((gacSpecialFileStatus & 0x01) == 0x01) //生产模式 { APP_Factory_SetAutoTestOnOff(TRUE); UINT8 retval = 0; Cmd_mmio_ReadUINT8(0xbe0f0523, &retval);//check upgrade or not if((retval & 0x0C)) { Cmd_mmio_WriteUINT8mask(0xbe0f0523, 0x00, 0x0c); APP_Factory_SetUpgradeandAutoTestFlag(TRUE); APP_SetPoweronEnterVersion(1);//show the menu of version } } if(APP_Factory_GetAutoTestOnOff()==TRUE) { Enable_Debug_Message(0); //生产模式下DRIVE打印信息关闭 } #endif
6、APP main.c->SW_Init()根据读取的寄存器的值,做相应的行为:
#ifdef SUPPORT_FACTORY_AUTO_TEST if((gacSpecialFileStatus & 0x02) == 0x02 && FALSE == APP_Factory_GetAutoTestOnOff()) { g_stFactoryUserData.n_FactSet_BurningMode = 1; AL_Setting_Write(APP_Data_UserSetting_Handle(), SYS_SET_ID_FACTUSER, ITEM_OFFSET(APP_SETTING_FactoryUser_t, n_FactSet_BurningMode), sizeof(g_stFactoryUserData.n_FactSet_BurningMode),&(g_stFactoryUserData.n_FactSet_BurningMode)); AL_Setting_Store(APP_Data_UserSetting_Handle(), SYS_SET_ID_FACTUSER, ITEM_OFFSET(APP_SETTING_FactoryUser_t, n_FactSet_BurningMode), sizeof(g_stFactoryUserData.n_FactSet_BurningMode)); Cmd_gpio_WriteOnLevel(GPIO_BL_ON_PIN); } else if(APP_Factory_GetAutoTestOnOff()==TRUE) { g_stFactoryUserData.n_FactSet_BurningMode = 0; AL_Setting_Write(APP_Data_UserSetting_Handle(), SYS_SET_ID_FACTUSER, ITEM_OFFSET(APP_SETTING_FactoryUser_t, n_FactSet_BurningMode), sizeof(g_stFactoryUserData.n_FactSet_BurningMode),&(g_stFactoryUserData.n_FactSet_BurningMode)); AL_Setting_Store(APP_Data_UserSetting_Handle(), SYS_SET_ID_FACTUSER, ITEM_OFFSET(APP_SETTING_FactoryUser_t, n_FactSet_BurningMode), sizeof(g_stFactoryUserData.n_FactSet_BurningMode)); } //保存老化模式后,禁止FLASH写置位 #ifdef CONFIG_AC_SPECIAL_FILE_CHECK if(APP_Factory_GetAutoTestOnOff()==TRUE) { extern int AutoTest_NoSaveFlash; AutoTest_NoSaveFlash = 1; //自动测试时不可保存,关闭FLASH的保存功能 } #endif #endif
7、预制频道后,CHANNEL DB也是不能写: atv_app.c->_ATVApp_sw_init()
#ifdef SUPPORT_FACTORY_AUTO_TEST if(APP_Factory_GetAutoTestOnOff() == TRUE) { _ATVApp_PrestoreProgram(); //AL_DB_Sync(AL_DBTYPE_DVB_ATV, al_true); //预置频道写入FLASH } else #endif
8、工厂文件的逐行分析:
#include "stdio.h" #include "types.h" #include <rom_def.h> #include <factory_file_parser.h> #include <drv_kmf_interface.h> #include <drv_vip_external.h> #define FAC_PANEL "panel" #define FAC_SELECT "factory" #define FAC_TIMODE "timod" #define FAC_INVERT "invert" #define FAC_BURNING "burning" #define FIELD_NUM 5 BOOL bFactory_File_Exit=FALSE; struct field { const char *tag; int value; }; struct factory_file { struct field fields[FIELD_NUM]; }; struct factory_file ft_file = { \ { \ {FAC_PANEL, 0}, \ {FAC_SELECT, 0}, \ {FAC_TIMODE, 0}, \ {FAC_INVERT, 0}, \ {FAC_BURNING, 0}, \ },\ }; static void get_line(char *file_data, int line, char *ret_line) { int i, j, s, e; int current_line = 0; char *ptr; s = 0; for (i = 0; i < 2048; i++) { if (file_data[i] == '\n') { current_line++; if (current_line > line) { e = i; break; } else { s = i+1; } } } memcpy(ret_line, &file_data[s], e-s); ret_line[e-s] = '\0'; if (ret_line[e-s-1] == '\r') ret_line[e-s-1] = '\0'; } static int paser_field(char *line) { char tag[32]; char value[16]; int i,j; j = 0; for (i = 0; i < 256; i++) { if ((line[i] != ' ') && (line[i] != ':')) { tag[j++] = line[i]; } else if (line[i] == ':') { tag[j] = '\0'; i++; break; } } j = 0; for (i; i < 256; i++) { if ((line[i] != ' ') && (line[i] != '\0')) { if ((line[i] >= '0') && (line[i] <= '9')) value[j++] = line[i]; } else if (line[i] == '\0') { value[j] = '\0'; break; } } for (i = 0; i < FIELD_NUM; i++) { if(!strcmp(ft_file.fields[i].tag, tag)) { ft_file.fields[i].value = myatoi(value); break; } } if (i != FIELD_NUM) { printf("tag:%s value:%s\n", tag, value); return TRUE; } else { printf("unknow tag:%s\n", tag); return FALSE; } } BOOL parser_special_file(char *file_data) { int i,ret; char line[256]; for (i = 0; i < 20; i++) { get_line(file_data,i, line); //printf("--->%s\n",line); if ((line[0] == 'Z')) break; ret = paser_field(line); if (ret == FALSE) { printf(" special_file format error!!!!\n"); return FALSE; } } if(get_special_value(FAC_PANEL)>0 && get_special_value(FAC_PANEL)<4) bFactory_File_Exit = TRUE; return TRUE; } int get_special_value(const char *tag) { int i; int ret = -1; for (i = 0; i < FIELD_NUM; i++) { if(!strcmp(ft_file.fields[i].tag, tag)) { ret = ft_file.fields[i].value; break; } } return ret; } BOOL has_factory_file() { return bFactory_File_Exit; } void factory_file_setting(Factory_File_Setting status) { BootRomShareData_t *BootromShareData = (void *) KMFBR_ShareData_ShadowAddress; PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)PanelSet_ShadowAddress; int u32Index = 0; if(bFactory_File_Exit) { if(status==Factory_Panel_Resolution) { u32Index = get_special_value(FAC_PANEL); switch(u32Index) { case 0: BootromShareData->Panelresolution = 0; break; case 1: BootromShareData->Panelresolution = 1440; break; case 2: BootromShareData->Panelresolution = 1366; break; case 3: BootromShareData->Panelresolution = 1920; break; default: BootromShareData->Panelresolution = 0; break; } } else if (status==Factory_Burning) { u32Index = get_special_value(FAC_BURNING); if(u32Index) *(volatile UINT8 *)OnEvent_INT_Status_MMIOAddress |= Special_FileBit1; } else if (status==Factory_Select) { u32Index = get_special_value(FAC_SELECT); if(u32Index) *(volatile UINT8 *)0xa0000084 |= Special_FileBit0; } else if(status==Factory_Panel_TiMode) { //0-JEDIA 1-VESA LSB 2-VESA MSB u32Index = get_special_value(FAC_TIMODE); brvip_flash_p->LvdsType = ((UINT8)u32Index)>2?0:((UINT8)u32Index); } else if(status==Factory_Panel_Invert) { u32Index = get_special_value(FAC_INVERT); brvip_flash_p->PanelInvert = (UINT8)u32Index?1:0; } } }