[post] ESS的DVD、VCD程序修改软件说明文件2008-04-23 08:46(1)先解压SVCD的软件(据文件的扩展名 选用arj或 WINZIP)
(2)在解压SVCD的软件下打开makefile.pc文件,查对makefile.pc定义的GOAL,如
#GOAL = iixf30
#GOAL = f30cnr
GOAL = sxf30
#GOAL = sxf30p
上面例是GOAL = sxf30(选用前没有“#”的GOAL)
(3)调用C:\ESSVIDEO\DJGPP\BIN (请把ESSVIDEO编译平台放在C盘)的gmake.exe编译
C:\ESSVIDEO\DJGPP\BIN \gmake -f makefile.pc sxf30
(4) ESS仿真器的LOADDOWN 用C:\ESSVIDEO\TOOLS 下的VCS.exe 或VCS.exe
C:\ESSVIDEO\TOOLS\VCS BANK30.ROM
(BANK30.ROM是目标文件,由STEP 3 生成)
(5)如修改过makefile.pc,请用下
C:\ESSVIDEO\DJGPP\BIN \gmake -f makefile.pc clearn
清除编译生成的中间的文件.
为方便编译,请把相关路径加入autoexec.bat
如:
path=%path%;c:\essvideo\djgpp\bin;c:\essvideo\tools;c:\essvideo\bin;
set djgpp=c:\essvideo\djgpp\djgpp.env
set go32tmp=c:\essvideo\djgpp\tmp
在使用ESS的编译系统时用到两个指令
gmake –f makefile.pc goal (注:goal为makefile.pc中未被注释掉的那个),编译
生成bank30.rom
gmake –f makefile.pc cleanall 清除中间内容
修改VFD(vcd)步骤:
1:测量16312与屏的管脚连接关系
16312 G[X]--------G[X’] VFD
P[Y]---------Q[Y’]
2:在makefile.pc中的sysoption中,加上-DVFD-FUTABA
3:在VFD_TBL.C中修改对应值 SEG_A(_B,_C,_D,_E,_F,_G,),正接01,02,04,08,10,20,40,80
反接80,40,20,10,08,04,02,01,所有的数为16进制,即0x01等.
4:在microvfd.c中定义TRACK_HIGH,TRACK_LOW;MINUTE_HIGH,MINUTE_LOW和
SECOND_HIGH,SECOND_LOW的位置,确切位置由G,P的接法决定P1~P8为低,P9~P16高
5:在microvfd.c中的VFD_process7Segments中修改*rambyte &= 0x80或其他值,其原理在于部分显示需要一直存在,而不能随时变化,它的状态由具体的参数决定,修改后利用VFD_push( )函数进行刷新,函数的参数为刷新对象对应的位置.
在processMessage( )中,也要作相应修改.
6:在VFD_UPDATE_CALENDAR()中修改 ifdef VFD_FUTABA
VFD_push(0x0); VFD_push(0x0);
如果G,P反接VFD_push(0x0a); VFD_push(0x0b);
7:在VFD_tbl.c中定义#define SEG_A 0x__; #define SEG_B 0x__
#define SEG_C 0x__; #define SEG_D 0x__;
#define SEG_E 0x__; #define SEG_F 0x__;
#define SEG_G 0x__; 其值由所处位置决定.
8: 加显示在VFD_TBL.C中定义显示标示#define SEG_AAA
在数组calendar[4][8]中加上SEG_AAA
在panelcmd.h中加上SEG_AAA对应的值,其值由其在数组中的位置决定
若SEG_AAA在数组的第一项的第四个,则对应
#define PANEL_IND1 0XXX下的#define SEG_AAA 0X08;
最后,在PANELVFD.C或PLAY.C中,根据需要加在合适的地方.
作LOGO的方法
1:选择图形尺寸大小,(352,240)、(704,480)等,此图为256色,不能太大;
2:生成e1logo.c文件利用 mklogo.exe *.bmp 50 -vcd;
3:拷贝 e1logo.c 到要编译的文件中即可,则生成的图就可以在开机时看到;
注: 在make.sh中mktable项中含有e1logo.c;有时用e1logos.c,需调试.
作汉字的方法
1: 利用画图作汉字,属性48*32,256色,设文件名为*.bmp
2:生成预览图,利用bmp.exe *.bmp生成三个文件,其中*_ab.bmp为预览图;
利用画图预览*_ab.bmp,若不满足要求,重新作字,重复1,2即可;
注:由于电视机的隔行扫描,对横的要求较高,所以横要加粗.
3: 生成*_c.c, 利用bmpnew.exe .bmp,此文件含ESS需要的图形数据;
4: 在font.h中定义CN_* 的值 0xaa, aa为假定,其实际值由系统已定义的最后汉字的值加1;
一定要找到系统实际定义的最后一个字;
5: 在smfont.c中,用与(4)一样的方法,在数组unsigned int osd_cfont00[][16]中找到系统 定义的最后一个字,在其后加上*_c.c中的第一个数组内的两组数据,注意数组前后的逗号,一定要有;在数组unsigned short osd_cfont01[][16]中找到系统定义的最后一个字,在其后加上*_c.c中的第二个数组内的两组数据,注意数组前后的逗号,一定要有;
6: 在osdmsg.c中,在中英文对应的地方加上:
{“e_*(注:此为键名)”,”**(此为要显示的英文)”},
{“c_*”,{CN_*(注:CN_*要和FONT.H定义的相同),0}},
注:在放中文的时候,要按照显示的顺序存放,如:安静,应为
{“c_*”,{CN_AN,CN_JING,0}},
7: 在play.c中需要显示的地方加显示
assign_osd_msg(osd_msg,MSG_*, c_osd_msg, MSG_c_*,);
附注:在有些font.h中,还需定义LAST_CN的值(指针)
#define LAST_CN,CN_* 或LAST_CN+a.
或用OUTOSD( ) 显示,例如:
OUTOSD(OSD_AUDFX_REGION, MSG_mute, MSG_c_mute, 0);
VCD1.1测键值方法
#ifdef GETKEYCODE ,在makefile.pc中的goal上的ENCODEFLAGS后加-DGETKEYCODE
NTSC与PAL的改制
在display.c中找288为PAL ,240为NTSC,两者对换位置就改换制式
开始时制式转换:在dispcust.c的函数cust_disp_init()中设置DISP_SET_TV_MODE(TV_PAL)
在dsa.c中,将cust_background()有关检测及转换的部分去掉即可;同时在sysinfo.h中将NTSC与PAL 所定义的1,0互换
法1:在此处作一个开关模拟,切换NTSC,PAL,且NTSC=set_AUX6;
2:在sysinfo.h中将#define NTSC,0与#define PAL,1互换即可
键定义(状态)
定义一个键,要在play.c中开头部分定义与keycode.h中相同的值后,才能用
if(current_key==定义_key)定义一种状态,首先在play.h中定义;
在play.c中定义何种情况执行此键:
1:在定义后,在函数change_to_trick_mode()中加上按此键应执行的动作,如 play_FREEZE_STATE;
2: 在函数play_state_machine()中加 case play_ FREEZE_STATE:
{
加上要完成的功能
}break;
注:3210版本第89脚应接一33p的电容到地.;
ESS3883被3207代替,音频输出不一样;
在.cxd.c中函数SERVO_set_speed(speed)可以控制碟片的转速,通常注释掉
If(SERVO_current_speed !=speed) ;
SVCD改机步骤:
1:在makefile.pc的sysoption中-DVFD-FUT267,别的地方有关FUT267的地方均要改成相应所需 make.sh ifdef VFDSPEC_C vfdspec.c #include sccsget中FUT267.VFD
2:在IRKEY.C中改remote,在vfdspec.c中改key,fut267.vfd中改显示(microvfd.c不用改)
在VFD_CHAR_SEGMENTS中改TRACK对应值(与vcd不同,完全按由高到低排)以及
minute,second的值
3: 在VFD_ICON VFD_Iconmsg()中改icon显示
注:每个显示分两组第一组为{ICON_X(要显示)},第二组为{ ICON_XY(要灭掉)}
加书签的方法
1:首先在keydef.h,play.h,play.c中定义book_mark_key,
2:在play.c中加上几点:a:在开始加上
#define BOOK_MARK
#ifdef BOOK_MARK
static void record_resume_time();
static book_flag=0;
static unsigned char BookMinute=0,BookSecond=0,BookTrack=0;
#endif
3:在play_state_machine()函数中的switch (key)下加上
#ifdef BOOK_MARK
case BOOK_MARK_KEY:
/*if (cdtype==3(vcd20?)||plat!=vcd30_play_track)或if(play_state)*/
if(play_state)
if(book_flag){
process_resume_key();
book_flag=0; }
else
{
record_resume_time();
OUTOSD(1, MSG_marked, MSG_c_marked,3);
/*DISPLAY_TIME_OUT);*/
resume_flag = RESUME_PLAY_STOP_TIME_STATE;
/*RESUME_PLAY_BOOK_MARK_TIME_STATE;*/
book_flag=1;
}
/*play_state = PLAY_NORMAL_STATE; */
else OUTOSD(1, MSG_erroe, MSG_c_error,3);
break;
case PLAY_BOOK_MARK_STATE:
if (current_key == BOOK_MARK_KEY) {
current_key = RESUME_KEY;
} else if (current_key != NO_KEY) {
play_state = PLAY_NORMAL_STATE;
}
break;
#endif
4:在最后加函数
#ifdef BOOK_MARK
static void record_resume_time()
{ ResumeTrack = cur_track_number;
ResumeMinute = ((servo_info & 0xff00) >> 8);
ResumeSecond = servo_info & 0xff;
} #endif
5:在process_resume_key(char)的process_PBC_key()后加上
/*#ifdef BOOK_MARK
if(osd)
{
ResumeTrack=BookTrack;
ResumeMinute=BookMinute;
ResumeSecond=BookSecond;
}
else{
ResumeTrack=ResumeTrack;
ResumeMinute=ResumeMinute;
ResumeSecond=ResumeSecond;
}
#endif */
/*与以往不同的是: process_resume_key(void)改为 process_resume_key(char)
在case RESUME_KEY
if(!process_resume_key(0))输出error,current_key=NO_KEY;BREAK;*/
6: 在process_resume_key(osd)中还得加上if(osd) OUTOSD(标签) else OUTOSD(resume)
几种板子的区别(147脚,4108)
typhoneSA+philips; (sony+直接伺服?)
tomcat: DSA+philips; (sony+直接伺服?)
terminator:sony直接伺服
有些机型定义为开机为powerdown模式,在dsc.c中的DSC_init()函数中
#ifndef IGNORE_powerdown()
if DSC_powerdown();改为if DSC_powerup();
复读的几种方式:
1:手动:复读 repeat aàb
录音 录音(图声停)
对比 放录音(图声停)
2:自动:复读 自动复读三遍,然后放音
对比,录音通手动,不同在于:放完就自动进入复读状态
3:复唱: 复读 repeat aàb
录音 录音(图声停)
对比 录音回放
SERVO_INFO的格式:在initcd()后(即读完碟) VCD20 servo_info 00010000;
VCD11 servo_info 00010001 CD servo_info 01010001
在play时, servo_info=00000000;
SONY+2B问题:开机数次容易死机,不显示CLOSE,碟不转;
检查RESET(伺服上)的信号,由解码板上的EAUX3提供,测试信号为低电平,延时,高电平
问题:伺服已初始化,RESET信号还没过来,因此解码板没有初始化,解决办法:在DSA.C
cust_background()函数中
if (power_up)
{initMicroObject();
/*在此加几个reset信号*/
init_dsa();
} for (j=1;j=10){ osdtrack -=10;cntTen++;}
}while (osdtrack>9);
msgOKnumber[0]=cntTen+’0’;
msgOKnumber[1]=osdtrack+’0’;
makefile.pc应引起足够的注意,详见下面的原则:
# # System Options;
# Please make sure you customize for your target.
# # Current options:
# 1) Specify VFD controller:
# One of $(VFDCTL16311) $(VFDCTL16312), $(VFDCTL6311), $(VFDCTL12510),
# or $(VFDCTL2872)
# 2) Remote control type:
# One of -DIR_NEC, -DIR_SANYO, -DIR_PHILIPS
# 3) Remote control
# Default is the original remote controller. Can also be
# -DNEW_ESS_REMOTE -DESS_REMOTE or -DSAST_REMOTE (debugging version)
# # IR_SYSCODE is in microvfd.c (2.0) or po4tact.c (1.1) or
# custvfd.c(customer) or irkey.c(svcd)
# 4) VFD display:
# Default is VFD_ZEC901 (28-0901). Can also be -DVFD_FUT267 (6-BT-267GK),
# -DVFD_FUT297 (6-BT-297GK) -DVFD_ZEC702 (25-0702)
# -DVFD_ZEC703 (25-0703) -DVFD_ZEC704 (25-0704)
# # 5) OSD font
# Use -DFOUR_LINE_OSD to specify using the new OSD layout.
# Use -DBILINGUAL_OSD to specify dual language(Chinese & English) OSD.
# Use -DFONT18 to specify larger font (36 lines duplicated).
# Use -DDVD_FONT to specify non-duplicated 32 lines font
# (DVD_FONT is only allowed for BD_TORNADO!!)
# NOTE: Default OSD is 5-lines layout, 32 lines duplicated font,
# and English only language.
# # 6) Nintendo game
# Use -DNGAME (if you are not planning to use this, please remove
# the flag.) Since ngame.c is a protected module, when ESS makes
# distribution, this flag must be enabled.
SYSOPTIONS = $(VFDCTL16312) -DIR_NEC -DVFD_FUT267 -DNGAME \
-DOSD_4BITS -DEQUALIZER -DDANCER -DBILINGUAL_OSD \
-DMIC_RECORD -DVR_DEMO -DBOOK_MARK
SVCD中:
IRKEY.C 填写遥控器的键码,要分清所用的REMOTE
VFDSPEC.C 填写面板上的按键的键码,注意所用的芯片和接法
FUT267.VFD(OR *.VFD) 填写面板上要显示的字符的位置
KEYDEF.H VFDSPEC.C IRKEY.C 的按键所对应的键值
IR.C 处理遥控器的键
MICROVFD.C 处理面板上的键
PANELVFD.C 关于面板的显示问题
当面板上有转轮时,在FUT267.VFD中填写对应的字符,然后在PANELVFD.C的show_panel_time()函数中
加上if(T_VFD_wheel_SZ) VFD_spin_wheel(VFD_WHEEL_SPIN);
VFD_spin_wheel(VFD_WHEEL_SPIN)的原函数在MICROVFD.C,从中可以清楚转轮的算法,也可以改.
VCD中:
vfd_tbl.c 定义面板上的键,遥控器的键对应的位置
panelcmd.h 定义按键所对应的键值
panelvfd.c 对各种键进行处理
以上三个文件一一对应,其中panelcmd.h中的键值由vfd_tbl.c中的数组INDICATOR_TABLE[4][8]决定,其算法为每一分数组从开始到结束依次为01,02,04,08,10,20,40,80,而主数组则对应panelcmd.h中的PANEL_IND*为1,2,3,4
东芝VCD+MP3(3210+3207)在播放CD时,REPEAT 功能不全,只能回到A一次
的问题:在PLAY.C的开始部分加上extern int dsa_go(unsigned int);然后在函数
upper_state_machine( )中加上
#ifdef XDDJD
currCDtime =(servo_info & 0xffff) < play_item_end_time)
{
dsa_go(play_item_start_time);
}
}
}
#endif XDDJD
在tcservo.c( dsa_go( )函数在这里定义)中更改dsa_go( )函数的
作用区域( 不是private型)即可.
TCL的SVCD+GAME(4108+3883)在随机播放时,按STOP后,PLAY不能从头开始播放问题,解决办法为:
在PLAY.C 的函数process_stop_key( )中加上
if(shuffle_on) {
shuffle_on = 0;
VFD_icon(VFDICON_shuffle_off);
fill_track_list();
cur_track_index = 0;
track_list[0] = 1;
cur_track_number = track_list[0];
play_state = ENTRY_STATE;
}即可.
ESS原来默认的播放MP3时,SELECT为总的排序,现在TCL要求改为菜单式,即先选目录,再选曲子,输入的数字为目录下的顺序数。通过以下修改实现:
Play.c get_next_mp3_track( )函数中的
cur_track_index++;
cur_track_number = cur_track_index+1;
改为
if (mp3_song >= iso9660_dir[real_track[mp3_dir]].dir - 1)
{
mp3_dir++;
cur_track_index++;
cur_track_number = cur_track_index+1;
ddd= cur_track_number;
}
else
{
cur_track_index++;
cur_track_number = cur_track_index+1;
}
get_prev_mp3_track( )函数中的
cur_track_index--;
cur_track_number = cur_track_index + 1;
改为
if(mp3_song == 0)
{
if(mp3_dir==0)return;
else
{
mp3_dir--;
ddd = MP3_song();
cur_track_index--;
cur_track_number = cur_track_index + 1;
}
}
else
{
cur_track_index--;
cur_track_number = cur_track_index + 1;
}
即可
配置sanyo机芯的pansonic servo的参数修改
R62 30Kà33K
R108 18Kà8.2K
对于部分机芯会发出”咔咔”声,是因为光头部分不能到位造成的,需要光头滑动部分前端
靠近主导轴部分作适当的调整.
面板按键无反应:DATA线上的电容去掉,16312的5,6脚应短接,如果还不行,查看data、
std、clk的上拉电阻,它应在4k7左右。
DVD改为全区制
在cust.h中:GBLCUSTDEF(int ignore_region,0)改为1;
若不行,开机,ejectàsetupàstepàprevànext,选择区域中的bypass
menuspec.c
setup.c
play.c
menuspec.c
#ifndef NOSECRET /*************ran***************/
/******************************************************************
* Control Page Declaration
******************************************************************/
MENU_Option version_option[] = {
{ OSD_VER , 0x1, OSD_NULL, OSD_NULL },
{ OSD_SIMU , 0x2, OSD_NULL, OSD_NULL },
{ OSD_BASS , 0x3, OSD_NULL, OSD_NULL },
{ OSD_PRECISION, 0x4, OSD_NULL, OSD_NULL },
{ OSD_KEYSHIFT, 0x5, OSD_NULL, OSD_NULL },
{ OSD_CUSTOM, 0x6, OSD_NULL, OSD_NULL },
};
MENU_Option region_id_option[] = {
{ OSD_REGION1, 0x01, OSD_SET_REGION1, OSD_SET_AS_REGION1 },
{ OSD_REGION2, 0x02, OSD_SET_REGION2, OSD_SET_AS_REGION2 },
{ OSD_REGION3, 0x03, OSD_SET_REGION3, OSD_SET_AS_REGION3 },
{ OSD_REGION4, 0x04, OSD_SET_REGION4, OSD_SET_AS_REGION4 },
{ OSD_REGION5, 0x05, OSD_SET_REGION5, OSD_SET_AS_REGION5 },
{ OSD_REGION6, 0x06, OSD_SET_REGION6, OSD_SET_AS_REGION6 },
{ OSD_REGION7, 0x07, OSD_SET_REGION7, OSD_SET_AS_REGION7 },
{ OSD_REGION8, 0x08, OSD_SET_REGION8, OSD_SET_AS_REGION8 },
{OSD_BYPASS, 0x00, OSD_BYPASS_REGION_ID, OSD_REGION_ID_BYPASS },
};
MENU_Option css_option[] = {
{ OSD_AUTO, CSS_AUTO, OSD_SET_CSS_AUTO, OSD_SET_CSS_AS_AUTO },
{ OSD_OFF, CSS_OFF, OSD_SET_CSS_OFF, OSD_SET_CSS_AS_OFF },
};
MENU_Option mv_option[] = {
{ OSD_AUTO, MV_AUTO, OSD_SET_MV_AUTO, OSD_SET_MV_AS_AUTO },
{ OSD_OFF, MV_OFF, OSD_SET_MV_OFF, OSD_SET_MV_AS_OFF },
};
#ifdef DITHER_MUTE
MENU_Option automute_option[] = {
{OSD_OFF,AUTOMUTE_OFF,OSD_SET_AUTOMUTE_OFF,OSD_SET_AUTOMUTE_OFF },
{OSD_ON, AUTOMUTE_ON, OSD_SET_AUTOMUTE_ON, SD_SET_AUTOMUTE_ON },
};
MENU_Option dither_option[] = {
{OSD_AUTO,DITHER_AUTO,OSD_SET_DITHER_AUTO,OSD_SET_DITHER_AUTO },
{OSD_OFF,DITHER_OFF,OSD_SET_DITHER_OFF, OSD_SET_DITHER_OFF },
};
#endif
MENU_Item secret_page_items[] = {
{ OSD_VERSION, OSD_NULL, GENERAL_ITEM_TYPE, REGULAR_ITEM,
ARRAY_SIZE(version_option), 0, version_option, secret_setup_version },
{ OSD_REGION_ID, OSD_SET_REGION_ID, GENERAL_ITEM_TYPE,
REGULAR_ITEM, ARRAY_SIZE(region_id_option), 0, region_id_option,
secret_setup_region_id },
{OSD_CSS, OSD_SET_CSS_MODE, GENERAL_ITEM_TYPE,REGULAR_ITEM,
ARRAY_SIZE(css_option), 0, css_option, secret_setup_css_state },
{ OSD_MACROVISION, OSD_SET_MV_MODE, GENERAL_ITEM_TYPE,
REGULAR_ITEM, ARRAY_SIZE(mv_option), 0, mv_option,
secret_setup_mv_state },
#ifdef DITHER_MUTE
{OSD_AUTOMUTE,OSD_SET_AUTOMUTE,GENERAL_ITEM_TYPE, EGULAR_ITEM,
ARRAY_SIZE(automute_option), 0, automute_option, secret_setup_automute},
{ OSD_DITHER, OSD_SET_DITHER, GENERAL_ITEM_TYPE, REGULAR_ITEM,
ARRAY_SIZE(dither_option), 0, dither_option, secret_setup_dither},
#endif
};
MENU_Page secret_page[] = {
{ OSD_CONTROL_PAGE, OSD_SETUP_CONTROL_FEATURE, SECRET_PAGE,
OPTION_TYPE, ARRAY_SIZE(secret_page_items), (void *) secret_page_items },
};
#endif
/*************ran***************/
setup.c
int setup_load_default_value()
{ …
init_setting = old_init;
ctl_load_default_value2();/**************ran***********/
/* in case we do reset in Chinese mode */
menu_page_refresh();
….
}
int user_setup_init()
{ …
user_setup_ctl_init2(); /*********ran************/
init_setting = 1;
return;
} at last:
#ifdef DITHER_MUTE
int secret_setup_automute(int mode, int value)
{ int index, pos;
pos = AUTOMUTE_POSITION;
switch( mode ) {
case EXECUTE_MODE:
DAC_automute(value);
break;
case READ_VALUE_MODE:
index = read_e2prom( pos );
return index;
case WRITE_VALUE_MODE:
write_e2prom( pos, value);
break;
case LOAD_DEFAULT_MODE:
return default_automute;
}
return 0;
}
int secret_setup_dither(int mode, int value)
{ int index, pos;
pos = DITHER_POSITION;
switch( mode ) {
case EXECUTE_MODE:
AC3_dither(value);
break;
case READ_VALUE_MODE:
index = read_e2prom( pos );
return index;
case WRITE_VALUE_MODE:
write_e2prom( pos, value);
break;
case LOAD_DEFAULT_MODE:
return default_dither_state;
}
return 0;
} #endif /* DITHER_MUTE */
#endif /* NOSECRET */
/*********ran***********/
play.c
static int proc_setup_key( int a_save_key )
{ …
case _NEXT_KEY:
if( last_key==_PREVIOUS_KEY &&
last2_key==_STEP_KEY ) {
if( !special_setup )
setup_ctl_init2(); /************ran**********/
};
break;
… }
[p:4][/post]