⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ens1370.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *  Driver for Ensoniq ES1370/ES1371 AudioPCI soundcard *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>, *		     Thomas Sailer <sailer@ife.ee.ethz.ch> * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program; if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA * *//* Power-Management-Code ( CONFIG_PM ) * for ens1371 only ( FIXME ) * derived from cs4281.c, atiixp.c and via82xx.c * using http://www.alsa-project.org/~iwai/writing-an-alsa-driver/c1540.htm * by Kurt J. Bosch */#include <sound/driver.h>#include <asm/io.h>#include <linux/delay.h>#include <linux/interrupt.h>#include <linux/init.h>#include <linux/pci.h>#include <linux/slab.h>#include <linux/gameport.h>#include <linux/moduleparam.h>#include <linux/mutex.h>#include <sound/core.h>#include <sound/control.h>#include <sound/pcm.h>#include <sound/rawmidi.h>#ifdef CHIP1371#include <sound/ac97_codec.h>#else#include <sound/ak4531_codec.h>#endif#include <sound/initval.h>#include <sound/asoundef.h>#ifndef CHIP1371#undef CHIP1370#define CHIP1370#endif#ifdef CHIP1370#define DRIVER_NAME "ENS1370"#else#define DRIVER_NAME "ENS1371"#endifMODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Thomas Sailer <sailer@ife.ee.ethz.ch>");MODULE_LICENSE("GPL");#ifdef CHIP1370MODULE_DESCRIPTION("Ensoniq AudioPCI ES1370");MODULE_SUPPORTED_DEVICE("{{Ensoniq,AudioPCI-97 ES1370},"	        "{Creative Labs,SB PCI64/128 (ES1370)}}");#endif#ifdef CHIP1371MODULE_DESCRIPTION("Ensoniq/Creative AudioPCI ES1371+");MODULE_SUPPORTED_DEVICE("{{Ensoniq,AudioPCI ES1371/73},"		"{Ensoniq,AudioPCI ES1373},"		"{Creative Labs,Ectiva EV1938},"		"{Creative Labs,SB PCI64/128 (ES1371/73)},"		"{Creative Labs,Vibra PCI128},"		"{Ectiva,EV1938}}");#endif#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))#define SUPPORT_JOYSTICK#endifstatic int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable switches */#ifdef SUPPORT_JOYSTICK#ifdef CHIP1371static int joystick_port[SNDRV_CARDS];#elsestatic int joystick[SNDRV_CARDS];#endif#endif#ifdef CHIP1371static int spdif[SNDRV_CARDS];static int lineio[SNDRV_CARDS];#endifmodule_param_array(index, int, NULL, 0444);MODULE_PARM_DESC(index, "Index value for Ensoniq AudioPCI soundcard.");module_param_array(id, charp, NULL, 0444);MODULE_PARM_DESC(id, "ID string for Ensoniq AudioPCI soundcard.");module_param_array(enable, bool, NULL, 0444);MODULE_PARM_DESC(enable, "Enable Ensoniq AudioPCI soundcard.");#ifdef SUPPORT_JOYSTICK#ifdef CHIP1371module_param_array(joystick_port, int, NULL, 0444);MODULE_PARM_DESC(joystick_port, "Joystick port address.");#elsemodule_param_array(joystick, bool, NULL, 0444);MODULE_PARM_DESC(joystick, "Enable joystick.");#endif#endif /* SUPPORT_JOYSTICK */#ifdef CHIP1371module_param_array(spdif, int, NULL, 0444);MODULE_PARM_DESC(spdif, "S/PDIF output (-1 = none, 0 = auto, 1 = force).");module_param_array(lineio, int, NULL, 0444);MODULE_PARM_DESC(lineio, "Line In to Rear Out (0 = auto, 1 = force).");#endif/* ES1371 chip ID *//* This is a little confusing because all ES1371 compatible chips have the   same DEVICE_ID, the only thing differentiating them is the REV_ID field.   This is only significant if you want to enable features on the later parts.   Yes, I know it's stupid and why didn't we use the sub IDs?*/#define ES1371REV_ES1373_A  0x04#define ES1371REV_ES1373_B  0x06#define ES1371REV_CT5880_A  0x07#define CT5880REV_CT5880_C  0x02#define CT5880REV_CT5880_D  0x03	/* ??? -jk */#define CT5880REV_CT5880_E  0x04	/* mw */#define ES1371REV_ES1371_B  0x09#define EV1938REV_EV1938_A  0x00#define ES1371REV_ES1373_8  0x08/* * Direct registers */#define ES_REG(ensoniq, x) ((ensoniq)->port + ES_REG_##x)#define ES_REG_CONTROL	0x00	/* R/W: Interrupt/Chip select control register */#define   ES_1370_ADC_STOP	(1<<31)		/* disable capture buffer transfers */#define   ES_1370_XCTL1 	(1<<30)		/* general purpose output bit */#define   ES_1373_BYPASS_P1	(1<<31)		/* bypass SRC for PB1 */#define   ES_1373_BYPASS_P2	(1<<30)		/* bypass SRC for PB2 */#define   ES_1373_BYPASS_R	(1<<29)		/* bypass SRC for REC */#define   ES_1373_TEST_BIT	(1<<28)		/* should be set to 0 for normal operation */#define   ES_1373_RECEN_B	(1<<27)		/* mix record with playback for I2S/SPDIF out */#define   ES_1373_SPDIF_THRU	(1<<26)		/* 0 = SPDIF thru mode, 1 = SPDIF == dig out */#define   ES_1371_JOY_ASEL(o)	(((o)&0x03)<<24)/* joystick port mapping */#define   ES_1371_JOY_ASELM	(0x03<<24)	/* mask for above */#define   ES_1371_JOY_ASELI(i)  (((i)>>24)&0x03)#define   ES_1371_GPIO_IN(i)	(((i)>>20)&0x0f)/* GPIO in [3:0] pins - R/O */#define   ES_1370_PCLKDIVO(o)	(((o)&0x1fff)<<16)/* clock divide ratio for DAC2 */#define   ES_1370_PCLKDIVM	((0x1fff)<<16)	/* mask for above */#define   ES_1370_PCLKDIVI(i)	(((i)>>16)&0x1fff)/* clock divide ratio for DAC2 */#define   ES_1371_GPIO_OUT(o)	(((o)&0x0f)<<16)/* GPIO out [3:0] pins - W/R */#define   ES_1371_GPIO_OUTM     (0x0f<<16)	/* mask for above */#define   ES_MSFMTSEL		(1<<15)		/* MPEG serial data format; 0 = SONY, 1 = I2S */#define   ES_1370_M_SBB		(1<<14)		/* clock source for DAC - 0 = clock generator; 1 = MPEG clocks */#define   ES_1371_SYNC_RES	(1<<14)		/* Warm AC97 reset */#define   ES_1370_WTSRSEL(o)	(((o)&0x03)<<12)/* fixed frequency clock for DAC1 */#define   ES_1370_WTSRSELM	(0x03<<12)	/* mask for above */#define   ES_1371_ADC_STOP	(1<<13)		/* disable CCB transfer capture information */#define   ES_1371_PWR_INTRM	(1<<12)		/* power level change interrupts enable */#define   ES_1370_DAC_SYNC	(1<<11)		/* DAC's are synchronous */#define   ES_1371_M_CB		(1<<11)		/* capture clock source; 0 = AC'97 ADC; 1 = I2S */#define   ES_CCB_INTRM		(1<<10)		/* CCB voice interrupts enable */#define   ES_1370_M_CB		(1<<9)		/* capture clock source; 0 = ADC; 1 = MPEG */#define   ES_1370_XCTL0		(1<<8)		/* generap purpose output bit */#define   ES_1371_PDLEV(o)	(((o)&0x03)<<8)	/* current power down level */#define   ES_1371_PDLEVM	(0x03<<8)	/* mask for above */#define   ES_BREQ		(1<<7)		/* memory bus request enable */#define   ES_DAC1_EN		(1<<6)		/* DAC1 playback channel enable */#define   ES_DAC2_EN		(1<<5)		/* DAC2 playback channel enable */#define   ES_ADC_EN		(1<<4)		/* ADC capture channel enable */#define   ES_UART_EN		(1<<3)		/* UART enable */#define   ES_JYSTK_EN		(1<<2)		/* Joystick module enable */#define   ES_1370_CDC_EN	(1<<1)		/* Codec interface enable */#define   ES_1371_XTALCKDIS	(1<<1)		/* Xtal clock disable */#define   ES_1370_SERR_DISABLE	(1<<0)		/* PCI serr signal disable */#define   ES_1371_PCICLKDIS     (1<<0)		/* PCI clock disable */#define ES_REG_STATUS	0x04	/* R/O: Interrupt/Chip select status register */#define   ES_INTR               (1<<31)		/* Interrupt is pending */#define   ES_1371_ST_AC97_RST	(1<<29)		/* CT5880 AC'97 Reset bit */#define   ES_1373_REAR_BIT27	(1<<27)		/* rear bits: 000 - front, 010 - mirror, 101 - separate */#define   ES_1373_REAR_BIT26	(1<<26)#define   ES_1373_REAR_BIT24	(1<<24)#define   ES_1373_GPIO_INT_EN(o)(((o)&0x0f)<<20)/* GPIO [3:0] pins - interrupt enable */#define   ES_1373_SPDIF_EN	(1<<18)		/* SPDIF enable */#define   ES_1373_SPDIF_TEST	(1<<17)		/* SPDIF test */#define   ES_1371_TEST          (1<<16)		/* test ASIC */#define   ES_1373_GPIO_INT(i)	(((i)&0x0f)>>12)/* GPIO [3:0] pins - interrupt pending */#define   ES_1370_CSTAT		(1<<10)		/* CODEC is busy or register write in progress */#define   ES_1370_CBUSY         (1<<9)		/* CODEC is busy */#define   ES_1370_CWRIP		(1<<8)		/* CODEC register write in progress */#define   ES_1371_SYNC_ERR	(1<<8)		/* CODEC synchronization error occurred */#define   ES_1371_VC(i)         (((i)>>6)&0x03)	/* voice code from CCB module */#define   ES_1370_VC(i)		(((i)>>5)&0x03)	/* voice code from CCB module */#define   ES_1371_MPWR          (1<<5)		/* power level interrupt pending */#define   ES_MCCB		(1<<4)		/* CCB interrupt pending */#define   ES_UART		(1<<3)		/* UART interrupt pending */#define   ES_DAC1		(1<<2)		/* DAC1 channel interrupt pending */#define   ES_DAC2		(1<<1)		/* DAC2 channel interrupt pending */#define   ES_ADC		(1<<0)		/* ADC channel interrupt pending */#define ES_REG_UART_DATA 0x08	/* R/W: UART data register */#define ES_REG_UART_STATUS 0x09	/* R/O: UART status register */#define   ES_RXINT		(1<<7)		/* RX interrupt occurred */#define   ES_TXINT		(1<<2)		/* TX interrupt occurred */#define   ES_TXRDY		(1<<1)		/* transmitter ready */#define   ES_RXRDY		(1<<0)		/* receiver ready */#define ES_REG_UART_CONTROL 0x09	/* W/O: UART control register */#define   ES_RXINTEN		(1<<7)		/* RX interrupt enable */#define   ES_TXINTENO(o)	(((o)&0x03)<<5)	/* TX interrupt enable */#define   ES_TXINTENM		(0x03<<5)	/* mask for above */#define   ES_TXINTENI(i)	(((i)>>5)&0x03)#define   ES_CNTRL(o)		(((o)&0x03)<<0)	/* control */#define   ES_CNTRLM		(0x03<<0)	/* mask for above */#define ES_REG_UART_RES	0x0a	/* R/W: UART reserver register */#define   ES_TEST_MODE		(1<<0)		/* test mode enabled */#define ES_REG_MEM_PAGE	0x0c	/* R/W: Memory page register */#define   ES_MEM_PAGEO(o)	(((o)&0x0f)<<0)	/* memory page select - out */#define   ES_MEM_PAGEM		(0x0f<<0)	/* mask for above */#define   ES_MEM_PAGEI(i)	(((i)>>0)&0x0f) /* memory page select - in */#define ES_REG_1370_CODEC 0x10	/* W/O: Codec write register address */#define   ES_1370_CODEC_WRITE(a,d) ((((a)&0xff)<<8)|(((d)&0xff)<<0))#define ES_REG_1371_CODEC 0x14	/* W/R: Codec Read/Write register address */#define   ES_1371_CODEC_RDY	   (1<<31)	/* codec ready */#define   ES_1371_CODEC_WIP	   (1<<30)	/* codec register access in progress */#define   ES_1371_CODEC_PIRD	   (1<<23)	/* codec read/write select register */#define   ES_1371_CODEC_WRITE(a,d) ((((a)&0x7f)<<16)|(((d)&0xffff)<<0))#define   ES_1371_CODEC_READS(a)   ((((a)&0x7f)<<16)|ES_1371_CODEC_PIRD)#define   ES_1371_CODEC_READ(i)    (((i)>>0)&0xffff)#define ES_REG_1371_SMPRATE 0x10	/* W/R: Codec rate converter interface register */#define   ES_1371_SRC_RAM_ADDRO(o) (((o)&0x7f)<<25)/* address of the sample rate converter */#define   ES_1371_SRC_RAM_ADDRM	   (0x7f<<25)	/* mask for above */#define   ES_1371_SRC_RAM_ADDRI(i) (((i)>>25)&0x7f)/* address of the sample rate converter */#define   ES_1371_SRC_RAM_WE	   (1<<24)	/* R/W: read/write control for sample rate converter */#define   ES_1371_SRC_RAM_BUSY     (1<<23)	/* R/O: sample rate memory is busy */#define   ES_1371_SRC_DISABLE      (1<<22)	/* sample rate converter disable */#define   ES_1371_DIS_P1	   (1<<21)	/* playback channel 1 accumulator update disable */#define   ES_1371_DIS_P2	   (1<<20)	/* playback channel 1 accumulator update disable */#define   ES_1371_DIS_R1	   (1<<19)	/* capture channel accumulator update disable */#define   ES_1371_SRC_RAM_DATAO(o) (((o)&0xffff)<<0)/* current value of the sample rate converter */#define   ES_1371_SRC_RAM_DATAM	   (0xffff<<0)	/* mask for above */#define   ES_1371_SRC_RAM_DATAI(i) (((i)>>0)&0xffff)/* current value of the sample rate converter */#define ES_REG_1371_LEGACY 0x18	/* W/R: Legacy control/status register */#define   ES_1371_JFAST		(1<<31)		/* fast joystick timing */#define   ES_1371_HIB		(1<<30)		/* host interrupt blocking enable */#define   ES_1371_VSB		(1<<29)		/* SB; 0 = addr 0x220xH, 1 = 0x22FxH */#define   ES_1371_VMPUO(o)	(((o)&0x03)<<27)/* base register address; 0 = 0x320xH; 1 = 0x330xH; 2 = 0x340xH; 3 = 0x350xH */#define   ES_1371_VMPUM		(0x03<<27)	/* mask for above */#define   ES_1371_VMPUI(i)	(((i)>>27)&0x03)/* base register address */#define   ES_1371_VCDCO(o)	(((o)&0x03)<<25)/* CODEC; 0 = 0x530xH; 1 = undefined; 2 = 0xe80xH; 3 = 0xF40xH */#define   ES_1371_VCDCM		(0x03<<25)	/* mask for above */#define   ES_1371_VCDCI(i)	(((i)>>25)&0x03)/* CODEC address */#define   ES_1371_FIRQ		(1<<24)		/* force an interrupt */#define   ES_1371_SDMACAP	(1<<23)		/* enable event capture for slave DMA controller */#define   ES_1371_SPICAP	(1<<22)		/* enable event capture for slave IRQ controller */#define   ES_1371_MDMACAP	(1<<21)		/* enable event capture for master DMA controller */#define   ES_1371_MPICAP	(1<<20)		/* enable event capture for master IRQ controller */#define   ES_1371_ADCAP		(1<<19)		/* enable event capture for ADLIB register; 0x388xH */#define   ES_1371_SVCAP		(1<<18)		/* enable event capture for SB registers */#define   ES_1371_CDCCAP	(1<<17)		/* enable event capture for CODEC registers */#define   ES_1371_BACAP		(1<<16)		/* enable event capture for SoundScape base address */#define   ES_1371_EXI(i)	(((i)>>8)&0x07)	/* event number */#define   ES_1371_AI(i)		(((i)>>3)&0x1f)	/* event significant I/O address */#define   ES_1371_WR		(1<<2)	/* event capture; 0 = read; 1 = write */#define   ES_1371_LEGINT	(1<<0)	/* interrupt for legacy events; 0 = interrupt did occur */#define ES_REG_CHANNEL_STATUS 0x1c /* R/W: first 32-bits from S/PDIF channel status block, es1373 */#define ES_REG_SERIAL	0x20	/* R/W: Serial interface control register */#define   ES_1371_DAC_TEST	(1<<22)		/* DAC test mode enable */#define   ES_P2_END_INCO(o)	(((o)&0x07)<<19)/* binary offset value to increment / loop end */#define   ES_P2_END_INCM	(0x07<<19)	/* mask for above */#define   ES_P2_END_INCI(i)	(((i)>>16)&0x07)/* binary offset value to increment / loop end */#define   ES_P2_ST_INCO(o)	(((o)&0x07)<<16)/* binary offset value to increment / start */#define   ES_P2_ST_INCM		(0x07<<16)	/* mask for above */#define   ES_P2_ST_INCI(i)	(((i)<<16)&0x07)/* binary offset value to increment / start */#define   ES_R1_LOOP_SEL	(1<<15)		/* ADC; 0 - loop mode; 1 = stop mode */#define   ES_P2_LOOP_SEL	(1<<14)		/* DAC2; 0 - loop mode; 1 = stop mode */#define   ES_P1_LOOP_SEL	(1<<13)		/* DAC1; 0 - loop mode; 1 = stop mode */#define   ES_P2_PAUSE		(1<<12)		/* DAC2; 0 - play mode; 1 = pause mode */#define   ES_P1_PAUSE		(1<<11)		/* DAC1; 0 - play mode; 1 = pause mode */#define   ES_R1_INT_EN		(1<<10)		/* ADC interrupt enable */#define   ES_P2_INT_EN		(1<<9)		/* DAC2 interrupt enable */#define   ES_P1_INT_EN		(1<<8)		/* DAC1 interrupt enable */#define   ES_P1_SCT_RLD		(1<<7)		/* force sample counter reload for DAC1 */#define   ES_P2_DAC_SEN		(1<<6)		/* when stop mode: 0 - DAC2 play back zeros; 1 = DAC2 play back last sample */#define   ES_R1_MODEO(o)	(((o)&0x03)<<4)	/* ADC mode; 0 = 8-bit mono; 1 = 8-bit stereo; 2 = 16-bit mono; 3 = 16-bit stereo */#define   ES_R1_MODEM		(0x03<<4)	/* mask for above */#define   ES_R1_MODEI(i)	(((i)>>4)&0x03)#define   ES_P2_MODEO(o)	(((o)&0x03)<<2)	/* DAC2 mode; -- '' -- */#define   ES_P2_MODEM		(0x03<<2)	/* mask for above */#define   ES_P2_MODEI(i)	(((i)>>2)&0x03)#define   ES_P1_MODEO(o)	(((o)&0x03)<<0)	/* DAC1 mode; -- '' -- */#define   ES_P1_MODEM		(0x03<<0)	/* mask for above */#define   ES_P1_MODEI(i)	(((i)>>0)&0x03)#define ES_REG_DAC1_COUNT 0x24	/* R/W: DAC1 sample count register */#define ES_REG_DAC2_COUNT 0x28	/* R/W: DAC2 sample count register */#define ES_REG_ADC_COUNT  0x2c	/* R/W: ADC sample count register */#define   ES_REG_CURR_COUNT(i)  (((i)>>16)&0xffff)#define   ES_REG_COUNTO(o)	(((o)&0xffff)<<0)#define   ES_REG_COUNTM		(0xffff<<0)#define   ES_REG_COUNTI(i)	(((i)>>0)&0xffff)#define ES_REG_DAC1_FRAME 0x30	/* R/W: PAGE 0x0c; DAC1 frame address */#define ES_REG_DAC1_SIZE  0x34	/* R/W: PAGE 0x0c; DAC1 frame size */#define ES_REG_DAC2_FRAME 0x38	/* R/W: PAGE 0x0c; DAC2 frame address */#define ES_REG_DAC2_SIZE  0x3c	/* R/W: PAGE 0x0c; DAC2 frame size */#define ES_REG_ADC_FRAME  0x30	/* R/W: PAGE 0x0d; ADC frame address */#define ES_REG_ADC_SIZE	  0x34	/* R/W: PAGE 0x0d; ADC frame size */#define   ES_REG_FCURR_COUNTO(o) (((o)&0xffff)<<16)#define   ES_REG_FCURR_COUNTM    (0xffff<<16)#define   ES_REG_FCURR_COUNTI(i) (((i)>>14)&0x3fffc)#define   ES_REG_FSIZEO(o)	 (((o)&0xffff)<<0)#define   ES_REG_FSIZEM		 (0xffff<<0)#define   ES_REG_FSIZEI(i)	 (((i)>>0)&0xffff)#define ES_REG_PHANTOM_FRAME 0x38 /* R/W: PAGE 0x0d: phantom frame address */#define ES_REG_PHANTOM_COUNT 0x3c /* R/W: PAGE 0x0d: phantom frame count */#define ES_REG_UART_FIFO  0x30	/* R/W: PAGE 0x0e; UART FIFO register */#define   ES_REG_UF_VALID	 (1<<8)#define   ES_REG_UF_BYTEO(o)	 (((o)&0xff)<<0)#define   ES_REG_UF_BYTEM	 (0xff<<0)#define   ES_REG_UF_BYTEI(i)	 (((i)>>0)&0xff)/* *  Pages */#define ES_PAGE_DAC	0x0c#define ES_PAGE_ADC	0x0d#define ES_PAGE_UART	0x0e#define ES_PAGE_UART1	0x0f/* *  Sample rate converter addresses */#define ES_SMPREG_DAC1		0x70#define ES_SMPREG_DAC2		0x74#define ES_SMPREG_ADC		0x78#define ES_SMPREG_VOL_ADC	0x6c#define ES_SMPREG_VOL_DAC1	0x7c#define ES_SMPREG_VOL_DAC2	0x7e#define ES_SMPREG_TRUNC_N	0x00#define ES_SMPREG_INT_REGS	0x01#define ES_SMPREG_ACCUM_FRAC	0x02#define ES_SMPREG_VFREQ_FRAC	0x03/* *  Some contants */#define ES_1370_SRCLOCK	   1411200#define ES_1370_SRTODIV(x) (ES_1370_SRCLOCK/(x)-2)/* *  Open modes */#define ES_MODE_PLAY1	0x0001#define ES_MODE_PLAY2	0x0002#define ES_MODE_CAPTURE	0x0004#define ES_MODE_OUTPUT	0x0001	/* for MIDI */#define ES_MODE_INPUT	0x0002	/* for MIDI *//* */struct ensoniq {	spinlock_t reg_lock;	struct mutex src_mutex;	int irq;	unsigned long playback1size;	unsigned long playback2size;	unsigned long capture3size;	unsigned long port;	unsigned int mode;	unsigned int uartm;	/* UART mode */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -