1. 概要:
目前对于越来越多的客户要求DTV工厂频道进行预置,以方便客户的工厂生产,这里提供一个笨拙的办法,可以一次预置ATV+DTV+DVBS的节目。
2. 方法:
(1) 让客户先搜到要预置的ATV,DTV和S2的节目,然后按MENU+7906进入到酒店模式菜单中,选择Export Databases,导出一个database.dat的文件给到我们;
(2) 拿到database.dat的文件后,用UE或者其他可以查看二进制文件的工具打开,找到DTVChannel的地方(一般在0x1D21地址的附近),如下图:
图1
(3) 从上图中可以看到”DTVChannel”后面有4个字节为”5A A5 A5 5A”,这四个字节为节目数据起始的标识,这4个字节之后的数据就是节目数据了。
(4) 用工具“Bin-txt.rar”打开这个BIN文件,转换成为可编辑的文档,如下图2:
图2
(5) 打开转换出的文档,找到”0x44, 0x54, 0x56, 0x43……”即”DTVChannel”对应的地方,并依此找到其后的”0x5A, 0xA5, 0xA5, 0x5A”节目数据开始的地方,将节目数据起始的地方前面的数据全部删掉,新建一个包含UINT8型PreSetDtvChannel数组的dat文件,将”0x5A, 0xA5, 0xA5, 0x5A”后面的数据全部COPY扔到PreSetDtvChannel数组中,别看数据多,基本不影响代码空间。
(6) 在代码中添加对应的CVT_DEF_FAC_CHANNEL_TABLE_TYPE,添加后在MApp_CVT_DataImportExport.c文件开头的地方Include刚才建的dat文件。
(7) 之后只需要在客户的MODE ID里设置VT_DEF_FAC_CHANNEL_TABLE_TYPE即可。
3. 代码的实现:
(1) 准备好如下代码,扔到你想扔的地方:
void msAPI_InstallFactoryDTV_channelTab(void) { memcpy((void *)_PA2VA(RM_DTV_CHSET_START_ADDR - RM_GEN_USAGE + DRAM_64K_DB_START(((DATABASE_START_MEMORY_TYPE & MIU1) ? (DATABASE_START_ADR | MIU_INTERVAL) : (DATABASE_START_ADR)))), PreSetDtvdata , RM_DTV_CHSET_SIZE); g_u8QuickDataBase |= QUICK_DB_UPDATE; msAPI_Timer_Delayms(100);//10-20ms delay MApp_DB_QuickDatabaseMonitor(); msAPI_Timer_Delayms(100);//10-20ms delay MApp_DB_QuickDatabaseMonitor(); msAPI_CM_InitDTVDataManager(); MApp_ChannelChange_VariableInit(); MApp_TopStateMachine_SetTopState(STATE_TOP_CHANNELCHANGE); }
(2) 建立一个名字你随便可以取的数组里,但是上面代码红色部分也得变,如:static const char PreSetDtvdata[]={};把2.7步骤里的数据拷到这个数组里。
(3) 调用msAPI_InstallFactoryDTV_channelTab即可预置工厂频道。