亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? syshdlc.c

?? 基于如何開發MPC860處理器系統的核心業務模塊QMC的開發程序
?? C
字號:
#include "vxworks.h"
#include "taskLib.h"
#include "mpc860p.h"
#include "msgQLib.h"
#include "arch/ppc/ivPpc.h"


QMCCHAN  	*chan;
MHEXTRAM 	*mhextRam;
char *pData2,*pData3;
UINT32 xi;
unsigned short QMCIntTbl[QMCINTMAX];
int  currentInt;
int  currentRXBD[HDLCCHANNELMAX];
int  currentTXBD[HDLCCHANNELMAX];

void QMC_BdInit();
void QMC_IntTblInit();
void QMC_ChannelInit();
void SiRamInit();

void mhRXF_int(int);
void mhTXB_int(int);
void mhMRF_int(int);
void mhIDL_int(int);
void mhNID_int(int);
void mhGlobalInt();
void mhQueueOverRun();
void mhTxUnderRun();
void mhRxOverRun();

void ppc860HdlcInt();

void sysHdlcHwInit(){	
QMCPARAM 	*param;  
 	int i,j;
	int immrVal = vxImmrGet();
	xi = 0;
	pData2 = (char *)0x3100000;
	pData3 = (char *)0x3180000;
  mhextRam = (MHEXTRAM *)QMC_BD_BASE;
  	chan = (QMCCHAN *)QMC_CHAN_BASE;

	*SDCR(immrVal) = 0x00000001;

   *SIMODE(immrVal) |= 0x00000010;/*0x00180018;*/ 

    /* Connect SCC2 to TMD mode */
   *SICR(immrVal) |= 0x00004000;  

    /* Configure PortA for TDMa & TDMb functionality */
    /* Enable the L1RCLKx and L1TCLKx                */
    
    /*********************** TDMA ************************/
    /* PA5 -> L1TCLKA : PA7 -> L1RCLK : PA8 -> L1RXDA :  */
    /* PA9 -> L1TXDA : PC4 -> L1RSYNCA : PC5 -> L1TSYNCA */
    /*********************** TDMB ************************/
    /* PA0 -> L1TCLKB : PA2 -> L1RCLKB : PA10 -> L1RXDB  */
    /* PA11 -> L1TXDB : PC6 -> L1RSYNCB : PC7 -> L1TSYNCB*/
    /*****************************************************/ 
    
    *PAPAR(immrVal) |= (PA5|PA7|PA8|PA9);
    *PADIR(immrVal) &= ~(PA5|PA7);
    *PADIR(immrVal) |= (PA8|PA9);

    *PCPAR(immrVal) |= (PC4|PC5);
    *PCDIR(immrVal) &= ~(PC4|PC5);

	*PBPAR(immrVal) |= PB20;
	*PBDIR(immrVal) |= PB20;
  
    SiRamInit();

  /* Enable TDMA & TDMB */
    *SIGMR(immrVal) = 0x04;
    
    *GSMR_H2(immrVal) = 0x00000780;
    *GSMR_L2(immrVal) = 0x0000000a;/* QMC mode */

	param = (QMCPARAM *)PARAM(2);
	param->mcbase   = (UINT32) QMC_BD_BASE;
	param->intbase  = (unsigned long ) &QMCIntTbl;
	param->mrblr    = MSGLEN;
  
  	param->grfthr   = 1;
  	param->grfcnt   = 1;

	param->c_mask32 = 0xDEBB20E3;
	param->c_mask16 = 0xF0B8;

	param->intptr   = (unsigned long ) &QMCIntTbl;
   		
  	for(j=0 ; j<32 ; j++)
  	{	
		if(j<HDLCCHANNELMAX)
		{
			param->tsatrx[j]=0xb03f + (unsigned short)(j<<6);
  			param->tsattx[j]=0xb03f + (unsigned short)(j<<6);
		}
		else
		{
			param->tsatrx[j]=0x303f + (unsigned short)(j<<6);
  			param->tsattx[j]=0x303f + (unsigned short)(j<<6);
		}
 	}
  	param->tsatrx[HDLCCHANNELMAX-1] |= 0x4000;
	param->tsattx[HDLCCHANNELMAX-1] |= 0x4000; 

	param->tx_s_ptr =0x3d60;	/* (short)(&param->tsattx);*/
	param->txptr = 0x3d60;		/*(short)(&param->tsattx);*/
	param->rx_s_ptr = 0x3d20;	/*(short)(&param->tsatrx);*/
	param->rxptr = 0x3d20;		/*(short)(&param->tsatrx);*/

	param->qmcstate = 0x8000;	


    QMC_ChannelInit();

    QMC_BdInit();

    for(i=0;i<HDLCCHANNELMAX;i++) 
    {
        currentRXBD[i] = 0;
        currentTXBD[i] = 0;
    }

    QMC_IntTblInit();
	 currentInt = 0;	

  	for(i = 0 ; i < HDLCCHANNELMAX ; i++)
  	{
      chan[i].chamr |= 0x1000;/*; 0x8000 */
   }

    *SCCE2(immrVal) = 0xffff;
    *SCCM2(immrVal) = 0x0004;


   /* Write CIMR, allow SCC2 &SCC4 to generate a system interrupt.*/
/*	 *CICR(immrVal) |= 0x00d00000;*/
 
    
    *GSMR_L2(immrVal) |= 0x00000030;     /* Enable Transmit and receive */

   intConnect(IV_SCC2, (VOIDFUNCPTR)ppc860HdlcInt,0);
   *CIMR(vxImmrGet()) |= 0x20000000;  
  }


void sysHdlcHwInit2(void)
{
   
}

void SiRamInit()
{
   unsigned long *SiEntry;
   int i;
   int immrVal = vxImmrGet();
  
   SiEntry = (unsigned long *) SIRAM(immrVal);

	for(i=0 ; i< 64 ; i++)
	{
		if(i < (HDLCCHANNELMAX - 1))
		{
			*(SiEntry + i) = 0x00820000;
			*(SiEntry + i + 64) = 0x00820000;
		}
		else
		{
			if(i == (HDLCCHANNELMAX - 1))/* the last */
			{
				*(SiEntry + i) = 0x00830000;
				*(SiEntry + i + 64) = 0x00830000;
			}
			else /* no used */
			{
			    *(SiEntry + i) = 0x00000000;
			    *(SiEntry + i) = 0x00000000;
			}
		}
	}
}

void QMC_BdInit(void)
{
   int i,j;
   char *RxBuf, *TxBuf; 
 	char * bufAddr; 

    RxBuf = (char *) QMC_RXBUF_BASE;/*(QMC_BUF_BASE + (MSGLEN + 4) 
							* MHTXBDNUM * MHCHANMAX);*/
    for(i = 0; i < HDLCCHANNELMAX; i++)
    {
        for(j = 0; j < MHRXBDNUM; j++)
        {
			bufAddr = (char *)&RxBuf[i * MHTXBDNUM * (MSGLEN + 4) + j * (MSGLEN + 4)];
        	(mhextRam->qmcRxBD[i][j]).sc = (RXBD_E|RXBD_I);/*0x9000;*/
        	(mhextRam->qmcRxBD[i][j]).len = 0;
        	(mhextRam->qmcRxBD[i][j]).addr = bufAddr;/*(UINT8 *)(&RxBuf[i * MHRXBDNUM 
							* (MSGLEN+4) + j * (MSGLEN+4)]);	*/
			*((mhextRam->qmcRxBD[i][j]).addr) = EOS;
    	}
        (mhextRam->qmcRxBD[i][MHRXBDNUM - 1]).sc |= 0x2000;
  	}
 
  	TxBuf = (char *)QMC_TXBUF_BASE;/*0x380000;*/
   for(i=0 ; i<HDLCCHANNELMAX ; i++)
   {
       for(j=0 ; j<MHTXBDNUM ; j++)
        {
				bufAddr = (char *)&TxBuf[i * MHTXBDNUM * (MSGLEN + 4) + j * (MSGLEN + 4)];
            (mhextRam->qmcTxBD[i][j]).addr = bufAddr;/*(char *)(&TxBuf[i * MHTXBDNUM 
							* (MSGLEN+4) +	j * (MSGLEN+4)]);*/
				 *((mhextRam->qmcTxBD[i][j]).addr) = EOS;  
				(mhextRam->qmcTxBD[i][j]).len = 0;
   			(mhextRam->qmcTxBD[i][j]).sc = (TXBD_I|TXBD_L|TXBD_TC); 
     	}
        (mhextRam->qmcTxBD[i][MHTXBDNUM - 1]).sc |= 0x3000;
    }
}

void QMC_IntTblInit(void)
{
   int i;

  	for(i=0; i<QMCINTMAX; i++)  QMCIntTbl[i] = 0;

  	QMCIntTbl[QMCINTMAX-1] = 0x4000;

}

void QMC_ChannelInit()
{
  	int i;

  	for(i = 0; i < HDLCCHANNELMAX ; i++)
   	{
  		chan[i].tbase = (UINT16)((UINT32)mhextRam->qmcTxBD[i]-(UINT32)mhextRam);
  		chan[i].rbase = (UINT16)((UINT32)mhextRam->qmcRxBD[i]-(UINT32)mhextRam);

  		chan[i].tbptr = (UINT16)((UINT32)mhextRam->qmcTxBD[i]-(UINT32)mhextRam);
		/*sizeof(BD) * MHTXBDNUM * i;*/
  		chan[i].rbptr = (UINT16)((UINT32)mhextRam->qmcRxBD[i]-(UINT32)mhextRam);
   		/*sizeof(BD) * MHRXBDNUM * i
   							+ sizeof(BD) * MHRXBDNUM * MHCHANMAX;*/

  		chan[i].tstate = 0x30000000;
  		chan[i].rstate = 0x31000000;

  		chan[i].zistate = 0x00000100;
  		chan[i].zdstate = 0x00000080;

	    chan[i].intmsk = 0x0008;
  		chan[i].mflr = MSGLEN;
 		chan[i].chamr = 0x8000;
    }
}


void ppc860HdlcInt()
{
    unsigned short intVal;
    int immrVal = vxImmrGet();

    intVal = *SCCE2(immrVal);
	
    if(intVal & SCCE_GINT)mhGlobalInt();
    if(intVal & SCCE_GOV)mhRxOverRun();
    if(intVal & SCCE_GUN)mhTxUnderRun();
    if(intVal & SCCE_IQOV)mhQueueOverRun();

    *SCCE2(immrVal) = 0xffff;
    *CISR(immrVal) |= 0x20000000;
 	return;
}

void mhRxOverRun()
{
	int immrVal = vxImmrGet();
	
	*SCCE2(immrVal) |= SCCE_GOV;
}

void mhTxUnderRun()
{          
	int immrVal = vxImmrGet();

   *SCCE2(immrVal) |= SCCE_GUN;
}

void mhQueueOverRun()
{
	int immrVal = vxImmrGet();

   *SCCE2(immrVal) |= SCCE_IQOV;
}

void mhGlobalInt()
{
  	UINT16 intValue;
	int immrVal = vxImmrGet();

  	int mhch;

	*SCCE2(immrVal) |= SCCE_GINT;
    
	while( (intValue = QMCIntTbl[currentInt]) & INTTBL_V )
	{
		QMCIntTbl[currentInt] &= ~(INTTBL_V);
		mhch = (UINT8)((intValue&INTTBL_CH_NUM)>>6);
  			
		if(intValue & INTTBL_TXB) mhTXB_int(mhch);
 		if(intValue & INTTBL_RXF) mhRXF_int(mhch);
 		if(intValue & INTTBL_MRF) mhMRF_int(mhch);
      if(intValue & INTTBL_IDL) mhIDL_int(mhch);
      if(intValue & INTTBL_NID) mhNID_int(mhch);

		/* clear int flag and channel number */
		QMCIntTbl[currentInt] &= ~(0x37f2);
		if( (intValue & INTTBL_W) || (currentInt >= (QMCINTMAX - 1)) )
		{
			currentInt = 0;
			continue;
		}
		currentInt++;
	}
}

void mhTXB_int(int mhch)
{
    QMCIntTbl[currentInt] &= ~INTTBL_TXB;
}

void mhRXF_int(int mhch)
{
   int n;
   UINT16 length;
	int msgType, link;
   BD *bd;

	QMCIntTbl[currentInt] &= ~(INTTBL_RXF);
     
   bd = &(mhextRam->qmcRxBD[mhch][currentRXBD[mhch]]);
    
   n=0;

   while( bd->sc & RXBD_E )
   {
      if( (bd->sc & RXBD_W) || (currentRXBD[mhch] >= (MHRXBDNUM - 1)) )
      {
         bd = &(mhextRam->qmcRxBD[mhch][0]);
         currentRXBD[mhch] = 0;
      }
      else
      {
         bd++; 
         currentRXBD[mhch]++;
      }
      n++;
      if(n>= MHRXBDNUM)return; 
   } 

   while( !(bd->sc & RXBD_E) )
   {
    	if( !(bd->sc & RXBD_F) || (bd->sc & RXBD_BAD_FACT) || (bd->len <= 2) )
    	{
			bd->sc &= ~(RXBD_L | RXBD_F | RXBD_BAD_FACT);
         bd->sc |= RXBD_E;
   		if( (bd->sc & RXBD_W) || currentRXBD[mhch] >= (MHRXBDNUM - 1) )
         {
        		bd = &(mhextRam->qmcRxBD[mhch][0]);
        		currentRXBD[mhch] = 0;
        		continue;
         }
         bd++;
         currentRXBD[mhch]++;
         continue;
      }
   	length = (bd->len - 2);     /* remove CRC bit */
	
		if(( bd->sc & RXBD_L )&&(length <= 512))
		{
if(mhch == 3){
	     		memcpy(pData3, (char *)bd->addr, length);
				pData3 = (char *)(pData3 + 0x40);
				if((UINT32)pData3 > 0x31ff000)pData3 = (char *)0x3100030;
				}
else if(mhch == 2)
{
		 		memcpy(pData2, (char *)bd->addr, length);
				pData2 = (char *)(pData2 + 0x40);
				if((UINT32)pData2 > 0x31ff000)pData2 = (char *)0x3100030;
}
		}
     		
    	bd->sc |= RXBD_E;
    	bd->sc &= ~(RXBD_L | RXBD_F | RXBD_BAD_FACT);

    	if( (bd->sc & RXBD_W) || currentRXBD[mhch] == (MHRXBDNUM - 1) )
    	{
    		bd = &(mhextRam->qmcRxBD[mhch][0]);
        	currentRXBD[mhch] = 0;
        	continue;
      }
    	bd++;
		currentRXBD[mhch]++;
   }
}

STATUS sendMsgQMC(int mhch, UINT16 length, char *buf)
{
   BD *bd;
   int i;
	char *tmp;
  
   bd = (BD *)&(mhextRam->qmcTxBD[mhch][currentTXBD[mhch]]);
  
	i=0;

   while( bd->sc & TXBD_R )
   {
      if( (bd->sc & TXBD_W) || (currentTXBD[mhch] >= (MHTXBDNUM - 1)) )
      {
         bd = &(mhextRam->qmcTxBD[mhch][0]);
         currentTXBD[mhch] = 0;
      }
      else
      {
         bd++;
         currentTXBD[mhch]++;
      }
      i++;
      if(i>=MHTXBDNUM) return ERROR;
   }

   if( !(bd->sc & TXBD_R) )
   {
		tmp = (char *)bd->addr;
		for(i=0;i<length;i++)*tmp++ = *buf++;

/*		memcpy((void *)bd->addr,(void *)buf,length);*/
      bd->len = length;
      bd->sc |= TXBD_R | TXBD_L;

      chan[mhch].chamr |= 0x100;  /* enable Polling */

      if( (bd->sc & TXBD_W) || (currentTXBD[mhch] >= (MHTXBDNUM - 1)))
      {
         currentTXBD[mhch] = 0;
         return OK;
     	}

     	currentTXBD[mhch]++;
    	return OK;
 	}
  	return ERROR;
}

void mhMRF_int(int mhch)
{
  	UINT16 length;
  	BD *bd;
  	char *Data;
  	int msgType, link;

  	if(mhch >= 32)return;

	QMCIntTbl[currentInt] &= ~(INTTBL_MRF);

  	bd = &(mhextRam->qmcRxBD[mhch][currentRXBD[mhch]]);

  	length = bd->len - 2;
/*
  	Data = (char *)malloc(length);
   memcpy(Data, (char *)bd->addr, length);
*/
   memcpy(pData2, (char *)bd->addr, length);
	xi++;
	pData2 ++;
	if((UINT32)pData2 >= 0x31fff80) pData2 = (char *)0x3100020;
	
  	bd->sc |= RXBD_E;
  	bd->sc &= ~(RXBD_L | RXBD_F | RXBD_BAD_FACT);

  	if( (bd->sc & RXBD_W) || currentRXBD[mhch] == (MHRXBDNUM - 1) )
  	{
  		bd = &(mhextRam->qmcRxBD[mhch][0]);
     	currentRXBD[mhch] = 0;
     	return;
   }

  	bd++;
	currentRXBD[mhch]++;


}

void mhIDL_int(int mhch)
{
	QMCIntTbl[currentInt] &= ~(INTTBL_IDL);
}

void mhNID_int(int mhch)
{
	QMCIntTbl[currentInt] &= ~(INTTBL_NID);
}

