📄 audio_api1.c
字号:
SGTV58xx_I2SAIn_DPllReset();
}
////////////////////////////////// Initialize /////////////////////////////////////////////////
void SGTV58xx_Initialize(void)
{
WORD wTemp;
//-------------------------zenghw add for audio factory menu-------------------
g_Data.ucAISADA = FactoryMenu_Audio_Struct.fnGetPersistentItemValue(FactoryMenu_AudioMenu_PrefADC_Gain_CTLR);
g_Data.ucPreScalarI2SA= FactoryMenu_Audio_Struct.fnGetPersistentItemValue(FactoryMenu_AudioMenu_Prescale_I2SA_DIN);
g_Data.ucPreScalarADC= FactoryMenu_Audio_Struct.fnGetPersistentItemValue(FactoryMenu_AudioMenu_Prescale_ADC);
g_Data.ucPreScalarDemod= FactoryMenu_Audio_Struct.fnGetPersistentItemValue(FactoryMenu_AudioMenu_Prescale_TV);
#ifdef ZHW_DEBUG_SGTV_MSG
tvDebugPrint("************* SGTV start initialized *****************\n");
#endif
SGTV58xx_HardwareReset();
SGTV58xx_SoftReset();
// 0) Temporary fix for Rev SGTV58xx CA1A -
// TODO - read chip id and get revision then set as appropriate
SGTV58xx_I2C_Write(0x500e, 0x0010);
// 1) Clock setup
SGTV58xx_I2C_Write(SGTV58XX_REG__CLKRST_CLOCK, s_DeviceConfig.wClkrstClock);
// 2) Block Disable/ Enable
wTemp = SGTV58XX_CLKRST_BLOCK_DISABLE__SYNC_DELAY_DISABLE__DISABLE_VALUE | // Disable sync delay
SGTV58XX_CLKRST_BLOCK_DISABLE__SPDIF_OUT_DISABLE__DISABLE_VALUE | // Disable SPDIF output - unused
SGTV58XX_CLKRST_BLOCK_DISABLE__ASYNC_I2S_OUT_DISABLE__ENABLE_VALUE | // Enable Async I2S out
SGTV58XX_CLKRST_BLOCK_DISABLE__ASYNC_I2S_IN_DISABLE__ENABLE_VALUE | // Enable Async I2S in
SGTV58XX_CLKRST_BLOCK_DISABLE__SYNC_I2S_DISABLE__ENABLE_VALUE | // Enable sync I2S
SGTV58XX_CLKRST_BLOCK_DISABLE__PEAK_DETECT_DISABLE__ENABLE_VALUE | // Enable Peak Detect
SGTV58XX_CLKRST_BLOCK_DISABLE__TONE_GENERATOR_DISABLE__ENABLE_VALUE | // Enable Tone generator
SGTV58XX_CLKRST_BLOCK_DISABLE__DAP_DISABLE__ENABLE_VALUE | // Enable DAP
SGTV58XX_CLKRST_BLOCK_DISABLE__DEMOD_DISABLE__ENABLE_VALUE; // Enable Demodulator
SGTV58xx_I2C_Write(SGTV58XX_REG__CLKRST_BLOCK_DISABLE, wTemp);
// 3) Power-up items
// 3a) Analog power
SGTV58xx_I2C_Write(SGTV58XX_REG__ANA_CTRL_PWD_CNTRL, s_DeviceConfig.wAnaCtrlPower);
// 3b) DEMOD power
wTemp = SGTV58XX_DEMOD_ANA_CTRL_1__AGC_SEL_SIF__SIF0_VALUE | // Default to SIF0
SGTV58XX_DEMOD_ANA_CTRL_1__AGC_BIAS_CTL__NORMAL_VALUE | // AGC Bias = Normal
SGTV58XX_DEMOD_ANA_CTRL_1__ADC_CLK_DIV__NORMAL_VALUE | // AGC Clock Divider = Normal
SGTV58XX_DEMOD_ANA_CTRL_1__ADC_INV_SAMP_CLK__NORMAL_VALUE | // ADC Invert Sample Clock = Normal
SGTV58XX_DEMOD_ANA_CTRL_1__ADC_CLK_DEF__ON_VALUE | // ADC Clock is On
SGTV58XX_DEMOD_ANA_CTRL_1__PWD_DEMOD_TOP__POWERED_UP_VALUE; // Demodulator power up
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_ANA_CTRL_1, wTemp);
// 4) GPIO and interrupt
// - none being used so use defaults as disabled
// 5) Port Setup (I2S, SPDIF, DEMOD)
// 5a) I2S Sync
SGTV58xx_I2C_Write(SGTV58XX_REG__I2SS_CTRL, s_DeviceConfig.wI2SSCtrl);
SGTV58xx_I2C_Write(SGTV58XX_REG__I2SAIN_CTRL, s_DeviceConfig.wI2SAInCtrl); // updated possible
SGTV58xx_I2C_Write(SGTV58XX_REG__I2SAOUT_CTRL, s_DeviceConfig.wI2SAOutCtrl); // updated possible
// 5b) SPDIF
// - not using - so use defaults
// 5c) DEMOD (asd control) - done in channel change
// set number of asd iterations and supported standards
wTemp = s_DeviceConfig.wDEMOD_Num_ASD_Iterations << SGTV58XX_DEMOD_SUPPORTED_STDS__ASD_ITERATIONS__STARTBIT;
wTemp |= s_DeviceConfig.wDEMOD_Supported_Stds;
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_SUPPORTED_STDS, wTemp);
// set auto-mute noise level in ASD Control register
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_ASD_CTRL, s_DeviceConfig.wDEMOD_AutomuteNoiseLevel);
// set force RSS for NICAM
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_NICAM_CTRL, SGTV58XX_DEMOD_NICAM_CTRL__FORCE_RSS__FORCE_VALUE ); // setup to Force RSS for NICAM
// 6) DAP + MISC(TG & PD) settings - default values to use
// 6a) DAP Control
wTemp = SGTV58XX_DAP_CTRL__LOUDNESS_BOOST__0_DB_VALUE | // Set Loudness Boost to Max
SGTV58XX_DAP_CTRL__LOUDNESS_EN__BYPASS_VALUE | // Enable Loudness
SGTV58XX_DAP_CTRL__EQ_EN__GEQ_VALUE | // Enable GEQ
SGTV58XX_DAP_CTRL__TONE_CONTROL_EN__ENABLED_VALUE | // Enable SGTL - Tone Control
SGTV58XX_DAP_CTRL__SGTL_EN__ENABLE_VALUE; // Enable SGTL Block
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_CTRL, wTemp);
// 6b) DAP AVC Control
wTemp = SGTV58XX_DAP_AVC_CTRL__AVC_DECAY__4_S_DELAY_VALUE | // 4 second decay
SGTV58XX_DAP_AVC_CTRL__THRESHOLD__MINUS_18_DB_VALUE | // -18 dB threshold
SGTV58XX_DAP_AVC_CTRL__LIMITER_EN__COMPRESSOR_MODE_VALUE | // use Compressor Mode
SGTV58XX_DAP_AVC_CTRL__AVC_EN__ENABLE_VALUE; // Enable the AVC
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_AVC_CTRL, wTemp);
// 6c) DAP Headphone DAC Control
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_HP_DAC_CTRL, SGTV58XX_HP_DAC_CTRL__ENABLE__ENABLE); // Enable Headphone TC
// 6d) DAP GEQ0
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_GEQ0, s_DeviceConfig.wGEQ0); // set to configuration
// 6e) DAP GEQ1
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_GEQ1, s_DeviceConfig.wGEQ1); // set to configuration
// 6f) DAP GEQ2
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_GEQ2, s_DeviceConfig.wGEQ2); // set to configuration
// 6g) DAP GEQ3
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_GEQ3, s_DeviceConfig.wGEQ3); // set to configuration
// 6h) DAP GEQ4
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_GEQ4, s_DeviceConfig.wGEQ4); // set to configuration
// 6i) DAP Licensed Audio - SRS
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_LIC_AUDIO_CTRL, SGTV58XX_DAP_LIC_AUDIO_CTRL__ENABLE__SRS_VALUE); // Enable SRS
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_WOWHD, s_DeviceConfig.wWOWHDConfig);
// 6j) DAC Bass Management
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_DAC_BM, s_DeviceConfig.wBassManagement);
// 6k) Tone Generator - Volume
SGTV58xx_I2C_Write(SGTV58XX_REG__TG_VOLUME, s_DeviceConfig.wToneGeneratorVolume);
// 6L) Tone Generator - Frequency
SGTV58xx_I2C_Write(SGTV58XX_REG__TG_FREQ, s_DeviceConfig.wToneGeneratorFreq);
// 6m) Tone Generator - Mix
SGTV58xx_I2C_Write(SGTV58XX_REG__TG_MIX, SGTV58XX_TG_MIX__MIX__FULL_SSS_VALUE);
// NOTE: GOOD place to set different coefficients if need to
// 6n) Peak Detect
// use defaults for now - which is off - items set in GetPeakDetect()
// 7) Prescaler - control set
// TODO - all prescaler control
// 8) Prescaler - values
// 8a) I2SIN0 Prescaler
// 8b) I2SIN1 Prescaler
// 8c) I2SAIN Prescaler
// 8d) Tone Generator Prescaler
// 8e) SGTL Prescaler
// 8f) Headphone TC Prescaler
// 8g) BM Stereo Prescaler
// 8h) BM Mono Prescaler
// 8i) SRS/BBE Prescaler
// 8j) ADC Prescaler
// 8k) DEMOD Prescaler
// 9) Routing - only hardcoded items done here -
// complete connection should be handled by higher up control
// which should be done after this function call
// 9a) I2S OUT Routing - nothing to do - being done in configure() function
// 9b) SPDIF out Routing - not using - so nothing to do
// 9c) DAC out Routing
// hardcoding - SRS/BBE -> Analog Main
// - Headphone Tone Control -> Analog Headphone
// wTemp = ((WORD)SGTV58XX_SSS_INPUT__DAP_SRS_BBE_IN_VALUE << SGTV58XX_SSS_DACOUT__DACMAIN__STARTBIT ) |
// ((WORD)SGTV58XX_SSS_INPUT__DAP_HDPH_TC_IN_VALUE << SGTV58XX_SSS_DACOUT__DACHDPH__STARTBIT );
wTemp = (((WORD)(SGTV58XX_SSS_INPUT__DAP_HDPH_TC_IN_VALUE)) << SGTV58XX_SSS_DACOUT__DACHDPH__STARTBIT );
SGTV58xx_I2C_Write(SGTV58XX_REG__SSS_DACOUT, wTemp);
// 9d) DAC - MAIN LF Routing
// hardcoding - BM_Mono -> Analog Sub
wTemp = (((WORD)(SGTV58XX_SSS_INPUT__DAP_BM_M_IN_VALUE))) << SGTV58XX_SSS_DAC__MAIN_LF__STARTBIT;
SGTV58xx_I2C_Write(SGTV58XX_REG__SSS_DAC_MAIN_LF, wTemp);
// 9e) MISC Routing
// hardcoding - SGTL_DP -> Tone Generator
// - DEMOD -> Sync Delay
wTemp = (((WORD)(SGTV58XX_SSS_INPUT__DAP_SGTL_DP_IN_VALUE)) << SGTV58XX_SSS_MISC__TONE_GENERATOR__STARTBIT ) |
(((WORD)(SGTV58XX_SSS_INPUT__DEMOD_VALUE)) << SGTV58XX_SSS_MISC__SYNC_DELAY__STARTBIT );
SGTV58xx_I2C_Write(SGTV58XX_REG__SSS_MISC, wTemp);
// 9f) DAP Routing
// hardcoding - BM_Stereo -> SRS
// - Tone Generator -> BM
wTemp = (((WORD)(SGTV58XX_SSS_INPUT__DAP_BM_S_IN_VALUE)) << SGTV58XX_SSS_DAP__BBE_SRS__STARTBIT ) |
(((WORD)(SGTV58XX_SSS_INPUT__TG_VALUE)) << SGTV58XX_SSS_DAP__BASS_MANAGEMENT__STARTBIT );
SGTV58xx_I2C_Write(SGTV58XX_REG__SSS_DAP, wTemp);
// 10) Sync Delay
SGTV58xx_I2C_Write(SGTV58XX_REG__SYNC_DELAY_CONTROL, s_DeviceConfig.wSyncDelay);
// 11) Volume(unmute) -
// 11a) DAC Volume not done here - should be handled by higher up control
// 11b) ADC Volume and unmute
// wTemp = SGTV58XX_ANA_CTRL_ADC_VOL__ADC_MUTE_R__UNMUTE_VALUE | // unmute right
// SGTV58XX_ANA_CTRL_ADC_VOL__ADC_VOL_R__0_DB_GAIN_VALUE | // set right volume
// SGTV58XX_ANA_CTRL_ADC_VOL__ADC_MUTE_L__UNMUTE_VALUE | // unmute left
// SGTV58XX_ANA_CTRL_ADC_VOL__ADC_VOL_L__0_DB_GAIN_VALUE; // set left volume
#if 0
wTemp = SGTV58XX_ANA_CTRL_ADC_VOL__ADC_MUTE_R__UNMUTE_VALUE | // unmute right
(((WORD)(g_Data.ucPreScalarADC))<<8 ) | // set right volume //zenghw change for byte to word g_Data.ucPreScalarDAPSGTLDP
SGTV58XX_ANA_CTRL_ADC_VOL__ADC_MUTE_L__UNMUTE_VALUE | // unmute left
g_Data.ucPreScalarADC; // set left volume zenghw old is g_Data.ucPreScalarDAPSGTLDP
// lsz 060626 M2k60703 }
// M2k60703 }
SGTV58xx_I2C_Write(SGTV58XX_REG__ANA_CTRL_ADC_VOL, wTemp);
#else
wTemp = (0xefef & // unmute right
(((WORD)(g_Data.ucAISADA))<<8 ) )| // set right volume //zenghw change for byte to word g_Data.ucPreScalarDAPSGTLDP
(0xefef & // unmute left, 0xef7f
g_Data.ucAISADA); // set left volume zenghw old is g_Data.ucPreScalarDAPSGTLDP
// lsz 060626 M2k60703 }
// M2k60703 }
SGTV58xx_I2C_Write(SGTV58XX_REG__ANA_CTRL_ADC_VOL, wTemp);
#endif
// 12) turn on peak detect
// 2) Enable Peak Detect
wTemp = SGTV58xx_I2C_Read(SGTV58XX_REG__PD_ENABLE);
wTemp &= SGTV58XX_PD_ENABLE__ENABLE__CLEARMASK;
wTemp |= SGTV58XX_PD_ENABLE__ENABLE__ENABLE_VALUE;
SGTV58xx_I2C_Write(SGTV58XX_REG__PD_ENABLE, wTemp);
SGTV58xx_I2SAOut_Config(); // moved from channel config, Tenny at 2k60801
SGTV58xx_ChannelConfig(g_Data.ucMenuMPSource, g_Data.ucMenuPIPSource, _FALSE_);
/*
// Should get value from memory actually
g_FactoryAudioDatas.ucRegVal_Vol1 = 0x80;
g_FactoryAudioDatas.ucRegVal_Vol25 = 0xd8;
g_FactoryAudioDatas.ucRegVal_Vol50 = 0xe8;
g_FactoryAudioDatas.ucRegVal_Vol75 = 0xf0;
g_FactoryAudioDatas.ucRegVal_Vol100 = 0xff;
*/
//SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__SSS_PSCLR_CTRL,0x3ff,0x3ff); // lsz 060616
// M2k60703 {
SGTV58xx_I2C_Write(SGTV58XX_REG__SSS_PSCLR_CTRL,0x7ff ); // lsz 060621
// M2k60703 }
SGTV58xx_PreScalarSet(PreScalar_I2SA, _TRUE_, g_Data.ucPreScalarI2SA);
SGTV58xx_PreScalarSet(PreScalar_ADC, _TRUE_, g_Data.ucPreScalarADC);
SGTV58xx_PreScalarSet(PreScalar_Demod, _TRUE_, g_Data.ucPreScalarDemod);
SGTV58xx_I2C_Write(SGTV58XX_REG__DAC_AOS0, 0x00);// lsz 060612
SGTV58xx_I2C_Write(SGTV58XX_REG__DAC_HP, 0x00);// lsz 060724
SGTV58xx_I2C_Write(SGTV58XX_REG__DAC_HP_VOL, 0xffff);// lsz 060724
SGTV58xx_I2C_Write(0x5008, 0x00c0);// lsz 060719
SGTV58xx_I2C_Write(SGTV58XX_REG__DAP_AVC_PRG_HI_THRESH,0x730); // lsz
// SGTV58xx_VolumeSet(SGTVVolume_DAC0, 0xffff); // Tenny at 2k61020
xMspDspCommand(AUDIO_VOL_DAC0, FactoryMenu_Audio_Struct.fnGetPersistentItemValue(FactoryMenu_AudioMenu_DAC0)); //ZENGHW ADD 20070208
SGTV58xx_VolumeSet(SGTVVolume_DAC1, Default_DAC1_Volume);
// SGTV58xx_I2C_Write(SGTV58XX_REG__DAC_AOS1, 0); // Tenny at 2k61027 ZENGHW 20070402
dAudio_OutputMute(D_AUDIO_LOUDSPEAKER, _FALSE_); //zenghw removed
Audio_SetOverModulation(0x02);//zenghw add for volume demolulator P016 0x03
// //2Tenny at 2k60921 { Patch for SAP detection
// SGTV58xx_I2C_Write(0x8080, 0x1000);
// SGTV58xx_I2C_Write(0x8082, 0x0b00);
// //2Tenny at 2k60921 }
// Initial variables
g_AudioInfo.bForceMono_SAP = _FALSE_;
g_AudioInfo.bNicamLEnabled = _FALSE_;
g_AudioInfo.bNicamLocked = _FALSE_;
g_AudioInfo.bSAPDetected = _FALSE_;
g_AudioInfo.bStatusChanged = _FALSE_;
g_AudioInfo.bUserChanged = _FALSE_;
g_AudioInfo.ucUserPreSelect = StereoMode_MONO; //zenghw add
#if 0
g_MspData.ucMspReadStatus = MSP_TRANS_ONLY_FM_MONO; // No standard detected
g_MspData.ucMspUserSelect = MSP_USER_STEREO_A; // Default audio mode is FM MONO.
g_MspData.ucMspOutputMode = MSP_OUT_MONO; // Default audio output is FM MONO.
g_AudioInfo.ucAutoDetectState = 0x00;
gMspFlags.F_MspSecamL = 0; // SECAM-L debug
gMspFlags.F_MspASS = 1;
#endif
}
////////////////////////////////// Demodulator /////////////////////////////////////////////
void SGTV58xx_AGC_Disable(BOOL bDisable)
{
WORD wTemp;
if(bDisable)
{
wTemp = g_FactoryAudioDatas.ucGain4NicamL << 1; // set Gain value for AM signals(L)
wTemp |= SGTV58XX_DEMOD_AGC_CTRL__AGC_EN__USE_GAIN_VALUE;
}
else
{
wTemp = 0x22; // Set Gain value for FM signals(unused),AGC enabled
wTemp |= SGTV58XX_DEMOD_AGC_CTRL__AGC_EN__USE_AGC_VALUE;
}
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_AGC_CTRL,
(SGTV58XX_DEMOD_AGC_CTRL__AGC_EN__GETMASK | SGTV58XX_DEMOD_AGC_CTRL__GAIN_VALUE__GETMASK),
wTemp);
}
void SGTV58xx_L_DK_SelectL(BOOL bSelectNicamL)
{
WORD wTemp = 0;
wTemp = SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L_DK_SEL__NICAM_DK_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_DK__AUTODETECT_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L__NO_AUTODETECT_VALUE;
if(bSelectNicamL)
wTemp = SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L_DK_SEL__NICAM_L_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_DK__NO_AUTODETECT_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L__AUTODETECT_VALUE;
SGTV58xx_I2C_MaskWrite( SGTV58XX_REG__DEMOD_SUPPORTED_STDS,
( SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L_DK_SEL__GETMASK
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_DK__GETMASK
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L__GETMASK),
wTemp);
}
void SGTV58xx_ASD_SupportSTD(WORD wStandard)
{
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL, 0x0008, 0x0008); //zenghw add bit3
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_SUPPORTED_STDS, 0x0ffe,wStandard); //zenghw changed
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL, 0x0008, 0x0000); //zenghw add bit3
}
// M2k60712 with LSZ {
BOOL SGTV58xx_ASD_IS_SupportSTD(void) // lsz 060707
{
WORD Temp;
Temp= SGTV58xx_I2C_Read(SGTV58XX_REG__DEMOD_SUPPORTED_STDS);
Temp&=SGTV58XX_DEMOD_SUPPORTED_STDS__UNSUPPORTED;
if(Temp)
{
return _FALSE_;
}
else
return _TRUE_ ;
}
// M2k60712 with LSZ }
void SGTV58xx_ASD_Enable(void)
{
WORD wTemp = 0;
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL, 0x0008, 0x0008); //zenghw add bit3
wTemp = SGTV58XX_DEMOD_ASD_CTRL__ASD_DISABLE__ENABLE_VALUE
| SGTV58XX_DEMOD_ASD_CTRL__AUTOMUTE_NOISE_LEVEL__6_DB_SNR
| SGTV58XX_DEMOD_ASD_CTRL__DISABLE_AUTOMUTE__ENABLE_VALUE
| SGTV58XX_DEMOD_ASD_CTRL__CHANNEL_CHANGE__CHANGE_CHANNEL_VALUE
| SGTV58XX_DEMOD_ASD_CTRL__STANDARD__SEARCHING_FOR_STANDARD_VALUE;
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_ASD_CTRL, wTemp);
// //4Tenny at 2k70120 {: Disable continue ASD if not searching state
wTemp = 0;
if(!g_Tuner1Data.ucTunerStep) //zenghw 20070402
wTemp = SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD;
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL,
SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD,
wTemp);
// //4Tenny at 2k70120 }
}
void SGTV58xx_StandardForcedTo(ESGTV58xxStandard eStandard)
{
WORD wTemp;
SGTV58xx_L_DK_SelectL(eStandard == Standard_NICAM_L);
SGTV58xx_AGC_Disable(eStandard == Standard_NICAM_L);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -