📄 misc.c
字号:
/************************************************
* *
* MISC.C: Misc. sub-routines *
* *
************************************************/
#include <reg51.h>
#include <intrins.h>
#include "mascot.h"
#include "osd.h"
#include "global.h"
//
// Turn off LCD BackLight
//
void miscTurnOnBackLight(void)
{
backlightOffFlag = 0;
#if BACK_LIGHT_INVERT
RegBitOut(0x58,0x0D,0x0F); // turn on LCD Backlight
PANEL_BKL_PIN = 0;
#else
RegBitOut(0x58,0x0F,0x0F); // turn on LCD Backlight
PANEL_BKL_PIN = 1;
#endif
#if DEBUGMSG
printf(" BackLight on ");
#endif
}
//
// Turn off LCD BackLight
//
void miscTurnOffBackLight(void)
{
backlightOffFlag = 1;
#if BACK_LIGHT_INVERT
RegBitOut(0x58,0x02,0x02); // turn off LCD Backlight
PANEL_BKL_PIN = 1;
#else
RegBitOut(0x58,0x00,0x02); // turn off LCD Backlight
PANEL_BKL_PIN = 0;
#endif
#if DEBUGMSG
printf(" BackLight off ");
#endif
}
//
// Turn on LCD panel
//
void miscTurnOnPanel(void)
{
#if DEBUGMSG
printf(" Panel ON\n");
#endif
if ( PanelOnFlag )
{
setBrightness(eepData.brightness);
miscTurnOnBackLight();
return;
}
PanelOnFlag = 1;
#if 0 //for LVDS power
RegBitOut(0x58,0x08,0x08); // turn on LCD VEE FOR LVDS
#endif
#if PANEL_VDD_INVERT
RegBitOut(0x58,0x00,0x04); // turn on LCD VDD
PANEL_VCC_PIN = 0;
#else
RegBitOut(0x58,0x04,0x04); // turn on LCD VDD
PANEL_VCC_PIN = 1;
#endif
#if (USE_TCON + USE_RSDS)
miscDelay(5);
#if 1 //MVXPRL
RegBitOut(0x24, 0x80, 0xC0); // turn on data output
#else
RegBitOut(0x24, 0x00, 0xC0); // turn on data output
#endif
#endif
miscDelay(10);
RegBitOut(0x58,0x01,0x01); // turn on data output
miscDelay(100);
setBrightness(eepData.brightness);
miscTurnOnBackLight();
#if WITH_AUDIO
#if MVRL_NEC15
setVolume(1);
#else
setVolume(eepData.volume);
#endif
#endif
}
//
// Turn off LCD panel
//
void miscTurnOffPanel(void)
{
#if DEBUGMSG
printf(" Panel off ");
#endif
if ( !PanelOnFlag )
return;
PanelOnFlag = 0;
miscTurnOffBackLight();
dspMute(2);
miscDelay(30);
#if (USE_TCON + USE_RSDS)
RegBitOut(0x24, 0x40, 0xC0); // turn off data output
miscDelay(1);
#endif
RegBitOut(0x58,0x00,0x01); // turn off data output
miscDelay(10);
#if PANEL_VDD_INVERT
RegBitOut(0x58,0x04,0x04); // turn off LCD VDD
PANEL_VCC_PIN = 1;
#else
RegBitOut(0x58,0x00,0x04); // turn off LCD VDD
PANEL_VCC_PIN = 0;
#endif
#if 0 //for LVDS power
RegBitOut(0x58,0x00,0x08); // turn off LCD VEE FOR LVDS
#endif
#if DEBUGMSG
printf("OFF\n");
#endif
}
//
// Enter sleep mode
//
void miscEnterSleepMode()
{
if (SleepModeFlag) return;
#if DEBUGMSG
printf("Enter SleepMode\n");
#endif
SleepModeFlag = 1;
disableOSD();
miscTurnOffPanel();
miscClkOff();
LED_G_Pin = 1; LED_O_Pin = 0;
#if WITH_AUDIO
setVolume(0);
#endif
}
//
// Exit sleep mode
//
void miscExitSleepMode()
{
if (!SleepModeFlag) return;
#if DEBUGMSG
printf("Exit SleepMode\n");
#endif
SleepModeFlag = 0;
miscClkOn();
}
void miscTurnOnPower(void)
{
miscExitSleepMode();
LED_G_Pin = 0; LED_O_Pin = 1;
miscTurnOnPanel();
}
void miscClkOn(void)
{
if (sogSyncFlag) // ADC Power on
RegByteOut(0x25, 0xFD);
else
RegByteOut(0x25, 0xFC);
RegBitOut(0x2F, 0x80, 0x90); // SCLK on
#if USE_GAMMA
RegBitOut(0x50, 0x08, 0x08); // Gamma on
#endif
}
void miscClkOff(void)
{
RegByteOut(0x25, 0x80); // ADC Power off
RegBitOut(0x2F, 0x10, 0x90); // SCLK off
#if USE_GAMMA
RegBitOut(0x50, 0x00, 0x08); // Gamma off
#endif
}
//
// Delay (n) ms
//
void miscDelay(int n)
{
unsigned int i;
while (n--) {
i = 1000/11 ; // one loop below takes about 11 us
while (i--);
}
}
void miscSetADCPhase(unsigned char phase)
{
RegByteOut(TDA_PHASE, (phase & PHASEMSK)|0x40);
RegByteOut(TDA_DIVL, RegByteIn(TDA_DIVL));
}
void miscSetADCPitch(unsigned int pitch)
{
unsigned char data tpitchH;
tpitchH = RegByteIn(TDA_DIVH) & 0xf8;
RegByteOut(TDA_DIVH, tpitchH | ((unsigned char)(pitch>>8)&0x07));
RegByteOut(TDA_DIVL, (unsigned char)pitch);
#if (DEBUGMSG>=3)
printf(" Pitch=%d", pitch);
#endif
}
#if (!MODE_ADJ_BY_CALCULATE)
#if MODE_ADJ_SMALL_STEP
#define mt ival
#define nt ival1
#define NMUL 7
#define MINM 4
#define MAXM 0x3F
#define MAXN 0x1FF
void miscDClkUp(unsigned char delta)
{
unsigned long F, fs, ft;
unsigned int M, N;
unsigned char i;
M = RegByteIn(0x2B);
N = (((unsigned int)RegByteIn(0x2D)&0x0F)<<8) + RegByteIn(0x2C);
#if (DEBUGMSG >= 3)
printf(" miscDClkUp: %04X/%02X %d",
(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif
for (i = 0; i < delta; i++)
{
F = ((unsigned long)N << NMUL) / M;
fs = 0xFFF << NMUL;
for (mt = MINM; mt <= MAXM; mt++) {
for (nt = (F*mt)>>NMUL; nt <= MAXN; nt++) {
ft = ((unsigned long)nt<<NMUL)/mt;
if (ft > F) {
if (fs > ft-F) {
fs = ft-F; N = nt; M = mt;
}
break;
}
}
}
}
RegByteOut(0x2B, (unsigned char) M);
RegByteOut(0x2C, (unsigned char) N);
RegByteOut(0x2D, (unsigned char) (N>>8) & 0x0F);
#if (DEBUGMSG >= 3)
printf(" -> %04X/%02X %d\n",
(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif
}
void miscDClkDown(unsigned char delta)
{
unsigned long F, fs, ft;
unsigned int M, N;
unsigned char i;
M = RegByteIn(0x2B);
N = (((unsigned int)RegByteIn(0x2D)& 0x0F)<<8) + RegByteIn(0x2C);
#if (DEBUGMSG >= 3)
printf(" miscDClkDown: %04X/%02X %d", N, M, (unsigned int)((long)1200*N/M));
#endif
for (i = 0; i < delta; i++)
{
F = ((unsigned long)N << NMUL) / M;
fs = 0xFF<<NMUL;
for (mt = MINM; mt <= MAXM; mt++) {
for (nt = ((F*mt)>>NMUL)+1; nt > 2; nt--) {
ft = ((unsigned long)nt<<NMUL)/mt;
if (F > ft) {
if (fs > F-ft) {
fs = F-ft; N = nt; M = mt;
}
break;
}
}
}
}
RegByteOut(0x2B, (unsigned char) M);
RegByteOut(0x2C, (unsigned char) N);
RegByteOut(0x2D, (unsigned char) (N>>8)&0x0F);
#if (DEBUGMSG >= 3)
printf(" -> %04X/%02X %d\n",(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif
}
#else //MODE_ADJ_SMALL_STEP
#define NMUL 7 //6
#define MINM 4 //4
#define MAXM 0x1D //0F
#define MAXN 0xFD //7F
#define ft ival
#define fs ival1
#define F ival2
void miscDClkUp(unsigned char delta)
{
unsigned int mt, nt;
unsigned char M, N;
unsigned char i;
M = RegByteIn(0x2B);
nt = (((unsigned int)RegByteIn(0x2D)&0x0F)<<8) + RegByteIn(0x2C);
#if (DEBUGMSG >= 3)
printf(" miscDClkUp: %04X/%02X %d",(unsigned int)nt, (unsigned int)M, (unsigned int)((long)1200*nt/M));
#endif
F = ((unsigned long)nt << NMUL) / M;
fs = 0xFF<<NMUL;
for (i = 0; i < delta; i++)
{
for (mt = MINM; mt <= MAXM; mt++) {
nt = (F*mt)>>NMUL;
if (nt > 0xff) break;
for (; nt <= MAXN; nt++) {
ft = (nt<<NMUL)/mt;
if (ft > F) {
if (fs >= ft-F) {
fs = ft-F; N = nt; M = mt;
}
break;
}
}
}
F = ((unsigned int)N<<NMUL) / M;
fs = 0xFF<<NMUL;
}
RegByteOut(0x2B, (unsigned char) M);
RegByteOut(0x2C, (unsigned char) N);
RegByteOut(0x2D, (unsigned char) (N>>8) & 0x0F);
#if (DEBUGMSG >= 3)
printf(" -> %04X/%02X %d\n",(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif
}
void miscDClkDown(unsigned char delta)
{
unsigned int mt, nt;
unsigned char M, N;
unsigned char i;
M = RegByteIn(0x2B);
nt = (((unsigned int)RegByteIn(0x2D)& 0x0F)<<8) + RegByteIn(0x2C);
#if (DEBUGMSG >= 3)
printf(" miscDClkDown: %04X/%02X %d",(unsigned int)nt,(unsigned int)M, (unsigned int)((long)1200*nt/M));
#endif
F = ((unsigned long)nt<<NMUL) / M;
fs = 0xFF<<NMUL;
for (i = 0; i < delta; i++)
{
for (mt = 1+2; mt <= MAXM; mt++) {
nt = ((F*mt)>>NMUL)+1 ;
if (nt > 0xff) break;
for ( ; nt > 2; nt--) {
ft = (nt<<NMUL)/mt;
if (F > ft) {
if (fs > F-ft) {
fs = F-ft; N = nt; M = mt;
}
break;
}
}
}
F = ((unsigned int)N<<NMUL) / M;
fs = 0xFF<<NMUL;
}
RegByteOut(0x2B, (unsigned char) M);
RegByteOut(0x2C, (unsigned char) N);
RegByteOut(0x2D, (unsigned char) (N>>8)&0x0F);
#if (DEBUGMSG >= 3)
printf(" -> %04X/%02X %d\n",(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif
}
#undef ft
#undef fs
#undef F
#endif //MODE_ADJ_SMALL_STEP
#endif //(!MODE_ADJ_BY_CALCULATE)
#if USE_TCON
void miscSwitchTCONReg(unsigned char flag)
{
TCON_Page_Flag = flag?1:0;
RegByteOut(0xC0, flag?0x40:0x3C);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -