📄 candrv.c
字号:
case CAN_RXID_SET:
if (CanRxIDSet(pChan, arg) != OK)
result = ERROR;
break;
case CAN_RXID_GET:
*(int *)arg = pChan->RxID;
return (OK);
default:
return (ERROR);
}
printf("CanIoctl funtion has been set \n");
return (result);
}
/******************************************************************************
*
* CanBaudSet - 改变can设备的波特率
*设置can的波特率,设置时不使能中断
*波特率只能为1M 500K 250K 125K 100K 75K 50K
*
* 返回:OK或者ERROR
*
******************************************************************************/
LOCAL STATUS CanBaudSet
(
Can_DEV * pcan_chan,
UINT32 baud
)
{
register int i;
i = 0;
if (!baud)
return (ERROR);
if (baud != pcan_chan->baudRate)
{
UINT32 val;
int oldlevel;
switch(baud)
{
case 1000000:
val = 0x045B2005;
break;
case 500000:
val = ((PRESDIV1(baud)) << 24)| CTRL_RJW | CTRL_PSEG1 | CTRL_PSEG2 | CTRL_CLK_SRC | CTRL_SMP | CTRL_PROPSEG;
break;
case 125000:
val = ((PRESDIV1(baud)) << 24)| CTRL_RJW | CTRL_PSEG1 | CTRL_PSEG2 | CTRL_CLK_SRC | CTRL_SMP | CTRL_PROPSEG;
break;
case 100000:
val = ((PRESDIV1(baud)) << 24)| CTRL_RJW | CTRL_PSEG1 | CTRL_PSEG2 | CTRL_CLK_SRC | CTRL_SMP | CTRL_PROPSEG;
break;
case 75000:
val = ((PRESDIV1(baud)) << 24)| CTRL_RJW | CTRL_PSEG1 | CTRL_PSEG2 | CTRL_CLK_SRC | CTRL_SMP | CTRL_PROPSEG;
break;
case 50000:
val = ((PRESDIV1(baud)) << 24)| CTRL_RJW | CTRL_PSEG1 | CTRL_PSEG2 | CTRL_CLK_SRC | CTRL_SMP | CTRL_PROPSEG;
break;
default:
return ERROR;
}
oldlevel = intLock ();
/*设置FRZ和HALT位,使CAN进入Freeze模式,进入管理模式*/
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_FRZ | MCR_HALT | MCR_SUPV | MCR_MAXMB);
while((CANDEV_READ(pcan_chan->mcr) & 0x01000000) == 0x00000000) //等待can进入Freeze模式
{
i++;
if(i >= 40000)
{
return ERROR;
}
}
CANDEV_WRITE(pcan_chan->ctrl,val);
/*退出FREEZE模式,退出管理模式*/
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_MAXMB);
pcan_chan->baudRate = baud;
intUnlock (oldlevel);
}
return (OK);
}
/******************************************************************************
*
* CanIDTxSet - 改变can信息缓冲区MB0的ID
*设置信息缓冲区ID,设置时理论上可以不用使该CAN进入FREEZE模式
*但为了安全起见,还是考虑进入FREEZE模式并且不使能中断
*
* 返回:OK或者ERROR
*
******************************************************************************/
LOCAL STATUS CanTxIDSet
(
Can_DEV *pcan_chan,
UINT32 Id
)
{
register int i;
UINT32 MbufId;
int oldlevel;
i = 0;
if((Id ==0) || (Id > 2047))
{
printf("The TXID number is too large!\n");
return ERROR;
}
if(Id != pcan_chan->TxID)
{
MbufId = Id << 18;
oldlevel = intLock ();
/*设置FRZ和HALT位,使CAN进入Freeze模式,进入管理模式*/
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_FRZ | MCR_HALT | MCR_SUPV | MCR_MAXMB);
while((CANDEV_READ(pcan_chan->mcr) & 0x01000000) == 0x00000000) //等待can进入Freeze模式
{
i++;
if(i >= 40000)
{
printf("CAN didn't enter into freeze mode!");
return ERROR;
}
}
CANDEV_WRITE(pcan_chan->txcode,
TX_NOTENABLE | DEFAULT_LENGTH);
CANDEV_WRITE(pcan_chan->txID,MbufId); //写发送缓冲区ID
/*退出FREEZE模式,退出管理模式*/
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_MAXMB);
pcan_chan->TxID = Id;
intUnlock (oldlevel);
}
return OK;
}
/******************************************************************************
*
* CanIDRxSet - 改变can信息缓冲区MB1的ID
*设置信息缓冲区ID,设置时理论上可以不用使该CAN进入FREEZE模式
*但为了安全起见,还是考虑进入FREEZE模式并且不使能中断
*
* 返回:OK或者ERROR
*
******************************************************************************/
LOCAL STATUS CanRxIDSet
(
Can_DEV *pcan_chan,
UINT32 Id
)
{
register int i;
i = 0;
if((Id ==0) || (Id > 2047))
{
printf("The RXID number is too large!\n");
return ERROR;
}
if(Id != pcan_chan->RxID)
{
UINT32 MbufId;
int oldlevel;
MbufId = Id << 18;
oldlevel = intLock ();
/*设置FRZ和HALT位,使CAN进入Freeze模式,进入管理模式*/
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_FRZ | MCR_HALT | MCR_SUPV | MCR_MAXMB);
while((CANDEV_READ(pcan_chan->mcr) & 0x01000000) == 0x00000000) //等待can进入Freeze模式
{
i++;
if(i >= 40000)
{
printf("CAN didn't enter into freeze mode!");
return ERROR;
}
}
CANDEV_WRITE(pcan_chan->rxcode,
RX_NOTENABLE | DEFAULT_LENGTH);
CANDEV_WRITE(pcan_chan->rxID,MbufId);//写接收缓冲区ID
CANDEV_WRITE(pcan_chan->rxcode,
RX_ENABLE | DEFAULT_LENGTH);
/*退出FREEZE模式,退出管理模式*/
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_MAXMB);
pcan_chan->RxID = Id;
intUnlock (oldlevel);
}
return OK;
}
/******************************************************************************
*
* CanDevInit - can设备初始化程序
*初始化CAN设备结构寄存器地址,并调用Initcan函数对CAN寄存器进行初始化
*
*返回:无
*
*参数:无
******************************************************************************/
void CanDevInit (void)
{
int i;
for(i=0;i<NUM_CAN;i++)
{
can_chan_dev[i].clkRate = MASTER_CLOCK;/*默认系统主频为150MHz*/
can_chan_dev[i].baudRate = CAN_DEFAULT_BAUD;
if(i == 0)
{
can_chan_dev[i].TxID = 1;
can_chan_dev[i].RxID = 2;
}
else
{
can_chan_dev[i].TxID = 2;
can_chan_dev[i].RxID = 1;
}
can_chan_dev[i].Flag_canOpen = CAN_NO;
/*初始化发送缓冲区指针及发送计数器*/
can_chan_dev[i].ptx = can_chan_dev[i].tx_Buff;
can_chan_dev[i].tx_number = 0;
can_chan_dev[i].tx_length =0;
/*初始化接收缓冲区指针及接收计数器*/
can_chan_dev[i].prx_write = can_chan_dev[i].rx_Buff;
can_chan_dev[i].prx_read = can_chan_dev[i].rx_Buff;
can_chan_dev[i].rx_number = 0;
can_chan_dev[i].rx_length = 0;
if(i == 0)/* Initialize Port FECI2C PAR to have Can 0 TX/RX signals enabled */
{
#if 0
(*M523X_GPIO_PAR_FECI2C(IPS_BASE)) &= 0xF0;
(*M523X_GPIO_PAR_FECI2C(IPS_BASE)) |= 0x0A;
#endif
(*M523X_GPIO_PAR_UART(IPS_BASE)) &= 0xF0FF;
(*M523X_GPIO_PAR_UART(IPS_BASE)) |= 0x0A00;
}
else/* Initialize Port UART PAR to have Can 1 TX/RX signals enabled */
{
(*M523X_GPIO_PAR_UART(IPS_BASE)) |= 0x4000;
}
/*初始化Flex_can设备结构寄存器*/
can_chan_dev[i].mcr = M523X_CAN_CANMCR(IPS_BASE,i);
can_chan_dev[i].ctrl = M523X_CAN_CANCTRL(IPS_BASE,i);
can_chan_dev[i].timer = M523X_CAN_TIMER(IPS_BASE,i);
can_chan_dev[i].rxgmask = M523X_CAN_RXGMASK(IPS_BASE,i);
can_chan_dev[i].rx14mask = M523X_CAN_RX14MASK(IPS_BASE,i);
can_chan_dev[i].rx15mask = M523X_CAN_RX15MASK(IPS_BASE,i);
can_chan_dev[i].errcnt = M523X_CAN_ERRCNT(IPS_BASE,i);
can_chan_dev[i].errstat = M523X_CAN_ERRSTAT(IPS_BASE,i);
can_chan_dev[i].imask = M523X_CAN_IMASK(IPS_BASE,i);
can_chan_dev[i].iflag = M523X_CAN_IFLAG(IPS_BASE,i);
can_chan_dev[i].txcode = M523X_CAN_MBUF0_CTRL(IPS_BASE,i);
can_chan_dev[i].txlength = M523X_CAN_MBUF0_CTRL(IPS_BASE,i);
can_chan_dev[i].txtimestamp = M523X_CAN_MBUF0_TMSTP(IPS_BASE,i);
can_chan_dev[i].txID = M523X_CAN_MBUF0_ID(IPS_BASE,i);
can_chan_dev[i].txdata0 = M523X_CAN_MBUF0_BYTE0(IPS_BASE,i);
can_chan_dev[i].txdata1 = M523X_CAN_MBUF0_BYTE1(IPS_BASE,i);
can_chan_dev[i].txdata2 = M523X_CAN_MBUF0_BYTE2(IPS_BASE,i);
can_chan_dev[i].txdata3 = M523X_CAN_MBUF0_BYTE3(IPS_BASE,i);
can_chan_dev[i].txdata4 = M523X_CAN_MBUF0_BYTE4(IPS_BASE,i);
can_chan_dev[i].txdata5 = M523X_CAN_MBUF0_BYTE5(IPS_BASE,i);
can_chan_dev[i].txdata6 = M523X_CAN_MBUF0_BYTE6(IPS_BASE,i);
can_chan_dev[i].txdata7 = M523X_CAN_MBUF0_BYTE7(IPS_BASE,i);
can_chan_dev[i].rxcode = M523X_CAN_MBUF1_CTRL(IPS_BASE,i);
can_chan_dev[i].rxlength = M523X_CAN_MBUF1_CTRL(IPS_BASE,i);
can_chan_dev[i].rxtimestamp = M523X_CAN_MBUF1_TMSTP(IPS_BASE,i);
can_chan_dev[i].rxID = M523X_CAN_MBUF1_ID(IPS_BASE,i);
can_chan_dev[i].rxdata0 = M523X_CAN_MBUF1_BYTE0(IPS_BASE,i);
can_chan_dev[i].rxdata1 = M523X_CAN_MBUF1_BYTE1(IPS_BASE,i);
can_chan_dev[i].rxdata2 = M523X_CAN_MBUF1_BYTE2(IPS_BASE,i);
can_chan_dev[i].rxdata3 = M523X_CAN_MBUF1_BYTE3(IPS_BASE,i);
can_chan_dev[i].rxdata4 = M523X_CAN_MBUF1_BYTE4(IPS_BASE,i);
can_chan_dev[i].rxdata5 = M523X_CAN_MBUF1_BYTE5(IPS_BASE,i);
can_chan_dev[i].rxdata6 = M523X_CAN_MBUF1_BYTE6(IPS_BASE,i);
can_chan_dev[i].rxdata7 = M523X_CAN_MBUF1_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb2code = M523X_CAN_MBUF2_CTRL(IPS_BASE,i);
can_chan_dev[i].mb2length = M523X_CAN_MBUF2_CTRL(IPS_BASE,i);
can_chan_dev[i].mb2timestamp = M523X_CAN_MBUF2_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb2ID = M523X_CAN_MBUF2_ID(IPS_BASE,i);
can_chan_dev[i].mb2data0 = M523X_CAN_MBUF2_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb2data1 = M523X_CAN_MBUF2_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb2data2 = M523X_CAN_MBUF2_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb2data3 = M523X_CAN_MBUF2_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb2data4 = M523X_CAN_MBUF2_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb2data5 = M523X_CAN_MBUF2_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb2data6 = M523X_CAN_MBUF2_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb2data7 = M523X_CAN_MBUF2_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb3code = M523X_CAN_MBUF3_CTRL(IPS_BASE,i);
can_chan_dev[i].mb3length = M523X_CAN_MBUF3_CTRL(IPS_BASE,i);
can_chan_dev[i].mb3timestamp = M523X_CAN_MBUF3_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb3ID = M523X_CAN_MBUF3_ID(IPS_BASE,i);
can_chan_dev[i].mb3data0 = M523X_CAN_MBUF3_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb3data1 = M523X_CAN_MBUF3_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb3data2 = M523X_CAN_MBUF3_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb3data3 = M523X_CAN_MBUF3_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb3data4 = M523X_CAN_MBUF3_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb3data5 = M523X_CAN_MBUF3_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb3data6 = M523X_CAN_MBUF3_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb3data7 = M523X_CAN_MBUF3_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb4code = M523X_CAN_MBUF4_CTRL(IPS_BASE,i);
can_chan_dev[i].mb4length = M523X_CAN_MBUF4_CTRL(IPS_BASE,i);
can_chan_dev[i].mb4timestamp = M523X_CAN_MBUF4_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb4ID = M523X_CAN_MBUF4_ID(IPS_BASE,i);
can_chan_dev[i].mb4data0 = M523X_CAN_MBUF4_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb4data1 = M523X_CAN_MBUF4_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb4data2 = M523X_CAN_MBUF4_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb4data3 = M523X_CAN_MBUF4_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb4data4 = M523X_CAN_MBUF4_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb4data5 = M523X_CAN_MBUF4_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb4data6 = M523X_CAN_MBUF4_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb4data7 = M523X_CAN_MBUF4_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb5code = M523X_CAN_MBUF5_CTRL(IPS_BASE,i);
can_chan_dev[i].mb5length = M523X_CAN_MBUF5_CTRL(IPS_BASE,i);
can_chan_dev[i].mb5timestamp = M523X_CAN_MBUF5_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb5ID = M523X_CAN_MBUF5_ID(IPS_BASE,i);
can_chan_dev[i].mb5data0 = M523X_CAN_MBUF5_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb5data1 = M523X_CAN_MBUF5_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb5data2 = M523X_CAN_MBUF5_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb5data3 = M523X_CAN_MBUF5_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb5data4 = M523X_CAN_MBUF5_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb5data5 = M523X_CAN_MBUF5_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb5data6 = M523X_CAN_MBUF5_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb5data7 = M523X_CAN_MBUF5_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb6code = M523X_CAN_MBUF6_CTRL(IPS_BASE,i);
can_chan_dev[i].mb6length = M523X_CAN_MBUF6_CTRL(IPS_BASE,i);
can_chan_dev[i].mb6timestamp = M523X_CAN_MBUF6_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb6ID = M523X_CAN_MBUF6_ID(IPS_BASE,i);
can_chan_dev[i].mb6data0 = M523X_CAN_MBUF6_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb6data1 = M523X_CAN_MBUF6_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb6data2 = M523X_CAN_MBUF6_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb6data3 = M523X_CAN_MBUF6_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb6data4 = M523X_CAN_MBUF6_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb6data5 = M523X_CAN_MBUF6_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb6data6 = M523X_CAN_MBUF6_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb6data7 = M523X_CAN_MBUF6_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb7code = M523X_CAN_MBUF7_CTRL(IPS_BASE,i);
can_chan_dev[i].mb7length = M523X_CAN_MBUF7_CTRL(IPS_BASE,i);
can_chan_dev[i].mb7timestamp = M523X_CAN_MBUF7_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb7ID = M523X_CAN_MBUF7_ID(IPS_BASE,i);
can_chan_dev[i].mb7data0 = M523X_CAN_MBUF7_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb7data1 = M523X_CAN_MBUF7_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb7data2 = M523X_CAN_MBUF7_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb7data3 = M523X_CAN_MBUF7_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb7data4 = M523X_CAN_MBUF7_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb7data5 = M523X_CAN_MBUF7_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb7data6 = M523X_CAN_MBUF7_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb7data7 = M523X_CAN_MBUF7_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb8code = M523X_CAN_MBUF8_CTRL(IPS_BASE,i);
can_chan_dev[i].mb8length = M523X_CAN_MBUF8_CTRL(IPS_BASE,i);
can_chan_dev[i].mb8timestamp = M523X_CAN_MBUF8_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb8ID = M523X_CAN_MBUF8_ID(IPS_BASE,i);
can_chan_dev[i].mb8data0 = M523X_CAN_MBUF8_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb8data1 = M523X_CAN_MBUF8_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb8data2 = M523X_CAN_MBUF8_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb8data3 = M523X_CAN_MBUF8_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb8data4 = M523X_CAN_MBUF8_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb8data5 = M523X_CAN_MBUF8_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb8data6 = M523X_CAN_MBUF8_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb8data7 = M523X_CAN_MBUF8_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb9code = M523X_CAN_MBUF9_CTRL(IPS_BASE,i);
can_chan_dev[i].mb9length = M523X_CAN_MBUF9_CTRL(IPS_BASE,i);
can_chan_dev[i].mb9timestamp = M523X_CAN_MBUF9_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb9ID = M523X_CAN_MBUF9_ID(IPS_BASE,i);
can_chan_dev[i].mb9data0 = M523X_CAN_MBUF9_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb9data1 = M523X_CAN_MBUF9_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb9data2 = M523X_CAN_MBUF9_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb9data3 = M523X_CAN_MBUF9_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb9data4 = M523X_CAN_MBUF9_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb9data5 = M523X_CAN_MBUF9_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb9data6 = M523X_CAN_MBUF9_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb9data7 = M523X_CAN_MBUF9_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb10code = M523X_CAN_MBUF10_CTRL(IPS_BASE,i);
can_chan_dev[i].mb10length = M523X_CAN_MBUF10_CTRL(IPS_BASE,i);
can_chan_dev[i].mb10timestamp = M523X_CAN_MBUF10_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb10ID = M523X_CAN_MBUF10_ID(IPS_BASE,i);
can_chan_dev[i].mb10data0 = M523X_CAN_MBUF10_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb10data1 = M523X_CAN_MBUF10_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb10data2 = M523X_CAN_MBUF10_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb10data3 = M523X_CAN_MBUF10_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb10data4 = M523X_CAN_MBUF10_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb10data5 = M523X_CAN_MBUF10_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb10data6 = M523X_CAN_MBUF10_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb10data7 = M523X_CAN_MBUF10_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb11code = M523X_CAN_MBUF11_CTRL(IPS_BASE,i);
can_chan_dev[i].mb11length = M523X_CAN_MBUF11_CTRL(IPS_BASE,i);
can_chan_dev[i].mb11timestamp = M523X_CAN_MBUF11_TMSTP(IPS_BASE,i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -