工厂生产模式

  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;
        }
    }
}

 

转载于:https://www.cnblogs.com/jiangzhaowei/p/7442989.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值