/*
void vSendPkgToHardware(unsigned char MsgDirType, unsigned char PhLinkNo,
							unsigned short PkLen, unsigned char *bpPkg)
{
	
}
void vSetSlotType(UINT8 SlotType, UINT8 PhLinkNo, UINT8 SlotNo)
{
	switch (SlotType)
	{
	case BC_SLOT:
		break;
	case PH_C_CHANNEL_SLOT:
		break;
	default: break;
	}
}
*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品一二三| 91麻豆精品国产自产在线| 欧美日韩激情一区二区三区| 欧美日本一区二区三区| 久久电影网电视剧免费观看| 亚洲国产高清aⅴ视频| av在线综合网| 亚洲精品乱码久久久久久| 国产风韵犹存在线视精品| 91麻豆精品国产91久久久久久 | 亚洲人被黑人高潮完整版| 亚洲综合色丁香婷婷六月图片| 国产一区视频在线看| 欧美三级视频在线观看| 亚洲女人小视频在线观看| 国产成人精品网址| 亚洲精品在线免费观看视频| 亚洲一二三级电影| 在线观看一区日韩| 亚洲三级电影网站| av一本久道久久综合久久鬼色| 久久久蜜桃精品| 国产麻豆成人传媒免费观看| 日韩欧美中文字幕公布| 奇米精品一区二区三区在线观看一| 在线视频欧美区| 亚洲激情六月丁香| 欧美三级视频在线| 一区二区三区小说| 91久久国产最好的精华液| 亚洲女子a中天字幕| 日本高清成人免费播放| 亚洲丝袜美腿综合| 91精彩视频在线| 亚洲午夜日本在线观看| 欧美三级午夜理伦三级中视频| 亚洲午夜一二三区视频| 欧美精品一卡两卡| 久久国产三级精品| 国产欧美一区二区精品忘忧草 | 精品粉嫩aⅴ一区二区三区四区| 视频在线在亚洲| 日韩美女一区二区三区四区| 久久99久久久久| 国产丝袜欧美中文另类| av在线不卡观看免费观看| 亚洲人精品午夜| 欧美日韩一区在线观看| 日本aⅴ精品一区二区三区| 日韩久久久久久| 国产99精品国产| 亚洲人成亚洲人成在线观看图片 | 色系网站成人免费| 亚洲国产乱码最新视频| 日韩美女视频一区二区在线观看| 狠狠色狠狠色综合系列| 欧美视频日韩视频| 久久国产精品区| 欧美电影免费观看高清完整版在线 | 在线视频亚洲一区| 麻豆精品国产传媒mv男同| 国产欧美日本一区二区三区| 91视频国产观看| 七七婷婷婷婷精品国产| 日本一区二区三区在线不卡| 91在线观看一区二区| 日日噜噜夜夜狠狠视频欧美人 | 欧美精品在线一区二区三区| 精品在线一区二区| 亚洲少妇最新在线视频| 欧美一级一级性生活免费录像| 国产成人亚洲综合a∨婷婷图片| 综合久久久久久| 欧美一级在线视频| 99精品视频在线播放观看| 日韩二区在线观看| 亚洲欧美另类图片小说| 精品国产三级a在线观看| 91丨porny丨在线| 美洲天堂一区二卡三卡四卡视频 | 五月婷婷久久丁香| 欧美激情一区二区三区不卡| 欧美久久一区二区| 99精品国产91久久久久久| 国产在线视频一区二区三区| 亚洲一区免费在线观看| 久久这里只有精品首页| 欧亚洲嫩模精品一区三区| 国产一区二区伦理片| 青青草97国产精品免费观看无弹窗版 | 国产一区二区免费视频| 亚洲v精品v日韩v欧美v专区| 国产精品乱码一区二区三区软件| 日韩一区二区免费在线观看| 欧美最猛黑人xxxxx猛交| 高清国产一区二区| 狠狠久久亚洲欧美| 日本一不卡视频| 性做久久久久久免费观看欧美| 国产精品剧情在线亚洲| 国产色产综合色产在线视频 | 日本vs亚洲vs韩国一区三区 | 欧美α欧美αv大片| heyzo一本久久综合| 国产成人av一区| 日本不卡视频在线观看| 天堂av在线一区| 亚洲va韩国va欧美va精品| 亚洲精品国产无套在线观| 中文字幕制服丝袜一区二区三区 | 欧美精品乱码久久久久久按摩| 91女厕偷拍女厕偷拍高清| 成人h精品动漫一区二区三区| 成人永久aaa| 成人综合在线视频| 波多野结衣中文字幕一区| 成人美女在线视频| 成人激情免费网站| 色综合视频在线观看| 91啪在线观看| 欧美性三三影院| 777欧美精品| 26uuu久久天堂性欧美| 国产欧美日产一区| 一区二区在线免费观看| 亚洲bt欧美bt精品777| 日韩高清不卡一区二区| 裸体一区二区三区| 国产激情一区二区三区桃花岛亚洲| 粉嫩蜜臀av国产精品网站| av成人老司机| 欧美精品色综合| 久久网站最新地址| 中文字幕在线一区二区三区| 亚洲人成伊人成综合网小说| 天天操天天综合网| 经典三级一区二区| 懂色av中文一区二区三区| 色综合激情五月| 日韩亚洲欧美一区| 国产精品欧美极品| 亚洲国产你懂的| 精品午夜久久福利影院| 国产福利一区二区三区视频 | 日韩激情视频网站| 精品一区免费av| 91麻豆成人久久精品二区三区| 欧美私模裸体表演在线观看| 精品少妇一区二区三区视频免付费| 久久婷婷一区二区三区| 亚洲一区影音先锋| 国产一区视频在线看| 在线观看一区二区视频| 久久综合色综合88| 自拍偷拍国产亚洲| 狠狠色丁香久久婷婷综合_中| 97se亚洲国产综合在线| 欧美成人bangbros| 亚洲国产一二三| 国产黄色精品网站| 欧美日韩一区二区三区四区| 久久久噜噜噜久久人人看 | 欧美一级欧美一级在线播放| 国产性做久久久久久| 性欧美疯狂xxxxbbbb| 成人免费毛片app| 日韩免费福利电影在线观看| 亚洲黄色尤物视频| 国产精品一线二线三线| 欧美一区二区三区日韩视频| 亚洲人成影院在线观看| 国产精品性做久久久久久| 欧美亚洲一区三区| 国产精品国产成人国产三级| 国产综合成人久久大片91| 欧美日韩高清影院| 亚洲最大色网站| 9i在线看片成人免费| 久久久久久黄色| 免费在线欧美视频| 在线观看成人小视频| 亚洲视频免费在线| 成人永久aaa| 国产精品人妖ts系列视频| 韩国视频一区二区| 久久综合色婷婷| 久热成人在线视频| 欧美成人一级视频| 久久国产福利国产秒拍| 日韩精品一区在线| 麻豆久久久久久| 日韩一区二区免费高清| 亚洲成人免费电影| 欧美高清一级片在线| 性做久久久久久免费观看 | 色婷婷综合久久久中文一区二区| 国产精品午夜春色av| 成人性生交大片免费看中文| 国产欧美日韩麻豆91| 北条麻妃一区二区三区|